@zenon-red/probe 1.2.3 → 1.2.5

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","note","spinner","clackSpinner","walletSubcommands","spinner","__t","AgentRole","AgentStatus","IdeaStatus","MessageType","ProjectStatus","TaskStatus","__t","__t","__t","__t","__t","__t","__t","__t","__t","__t","__t","__t","AgentRole","__t","__t","MessageType","__t","MessageType","AgentStatus","__t","__t","__t","__t","__t","ProjectStatus","__t","TaskStatus","__t","__t","__t","__t","__t","AgentRole","AgentStatus","__t","__t","__t","__t","__t","IdeaStatus","__t","AgentRole","__t","MessageType","__t","__t","MessageType","__t","ProjectStatus","__t","__t","TaskStatus","__t","__t","__schema","__table","AgentActionEventsRow","AgentActionsRow","AgentsRow","ChannelsRow","ConfigRow","DiscoveredTasksRow","EvaluationDimensionsRow","IdeasRow","IdentityRolesRow","MessagesRow","ProjectChannelsRow","ProjectMessagesRow","ProjectsRow","TaskDependenciesRow","TasksRow","VoiceAnnouncementsRow","VotesRow","__reducers","__reducerSchema","AddTaskDependencyReducer","ClaimTaskReducer","CreateProjectReducer","CreateTaskReducer","DiscoverTaskReducer","FailVoiceAnnouncementReducer","FinalizeVoiceAnnouncementReducer","HeartbeatReducer","IssueAgentActionReducer","MarkIdeaImplementedReducer","ProposeIdeaReducer","RegisterAgentReducer","ReviewDiscoveredTaskReducer","SeedUiDataReducer","SeedVoiceAnnouncementsReducer","SendMessageReducer","SendProjectMessageReducer","SetAgentStatusReducer","UpdateAgentActionReducer","UpdateAgentBioReducer","UpdateAgentCapabilitiesReducer","UpdateProjectStatusReducer","UpdateTaskStatusReducer","VoteIdeaReducer","__procedures","__procedureSchema","GenerateVoiceProcedure.params","GenerateVoiceProcedure.returnType","__makeQueryBuilder","reducers","__convertToAccessorMap","procedures","__SubscriptionBuilderImpl","DbConnectionBuilder","__DbConnectionBuilder","__DbConnectionImpl","commandExists","commandExists","commandExists","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/fail_voice_announcement_reducer.ts","../src/module_bindings/finalize_voice_announcement_reducer.ts","../src/module_bindings/heartbeat_reducer.ts","../src/module_bindings/issue_agent_action_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/seed_voice_announcements_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_action_reducer.ts","../src/module_bindings/update_agent_bio_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/generate_voice_procedure.ts","../src/module_bindings/agent_action_events_table.ts","../src/module_bindings/agent_actions_table.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/evaluation_dimensions_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/voice_announcements_table.ts","../src/module_bindings/votes_table.ts","../src/module_bindings/index.ts","../src/utils/context.ts","../src/utils/enums.ts","../src/utils/health.ts","../src/utils/toon.ts","../src/commands/doctor.ts","../src/utils/upgrade.ts","../src/utils/auto-update.ts","../src/utils/time.ts","../src/utils/next-router.ts","../src/commands/next.ts","../src/utils/scheduler-plans.ts","../src/utils/auth-flow.ts","../src/utils/skills-install.ts","../src/utils/daemon.ts","../src/utils/runtime-detection.ts","../src/utils/onboard/steps.ts","../src/commands/onboard.ts","../src/utils/errors.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/upgrade.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 issuer: string;\n walletDir: string;\n defaultWallet?: string;\n autoUpdate?: boolean | \"notify\";\n passwordMinLength: number;\n tokenCacheDir: string;\n requestTimeout: number;\n schedulerConfirmed?: boolean;\n spacetime: {\n host: string;\n module: string;\n };\n}\n\nexport const DEFAULT_CONFIG: NexusConfig = {\n issuer: \"https://api.zenon.red\",\n walletDir: \"~/.probe/wallets\",\n autoUpdate: \"notify\",\n passwordMinLength: 8,\n tokenCacheDir: \"~/.probe/tokens\",\n requestTimeout: 30000,\n spacetime: {\n host: \"wss://db.zenon.red\",\n module: \"nexus\",\n },\n};\n\nexport interface WalletInfo {\n name: string;\n address: string;\n publicKey?: string;\n createdAt?: string;\n}\n\nexport interface WalletCreationResult {\n name: string;\n address: string;\n publicKey: string;\n mnemonic: string;\n}\n\nexport interface ChallengeResponse {\n nonce: string;\n challenge: string;\n expiresAt: string;\n}\n\nexport interface TokenResponse {\n accessToken: string;\n idToken: string;\n expiresIn: number;\n}\n\nexport interface OutputResult<T> {\n success: boolean;\n data?: T;\n error?: { 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 try {\n await access(CONFIG_PATH);\n const content = await readFile(CONFIG_PATH, \"utf-8\");\n return JSON.parse(content) as Partial<NexusConfig>;\n } catch {\n return {};\n }\n}\n\nexport async function saveUserConfig(config: Partial<NexusConfig>): Promise<void> {\n await mkdir(CONFIG_DIR, { recursive: true });\n await writeFile(CONFIG_PATH, JSON.stringify(config, null, 2), {\n mode: 0o600,\n });\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 if (cachedConfig) {\n return cachedConfig;\n }\n\n const [c12Config, userConfig] = await Promise.all([\n loadConfig<NexusConfig>({\n name: \"probe\",\n defaults: DEFAULT_CONFIG,\n envName: \"PROBE\",\n }),\n loadUserConfig(),\n ]);\n\n cachedConfig = {\n ...DEFAULT_CONFIG,\n ...c12Config.config,\n ...userConfig,\n };\n\n cachedConfig.walletDir = expandHomeDir(cachedConfig.walletDir);\n cachedConfig.tokenCacheDir = expandHomeDir(cachedConfig.tokenCacheDir);\n\n return cachedConfig;\n}\n\nexport function clearConfigCache(): void {\n cachedConfig = null;\n}\n\nexport function expandHomeDir(path: string): string {\n if (path.startsWith(\"~/\")) {\n return join(homedir(), path.slice(2));\n }\n return path;\n}\n\nexport async function getWalletDir(): Promise<string> {\n const config = await getConfig();\n return config.walletDir;\n}\n\nexport async function getTokenCacheDir(): Promise<string> {\n const config = await getConfig();\n return config.tokenCacheDir;\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { spinner as clackSpinner, log, note as clackNote } from \"@clack/prompts\";\nimport { dim } from \"kolorist\";\nimport type { OutputResult } from \"~/types/index.js\";\n\nconst outputModeStorage = new AsyncLocalStorage<{ jsonMode: boolean }>();\nlet jsonModeFallback = false;\n\nconst jsonReplacer = (_key: string, value: unknown): unknown => {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n};\n\nconst printJson = (value: unknown, stderr = false): void => {\n const serialized = JSON.stringify(value, jsonReplacer, 2);\n if (stderr) {\n console.error(serialized);\n return;\n }\n console.log(serialized);\n};\n\nexport function setJsonMode(enabled: boolean) {\n jsonModeFallback = enabled;\n outputModeStorage.enterWith({ jsonMode: enabled });\n}\n\nexport function isJsonMode(): boolean {\n return outputModeStorage.getStore()?.jsonMode === true || jsonModeFallback;\n}\n\nexport function success<T>(data: T): void {\n if (isJsonMode()) {\n printJson({ success: true, data });\n }\n}\n\nexport function error(code: string, message: string, suggestion?: string, exitCode = 1): never {\n if (isJsonMode()) {\n const output: OutputResult<never> = {\n success: false,\n error: {\n code,\n message,\n ...(suggestion && { suggestion }),\n },\n };\n printJson(output, true);\n process.exit(exitCode);\n } else {\n log.error(message);\n if (suggestion) {\n console.error(`${dim(\"hint:\")} ${suggestion}`);\n }\n process.exit(exitCode);\n }\n}\n\nexport function info(message: string): void {\n if (!isJsonMode()) {\n log.info(message);\n }\n}\n\nexport function successMessage(message: string): void {\n if (!isJsonMode()) {\n log.success(message);\n }\n}\n\nexport function warning(message: string): void {\n if (!isJsonMode()) {\n log.warn(message);\n }\n}\n\nexport function note(message: string, title?: string): void {\n if (!isJsonMode()) {\n clackNote(message, title);\n }\n}\n\nexport function spinner(message: string) {\n if (isJsonMode()) {\n return {\n start: () => {},\n stop: () => {},\n succeed: () => {},\n fail: () => {},\n };\n }\n\n const clack = clackSpinner();\n\n const start = () => {\n clack.start(message);\n };\n\n const stop = () => {\n clack.stop();\n };\n\n const succeed = (msg?: string) => {\n clack.stop(msg || message);\n };\n\n const fail = (msg?: string) => {\n clack.stop(msg || message);\n };\n\n return {\n start,\n stop,\n succeed,\n fail,\n };\n}\n","import { readFile } from \"node:fs/promises\";\nimport { password, text } from \"@clack/prompts\";\nimport { error, isJsonMode } from \"./output.js\";\n\nconst readTrimmedFile = async (filePath: string, label: string): Promise<string> => {\n try {\n return (await readFile(filePath, \"utf-8\")).trim();\n } catch {\n error(\"FILE_READ_ERROR\", `Failed to read ${label} file: ${filePath}`);\n }\n};\n\nexport interface ResolvePasswordInput {\n passwordFile?: string;\n envVar?: string;\n promptMessage: string;\n jsonModeError: string;\n minLength?: number;\n confirmPromptMessage?: string;\n}\n\nexport const resolvePasswordInput = async (options: ResolvePasswordInput): Promise<string> => {\n if (options.passwordFile) {\n return readTrimmedFile(options.passwordFile, \"password\");\n }\n\n const envVar = options.envVar || \"PROBE_WALLET_PASSWORD\";\n const fromEnv = process.env[envVar];\n if (fromEnv) {\n return fromEnv;\n }\n\n if (isJsonMode() || !process.stdin.isTTY || !process.stdout.isTTY) {\n error(\"PASSWORD_REQUIRED\", options.jsonModeError);\n }\n\n const first = await password({\n message: options.promptMessage,\n validate: (value) => {\n if (!value) return;\n if (options.minLength && value.length < options.minLength) {\n return `Password must be at least ${options.minLength} characters`;\n }\n },\n });\n\n if (typeof first !== \"string\") {\n process.exit(130);\n }\n\n if (!options.confirmPromptMessage) {\n return first;\n }\n\n const second = await password({\n message: options.confirmPromptMessage,\n validate: (value) => (value === first ? undefined : \"Passwords do not match\"),\n });\n if (typeof second !== \"string\") {\n process.exit(130);\n }\n\n return first;\n};\n\nexport interface ResolveMnemonicInput {\n mnemonic?: string;\n mnemonicFile?: string;\n envVar?: string;\n jsonModeError: string;\n}\n\nexport const resolveMnemonicInput = async (options: ResolveMnemonicInput): Promise<string> => {\n if (options.mnemonic) {\n return options.mnemonic;\n }\n\n if (options.mnemonicFile) {\n return readTrimmedFile(options.mnemonicFile, \"mnemonic\");\n }\n\n const envVar = options.envVar || \"PROBE_WALLET_MNEMONIC\";\n const fromEnv = process.env[envVar];\n if (fromEnv) {\n return fromEnv;\n }\n\n if (isJsonMode() || !process.stdin.isTTY || !process.stdout.isTTY) {\n error(\"MNEMONIC_REQUIRED\", options.jsonModeError);\n }\n\n const input = await text({\n message: \"Enter mnemonic phrase:\",\n validate: (value) =>\n !value\n ? \"Mnemonic must be 24 words\"\n : value.trim().split(/\\s+/).length === 24\n ? undefined\n : \"Mnemonic must be 24 words\",\n });\n if (typeof input !== \"string\") {\n process.exit(130);\n }\n return input;\n};\n","import { blue, bold, cyan, dim, gray, green, white } from \"kolorist\";\n\ninterface HelpSectionItem {\n name: string;\n detail: string;\n}\n\ninterface HelpSpec {\n command: string;\n description: string;\n usage: string[];\n actions?: HelpSectionItem[];\n options?: HelpSectionItem[];\n examples?: string[];\n notes?: string[];\n}\n\nconst actionHelpCommands = new Set([\n \"agent\",\n \"task\",\n \"message\",\n \"idea\",\n \"discover\",\n \"project\",\n \"config\",\n]);\nconst directHelpCommands = new Set([\n \"wallet\",\n \"auth\",\n \"sign\",\n \"token\",\n \"nexus\",\n \"query\",\n \"doctor\",\n \"upgrade\",\n]);\nconst walletSubcommands = new Set([\"create\", \"import\", \"list\", \"show\", \"delete\", \"default\"]);\n\nlet forceHelpFlag = false;\n\nconst neonBadge = (text: string): string =>\n `\\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 = (items: HelpSectionItem[], nameColor: (value: string) => string): string => {\n const width = Math.max(...items.map((i) => i.name.length), 0);\n return items.map((i) => ` ${nameColor(i.name.padEnd(width))} ${i.detail}`).join(\"\\n\");\n};\n\nexport const printHelp = (spec: HelpSpec): void => {\n const notes = [...(spec.notes || [])];\n const hasHostModuleOption = (spec.options || []).some(\n (item) => item.name.includes(\"--host\") && item.name.includes(\"--module\"),\n );\n const hasHostModuleNote = notes.some(\n (note) => note.includes(\"--host\") && note.includes(\"--module\"),\n );\n if (hasHostModuleOption && !hasHostModuleNote) {\n notes.push(\n \"--host sets the SpacetimeDB server endpoint; --module sets the target module/database name (default: nexus).\",\n );\n }\n\n const lines: string[] = [];\n lines.push(`${bold(white(spec.command))} ${dim(\"•\")} ${gray(spec.description)}`);\n\n lines.push(\"\");\n lines.push(section(\"Usage\"));\n for (const entry of spec.usage) {\n lines.push(` ${white(entry)}`);\n }\n\n if (spec.actions && spec.actions.length > 0) {\n lines.push(\"\");\n lines.push(section(\"Actions\"));\n lines.push(renderItems(spec.actions, green));\n }\n\n if (spec.options && spec.options.length > 0) {\n lines.push(\"\");\n lines.push(section(\"Options\"));\n lines.push(renderItems(spec.options, blue));\n }\n\n if (spec.examples && spec.examples.length > 0) {\n lines.push(\"\");\n lines.push(section(\"Examples\"));\n for (const example of spec.examples) {\n lines.push(` ${cyan(example)}`);\n }\n }\n\n if (notes.length > 0) {\n lines.push(\"\");\n lines.push(section(\"Notes\"));\n for (const note of notes) {\n lines.push(` ${dim(\"-\")} ${note}`);\n }\n }\n\n console.log(lines.join(\"\\n\"));\n};\n\nexport const setForceHelpRequested = (enabled: boolean): void => {\n forceHelpFlag = enabled;\n};\n\nexport const forceHelpRequested = (): boolean => forceHelpFlag;\n\nexport const normalizeHelpArgv = (argv: string[]): { argv: string[]; forceHelp: boolean } => {\n const hasHelp = argv.includes(\"--help\") || argv.includes(\"-h\");\n if (!hasHelp) {\n return { argv, forceHelp: false };\n }\n\n if (argv.every((arg) => arg.startsWith(\"-\"))) {\n return { argv: [], forceHelp: true };\n }\n\n const command = argv.find((arg) => !arg.startsWith(\"-\"));\n if (!command) {\n return { argv, forceHelp: true };\n }\n\n if (actionHelpCommands.has(command)) {\n return { argv: [command], forceHelp: true };\n }\n\n if (!directHelpCommands.has(command)) {\n return { argv, forceHelp: true };\n }\n\n if (command === \"wallet\") {\n const positionals = argv.filter((arg) => !arg.startsWith(\"-\"));\n if (positionals.length > 1 && walletSubcommands.has(positionals[1])) {\n return { argv: [command, positionals[1]], forceHelp: true };\n }\n }\n\n return { 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 address: string,\n issuerOverride?: string,\n): Promise<ChallengeResponse> {\n const config = await getConfig();\n const issuer = issuerOverride || config.issuer;\n const url = `${issuer}/auth/challenge`;\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ address }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Challenge request failed: ${error}`);\n }\n\n const data = await response.json();\n return {\n nonce: data.nonce,\n challenge: data.challenge,\n expiresAt: data.expires_at,\n };\n}\n\nexport async function exchangeToken(\n address: string,\n publicKey: string,\n signature: string,\n nonce: string,\n issuerOverride?: string,\n): Promise<TokenResponse> {\n const config = await getConfig();\n const issuer = issuerOverride || config.issuer;\n const url = `${issuer}/auth/token`;\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n address,\n public_key: publicKey,\n signature,\n nonce,\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Token exchange failed: ${error}`);\n }\n\n const data = await response.json();\n return {\n accessToken: data.access_token,\n idToken: data.id_token,\n expiresIn: data.expires_in,\n };\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(wallet: string, token: string, expiresAt: string): Promise<void> {\n const cacheDir = await getTokenCacheDir();\n\n try {\n await mkdir(cacheDir, { recursive: true });\n } catch {}\n\n const cachePath = join(cacheDir, `${wallet}.jwt`);\n const data = {\n token,\n expiresAt,\n };\n\n await writeFile(cachePath, JSON.stringify(data), { mode: 0o600 });\n}\n\nexport async function getCachedToken(\n wallet: string,\n): Promise<{ token: string; expiresAt: string } | null> {\n const cacheDir = await getTokenCacheDir();\n const cachePath = join(cacheDir, `${wallet}.jwt`);\n\n try {\n await access(cachePath);\n const content = await readFile(cachePath, \"utf-8\");\n return JSON.parse(content);\n } catch {\n return null;\n }\n}\n\nexport async function clearCachedToken(wallet: string): Promise<void> {\n const cacheDir = await getTokenCacheDir();\n const cachePath = join(cacheDir, `${wallet}.jwt`);\n\n try {\n await access(cachePath);\n const { unlink } = await import(\"node:fs/promises\");\n await unlink(cachePath);\n } catch {}\n}\n","import { access, mkdir, readdir, readFile, unlink, writeFile } 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 const walletDir = await getWalletDir();\n try {\n await mkdir(walletDir, { recursive: true });\n } catch {}\n return walletDir;\n}\n\nasync function getWalletFilePath(name: string): Promise<string> {\n const walletDir = await ensureWalletDir();\n return join(walletDir, `${name}.json`);\n}\n\nexport async function createWallet(name: string, password: string): Promise<WalletCreationResult> {\n const exists = await walletExists(name);\n if (exists) {\n throw new Error(`Wallet '${name}' already exists`);\n }\n\n const keyStore = KeyStore.newRandom();\n const keyFile = KeyFile.setPassword(password);\n const encryptedData = await keyFile.encrypt(keyStore);\n\n const walletPath = await getWalletFilePath(name);\n await writeFile(walletPath, JSON.stringify(encryptedData, null, 2), \"utf-8\");\n\n const keyPair = keyStore.getKeyPair(0);\n const address = keyPair.getAddress();\n const publicKey = keyPair.getPublicKey();\n\n return {\n name,\n address: address.toString(),\n publicKey: publicKey.toString(\"hex\"),\n mnemonic: keyStore.mnemonic || \"\",\n };\n}\n\nexport async function importWallet(\n name: string,\n mnemonic: string,\n password: string,\n): Promise<WalletInfo> {\n const exists = await walletExists(name);\n if (exists) {\n throw new Error(`Wallet '${name}' already exists`);\n }\n\n const keyStore = KeyStore.fromMnemonic(mnemonic);\n const keyFile = KeyFile.setPassword(password);\n const encryptedData = await keyFile.encrypt(keyStore);\n\n const walletPath = await getWalletFilePath(name);\n await writeFile(walletPath, JSON.stringify(encryptedData, null, 2), \"utf-8\");\n\n const keyPair = keyStore.getKeyPair(0);\n const address = keyPair.getAddress();\n\n return {\n name,\n address: address.toString(),\n };\n}\n\nexport async function listWallets(): Promise<WalletInfo[]> {\n const walletDir = await getWalletDir();\n\n try {\n const files = await readdir(walletDir);\n const wallets: WalletInfo[] = [];\n\n for (const file of files) {\n if (file.endsWith(\".json\")) {\n const name = file.slice(0, -5);\n const info = await getWalletInfo(name);\n if (info) {\n wallets.push(info);\n }\n }\n }\n\n return wallets;\n } catch {\n return [];\n }\n}\n\nexport async function getWalletInfo(name: string): Promise<WalletInfo | null> {\n const walletPath = await getWalletFilePath(name);\n\n try {\n const content = await readFile(walletPath, \"utf-8\");\n const data = JSON.parse(content);\n const stats = await stat(walletPath);\n\n return {\n name,\n address: data.address || data.baseAddress,\n createdAt: data.timestamp\n ? new Date(data.timestamp * 1000).toISOString()\n : new Date(stats.mtime).toISOString(),\n };\n } catch {\n return null;\n }\n}\n\nexport async function loadWallet(name: string, password: string): Promise<KeyStore> {\n const walletPath = await getWalletFilePath(name);\n\n try {\n const content = await readFile(walletPath, \"utf-8\");\n const encryptedData = JSON.parse(content);\n\n const keyFile = KeyFile.setPassword(password);\n const keyStore = await keyFile.decrypt(encryptedData);\n\n return keyStore;\n } catch (err) {\n throw new Error(\n `Failed to load wallet: ${err instanceof Error ? err.message : \"Unknown error\"}`,\n );\n }\n}\n\nexport async function deleteWallet(name: string): Promise<void> {\n const walletPath = await getWalletFilePath(name);\n\n try {\n await unlink(walletPath);\n } catch (err) {\n throw new Error(\n `Failed to delete wallet: ${err instanceof Error ? err.message : \"Unknown error\"}`,\n );\n }\n}\n\nexport async function walletExists(name: string): Promise<boolean> {\n const walletPath = await getWalletFilePath(name);\n\n try {\n await access(walletPath);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function stat(path: string) {\n const { stat } = await import(\"node:fs/promises\");\n return 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 error,\n isJsonMode,\n setJsonMode,\n spinner,\n success,\n successMessage,\n} from \"~/utils/output.js\";\nimport { cacheToken, getCachedToken } from \"~/utils/token-cache.js\";\nimport { loadWallet } from \"~/utils/wallet.js\";\n\nexport default defineCommand({\n meta: {\n name: \"auth\",\n description: \"Complete OIDC authentication flow\",\n },\n args: {\n name: {\n type: \"positional\",\n description: \"Wallet name, or status action\",\n required: false,\n },\n wallet: {\n type: \"string\",\n description: \"Wallet name override (used with auth status)\",\n },\n \"expect-address\": {\n type: \"string\",\n description: \"Expected Zenon address safety check (z1...)\",\n },\n issuer: {\n type: \"string\",\n description: \"OIDC issuer URL override\",\n },\n \"password-file\": {\n type: \"string\",\n description: \"Read password from file\",\n },\n save: {\n type: \"boolean\",\n description: \"Save token to cache (default: true)\",\n default: true,\n },\n json: {\n type: \"boolean\",\n description: \"Output JSON only\",\n default: false,\n },\n },\n async run({ args }) {\n if (args.json) {\n setJsonMode(true);\n }\n\n const name = args.name;\n const requestedAddress = args[\"expect-address\"];\n\n if (!name) {\n printHelp({\n command: \"probe auth\",\n description: \"Complete OIDC authentication flow\",\n usage: [\n \"probe auth <wallet-name> [options]\",\n \"probe auth status [--wallet my-wallet]\",\n \"probe auth my-wallet --save\",\n \"probe auth my-wallet --expect-address z1q... --save\",\n ],\n options: [\n {\n name: \"--expect-address\",\n detail: \"Optional safety check against resolved wallet address\",\n },\n { name: \"--wallet\", detail: \"Wallet override for `auth status`\" },\n {\n name: \"--issuer\",\n detail: \"OIDC issuer URL (default from config: issuer)\",\n },\n { name: \"--password-file\", detail: \"Read wallet password from file\" },\n {\n name: \"--save\",\n detail: \"Save token in local cache (default: true)\",\n },\n { name: \"--json\", detail: \"JSON output for agents\" },\n ],\n notes: [\n \"Password source order: --password-file, PROBE_WALLET_PASSWORD, interactive prompt.\",\n \"Most users should omit --expect-address; it is for safety checks in external workflows.\",\n \"Use --issuer only when authenticating against a non-default OIDC server (for example local/dev environments).\",\n ],\n });\n return;\n }\n\n if (name === \"status\") {\n const config = await getConfig();\n const walletName = args.wallet || config.defaultWallet;\n if (!walletName) {\n error(\"WALLET_REQUIRED\", \"Wallet required. Use --wallet or set default wallet.\");\n }\n\n const cached = await getCachedToken(walletName);\n if (!cached) {\n success({\n wallet: walletName,\n authenticated: false,\n valid: false,\n reason: \"no_cached_token\",\n });\n if (!isJsonMode()) {\n console.log(`Wallet: ${walletName}`);\n console.log(\"Status: Not authenticated (no cached token)\");\n console.log(`Next: probe auth ${walletName} --save`);\n }\n return;\n }\n\n const expiresAt = new Date(cached.expiresAt);\n const expiresIn = Math.floor((expiresAt.getTime() - Date.now()) / 1000);\n const valid = Number.isFinite(expiresIn) && expiresIn > 0;\n success({\n wallet: walletName,\n authenticated: true,\n valid,\n expiresAt: cached.expiresAt,\n expiresIn: Math.max(0, expiresIn),\n });\n if (!isJsonMode()) {\n console.log(`Wallet: ${walletName}`);\n console.log(`Status: ${valid ? \"Authenticated\" : \"Token expired\"}`);\n console.log(`Expires: ${expiresAt.toUTCString()}`);\n }\n return;\n }\n\n const walletPassword = await resolvePasswordInput({\n passwordFile: args[\"password-file\"],\n promptMessage: \"Enter wallet password:\",\n jsonModeError:\n \"Password required via PROBE_WALLET_PASSWORD env, --password-file, or interactive prompt in a TTY session\",\n });\n\n let keyPair: KeyPair | undefined;\n let walletAddress: string;\n let address: string;\n try {\n const keyStore = await loadWallet(name, walletPassword);\n keyPair = keyStore.getKeyPair(0);\n const addr = keyPair.getAddress();\n walletAddress = addr.toString();\n\n if (requestedAddress && walletAddress !== requestedAddress) {\n error(\n \"ADDRESS_MISMATCH\",\n `Wallet address ${walletAddress} does not match provided address ${requestedAddress}`,\n );\n }\n\n address = requestedAddress || walletAddress;\n } catch (err) {\n error(\"WALLET_LOAD_ERROR\", err instanceof Error ? err.message : \"Failed to load wallet\");\n }\n\n try {\n const challengeSpinner = spinner(\"Requesting challenge from OIDC provider...\");\n challengeSpinner.start();\n\n const challenge = await requestChallenge(address, args.issuer);\n challengeSpinner.succeed();\n\n const signSpinner = spinner(\"Signing challenge...\");\n signSpinner.start();\n\n const signature = keyPair.sign(Buffer.from(challenge.challenge));\n const publicKey = keyPair.getPublicKey();\n signSpinner.succeed();\n\n const exchangeSpinner = spinner(\"Exchanging for token...\");\n exchangeSpinner.start();\n\n const tokenResponse = await exchangeToken(\n address,\n publicKey.toString(\"hex\"),\n signature.toString(\"hex\"),\n challenge.nonce,\n args.issuer,\n );\n exchangeSpinner.succeed();\n\n const expiresAt = new Date(Date.now() + tokenResponse.expiresIn * 1000).toISOString();\n\n if (args.save) {\n await cacheToken(name, tokenResponse.accessToken, expiresAt);\n }\n\n success({\n wallet: name,\n address,\n token: tokenResponse.accessToken,\n expiresAt,\n expiresIn: tokenResponse.expiresIn,\n });\n\n if (!isJsonMode()) {\n successMessage(\"Authentication successful\");\n if (args.save) {\n console.log(\"Token saved to wallet cache.\");\n }\n console.log(\n `Expires: ${new Date(expiresAt).toUTCString()} (${Math.floor(tokenResponse.expiresIn / 86400)} days)`,\n );\n }\n } catch (err) {\n error(\n \"AUTH_ERROR\",\n err instanceof Error ? err.message : \"Authentication failed\",\n undefined,\n 2,\n );\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { clearConfigCache, getConfig } from \"~/utils/config.js\";\nimport { printHelp } from \"~/utils/help.js\";\nimport { error, isJsonMode, setJsonMode, success, successMessage } from \"~/utils/output.js\";\nimport { loadUserConfig, saveUserConfig } from \"~/utils/user-config.js\";\n\nfunction getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n const parts = path.split(\".\");\n let current: unknown = obj;\n for (const part of parts) {\n if (current && typeof current === \"object\" && part in current) {\n current = (current as Record<string, unknown>)[part];\n } else {\n return undefined;\n }\n }\n return current;\n}\n\nfunction setNestedValue(obj: Record<string, unknown>, path: string, value: unknown): void {\n const parts = path.split(\".\");\n let current = obj;\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n if (!(part in current) || typeof current[part] !== \"object\") {\n current[part] = {};\n }\n current = current[part] as Record<string, unknown>;\n }\n current[parts[parts.length - 1]] = value;\n}\n\nexport default defineCommand({\n meta: {\n name: \"config\",\n description: \"Manage configuration settings\",\n },\n args: {\n action: {\n type: \"positional\",\n description: \"Action: get, set, list\",\n required: false,\n },\n key: {\n type: \"positional\",\n description: \"Configuration key\",\n required: false,\n },\n value: {\n type: \"positional\",\n description: \"Configuration value\",\n required: false,\n },\n json: {\n type: \"boolean\",\n description: \"Output JSON only\",\n default: false,\n },\n },\n async run({ args }) {\n if (args.json) {\n setJsonMode(true);\n }\n\n if (!args.action) {\n printHelp({\n command: \"probe config\",\n description: \"Read and write CLI configuration values\",\n usage: [\n \"probe config <action> [key] [value]\",\n \"probe config get spacetime.host\",\n \"probe config set defaultWallet agent-wallet\",\n ],\n actions: [\n { name: \"get <key>\", detail: \"Get one config value\" },\n { name: \"set <key> <value>\", detail: \"Set one config value\" },\n { name: \"list\", detail: \"List merged config and user overrides\" },\n ],\n notes: [\n \"Valid keys: issuer, walletDir, defaultWallet, autoUpdate, tokenCacheDir, requestTimeout, spacetime.host, spacetime.module.\",\n ],\n });\n return;\n }\n\n const action = args.action;\n const validKeys = [\n \"issuer\",\n \"walletDir\",\n \"defaultWallet\",\n \"autoUpdate\",\n \"tokenCacheDir\",\n \"requestTimeout\",\n \"spacetime.host\",\n \"spacetime.module\",\n ];\n\n try {\n switch (action) {\n case \"get\": {\n if (!args.key) {\n error(\"KEY_REQUIRED\", \"Configuration key required\");\n }\n\n if (!validKeys.includes(args.key)) {\n error(\n \"INVALID_KEY\",\n `Invalid configuration key: ${args.key}`,\n `Valid keys: ${validKeys.join(\", \")}`,\n );\n }\n\n const config = await getConfig();\n const value = getNestedValue(config as unknown as Record<string, unknown>, args.key);\n\n success({ [args.key]: value });\n\n if (!isJsonMode()) {\n console.log(`${args.key}: ${value}`);\n }\n break;\n }\n\n case \"set\": {\n if (!args.key || args.value === undefined) {\n error(\"ARGS_REQUIRED\", \"Configuration key and value required\");\n }\n\n if (!validKeys.includes(args.key)) {\n error(\n \"INVALID_KEY\",\n `Invalid configuration key: ${args.key}`,\n `Valid keys: ${validKeys.join(\", \")}`,\n );\n }\n\n let parsedValue: string | boolean | number = args.value;\n\n if (args.key === \"requestTimeout\") {\n parsedValue = parseInt(args.value, 10);\n }\n if (args.key === \"autoUpdate\") {\n const raw = String(args.value).toLowerCase();\n if (raw === \"true\") parsedValue = true;\n else if (raw === \"false\") parsedValue = false;\n else if (raw === \"notify\") parsedValue = \"notify\";\n else {\n error(\"INVALID_VALUE\", \"autoUpdate must be one of: true, false, notify\");\n }\n }\n\n const userConfig = await loadUserConfig();\n setNestedValue(userConfig as unknown as Record<string, unknown>, args.key, parsedValue);\n await saveUserConfig(userConfig);\n clearConfigCache();\n\n success({ [args.key]: parsedValue });\n\n if (!isJsonMode()) {\n successMessage(`Set ${args.key} = ${parsedValue}`);\n }\n break;\n }\n\n case \"list\": {\n const config = await getConfig();\n const userConfig = await loadUserConfig();\n\n success({\n ...config,\n userConfig,\n });\n\n if (!isJsonMode()) {\n console.log(\"Configuration:\");\n console.log(` issuer: ${config.issuer}`);\n console.log(` walletDir: ${config.walletDir}`);\n console.log(` defaultWallet: ${config.defaultWallet || \"(not set)\"}`);\n console.log(` autoUpdate: ${config.autoUpdate}`);\n console.log(` passwordMinLength: ${config.passwordMinLength}`);\n console.log(` tokenCacheDir: ${config.tokenCacheDir}`);\n console.log(` requestTimeout: ${config.requestTimeout}`);\n console.log(` spacetime.host: ${config.spacetime.host}`);\n console.log(` spacetime.module: ${config.spacetime.module}`);\n\n if (Object.keys(userConfig).length > 0) {\n console.log(\"\\nUser overrides:\");\n for (const [key, value] of Object.entries(userConfig)) {\n console.log(` ${key}: ${JSON.stringify(value)}`);\n }\n }\n }\n break;\n }\n\n default:\n error(\"INVALID_ACTION\", `Invalid action: ${action}`, \"Use: get, set, list\");\n }\n } catch (err) {\n error(\"CONFIG_ERROR\", err instanceof Error ? err.message : \"Configuration error\");\n }\n },\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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\n// The tagged union or sum type for the algebraic type `ActionEventType`.\nexport const ActionEventType = __t.enum(\"ActionEventType\", {\n Issued: __t.unit(),\n Completed: __t.unit(),\n Skipped: __t.unit(),\n Failed: __t.unit(),\n Expired: __t.unit(),\n});\nexport type ActionEventType = __Infer<typeof ActionEventType>;\n\n// The tagged union or sum type for the algebraic type `ActionKind`.\nexport const ActionKind = __t.enum(\"ActionKind\", {\n Repair: __t.unit(),\n Inbox: __t.unit(),\n Vote: __t.unit(),\n Propose: __t.unit(),\n ContinueTask: __t.unit(),\n ClaimTask: __t.unit(),\n ProjectSetup: __t.unit(),\n CreateTasks: __t.unit(),\n ValidateReviews: __t.unit(),\n ReviewDiscovery: __t.unit(),\n Idle: __t.unit(),\n});\nexport type ActionKind = __Infer<typeof ActionKind>;\n\n// The tagged union or sum type for the algebraic type `ActionStatus`.\nexport const ActionStatus = __t.enum(\"ActionStatus\", {\n Issued: __t.unit(),\n Completed: __t.unit(),\n Skipped: __t.unit(),\n Failed: __t.unit(),\n Expired: __t.unit(),\n});\nexport type ActionStatus = __Infer<typeof ActionStatus>;\n\nexport const Agent = __t.object(\"Agent\", {\n id: __t.string(),\n name: __t.string(),\n bio: __t.string(),\n get role() {\n return AgentRole;\n },\n capabilities: __t.array(__t.string()),\n get status() {\n return AgentStatus;\n },\n zenonAddress: __t.string(),\n identity: __t.identity(),\n lastHeartbeat: __t.timestamp(),\n currentTaskId: __t.option(__t.u64()),\n createdAt: __t.timestamp(),\n lastActiveAt: __t.timestamp(),\n});\nexport type Agent = __Infer<typeof Agent>;\n\nexport const AgentAction = __t.object(\"AgentAction\", {\n id: __t.u64(),\n agentId: __t.string(),\n get kind() {\n return ActionKind;\n },\n targetType: __t.option(__t.string()),\n targetId: __t.option(__t.string()),\n reasonCode: __t.string(),\n get status() {\n return ActionStatus;\n },\n createdAt: __t.timestamp(),\n updatedAt: __t.timestamp(),\n});\nexport type AgentAction = __Infer<typeof AgentAction>;\n\nexport const AgentActionEvent = __t.object(\"AgentActionEvent\", {\n id: __t.u64(),\n actionId: __t.u64(),\n agentId: __t.string(),\n get eventType() {\n return ActionEventType;\n },\n eventCode: __t.option(__t.string()),\n note: __t.option(__t.string()),\n createdAt: __t.timestamp(),\n});\nexport type AgentActionEvent = __Infer<typeof AgentActionEvent>;\n\n// The tagged union or sum type for the algebraic type `AgentRole`.\nexport const AgentRole = __t.enum(\"AgentRole\", {\n Zoe: __t.unit(),\n Admin: __t.unit(),\n Zeno: __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 Online: __t.unit(),\n Offline: __t.unit(),\n Working: __t.unit(),\n});\nexport type AgentStatus = __Infer<typeof AgentStatus>;\n\nexport const AgentVoiceCounter = __t.object(\"AgentVoiceCounter\", {\n agentId: __t.identity(),\n nextSeq: __t.u64(),\n});\nexport type AgentVoiceCounter = __Infer<typeof AgentVoiceCounter>;\n\n// The tagged union or sum type for the algebraic type `AnnouncementStatus`.\nexport const AnnouncementStatus = __t.enum(\"AnnouncementStatus\", {\n Pending: __t.unit(),\n Ready: __t.unit(),\n Failed: __t.unit(),\n});\nexport type AnnouncementStatus = __Infer<typeof AnnouncementStatus>;\n\nexport const Channel = __t.object(\"Channel\", {\n id: __t.u64(),\n name: __t.string(),\n createdBy: __t.string(),\n createdAt: __t.timestamp(),\n});\nexport type Channel = __Infer<typeof Channel>;\n\nexport const Config = __t.object(\"Config\", {\n key: __t.string(),\n value: __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 Blocks: __t.unit(),\n ParentChild: __t.unit(),\n});\nexport type DependencyType = __Infer<typeof DependencyType>;\n\nexport const DimensionScore = __t.object(\"DimensionScore\", {\n dimension: __t.string(),\n score: __t.u8(),\n});\nexport type DimensionScore = __Infer<typeof DimensionScore>;\n\nexport const DiscoveredTask = __t.object(\"DiscoveredTask\", {\n id: __t.u64(),\n discoveredBy: __t.string(),\n currentTaskId: __t.u64(),\n projectId: __t.u64(),\n title: __t.string(),\n description: __t.string(),\n priority: __t.u8(),\n taskType: __t.string(),\n severity: __t.string(),\n get status() {\n return DiscoveredTaskStatus;\n },\n createdTaskId: __t.option(__t.u64()),\n rejectionReason: __t.option(__t.string()),\n createdAt: __t.timestamp(),\n reviewedAt: __t.option(__t.timestamp()),\n reviewedBy: __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 PendingReview: __t.unit(),\n Approved: __t.unit(),\n Rejected: __t.unit(),\n EscalatedToIdea: __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 ApproveAsTask: __t.unit(),\n Reject: __t.unit(),\n EscalateToIdea: __t.unit(),\n});\nexport type DiscoveryDecision = __Infer<typeof DiscoveryDecision>;\n\nexport const EvaluationDimension = __t.object(\"EvaluationDimension\", {\n id: __t.u64(),\n name: __t.string(),\n label: __t.string(),\n weight: __t.f64(),\n minScore: __t.u8(),\n maxScore: __t.u8(),\n description: __t.string(),\n active: __t.bool(),\n sortOrder: __t.u16(),\n});\nexport type EvaluationDimension = __Infer<typeof EvaluationDimension>;\n\nexport const GenerateVoiceResult = __t.object(\"GenerateVoiceResult\", {\n id: __t.u64(),\n seq: __t.u64(),\n agentName: __t.string(),\n keyPrefix: __t.string(),\n});\nexport type GenerateVoiceResult = __Infer<typeof GenerateVoiceResult>;\n\nexport const Idea = __t.object(\"Idea\", {\n id: __t.u64(),\n title: __t.string(),\n description: __t.string(),\n category: __t.string(),\n get status() {\n return IdeaStatus;\n },\n activeAgentCount: __t.u32(),\n quorum: __t.u16(),\n approvalThreshold: __t.u16(),\n vetoThreshold: __t.u16(),\n upVotes: __t.u16(),\n downVotes: __t.u16(),\n vetoCount: __t.u16(),\n totalVotes: __t.u16(),\n createdBy: __t.string(),\n createdAt: __t.timestamp(),\n updatedAt: __t.timestamp(),\n computedScore: __t.f64(),\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 Voting: __t.unit(),\n ApprovedForProject: __t.unit(),\n Rejected: __t.unit(),\n Implemented: __t.unit(),\n});\nexport type IdeaStatus = __Infer<typeof IdeaStatus>;\n\nexport const IdentityRole = __t.object(\"IdentityRole\", {\n identity: __t.identity(),\n get role() {\n return AgentRole;\n },\n});\nexport type IdentityRole = __Infer<typeof IdentityRole>;\n\nexport const Message = __t.object(\"Message\", {\n id: __t.u64(),\n channelId: __t.u64(),\n senderId: __t.string(),\n content: __t.string(),\n get messageType() {\n return MessageType;\n },\n contextId: __t.option(__t.string()),\n createdAt: __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 User: __t.unit(),\n System: __t.unit(),\n Directive: __t.unit(),\n});\nexport type MessageType = __Infer<typeof MessageType>;\n\nexport const Project = __t.object(\"Project\", {\n id: __t.u64(),\n sourceIdeaId: __t.u64(),\n name: __t.string(),\n githubRepo: __t.string(),\n description: __t.string(),\n get status() {\n return ProjectStatus;\n },\n createdAt: __t.timestamp(),\n createdBy: __t.string(),\n});\nexport type Project = __Infer<typeof Project>;\n\nexport const ProjectChannel = __t.object(\"ProjectChannel\", {\n projectId: __t.u64(),\n createdAt: __t.timestamp(),\n});\nexport type ProjectChannel = __Infer<typeof ProjectChannel>;\n\nexport const ProjectMessage = __t.object(\"ProjectMessage\", {\n id: __t.u64(),\n projectId: __t.u64(),\n senderId: __t.string(),\n content: __t.string(),\n get messageType() {\n return MessageType;\n },\n contextId: __t.option(__t.string()),\n createdAt: __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 Active: __t.unit(),\n Paused: __t.unit(),\n});\nexport type ProjectStatus = __Infer<typeof ProjectStatus>;\n\nexport const Task = __t.object(\"Task\", {\n id: __t.u64(),\n projectId: __t.u64(),\n title: __t.string(),\n description: __t.string(),\n get status() {\n return TaskStatus;\n },\n assignedTo: __t.option(__t.string()),\n claimedAt: __t.option(__t.timestamp()),\n githubIssueUrl: __t.option(__t.string()),\n githubPrUrl: __t.option(__t.string()),\n priority: __t.u8(),\n sourceIdeaId: __t.option(__t.u64()),\n reviewCount: __t.u8(),\n get blockedFromStatus() {\n return __t.option(TaskStatus);\n },\n archivedReason: __t.option(__t.string()),\n statusChangedBy: __t.option(__t.identity()),\n statusChangedAt: __t.option(__t.timestamp()),\n createdAt: __t.timestamp(),\n updatedAt: __t.timestamp(),\n createdBy: __t.string(),\n});\nexport type Task = __Infer<typeof Task>;\n\nexport const TaskDependency = __t.object(\"TaskDependency\", {\n id: __t.u64(),\n taskId: __t.u64(),\n dependsOnId: __t.u64(),\n get dependencyType() {\n return DependencyType;\n },\n createdAt: __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 Open: __t.unit(),\n Claimed: __t.unit(),\n InProgress: __t.unit(),\n Review: __t.unit(),\n Completed: __t.unit(),\n Blocked: __t.unit(),\n Archived: __t.unit(),\n});\nexport type TaskStatus = __Infer<typeof TaskStatus>;\n\nexport const VoiceAllowedHost = __t.object(\"VoiceAllowedHost\", {\n host: __t.string(),\n});\nexport type VoiceAllowedHost = __Infer<typeof VoiceAllowedHost>;\n\nexport const VoiceAnnouncement = __t.object(\"VoiceAnnouncement\", {\n id: __t.u64(),\n agentId: __t.identity(),\n seq: __t.u64(),\n agentName: __t.string(),\n transcript: __t.string(),\n audioUrl: __t.string(),\n get status() {\n return AnnouncementStatus;\n },\n contextType: __t.option(__t.string()),\n contextId: __t.option(__t.u64()),\n finalizedAt: __t.option(__t.timestamp()),\n failedAt: __t.option(__t.timestamp()),\n errorMessage: __t.option(__t.string()),\n createdAt: __t.timestamp(),\n});\nexport type VoiceAnnouncement = __Infer<typeof VoiceAnnouncement>;\n\nexport const Vote = __t.object(\"Vote\", {\n id: __t.u64(),\n ideaId: __t.u64(),\n agentId: __t.string(),\n get voteType() {\n return VoteType;\n },\n get scores() {\n return __t.array(DimensionScore);\n },\n createdAt: __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 Up: __t.unit(),\n Down: __t.unit(),\n Veto: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nimport { DependencyType } from \"./types\";\n\nexport default {\n taskId: __t.u64(),\n dependsOnId: __t.u64(),\n get dependencyType() {\n return DependencyType;\n },\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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nexport default {\n taskId: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nexport default {\n sourceIdeaId: __t.u64(),\n name: __t.string(),\n githubRepo: __t.string(),\n description: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nexport default {\n projectId: __t.u64(),\n title: __t.string(),\n description: __t.string(),\n priority: __t.u8(),\n sourceIdeaId: __t.option(__t.u64()),\n githubIssueUrl: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nexport default {\n currentTaskId: __t.u64(),\n projectId: __t.u64(),\n title: __t.string(),\n description: __t.string(),\n priority: __t.u8(),\n taskType: __t.string(),\n severity: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nexport default {\n announcementId: __t.u64(),\n errorMessage: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nexport default {\n announcementId: __t.u64(),\n audioUrl: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nexport default {\n agentId: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nimport { ActionKind } from \"./types\";\n\nexport default {\n agentId: __t.string(),\n get kind() {\n return ActionKind;\n },\n targetType: __t.option(__t.string()),\n targetId: __t.option(__t.string()),\n reasonCode: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nexport default {\n ideaId: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nexport default {\n title: __t.string(),\n description: __t.string(),\n category: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nimport { AgentRole } from \"./types\";\n\nexport default {\n agentId: __t.string(),\n name: __t.string(),\n zenonAddress: __t.string(),\n get role() {\n return __t.option(AgentRole);\n },\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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nimport { DiscoveryDecision } from \"./types\";\n\nexport default {\n discoveryId: __t.u64(),\n get decision() {\n return DiscoveryDecision;\n },\n reason: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nimport { MessageType } from \"./types\";\n\nexport default {\n channelId: __t.u64(),\n content: __t.string(),\n get messageType() {\n return MessageType;\n },\n contextId: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nimport { MessageType } from \"./types\";\n\nexport default {\n projectId: __t.u64(),\n content: __t.string(),\n get messageType() {\n return MessageType;\n },\n contextId: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nimport { AgentStatus } from \"./types\";\n\nexport default {\n get status() {\n return AgentStatus;\n },\n taskId: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nimport { ActionEventType } from \"./types\";\n\nexport default {\n actionId: __t.u64(),\n get eventType() {\n return ActionEventType;\n },\n eventCode: __t.option(__t.string()),\n note: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nexport default {\n bio: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nexport default {\n capabilities: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nimport { ProjectStatus } from \"./types\";\n\nexport default {\n projectId: __t.u64(),\n get status() {\n return ProjectStatus;\n },\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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nimport { TaskStatus } from \"./types\";\n\nexport default {\n taskId: __t.u64(),\n get status() {\n return TaskStatus;\n },\n githubPrUrl: __t.option(__t.string()),\n archiveReason: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nimport { DimensionScore } from \"./types\";\n\nexport default {\n ideaId: __t.u64(),\n get scores() {\n return __t.array(DimensionScore);\n },\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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nimport { GenerateVoiceResult } from \"./types\";\n\nexport const params = {\n transcript: __t.string(),\n audioUrl: __t.option(__t.string()),\n contextType: __t.option(__t.string()),\n};\nexport const returnType = __t.result(GenerateVoiceResult, __t.string());\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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\nimport { ActionEventType } from \"./types\";\n\nexport default __t.row({\n id: __t.u64().primaryKey(),\n actionId: __t.u64().name(\"action_id\"),\n agentId: __t.string().name(\"agent_id\"),\n get eventType() {\n return ActionEventType.name(\"event_type\");\n },\n eventCode: __t.option(__t.string()).name(\"event_code\"),\n note: __t.option(__t.string()),\n createdAt: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\nimport { ActionKind, ActionStatus } from \"./types\";\n\nexport default __t.row({\n id: __t.u64().primaryKey(),\n agentId: __t.string().name(\"agent_id\"),\n get kind() {\n return ActionKind;\n },\n targetType: __t.option(__t.string()).name(\"target_type\"),\n targetId: __t.option(__t.string()).name(\"target_id\"),\n reasonCode: __t.string().name(\"reason_code\"),\n get status() {\n return ActionStatus;\n },\n createdAt: __t.timestamp().name(\"created_at\"),\n updatedAt: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\nimport { AgentRole, AgentStatus } from \"./types\";\n\nexport default __t.row({\n id: __t.string().primaryKey(),\n name: __t.string(),\n bio: __t.string(),\n get role() {\n return AgentRole;\n },\n capabilities: __t.array(__t.string()),\n get status() {\n return AgentStatus;\n },\n zenonAddress: __t.string().name(\"zenon_address\"),\n identity: __t.identity(),\n lastHeartbeat: __t.timestamp().name(\"last_heartbeat\"),\n currentTaskId: __t.option(__t.u64()).name(\"current_task_id\"),\n createdAt: __t.timestamp().name(\"created_at\"),\n lastActiveAt: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nexport default __t.row({\n id: __t.u64().primaryKey(),\n name: __t.string(),\n createdBy: __t.string().name(\"created_by\"),\n createdAt: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nexport default __t.row({\n key: __t.string().primaryKey(),\n value: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\nimport { DiscoveredTaskStatus } from \"./types\";\n\nexport default __t.row({\n id: __t.u64().primaryKey(),\n discoveredBy: __t.string().name(\"discovered_by\"),\n currentTaskId: __t.u64().name(\"current_task_id\"),\n projectId: __t.u64().name(\"project_id\"),\n title: __t.string(),\n description: __t.string(),\n priority: __t.u8(),\n taskType: __t.string().name(\"task_type\"),\n severity: __t.string(),\n get status() {\n return DiscoveredTaskStatus;\n },\n createdTaskId: __t.option(__t.u64()).name(\"created_task_id\"),\n rejectionReason: __t.option(__t.string()).name(\"rejection_reason\"),\n createdAt: __t.timestamp().name(\"created_at\"),\n reviewedAt: __t.option(__t.timestamp()).name(\"reviewed_at\"),\n reviewedBy: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nexport default __t.row({\n id: __t.u64().primaryKey(),\n name: __t.string(),\n label: __t.string(),\n weight: __t.f64(),\n minScore: __t.u8().name(\"min_score\"),\n maxScore: __t.u8().name(\"max_score\"),\n description: __t.string(),\n active: __t.bool(),\n sortOrder: __t.u16().name(\"sort_order\"),\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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\nimport { IdeaStatus } from \"./types\";\n\nexport default __t.row({\n id: __t.u64().primaryKey(),\n title: __t.string(),\n description: __t.string(),\n category: __t.string(),\n get status() {\n return IdeaStatus;\n },\n activeAgentCount: __t.u32().name(\"active_agent_count\"),\n quorum: __t.u16(),\n approvalThreshold: __t.u16().name(\"approval_threshold\"),\n vetoThreshold: __t.u16().name(\"veto_threshold\"),\n upVotes: __t.u16().name(\"up_votes\"),\n downVotes: __t.u16().name(\"down_votes\"),\n vetoCount: __t.u16().name(\"veto_count\"),\n totalVotes: __t.u16().name(\"total_votes\"),\n createdBy: __t.string().name(\"created_by\"),\n createdAt: __t.timestamp().name(\"created_at\"),\n updatedAt: __t.timestamp().name(\"updated_at\"),\n computedScore: __t.f64().name(\"computed_score\"),\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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\nimport { AgentRole } from \"./types\";\n\nexport default __t.row({\n identity: __t.identity().primaryKey(),\n get role() {\n return AgentRole;\n },\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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\nimport { MessageType } from \"./types\";\n\nexport default __t.row({\n id: __t.u64().primaryKey(),\n channelId: __t.u64().name(\"channel_id\"),\n senderId: __t.string().name(\"sender_id\"),\n content: __t.string(),\n get messageType() {\n return MessageType.name(\"message_type\");\n },\n contextId: __t.option(__t.string()).name(\"context_id\"),\n createdAt: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nexport default __t.row({\n projectId: __t.u64().primaryKey().name(\"project_id\"),\n createdAt: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\nimport { MessageType } from \"./types\";\n\nexport default __t.row({\n id: __t.u64().primaryKey(),\n projectId: __t.u64().name(\"project_id\"),\n senderId: __t.string().name(\"sender_id\"),\n content: __t.string(),\n get messageType() {\n return MessageType.name(\"message_type\");\n },\n contextId: __t.option(__t.string()).name(\"context_id\"),\n createdAt: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\nimport { ProjectStatus } from \"./types\";\n\nexport default __t.row({\n id: __t.u64().primaryKey(),\n sourceIdeaId: __t.u64().name(\"source_idea_id\"),\n name: __t.string(),\n githubRepo: __t.string().name(\"github_repo\"),\n description: __t.string(),\n get status() {\n return ProjectStatus;\n },\n createdAt: __t.timestamp().name(\"created_at\"),\n createdBy: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\nimport { DependencyType } from \"./types\";\n\nexport default __t.row({\n id: __t.u64().primaryKey(),\n taskId: __t.u64().name(\"task_id\"),\n dependsOnId: __t.u64().name(\"depends_on_id\"),\n get dependencyType() {\n return DependencyType.name(\"dependency_type\");\n },\n createdAt: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\nimport { TaskStatus } from \"./types\";\n\nexport default __t.row({\n id: __t.u64().primaryKey(),\n projectId: __t.u64().name(\"project_id\"),\n title: __t.string(),\n description: __t.string(),\n get status() {\n return TaskStatus;\n },\n assignedTo: __t.option(__t.string()).name(\"assigned_to\"),\n claimedAt: __t.option(__t.timestamp()).name(\"claimed_at\"),\n githubIssueUrl: __t.option(__t.string()).name(\"github_issue_url\"),\n githubPrUrl: __t.option(__t.string()).name(\"github_pr_url\"),\n priority: __t.u8(),\n sourceIdeaId: __t.option(__t.u64()).name(\"source_idea_id\"),\n reviewCount: __t.u8().name(\"review_count\"),\n get blockedFromStatus() {\n return __t.option(TaskStatus).name(\"blocked_from_status\");\n },\n archivedReason: __t.option(__t.string()).name(\"archived_reason\"),\n statusChangedBy: __t.option(__t.identity()).name(\"status_changed_by\"),\n statusChangedAt: __t.option(__t.timestamp()).name(\"status_changed_at\"),\n createdAt: __t.timestamp().name(\"created_at\"),\n updatedAt: __t.timestamp().name(\"updated_at\"),\n createdBy: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\nimport { AnnouncementStatus } from \"./types\";\n\nexport default __t.row({\n id: __t.u64().primaryKey(),\n agentId: __t.identity().name(\"agent_id\"),\n seq: __t.u64(),\n agentName: __t.string().name(\"agent_name\"),\n transcript: __t.string(),\n audioUrl: __t.string().name(\"audio_url\"),\n get status() {\n return AnnouncementStatus;\n },\n contextType: __t.option(__t.string()).name(\"context_type\"),\n contextId: __t.option(__t.u64()).name(\"context_id\"),\n finalizedAt: __t.option(__t.timestamp()).name(\"finalized_at\"),\n failedAt: __t.option(__t.timestamp()).name(\"failed_at\"),\n errorMessage: __t.option(__t.string()).name(\"error_message\"),\n createdAt: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\nimport { DimensionScore, VoteType } from \"./types\";\n\nexport default __t.row({\n id: __t.u64().primaryKey(),\n ideaId: __t.u64().name(\"idea_id\"),\n agentId: __t.string().name(\"agent_id\"),\n get voteType() {\n return VoteType.name(\"vote_type\");\n },\n get scores() {\n return __t.array(DimensionScore);\n },\n createdAt: __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.2.0 (commit eb11e2f5c41dce6979715ad407996270d61329f6).\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n DbConnectionBuilder as __DbConnectionBuilder,\n DbConnectionImpl as __DbConnectionImpl,\n SubscriptionBuilderImpl as __SubscriptionBuilderImpl,\n TypeBuilder as __TypeBuilder,\n Uuid as __Uuid,\n convertToAccessorMap as __convertToAccessorMap,\n makeQueryBuilder as __makeQueryBuilder,\n procedureSchema as __procedureSchema,\n procedures as __procedures,\n reducerSchema as __reducerSchema,\n reducers as __reducers,\n schema as __schema,\n t as __t,\n table as __table,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type DbConnectionConfig as __DbConnectionConfig,\n type ErrorContextInterface as __ErrorContextInterface,\n type Event as __Event,\n type EventContextInterface as __EventContextInterface,\n type Infer as __Infer,\n type QueryBuilder as __QueryBuilder,\n type ReducerEventContextInterface as __ReducerEventContextInterface,\n type RemoteModule as __RemoteModule,\n type SubscriptionEventContextInterface as __SubscriptionEventContextInterface,\n type SubscriptionHandleImpl as __SubscriptionHandleImpl,\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 FailVoiceAnnouncementReducer from \"./fail_voice_announcement_reducer\";\nimport FinalizeVoiceAnnouncementReducer from \"./finalize_voice_announcement_reducer\";\nimport HeartbeatReducer from \"./heartbeat_reducer\";\nimport IssueAgentActionReducer from \"./issue_agent_action_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 SeedVoiceAnnouncementsReducer from \"./seed_voice_announcements_reducer\";\nimport SendMessageReducer from \"./send_message_reducer\";\nimport SendProjectMessageReducer from \"./send_project_message_reducer\";\nimport SetAgentStatusReducer from \"./set_agent_status_reducer\";\nimport UpdateAgentActionReducer from \"./update_agent_action_reducer\";\nimport UpdateAgentBioReducer from \"./update_agent_bio_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\nimport * as GenerateVoiceProcedure from \"./generate_voice_procedure\";\n\n// Import all table schema definitions\nimport AgentActionEventsRow from \"./agent_action_events_table\";\nimport AgentActionsRow from \"./agent_actions_table\";\nimport AgentsRow from \"./agents_table\";\nimport ChannelsRow from \"./channels_table\";\nimport ConfigRow from \"./config_table\";\nimport DiscoveredTasksRow from \"./discovered_tasks_table\";\nimport EvaluationDimensionsRow from \"./evaluation_dimensions_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 VoiceAnnouncementsRow from \"./voice_announcements_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 agent_action_events: __table(\n {\n name: \"agent_action_events\",\n indexes: [\n {\n accessor: \"by_action\",\n name: \"agent_action_events_action_id_created_at_idx_btree\",\n algorithm: \"btree\",\n columns: [\"actionId\", \"createdAt\"],\n },\n {\n accessor: \"id\",\n name: \"agent_action_events_id_idx_btree\",\n algorithm: \"btree\",\n columns: [\"id\"],\n },\n ],\n constraints: [{ name: \"agent_action_events_id_key\", constraint: \"unique\", columns: [\"id\"] }],\n event: true,\n },\n AgentActionEventsRow,\n ),\n agent_actions: __table(\n {\n name: \"agent_actions\",\n indexes: [\n {\n accessor: \"by_agent_created\",\n name: \"agent_actions_agent_id_created_at_idx_btree\",\n algorithm: \"btree\",\n columns: [\"agentId\", \"createdAt\"],\n },\n {\n accessor: \"by_agent_id\",\n name: \"agent_actions_agent_id_idx_btree\",\n algorithm: \"btree\",\n columns: [\"agentId\"],\n },\n { accessor: \"id\", name: \"agent_actions_id_idx_btree\", algorithm: \"btree\", columns: [\"id\"] },\n ],\n constraints: [{ name: \"agent_actions_id_key\", constraint: \"unique\", columns: [\"id\"] }],\n },\n AgentActionsRow,\n ),\n agents: __table(\n {\n name: \"agents\",\n indexes: [\n { accessor: \"id\", name: \"agents_id_idx_btree\", algorithm: \"btree\", columns: [\"id\"] },\n {\n accessor: \"identity\",\n name: \"agents_identity_idx_btree\",\n algorithm: \"btree\",\n columns: [\"identity\"],\n },\n ],\n constraints: [\n { name: \"agents_id_key\", constraint: \"unique\", columns: [\"id\"] },\n { name: \"agents_identity_key\", constraint: \"unique\", columns: [\"identity\"] },\n ],\n },\n AgentsRow,\n ),\n channels: __table(\n {\n name: \"channels\",\n indexes: [\n { accessor: \"id\", name: \"channels_id_idx_btree\", algorithm: \"btree\", columns: [\"id\"] },\n {\n accessor: \"by_name\",\n name: \"channels_name_idx_btree\",\n algorithm: \"btree\",\n columns: [\"name\"],\n },\n ],\n constraints: [{ name: \"channels_id_key\", constraint: \"unique\", columns: [\"id\"] }],\n },\n ChannelsRow,\n ),\n config: __table(\n {\n name: \"config\",\n indexes: [\n { accessor: \"key\", name: \"config_key_idx_btree\", algorithm: \"btree\", columns: [\"key\"] },\n ],\n constraints: [{ name: \"config_key_key\", constraint: \"unique\", columns: [\"key\"] }],\n },\n ConfigRow,\n ),\n discovered_tasks: __table(\n {\n name: \"discovered_tasks\",\n indexes: [\n {\n accessor: \"by_created_at\",\n name: \"discovered_tasks_created_at_idx_btree\",\n algorithm: \"btree\",\n columns: [\"createdAt\"],\n },\n {\n accessor: \"id\",\n name: \"discovered_tasks_id_idx_btree\",\n algorithm: \"btree\",\n columns: [\"id\"],\n },\n {\n accessor: \"by_priority\",\n name: \"discovered_tasks_priority_idx_btree\",\n algorithm: \"btree\",\n columns: [\"priority\"],\n },\n {\n accessor: \"by_status\",\n name: \"discovered_tasks_status_idx_btree\",\n algorithm: \"btree\",\n columns: [\"status\"],\n },\n ],\n constraints: [{ name: \"discovered_tasks_id_key\", constraint: \"unique\", columns: [\"id\"] }],\n },\n DiscoveredTasksRow,\n ),\n evaluation_dimensions: __table(\n {\n name: \"evaluation_dimensions\",\n indexes: [\n {\n accessor: \"by_active\",\n name: \"evaluation_dimensions_active_sort_order_idx_btree\",\n algorithm: \"btree\",\n columns: [\"active\", \"sortOrder\"],\n },\n {\n accessor: \"id\",\n name: \"evaluation_dimensions_id_idx_btree\",\n algorithm: \"btree\",\n columns: [\"id\"],\n },\n ],\n constraints: [\n { name: \"evaluation_dimensions_id_key\", constraint: \"unique\", columns: [\"id\"] },\n ],\n },\n EvaluationDimensionsRow,\n ),\n ideas: __table(\n {\n name: \"ideas\",\n indexes: [\n { accessor: \"id\", name: \"ideas_id_idx_btree\", algorithm: \"btree\", columns: [\"id\"] },\n {\n accessor: \"by_status\",\n name: \"ideas_status_idx_btree\",\n algorithm: \"btree\",\n columns: [\"status\"],\n },\n ],\n constraints: [{ name: \"ideas_id_key\", constraint: \"unique\", columns: [\"id\"] }],\n },\n IdeasRow,\n ),\n identity_roles: __table(\n {\n name: \"identity_roles\",\n indexes: [\n {\n accessor: \"identity\",\n name: \"identity_roles_identity_idx_btree\",\n algorithm: \"btree\",\n columns: [\"identity\"],\n },\n ],\n constraints: [\n { name: \"identity_roles_identity_key\", constraint: \"unique\", columns: [\"identity\"] },\n ],\n },\n IdentityRolesRow,\n ),\n messages: __table(\n {\n name: \"messages\",\n indexes: [\n {\n accessor: \"by_channel\",\n name: \"messages_channel_id_created_at_idx_btree\",\n algorithm: \"btree\",\n columns: [\"channelId\", \"createdAt\"],\n },\n { accessor: \"id\", name: \"messages_id_idx_btree\", algorithm: \"btree\", columns: [\"id\"] },\n ],\n constraints: [{ name: \"messages_id_key\", constraint: \"unique\", columns: [\"id\"] }],\n },\n MessagesRow,\n ),\n project_channels: __table(\n {\n name: \"project_channels\",\n indexes: [\n {\n accessor: \"project_id\",\n name: \"project_channels_project_id_idx_btree\",\n algorithm: \"btree\",\n columns: [\"projectId\"],\n },\n ],\n constraints: [\n { name: \"project_channels_project_id_key\", constraint: \"unique\", columns: [\"projectId\"] },\n ],\n },\n ProjectChannelsRow,\n ),\n project_messages: __table(\n {\n name: \"project_messages\",\n indexes: [\n {\n accessor: \"id\",\n name: \"project_messages_id_idx_btree\",\n algorithm: \"btree\",\n columns: [\"id\"],\n },\n {\n accessor: \"by_project\",\n name: \"project_messages_project_id_idx_btree\",\n algorithm: \"btree\",\n columns: [\"projectId\"],\n },\n ],\n constraints: [{ name: \"project_messages_id_key\", constraint: \"unique\", columns: [\"id\"] }],\n },\n ProjectMessagesRow,\n ),\n projects: __table(\n {\n name: \"projects\",\n indexes: [\n { accessor: \"id\", name: \"projects_id_idx_btree\", algorithm: \"btree\", columns: [\"id\"] },\n {\n accessor: \"by_source_idea_id\",\n name: \"projects_source_idea_id_idx_btree\",\n algorithm: \"btree\",\n columns: [\"sourceIdeaId\"],\n },\n ],\n constraints: [{ name: \"projects_id_key\", constraint: \"unique\", columns: [\"id\"] }],\n },\n ProjectsRow,\n ),\n task_dependencies: __table(\n {\n name: \"task_dependencies\",\n indexes: [\n {\n accessor: \"by_depends_on_id\",\n name: \"task_dependencies_depends_on_id_idx_btree\",\n algorithm: \"btree\",\n columns: [\"dependsOnId\"],\n },\n {\n accessor: \"id\",\n name: \"task_dependencies_id_idx_btree\",\n algorithm: \"btree\",\n columns: [\"id\"],\n },\n {\n accessor: \"by_task_id\",\n name: \"task_dependencies_task_id_idx_btree\",\n algorithm: \"btree\",\n columns: [\"taskId\"],\n },\n ],\n constraints: [{ name: \"task_dependencies_id_key\", constraint: \"unique\", columns: [\"id\"] }],\n },\n TaskDependenciesRow,\n ),\n tasks: __table(\n {\n name: \"tasks\",\n indexes: [\n {\n accessor: \"by_assigned_to\",\n name: \"tasks_assigned_to_idx_btree\",\n algorithm: \"btree\",\n columns: [\"assignedTo\"],\n },\n { accessor: \"id\", name: \"tasks_id_idx_btree\", algorithm: \"btree\", columns: [\"id\"] },\n {\n accessor: \"by_priority\",\n name: \"tasks_priority_idx_btree\",\n algorithm: \"btree\",\n columns: [\"priority\"],\n },\n {\n accessor: \"by_project_id\",\n name: \"tasks_project_id_idx_btree\",\n algorithm: \"btree\",\n columns: [\"projectId\"],\n },\n {\n accessor: \"by_status\",\n name: \"tasks_status_idx_btree\",\n algorithm: \"btree\",\n columns: [\"status\"],\n },\n ],\n constraints: [{ name: \"tasks_id_key\", constraint: \"unique\", columns: [\"id\"] }],\n },\n TasksRow,\n ),\n voice_announcements: __table(\n {\n name: \"voice_announcements\",\n indexes: [\n {\n accessor: \"by_agent\",\n name: \"voice_announcements_agent_id_created_at_idx_btree\",\n algorithm: \"btree\",\n columns: [\"agentId\", \"createdAt\"],\n },\n {\n accessor: \"id\",\n name: \"voice_announcements_id_idx_btree\",\n algorithm: \"btree\",\n columns: [\"id\"],\n },\n {\n accessor: \"by_status\",\n name: \"voice_announcements_status_created_at_idx_btree\",\n algorithm: \"btree\",\n columns: [\"status\", \"createdAt\"],\n },\n ],\n constraints: [{ name: \"voice_announcements_id_key\", constraint: \"unique\", columns: [\"id\"] }],\n },\n VoiceAnnouncementsRow,\n ),\n votes: __table(\n {\n name: \"votes\",\n indexes: [\n { accessor: \"id\", name: \"votes_id_idx_btree\", algorithm: \"btree\", columns: [\"id\"] },\n {\n accessor: \"by_idea_agent\",\n name: \"votes_idea_id_agent_id_idx_btree\",\n algorithm: \"btree\",\n columns: [\"ideaId\", \"agentId\"],\n },\n {\n accessor: \"by_idea\",\n name: \"votes_idea_id_idx_btree\",\n algorithm: \"btree\",\n columns: [\"ideaId\"],\n },\n ],\n constraints: [{ name: \"votes_id_key\", constraint: \"unique\", columns: [\"id\"] }],\n },\n VotesRow,\n ),\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 __reducerSchema(\"add_task_dependency\", AddTaskDependencyReducer),\n __reducerSchema(\"claim_task\", ClaimTaskReducer),\n __reducerSchema(\"create_project\", CreateProjectReducer),\n __reducerSchema(\"create_task\", CreateTaskReducer),\n __reducerSchema(\"discover_task\", DiscoverTaskReducer),\n __reducerSchema(\"fail_voice_announcement\", FailVoiceAnnouncementReducer),\n __reducerSchema(\"finalize_voice_announcement\", FinalizeVoiceAnnouncementReducer),\n __reducerSchema(\"heartbeat\", HeartbeatReducer),\n __reducerSchema(\"issue_agent_action\", IssueAgentActionReducer),\n __reducerSchema(\"mark_idea_implemented\", MarkIdeaImplementedReducer),\n __reducerSchema(\"propose_idea\", ProposeIdeaReducer),\n __reducerSchema(\"register_agent\", RegisterAgentReducer),\n __reducerSchema(\"review_discovered_task\", ReviewDiscoveredTaskReducer),\n __reducerSchema(\"seed_ui_data\", SeedUiDataReducer),\n __reducerSchema(\"seed_voice_announcements\", SeedVoiceAnnouncementsReducer),\n __reducerSchema(\"send_message\", SendMessageReducer),\n __reducerSchema(\"send_project_message\", SendProjectMessageReducer),\n __reducerSchema(\"set_agent_status\", SetAgentStatusReducer),\n __reducerSchema(\"update_agent_action\", UpdateAgentActionReducer),\n __reducerSchema(\"update_agent_bio\", UpdateAgentBioReducer),\n __reducerSchema(\"update_agent_capabilities\", UpdateAgentCapabilitiesReducer),\n __reducerSchema(\"update_project_status\", UpdateProjectStatusReducer),\n __reducerSchema(\"update_task_status\", UpdateTaskStatusReducer),\n __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 __procedureSchema(\n \"generate_voice\",\n GenerateVoiceProcedure.params,\n GenerateVoiceProcedure.returnType,\n ),\n);\n\n/** The remote SpacetimeDB module schema, both runtime and type information. */\nconst REMOTE_MODULE = {\n versionInfo: {\n cliVersion: \"2.2.0\" as const,\n },\n tables: tablesSchema.schemaType.tables,\n reducers: reducersSchema.reducersType.reducers,\n ...proceduresSchema,\n} satisfies __RemoteModule<\n typeof tablesSchema.schemaType,\n typeof reducersSchema.reducersType,\n typeof 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> = __makeQueryBuilder(\n tablesSchema.schemaType,\n);\n\n/** The reducers available in this remote SpacetimeDB module. */\nexport const reducers = __convertToAccessorMap(reducersSchema.reducersType.reducers);\n\n/** The procedures available in this remote SpacetimeDB module. */\nexport const procedures = __convertToAccessorMap(proceduresSchema.procedures);\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<typeof REMOTE_MODULE>;\n/** The context type returned in callbacks for subscription events. */\nexport type SubscriptionEventContext = __SubscriptionEventContextInterface<typeof REMOTE_MODULE>;\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<typeof REMOTE_MODULE> {}\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 /** Creates a new {@link DbConnectionBuilder} to configure and connect to the remote SpacetimeDB instance. */\n static builder = (): DbConnectionBuilder => {\n return new DbConnectionBuilder(\n REMOTE_MODULE,\n (config: __DbConnectionConfig<typeof REMOTE_MODULE>) => new DbConnection(config),\n );\n };\n\n /** Creates a new {@link SubscriptionBuilder} to configure a subscription to the remote SpacetimeDB instance. */\n override subscriptionBuilder = (): SubscriptionBuilder => {\n return new SubscriptionBuilder(this);\n };\n}\n","import type { Identity } from \"spacetimedb\";\nimport { DbConnection, type ErrorContext, type tables } from \"~/module_bindings/index.js\";\n\nexport type {\n Agent,\n Channel,\n Config,\n DiscoveredTask,\n EvaluationDimension,\n Idea,\n IdentityRole,\n Message,\n Project,\n ProjectChannel,\n ProjectMessage,\n Task,\n TaskDependency,\n Vote,\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 host?: string;\n module?: string;\n wallet?: string;\n token?: string;\n subscribe?: boolean;\n onDisconnect?: (...args: unknown[]) => void;\n}\n\nexport interface AuthInfo {\n wallet: string;\n token: string;\n identity: Identity;\n}\n\nexport class CommandContext implements AsyncDisposable {\n readonly conn: DbConnection;\n readonly identity?: Identity;\n readonly token?: string;\n readonly auth?: AuthInfo;\n readonly config: Awaited<ReturnType<typeof getConfig>>;\n\n private disposed = false;\n\n private constructor(\n conn: DbConnection,\n config: Awaited<ReturnType<typeof getConfig>>,\n identity?: Identity,\n token?: string,\n auth?: AuthInfo,\n ) {\n this.conn = conn;\n this.config = config;\n this.identity = identity;\n this.token = token;\n this.auth = auth;\n }\n\n get db() {\n return this.conn.db;\n }\n\n iter<T>(tableName: TableName): T[] {\n const db = this.db as Record<string, { iter?: () => IterableIterator<T> }>;\n const table = db[tableName];\n if (table?.iter) {\n return Array.from(table.iter());\n }\n return [];\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n if (!this.disposed) {\n this.disposed = true;\n this.conn.disconnect();\n }\n }\n\n static async create(options: CommandContextOptions = {}): Promise<CommandContext> {\n const config = await getConfig();\n const host = options.host || config.spacetime.host;\n const moduleName = options.module || config.spacetime.module;\n const walletName = options.wallet || config.defaultWallet;\n\n let token = options.token;\n let auth: AuthInfo | undefined;\n\n if (!token && walletName) {\n const cached = await getCachedToken(walletName);\n if (cached) {\n token = cached.token;\n auth = {\n wallet: walletName,\n token: cached.token,\n identity: undefined as unknown as Identity,\n };\n }\n }\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error(\"Connection timeout\"));\n }, config.requestTimeout);\n\n const originalConsoleLog = console.log;\n const originalConsoleError = console.error;\n const suppressSdkConnectLog = (...logArgs: unknown[]): void => {\n const shouldSuppress = logArgs.some(\n (arg) => typeof arg === \"string\" && arg.includes(\"Connecting to SpacetimeDB WS...\"),\n );\n if (!shouldSuppress) {\n originalConsoleLog(...(logArgs as Parameters<typeof console.log>));\n }\n };\n // Suppress SDK error spam during connection - errors are properly thrown and handled by callers\n const suppressSdkError = (..._logArgs: unknown[]): void => {\n // Errors are handled by onConnectError and rejected properly\n if (process.env.PROBE_DEBUG) {\n originalConsoleError(\"[probe:debug]\", ..._logArgs);\n }\n };\n\n console.log = suppressSdkConnectLog as typeof console.log;\n console.error = suppressSdkError as typeof console.error;\n\n try {\n DbConnection.builder()\n .withUri(host)\n .withDatabaseName(moduleName)\n .withToken(token || undefined)\n .onConnect((conn: DbConnection, identity: Identity, authToken: string) => {\n clearTimeout(timeout);\n\n if (auth) {\n auth.identity = identity;\n }\n\n const shouldSubscribe = options.subscribe !== false;\n\n if (shouldSubscribe) {\n conn\n .subscriptionBuilder()\n .onApplied(() => {\n resolve(new CommandContext(conn, config, identity, authToken, auth));\n })\n .onError((ctx: ErrorContext) => {\n reject(new Error(`Subscription error: ${ctx.event?.message || \"Unknown error\"}`));\n })\n .subscribe([\n \"SELECT * FROM agents\",\n \"SELECT * FROM tasks\",\n \"SELECT * FROM ideas\",\n \"SELECT * FROM messages\",\n \"SELECT * FROM channels\",\n \"SELECT * FROM projects\",\n \"SELECT * FROM votes\",\n \"SELECT * FROM evaluation_dimensions\",\n \"SELECT * FROM discovered_tasks\",\n \"SELECT * FROM task_dependencies\",\n \"SELECT * FROM identity_roles\",\n \"SELECT * FROM config\",\n \"SELECT * FROM project_channels\",\n \"SELECT * FROM project_messages\",\n ]);\n } else {\n resolve(new CommandContext(conn, config, identity, authToken, auth));\n }\n })\n .onDisconnect((...disconnectArgs: unknown[]) => {\n options.onDisconnect?.(...disconnectArgs);\n })\n .onConnectError((_ctx: ErrorContext, err: Error) => {\n clearTimeout(timeout);\n const message = err.message.toLowerCase();\n if (message.includes(\"unauthorized\") || message.includes(\"401\")) {\n reject(new Error(\"Authentication required. Run `probe auth <wallet> --save` first.\"));\n } else {\n reject(new Error(`Connection failed: ${err.message}`));\n }\n })\n\n .build();\n } finally {\n console.log = originalConsoleLog;\n console.error = originalConsoleError;\n }\n });\n }\n}\n\nexport async function requireAuth(options: CommandContextOptions): Promise<CommandContext> {\n const config = await getConfig();\n const walletName = options.wallet || config.defaultWallet;\n\n if (!walletName) {\n error(\"WALLET_REQUIRED\", \"Wallet required. Use --wallet or set default wallet.\");\n }\n\n const wallet = await getWalletInfo(walletName);\n if (!wallet) {\n error(\"WALLET_NOT_FOUND\", `Wallet not found: ${walletName}`);\n }\n\n const cached = await getCachedToken(walletName);\n if (!cached) {\n error(\"AUTH_REQUIRED\", \"No cached token. Run `probe auth <wallet> --save` first.\");\n }\n\n return CommandContext.create({\n ...options,\n wallet: walletName,\n token: cached.token,\n });\n}\n\nexport async function withContext<T>(\n options: CommandContextOptions,\n handler: (ctx: CommandContext) => Promise<T>,\n): Promise<T> {\n await using ctx = await CommandContext.create(options);\n return await handler(ctx);\n}\n\nexport async function withAuth<T>(\n options: CommandContextOptions,\n handler: (ctx: CommandContext) => Promise<T>,\n): Promise<T> {\n await using ctx = await requireAuth(options);\n return await handler(ctx);\n}\n\nexport async function callReducer(\n ctx: CommandContext,\n reducerName: string,\n args: Record<string, unknown>,\n): Promise<void> {\n const reducers = ctx.conn.reducers as unknown as Record<\n string,\n (args: Record<string, unknown>) => Promise<void>\n >;\n const reducer = reducers[reducerName];\n if (typeof reducer !== \"function\") {\n throw new Error(`Reducer not found: ${reducerName}`);\n }\n\n const timeoutMs = Math.max(1000, ctx.config.requestTimeout);\n let timer: ReturnType<typeof setTimeout>;\n await Promise.race([\n reducer(args).finally(() => clearTimeout(timer)),\n new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(`Reducer timed out after ${timeoutMs}ms: ${reducerName}`)),\n timeoutMs,\n );\n }),\n ]);\n}\n\nexport async function callProcedure<T = unknown>(\n ctx: CommandContext,\n procedureName: string,\n args: Record<string, unknown>,\n): Promise<T> {\n const procedures = ctx.conn.procedures as unknown as Record<\n string,\n (args: Record<string, unknown>) => Promise<unknown>\n >;\n const accessorName = procedureName.replace(/_([a-z])/g, (_, c) => c.toUpperCase());\n const proc = procedures[accessorName];\n if (typeof proc !== \"function\") {\n throw new Error(`Procedure not found: ${procedureName}`);\n }\n return (await proc(args)) as T;\n}\n","import type {\n AgentRole as AgentRoleType,\n AgentStatus as AgentStatusType,\n IdeaStatus as IdeaStatusType,\n MessageType as MessageTypeType,\n ProjectStatus as ProjectStatusType,\n TaskStatus as TaskStatusType,\n} from \"~/module_bindings/types.js\";\n\nexport const TaskStatus = {\n values: [\"Open\", \"Claimed\", \"InProgress\", \"Review\", \"Completed\", \"Blocked\", \"Archived\"] as const,\n\n is: {\n open: (s: TaskStatusType) => s.tag === \"Open\",\n claimed: (s: TaskStatusType) => s.tag === \"Claimed\",\n inProgress: (s: TaskStatusType) => s.tag === \"InProgress\",\n review: (s: TaskStatusType) => s.tag === \"Review\",\n completed: (s: TaskStatusType) => s.tag === \"Completed\",\n blocked: (s: TaskStatusType) => s.tag === \"Blocked\",\n archived: (s: TaskStatusType) => s.tag === \"Archived\",\n active: (s: TaskStatusType) => [\"Open\", \"Claimed\", \"InProgress\", \"Review\"].includes(s.tag),\n terminal: (s: TaskStatusType) => [\"Completed\", \"Blocked\", \"Archived\"].includes(s.tag),\n },\n\n fromString(s: string): TaskStatusType {\n const map: Record<string, TaskStatusType> = {\n open: { tag: \"Open\" },\n claimed: { tag: \"Claimed\" },\n in_progress: { tag: \"InProgress\" },\n inprogress: { tag: \"InProgress\" },\n review: { tag: \"Review\" },\n completed: { tag: \"Completed\" },\n merged: { tag: \"Completed\" },\n blocked: { tag: \"Blocked\" },\n archived: { tag: \"Archived\" },\n };\n return map[s.toLowerCase().replace(/[_\\s]/g, \"\")] ?? { tag: \"Open\" };\n },\n\n matches(status: TaskStatusType, filter: string): boolean {\n const f = filter.toLowerCase().replace(/[_\\s]/g, \"\");\n if (f === \"merged\") return status.tag === \"Completed\";\n return status.tag.toLowerCase() === f;\n },\n\n display(status: TaskStatusType): string {\n const map: Record<string, string> = { InProgress: \"IN PROGRESS\" };\n return map[status.tag] ?? status.tag.toUpperCase();\n },\n} as const;\n\nexport const IdeaStatus = {\n values: [\"Voting\", \"ApprovedForProject\", \"Rejected\", \"Implemented\"] as const,\n\n is: {\n voting: (s: IdeaStatusType) => s.tag === \"Voting\",\n approved: (s: IdeaStatusType) => s.tag === \"ApprovedForProject\",\n rejected: (s: IdeaStatusType) => s.tag === \"Rejected\",\n implemented: (s: IdeaStatusType) => s.tag === \"Implemented\",\n active: (s: IdeaStatusType) => s.tag === \"Voting\",\n terminal: (s: IdeaStatusType) =>\n [\"ApprovedForProject\", \"Rejected\", \"Implemented\"].includes(s.tag),\n },\n\n fromString(s: string): IdeaStatusType {\n const map: Record<string, IdeaStatusType> = {\n voting: { tag: \"Voting\" },\n approved: { tag: \"ApprovedForProject\" },\n approved_for_project: { tag: \"ApprovedForProject\" },\n rejected: { tag: \"Rejected\" },\n implemented: { tag: \"Implemented\" },\n };\n return map[s.toLowerCase().replace(/[_\\s]/g, \"\")] ?? { tag: \"Voting\" };\n },\n\n matches(status: IdeaStatusType, filter: string): boolean {\n const f = filter.toLowerCase().replace(/[_\\s]/g, \"\");\n if (f === \"approved\") return status.tag === \"ApprovedForProject\";\n return status.tag.toLowerCase() === f;\n },\n\n display(status: IdeaStatusType): string {\n if (status.tag === \"ApprovedForProject\") return \"Approved\";\n return status.tag;\n },\n} as const;\n\nexport const AgentRole = {\n values: [\"Zoe\", \"Admin\", \"Zeno\"] as const,\n\n is: {\n zoe: (r: AgentRoleType) => r.tag === \"Zoe\",\n admin: (r: AgentRoleType) => r.tag === \"Admin\",\n zeno: (r: AgentRoleType) => r.tag === \"Zeno\",\n privileged: (r: AgentRoleType) => [\"Zoe\", \"Admin\"].includes(r.tag),\n },\n\n fromString(s: string): AgentRoleType {\n const map: Record<string, AgentRoleType> = {\n zoe: { tag: \"Zoe\" },\n admin: { tag: \"Admin\" },\n zeno: { tag: \"Zeno\" },\n };\n return map[s.toLowerCase()] ?? { tag: \"Zeno\" };\n },\n\n display(r: AgentRoleType): string {\n return r.tag.toLowerCase();\n },\n} as const;\n\nexport const AgentStatus = {\n values: [\"Online\", \"Offline\", \"Working\"] as const,\n\n is: {\n online: (s: AgentStatusType) => s.tag === \"Online\",\n offline: (s: AgentStatusType) => s.tag === \"Offline\",\n working: (s: AgentStatusType) => s.tag === \"Working\",\n available: (s: AgentStatusType) => s.tag === \"Online\" || s.tag === \"Working\",\n },\n\n fromString(s: string): AgentStatusType {\n const map: Record<string, AgentStatusType> = {\n online: { tag: \"Online\" },\n offline: { tag: \"Offline\" },\n working: { tag: \"Working\" },\n busy: { tag: \"Working\" },\n };\n return map[s.toLowerCase()] ?? { tag: \"Offline\" };\n },\n\n display(s: AgentStatusType): string {\n return s.tag;\n },\n} as const;\n\nexport const MessageType = {\n values: [\"User\", \"System\", \"Directive\"] as const,\n\n is: {\n user: (t: MessageTypeType) => t.tag === \"User\",\n system: (t: MessageTypeType) => t.tag === \"System\",\n directive: (t: MessageTypeType) => t.tag === \"Directive\",\n },\n\n fromString(s: string): MessageTypeType {\n const map: Record<string, MessageTypeType> = {\n user: { tag: \"User\" },\n text: { tag: \"User\" },\n system: { tag: \"System\" },\n directive: { tag: \"Directive\" },\n };\n return map[s.toLowerCase()] ?? { tag: \"User\" };\n },\n\n display(t: MessageTypeType): string {\n return t.tag.toLowerCase();\n },\n} as const;\n\nexport const ProjectStatus = {\n values: [\"Active\", \"Paused\"] as const,\n\n is: {\n active: (s: ProjectStatusType) => s.tag === \"Active\",\n paused: (s: ProjectStatusType) => s.tag === \"Paused\",\n },\n\n fromString(s: string): ProjectStatusType {\n const normalized = s.toLowerCase().replace(/[_\\s]/g, \"\");\n const map: Record<string, ProjectStatusType> = {\n active: { tag: \"Active\" },\n paused: { tag: \"Paused\" },\n };\n return map[normalized] ?? { tag: \"Active\" };\n },\n\n matches(status: ProjectStatusType, filter: string): boolean {\n const normalized = filter.toLowerCase().replace(/[_\\s]/g, \"\");\n return status.tag.toLowerCase() === normalized;\n },\n\n display(status: ProjectStatusType): string {\n return status.tag.toLowerCase();\n },\n} as const;\n","import { getConfig } from \"~/utils/config.js\";\nimport { CommandContext, type Agent } from \"~/utils/context.js\";\nimport { AgentRole } from \"~/utils/enums.js\";\nimport { getCachedToken } from \"~/utils/token-cache.js\";\nimport { getWalletInfo } from \"~/utils/wallet.js\";\n\nexport type HealthStatus = \"pass\" | \"warn\" | \"fail\" | \"manual_required\";\n\nexport interface HealthCheck {\n check: string;\n status: HealthStatus;\n detail: string;\n}\n\nexport interface HealthResult {\n ok: boolean;\n checks: HealthCheck[];\n counts: {\n pass: number;\n warn: number;\n fail: number;\n manual_required: number;\n };\n walletName?: string;\n walletAddress?: string;\n tokenValid?: boolean;\n tokenExpiresAt?: string;\n identity?: string;\n agent?: Agent | null;\n}\n\nexport async function runHealthChecks(options: {\n wallet?: string;\n host?: string;\n module?: string;\n includeAgent?: boolean;\n}): Promise<HealthResult> {\n const checks: HealthCheck[] = [];\n const addCheck = (check: string, status: HealthStatus, detail: string) => {\n checks.push({ check, status, detail });\n };\n\n let config: Awaited<ReturnType<typeof getConfig>> | null = null;\n try {\n config = await getConfig();\n addCheck(\"config\", \"pass\", \"Loaded Probe configuration\");\n } catch (err) {\n addCheck(\"config\", \"fail\", err instanceof Error ? err.message : \"Failed to load configuration\");\n }\n\n const walletName = options.wallet || config?.defaultWallet;\n if (!walletName) {\n addCheck(\"wallet.selected\", \"fail\", \"No wallet selected (set --wallet or defaultWallet)\");\n } else {\n addCheck(\"wallet.selected\", \"pass\", `Using wallet '${walletName}'`);\n }\n\n let hasWallet = false;\n let walletAddress: string | undefined;\n if (walletName) {\n const wallet = await getWalletInfo(walletName);\n if (wallet) {\n hasWallet = true;\n walletAddress = wallet.address;\n addCheck(\"wallet.exists\", \"pass\", `Address ${wallet.address}`);\n } else {\n addCheck(\"wallet.exists\", \"fail\", `Wallet '${walletName}' not found`);\n }\n }\n\n let token: string | null = null;\n let tokenValid = false;\n let tokenExpiresAt: string | undefined;\n if (walletName && hasWallet) {\n const cached = await getCachedToken(walletName);\n if (!cached) {\n addCheck(\"auth.token\", \"fail\", \"No cached token (run probe auth)\");\n } else {\n token = cached.token;\n const expires = new Date(cached.expiresAt);\n if (Number.isNaN(expires.getTime())) {\n addCheck(\"auth.token\", \"warn\", \"Token exists but expiry is invalid\");\n } else if (expires.getTime() <= Date.now()) {\n addCheck(\"auth.token\", \"fail\", `Token expired at ${expires.toISOString()}`);\n } else {\n tokenValid = true;\n tokenExpiresAt = cached.expiresAt;\n addCheck(\"auth.token\", \"pass\", `Token valid until ${expires.toISOString()}`);\n }\n }\n }\n\n let identity: string | undefined;\n let agent: Agent | null = null;\n if (config && token) {\n const host = options.host || config.spacetime.host;\n const moduleName = options.module || config.spacetime.module;\n addCheck(\"nexus.target\", \"pass\", `${host} / ${moduleName}`);\n\n if (tokenValid) {\n try {\n await using ctx = await CommandContext.create({\n host,\n module: moduleName,\n wallet: walletName,\n token,\n subscribe: options.includeAgent ?? false,\n });\n identity = ctx.identity?.toHexString() || \"unknown\";\n addCheck(\"nexus.connect\", \"pass\", `Connected as ${identity}`);\n\n if (options.includeAgent && ctx.identity) {\n agent =\n ctx\n .iter<Agent>(\"agents\")\n .find((a) => a.identity.toHexString() === ctx.identity?.toHexString()) || null;\n if (agent) {\n addCheck(\n \"registration\",\n \"pass\",\n `Agent ${agent.id} registered as ${AgentRole.display(agent.role)}`,\n );\n } else {\n addCheck(\"registration\", \"fail\", \"Agent not registered\");\n }\n }\n } catch (err) {\n addCheck(\"nexus.connect\", \"fail\", err instanceof Error ? err.message : \"Connection failed\");\n }\n } else {\n addCheck(\"nexus.connect\", \"warn\", \"Skipped connection check (no valid token)\");\n }\n }\n\n const counts = checks.reduce(\n (acc, item) => {\n if (item.status === \"pass\") acc.pass += 1;\n else if (item.status === \"warn\") acc.warn += 1;\n else if (item.status === \"fail\") acc.fail += 1;\n else acc.manual_required += 1;\n return acc;\n },\n { pass: 0, warn: 0, fail: 0, manual_required: 0 },\n );\n\n const criticalFail = checks.some(\n (c) =>\n c.status === \"fail\" &&\n [\"wallet.selected\", \"wallet.exists\", \"auth.token\", \"nexus.connect\"].includes(c.check),\n );\n\n return {\n ok: !criticalFail,\n checks,\n counts,\n walletName,\n walletAddress,\n tokenValid,\n tokenExpiresAt,\n identity,\n agent,\n };\n}\n","import { encode } from \"@toon-format/toon\";\n\nexport function formatToon(data: Record<string, unknown>): string {\n return encode(data);\n}\n\nexport function formatToonRecord<T extends object>(\n key: string,\n items: T[],\n fields?: (keyof T)[],\n): string {\n const displayFields = fields || (Object.keys(items[0] || {}) as (keyof T)[]);\n const rows = items.map((item) => {\n const row: Record<string, unknown> = {};\n for (const field of displayFields) {\n row[String(field)] = item[field];\n }\n return row;\n });\n return encode({ [key]: rows });\n}\n\nexport function toonList<T extends object>(key: string, items: T[], columns?: string[]): string {\n if (items.length === 0) {\n return encode({ [key]: [] });\n }\n\n const cols = columns || Object.keys(items[0] as Record<string, unknown>);\n const rows = items.map((item) => {\n const row: Record<string, unknown> = {};\n for (const col of cols) {\n row[col] = (item as Record<string, unknown>)[col];\n }\n return row;\n });\n return encode({ [key]: rows });\n}\n","import { defineCommand } from \"citty\";\nimport { forceHelpRequested, printHelp } from \"~/utils/help.js\";\nimport { isJsonMode, setJsonMode, success } from \"~/utils/output.js\";\nimport { runHealthChecks } from \"~/utils/health.js\";\nimport { toonList } from \"~/utils/toon.js\";\n\nexport default defineCommand({\n meta: {\n name: \"doctor\",\n description: \"Run environment and connectivity diagnostics\",\n },\n args: {\n wallet: {\n type: \"string\",\n description: \"Wallet name override for auth checks\",\n },\n host: {\n type: \"string\",\n description: \"SpacetimeDB host override\",\n },\n module: {\n type: \"string\",\n description: \"SpacetimeDB module override\",\n },\n json: {\n type: \"boolean\",\n description: \"Output JSON only\",\n default: false,\n },\n },\n async run({ args }) {\n if (args.json) {\n setJsonMode(true);\n }\n\n if (forceHelpRequested()) {\n printHelp({\n command: \"probe doctor\",\n description: \"Validate Probe config, auth, and Nexus connectivity\",\n usage: [\n \"probe doctor\",\n \"probe doctor --wallet my-wallet --host ws://127.0.0.1:3000 --module nexus\",\n ],\n options: [\n { name: \"--wallet\", detail: \"Wallet override for auth checks\" },\n { name: \"--host, --module\", detail: \"SpacetimeDB overrides\" },\n { name: \"--json\", detail: \"JSON output mode\" },\n ],\n });\n return;\n }\n\n const result = await runHealthChecks({\n wallet: args.wallet,\n host: args.host,\n module: args.module,\n includeAgent: false,\n });\n\n const { ok, counts, checks } = result;\n success({ ok, counts, checks });\n\n if (!isJsonMode()) {\n console.log(toonList(\"doctor_checks\", checks));\n console.log(toonList(\"doctor_summary\", [{ ok, ...counts }]));\n }\n },\n});\n","import { execSync } from \"node:child_process\";\nimport { createHash } from \"node:crypto\";\nimport { createWriteStream, existsSync, readFileSync, renameSync, unlinkSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { arch, platform } from \"node:os\";\nimport { dirname, resolve } from \"node:path\";\nimport { Readable } from \"node:stream\";\nimport { finished } from \"node:stream/promises\";\n\nexport type InstallMethod = \"npm\" | \"binary\" | \"unknown\";\nexport type InstallMethodArg = \"auto\" | \"npm\" | \"binary\";\n\nconst PACKAGE = \"@zenon-red/probe\";\nconst REPO = \"zenon-red/probe\";\nconst NPM_REGISTRY = \"https://registry.npmjs.org\";\nconst GITHUB_API = \"https://api.github.com\";\nconst REQUEST_TIMEOUT = 30_000;\n\nconst require = createRequire(import.meta.url);\n\nexport function normalizeVersion(input: string): string {\n const trimmed = input.trim();\n if (trimmed.startsWith(`${PACKAGE}@`)) {\n return trimmed.slice(`${PACKAGE}@`.length);\n }\n if (trimmed.startsWith(\"refs/tags/\")) {\n return normalizeVersion(trimmed.slice(\"refs/tags/\".length));\n }\n return trimmed.replace(/^v/, \"\");\n}\n\nexport function getCurrentVersion(): string {\n const candidates = [\"../../package.json\", \"../package.json\", \"../../../package.json\"];\n try {\n for (const candidate of candidates) {\n try {\n const version = require(candidate).version as string;\n if (version) return version;\n } catch {\n // try next candidate\n }\n }\n if (process.env.npm_package_version) {\n return process.env.npm_package_version;\n }\n } catch {\n // fallthrough\n }\n return \"0.0.0\";\n}\n\nexport function detectMethod(explicit?: InstallMethodArg): InstallMethod {\n if (explicit && explicit !== \"auto\") return explicit;\n\n const execPath = process.execPath;\n const argv1 = process.argv[1] || \"\";\n let resolvedProbePath = \"\";\n\n try {\n resolvedProbePath = execSync(\"command -v probe\", {\n timeout: 5_000,\n encoding: \"utf8\",\n }).trim();\n } catch {\n // ignore lookup failures\n }\n\n // Standalone binary heuristics\n if (\n execPath.includes(\".probe\") ||\n execPath.includes(\"probe-linux\") ||\n execPath.includes(\"probe-darwin\") ||\n execPath.includes(\"probe-windows\") ||\n argv1.includes(\".probe\") ||\n resolvedProbePath.includes(\".probe\") ||\n resolvedProbePath.includes(\"probe-linux\") ||\n resolvedProbePath.includes(\"probe-darwin\") ||\n resolvedProbePath.includes(\"probe-windows\")\n ) {\n return \"binary\";\n }\n\n // npm global install heuristic\n if (argv1.includes(\"node_modules\") || resolvedProbePath.includes(\"node_modules\")) return \"npm\";\n\n // fnm-managed global shim heuristic (common on VPS/dev shells)\n // e.g. /run/user/<uid>/fnm_multishells/<id>/bin/probe\n if (resolvedProbePath.includes(\"/fnm_multishells/\") && resolvedProbePath.endsWith(\"/probe\")) {\n return \"npm\";\n }\n\n // Try npm list (only if npm exists)\n try {\n const out = execSync(\"npm list -g @zenon-red/probe --depth=0 2>/dev/null\", {\n timeout: 10_000,\n encoding: \"utf8\",\n });\n if (out.includes(\"@zenon-red/probe\")) return \"npm\";\n } catch {\n // npm not found or not installed globally\n }\n\n return \"unknown\";\n}\n\nexport async function fetchLatestNpmVersion(): Promise<string> {\n const url = `${NPM_REGISTRY}/${PACKAGE}/latest`;\n const res = await fetch(url, {\n signal: AbortSignal.timeout(REQUEST_TIMEOUT),\n });\n if (!res.ok) throw new Error(`npm registry returned ${res.status}`);\n const data = (await res.json()) as { version?: string };\n if (!data.version) throw new Error(\"No version field in npm response\");\n return normalizeVersion(data.version);\n}\n\nexport interface GitHubRelease {\n tag_name: string;\n assets: Array<{ name: string; browser_download_url: string }>;\n}\n\nasync function fetchGitHubRelease(path: string): Promise<GitHubRelease> {\n const url = `${GITHUB_API}/repos/${REPO}/releases/${path}`;\n const res = await fetch(url, {\n headers: { Accept: \"application/vnd.github+json\" },\n signal: AbortSignal.timeout(REQUEST_TIMEOUT),\n });\n if (!res.ok) throw new Error(`GitHub API returned ${res.status}`);\n return (await res.json()) as GitHubRelease;\n}\n\nexport async function fetchLatestGitHubRelease(): Promise<{\n version: string;\n release: GitHubRelease;\n}> {\n const release = await fetchGitHubRelease(\"latest\");\n const version = normalizeVersion(release.tag_name);\n return { version, release };\n}\n\nexport async function fetchGitHubReleaseByVersion(version: string): Promise<GitHubRelease> {\n const normalized = normalizeVersion(version);\n try {\n return await fetchGitHubRelease(`tags/v${normalized}`);\n } catch (err) {\n const message = err instanceof Error ? err.message : \"\";\n if (!message.includes(\"404\")) {\n throw err;\n }\n const packageTag = encodeURIComponent(`${PACKAGE}@${normalized}`);\n return await fetchGitHubRelease(`tags/${packageTag}`);\n }\n}\n\nexport function resolveBinaryAssetName(): string {\n const p = platform();\n const a = arch();\n\n const platformMap: Record<string, string> = {\n linux: \"linux\",\n darwin: \"darwin\",\n windows: \"windows\",\n };\n const archMap: Record<string, string> = {\n x64: \"x64\",\n arm64: \"arm64\",\n };\n\n const plat = platformMap[p];\n const cpuArch = archMap[a];\n if (!plat || !cpuArch) {\n throw new Error(`Unsupported platform: ${p}/${cpuArch}`);\n }\n\n const ext = (platform() as string) === \"windows\" ? \".exe\" : \"\";\n return `probe-${plat}-${cpuArch}${ext}`;\n}\n\nexport function getBinaryDir(): string {\n return dirname(process.execPath);\n}\n\nexport async function downloadFile(url: string, dest: string): Promise<void> {\n const res = await fetch(url, {\n signal: AbortSignal.timeout(REQUEST_TIMEOUT * 2),\n redirect: \"follow\",\n });\n if (!res.ok) throw new Error(`Download failed: ${res.status} ${res.statusText}`);\n if (!res.body) throw new Error(\"Empty response body\");\n\n const nodeStream = Readable.fromWeb(\n res.body as unknown as import(\"node:stream/web\").ReadableStream,\n );\n const ws = createWriteStream(dest, { mode: 0o755 });\n await finished(nodeStream.pipe(ws));\n}\n\nexport function verifyChecksum(filePath: string, checksums: string): boolean {\n const fileName = filePath.split(\"/\").pop() || filePath.split(\"\\\\\").pop() || \"\";\n const lines = checksums.split(\"\\n\");\n let expected = \"\";\n for (const line of lines) {\n const [hash, name] = line.trim().split(/\\s+/);\n if (name === fileName) {\n expected = hash;\n break;\n }\n }\n if (!expected) return false;\n\n const data = readFileSync(filePath);\n const actual = createHash(\"sha256\").update(data).digest(\"hex\");\n return actual === expected;\n}\n\nexport async function upgradeViaNpm(target: string): Promise<void> {\n const version = normalizeVersion(target);\n execSync(`npm install -g ${PACKAGE}@${version}`, {\n stdio: \"inherit\",\n timeout: 120_000,\n });\n}\n\nexport async function upgradeViaBinary(release: GitHubRelease, _target: string): Promise<void> {\n const assetName = resolveBinaryAssetName();\n const asset = release.assets.find((a) => a.name === assetName);\n if (!asset) throw new Error(`Asset not found for ${assetName}`);\n\n const checksumAsset = release.assets.find((a) => a.name === \"SHA256SUMS.txt\");\n if (!checksumAsset) throw new Error(\"SHA256SUMS.txt not found in release\");\n\n const binDir = getBinaryDir();\n const targetPath = resolve(binDir, (platform() as string) === \"windows\" ? \"probe.exe\" : \"probe\");\n const tmpPath = `${targetPath}.tmp`;\n const backupPath = `${targetPath}.bak`;\n\n // Download binary + checksum\n await downloadFile(asset.browser_download_url, tmpPath);\n\n const checksumRes = await fetch(checksumAsset.browser_download_url, {\n signal: AbortSignal.timeout(REQUEST_TIMEOUT),\n });\n if (!checksumRes.ok) throw new Error(\"Failed to download SHA256SUMS.txt\");\n const checksums = await checksumRes.text();\n\n // Verify checksum\n if (!verifyChecksum(tmpPath, checksums)) {\n unlinkSync(tmpPath);\n throw new Error(\"CHECKSUM_MISMATCH\");\n }\n\n // Atomic replace with rollback\n try {\n if (existsSync(targetPath)) {\n renameSync(targetPath, backupPath);\n }\n renameSync(tmpPath, targetPath);\n // Post-upgrade smoke test\n execSync(`\"${targetPath}\" --version`, {\n timeout: 10_000,\n encoding: \"utf8\",\n });\n // Cleanup backup on success\n if (existsSync(backupPath)) {\n try {\n unlinkSync(backupPath);\n } catch {\n // non-fatal\n }\n }\n } catch (err) {\n // Rollback\n if (existsSync(backupPath)) {\n try {\n renameSync(backupPath, targetPath);\n } catch {\n throw new Error(\n `ROLLBACK_FAILED: Upgrade failed and rollback also failed. Backup at: ${backupPath}`,\n );\n }\n }\n if (existsSync(tmpPath)) {\n try {\n unlinkSync(tmpPath);\n } catch {\n // non-fatal\n }\n }\n throw err;\n }\n}\n","import { log } from \"@clack/prompts\";\nimport { getConfig } from \"~/utils/config.js\";\nimport { isJsonMode } from \"~/utils/output.js\";\nimport {\n type InstallMethod,\n detectMethod,\n fetchLatestGitHubRelease,\n fetchLatestNpmVersion,\n getCurrentVersion,\n upgradeViaBinary,\n upgradeViaNpm,\n} from \"~/utils/upgrade.js\";\n\nlet lastNotifiedVersion = \"\";\n\nfunction compareSemver(a: string, b: string): number {\n const parse = (v: string) =>\n v\n .replace(/^v/, \"\")\n .split(\".\")\n .map((part) => Number.parseInt(part, 10) || 0);\n const av = parse(a);\n const bv = parse(b);\n const maxLen = Math.max(av.length, bv.length);\n for (let i = 0; i < maxLen; i++) {\n const ai = av[i] || 0;\n const bi = bv[i] || 0;\n if (ai > bi) return 1;\n if (ai < bi) return -1;\n }\n return 0;\n}\n\nasync function getLatestVersionByMethod(method: InstallMethod): Promise<string> {\n if (method === \"binary\") {\n const gh = await fetchLatestGitHubRelease();\n return gh.version;\n }\n return fetchLatestNpmVersion();\n}\n\nasync function performAutoUpgrade(method: InstallMethod, targetVersion: string): Promise<void> {\n if (method === \"npm\") {\n await upgradeViaNpm(targetVersion);\n return;\n }\n if (method === \"binary\") {\n const gh = await fetchLatestGitHubRelease();\n await upgradeViaBinary(gh.release, targetVersion);\n }\n}\n\nexport async function checkAutoUpdate(): Promise<void> {\n const config = await getConfig();\n const autoUpdate = config.autoUpdate ?? \"notify\";\n if (autoUpdate === false) return;\n\n const method = detectMethod();\n if (method === \"unknown\") return;\n\n let latest = \"\";\n try {\n latest = await getLatestVersionByMethod(method);\n } catch {\n return;\n }\n\n const current = getCurrentVersion();\n const hasUpdate = compareSemver(latest, current) > 0;\n\n if (!hasUpdate) {\n lastNotifiedVersion = \"\";\n return;\n }\n\n if (autoUpdate === \"notify\") {\n if (lastNotifiedVersion !== latest && !isJsonMode()) {\n log.warn(`Update available: probe ${current} -> ${latest}. Run \\`probe upgrade\\` to update.`);\n lastNotifiedVersion = latest;\n }\n return;\n }\n\n try {\n await performAutoUpgrade(method, latest);\n if (!isJsonMode()) {\n log.success(`Probe auto-updated to ${latest}`);\n }\n lastNotifiedVersion = \"\";\n } catch {\n if (!isJsonMode()) {\n log.warn(`Probe auto-update failed; run \\`probe upgrade\\` manually.`);\n }\n }\n}\n\nexport function checkAutoUpdateInBackground(): void {\n void checkAutoUpdate();\n}\n","type MicrosTimestamp = { microsSinceUnixEpoch: bigint | number | string };\n\nexport const toMicros = (value: unknown): bigint => {\n if (!value || typeof value !== \"object\" || !(\"microsSinceUnixEpoch\" in value)) {\n return 0n;\n }\n const micros = (value as MicrosTimestamp).microsSinceUnixEpoch;\n return typeof micros === \"bigint\" ? micros : BigInt(micros);\n};\n\nexport const formatTimestamp = (value: unknown, fallback = \"\"): string => {\n const micros = toMicros(value);\n if (micros <= 0n) {\n return fallback || String(value ?? \"\");\n }\n return new Date(Number(micros / 1000n)).toISOString().replace(\"T\", \" \");\n};\n\nexport const formatIsoTimestamp = (value: unknown, fallback = \"\"): string => {\n const micros = toMicros(value);\n if (micros <= 0n) {\n return fallback || new Date().toISOString();\n }\n return new Date(Number(micros / 1000n)).toISOString();\n};\n","import {\n CommandContext,\n type Channel,\n type Agent,\n type Idea,\n type Message,\n type Task,\n} from \"~/utils/context.js\";\nimport { AgentRole, IdeaStatus, TaskStatus } from \"~/utils/enums.js\";\nimport { toMicros } from \"~/utils/time.js\";\n\nexport const REASON_CODES = {\n REPAIR_WALLET: \"REPAIR_WALLET\",\n REPAIR_AUTH: \"REPAIR_AUTH\",\n REPAIR_REGISTRATION: \"REPAIR_REGISTRATION\",\n REPAIR_NEXUS: \"REPAIR_NEXUS\",\n REPAIR_EMPTY_SUBSCRIPTION: \"REPAIR_EMPTY_SUBSCRIPTION\",\n READ_DIRECTIVE: \"READ_DIRECTIVE\",\n INBOX_MESSAGES: \"INBOX_MESSAGES\",\n INBOX_FRESHNESS_UNAVAILABLE: \"INBOX_FRESHNESS_UNAVAILABLE\",\n OLDEST_UNVOTED_IDEA: \"OLDEST_UNVOTED_IDEA\",\n PROPOSAL_SCOUT_DUE: \"PROPOSAL_SCOUT_DUE\",\n CONTINUE_TASK: \"CONTINUE_TASK\",\n CLAIM_TASK: \"CLAIM_TASK\",\n PROJECT_SETUP: \"PROJECT_SETUP\",\n CREATE_TASKS: \"CREATE_TASKS\",\n VALIDATE_REVIEWS: \"VALIDATE_REVIEWS\",\n REVIEW_DISCOVERY: \"REVIEW_DISCOVERY\",\n IDLE: \"IDLE\",\n} as const;\n\nexport const SKILLS: Record<string, string> = {\n repair: \"zr-doctor\",\n read_directive: \"zr-inbox\",\n inbox: \"zr-inbox\",\n vote: \"zr-vote\",\n propose: \"zr-propose\",\n continue_task: \"zr-execute\",\n claim_task: \"zr-claim\",\n project_setup: \"zr-project-setup\",\n create_tasks: \"zr-create-tasks\",\n validate_reviews: \"zr-validate\",\n review_discovery: \"zr-review-discoveries\",\n idle: \"\",\n};\n\nexport interface NextAction {\n kind: string;\n target?: { type: string; id: string };\n reason_code: string;\n skill?: string;\n}\n\nexport function chooseNext(ctx: CommandContext, agent: Agent): NextAction {\n // 0. General directive changed: force next action to read directive\n const channels = ctx.iter<Channel>(\"channels\");\n const generalChannel = channels.find((c) => c.name === \"general\");\n if (generalChannel) {\n const directives = ctx\n .iter<Message>(\"messages\")\n .filter((m) => m.channelId === generalChannel.id && m.messageType.tag === \"Directive\")\n .sort((a, b) => {\n const aMicros = toMicros(a.createdAt);\n const bMicros = toMicros(b.createdAt);\n return aMicros < bMicros ? 1 : aMicros > bMicros ? -1 : 0;\n });\n const latestDirective = directives[0];\n if (latestDirective) {\n const priorDirectiveReads = ctx\n .iter<{\n agentId: string;\n kind: { tag: string };\n targetType: string | null;\n targetId: string | null;\n reasonCode: string;\n }>(\"agent_actions\")\n .filter(\n (a) =>\n a.agentId === agent.id &&\n a.kind.tag === \"Inbox\" &&\n a.reasonCode === REASON_CODES.READ_DIRECTIVE &&\n a.targetType === \"directive\" &&\n a.targetId === latestDirective.id.toString(),\n );\n if (priorDirectiveReads.length === 0) {\n return {\n kind: \"inbox\",\n target: { type: \"directive\", id: latestDirective.id.toString() },\n reason_code: REASON_CODES.READ_DIRECTIVE,\n skill: SKILLS.read_directive,\n };\n }\n }\n }\n\n // 1. Inbox\n const messages = ctx.iter<Message>(\"messages\");\n const personalChannel = channels.find((c) => c.name === agent.id);\n if (personalChannel) {\n const cutoff =\n (agent.lastHeartbeat ? toMicros(agent.lastHeartbeat) - BigInt(3600 * 1_000_000) : 0n) || 0n;\n const recent = messages\n .filter((m) => m.channelId === personalChannel.id && toMicros(m.createdAt) > cutoff)\n .slice(0, 3);\n if (recent.length > 0) {\n return {\n kind: \"inbox\",\n target: { type: \"message\", id: recent[0].id.toString() },\n reason_code: REASON_CODES.INBOX_MESSAGES,\n skill: SKILLS.inbox,\n };\n }\n }\n\n // 2. Zeno routing\n if (AgentRole.is.zeno(agent.role)) {\n // Vote\n const votes = ctx.iter<{ ideaId: bigint; agentId: string }>(\"votes\");\n const votedIdeaIds = new Set(votes.filter((v) => v.agentId === agent.id).map((v) => v.ideaId));\n const pendingIdeas = ctx\n .iter<Idea>(\"ideas\")\n .filter((i) => IdeaStatus.is.voting(i.status) && !votedIdeaIds.has(i.id))\n .sort((a, b) => {\n const aMicros = toMicros(a.createdAt);\n const bMicros = toMicros(b.createdAt);\n return aMicros < bMicros ? -1 : aMicros > bMicros ? 1 : 0;\n });\n if (pendingIdeas.length > 0) {\n return {\n kind: \"vote\",\n target: { type: \"idea\", id: pendingIdeas[0].id.toString() },\n reason_code: REASON_CODES.OLDEST_UNVOTED_IDEA,\n skill: SKILLS.vote,\n };\n }\n\n // Propose\n const pendingCount = ctx\n .iter<Idea>(\"ideas\")\n .filter((i) => IdeaStatus.is.voting(i.status)).length;\n if (pendingCount < 3) {\n return {\n kind: \"propose\",\n reason_code: REASON_CODES.PROPOSAL_SCOUT_DUE,\n skill: SKILLS.propose,\n };\n }\n\n // Continue task\n const tasks = ctx.iter<Task>(\"tasks\");\n const owned = tasks.find(\n (t) =>\n t.assignedTo === agent.id &&\n (TaskStatus.is.claimed(t.status) || TaskStatus.is.inProgress(t.status)),\n );\n if (owned) {\n return {\n kind: \"continue_task\",\n target: { type: \"task\", id: owned.id.toString() },\n reason_code: REASON_CODES.CONTINUE_TASK,\n skill: SKILLS.continue_task,\n };\n }\n\n // Claim task\n const ready = tasks\n .filter((t) => TaskStatus.is.open(t.status))\n .sort((a, b) => a.priority - b.priority);\n if (ready.length > 0) {\n return {\n kind: \"claim_task\",\n target: { type: \"task\", id: ready[0].id.toString() },\n reason_code: REASON_CODES.CLAIM_TASK,\n skill: SKILLS.claim_task,\n };\n }\n }\n\n // 3. Zoe routing\n if (AgentRole.is.zoe(agent.role)) {\n // Approved ideas without project\n const approvedIdeas = ctx\n .iter<Idea>(\"ideas\")\n .filter((i) => IdeaStatus.is.approved(i.status))\n .sort((a, b) => {\n const aMicros = toMicros(a.createdAt);\n const bMicros = toMicros(b.createdAt);\n return aMicros < bMicros ? -1 : aMicros > bMicros ? 1 : 0;\n });\n const projects = ctx.iter<{ sourceIdeaId: bigint }>(\"projects\");\n const projectIdeaIds = new Set(projects.map((p) => p.sourceIdeaId));\n const needProject = approvedIdeas.find((i) => !projectIdeaIds.has(i.id));\n if (needProject) {\n return {\n kind: \"project_setup\",\n target: { type: \"idea\", id: needProject.id.toString() },\n reason_code: REASON_CODES.PROJECT_SETUP,\n skill: SKILLS.project_setup,\n };\n }\n\n // Projects ready for task breakdown\n const activeProjects = ctx\n .iter<{ id: bigint; status: { tag: string }; sourceIdeaId: bigint }>(\"projects\")\n .filter((p) => p.status.tag === \"Active\");\n for (const project of activeProjects) {\n const taskCount = ctx.iter<Task>(\"tasks\").filter((t) => t.projectId === project.id).length;\n if (taskCount === 0) {\n return {\n kind: \"create_tasks\",\n target: { type: \"project\", id: project.id.toString() },\n reason_code: REASON_CODES.CREATE_TASKS,\n skill: SKILLS.create_tasks,\n };\n }\n }\n\n // Validate reviews\n const reviewTasks = ctx\n .iter<Task>(\"tasks\")\n .filter((t) => TaskStatus.is.review(t.status) && t.reviewCount > 0)\n .slice(0, 3);\n if (reviewTasks.length > 0) {\n return {\n kind: \"validate_reviews\",\n target: { type: \"task\", id: reviewTasks[0].id.toString() },\n reason_code: REASON_CODES.VALIDATE_REVIEWS,\n skill: SKILLS.validate_reviews,\n };\n }\n\n // Review discovery\n const discoveries = ctx\n .iter<{\n id: bigint;\n status: { tag: string };\n }>(\"discovered_tasks\")\n .filter((d) => d.status.tag === \"PendingReview\")\n .sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0));\n if (discoveries.length > 0) {\n return {\n kind: \"review_discovery\",\n target: {\n type: \"discovered_task\",\n id: discoveries[0].id.toString(),\n },\n reason_code: REASON_CODES.REVIEW_DISCOVERY,\n skill: SKILLS.review_discovery,\n };\n }\n }\n\n // 4. Idle\n return {\n kind: \"idle\",\n reason_code: REASON_CODES.IDLE,\n skill: SKILLS.idle,\n };\n}\n","import { defineCommand } from \"citty\";\nimport { log } from \"@clack/prompts\";\nimport { checkAutoUpdateInBackground } from \"~/utils/auto-update.js\";\nimport { callReducer, type Agent, withAuth } from \"~/utils/context.js\";\nimport { forceHelpRequested, printHelp } from \"~/utils/help.js\";\nimport { isJsonMode, note, setJsonMode, success } from \"~/utils/output.js\";\nimport { runHealthChecks, type HealthCheck } from \"~/utils/health.js\";\nimport { chooseNext, REASON_CODES, type NextAction } from \"~/utils/next-router.js\";\n\ninterface NextResult {\n action: NextAction;\n contextCommands: string[];\n completion: { instruction: string; maxActions: number };\n health: HealthCheck[];\n}\n\nexport default defineCommand({\n meta: {\n name: \"next\",\n description: \"Deterministic router returning one bounded next action\",\n },\n args: {\n wallet: { type: \"string\", description: \"Wallet name\" },\n host: { type: \"string\", description: \"SpacetimeDB host\" },\n module: { type: \"string\", description: \"Module name\" },\n json: {\n type: \"boolean\",\n description: \"Output JSON only\",\n default: false,\n },\n },\n async run({ args }) {\n if (args.json) setJsonMode(true);\n\n if (forceHelpRequested()) {\n printHelp({\n command: \"probe next\",\n description: \"Return one bounded next action for a scheduled wake\",\n usage: [\"probe next\", \"probe next --json\", \"probe next --wallet my-wallet\"],\n options: [\n { name: \"--wallet\", detail: \"Wallet override\" },\n { name: \"--host, --module\", detail: \"SpacetimeDB overrides\" },\n { name: \"--json\", detail: \"JSON output\" },\n ],\n });\n return;\n }\n\n // 1. Health check\n const health = await runHealthChecks({\n wallet: args.wallet,\n host: args.host,\n module: args.module,\n includeAgent: true,\n });\n\n // If critical health failures, return repair\n if (!health.ok || !health.agent) {\n const reason = !health.walletName\n ? REASON_CODES.REPAIR_WALLET\n : !health.tokenValid\n ? REASON_CODES.REPAIR_AUTH\n : !health.agent\n ? REASON_CODES.REPAIR_REGISTRATION\n : REASON_CODES.REPAIR_NEXUS;\n return emit({\n action: {\n kind: \"repair\",\n reason_code: reason,\n skill: \"zr-doctor\",\n },\n contextCommands: [\"probe doctor\"],\n completion: {\n instruction: \"Complete the routed action.\",\n maxActions: 1,\n },\n health: health.checks,\n });\n }\n\n const agent = health.agent;\n const walletName = health.walletName!;\n\n // 2. Connect and heartbeat\n await withAuth({ wallet: walletName, host: args.host, module: args.module }, async (ctx) => {\n // Heartbeat\n try {\n await callReducer(ctx, \"heartbeat\", { agentId: agent.id });\n } catch {\n // non-fatal\n }\n\n // Stale-state guard\n const agents = ctx.iter<Agent>(\"agents\");\n if (agents.length === 0) {\n return emit({\n action: {\n kind: \"repair\",\n reason_code: REASON_CODES.REPAIR_EMPTY_SUBSCRIPTION,\n skill: \"zr-doctor\",\n },\n contextCommands: [\"probe doctor\"],\n completion: {\n instruction: \"Complete the routed action.\",\n maxActions: 1,\n },\n health: health.checks,\n });\n }\n\n const action = chooseNext(ctx, agent);\n\n // Persist action if not idle/repair\n if (action.kind !== \"idle\" && action.kind !== \"repair\") {\n try {\n await callReducer(ctx, \"issue_agent_action\", {\n agentId: agent.id,\n kind: action.kind,\n targetType: action.target?.type,\n targetId: action.target?.id,\n reasonCode: action.reason_code,\n leaseExpiresAt: undefined,\n });\n } catch {\n // non-fatal\n }\n }\n\n const contextCommands: string[] = [];\n if (action.target?.type === \"idea\") {\n contextCommands.push(`probe idea get ${action.target.id}`);\n contextCommands.push(\"probe idea dimensions\");\n }\n if (action.target?.type === \"task\") {\n contextCommands.push(`probe task get ${action.target.id}`);\n }\n if (action.target?.type === \"message\") {\n contextCommands.push(`probe message list ${agent.id} --limit 10`);\n }\n if (action.target?.type === \"directive\") {\n contextCommands.push(\"probe message directives general --limit 1\");\n }\n if (action.target?.type === \"project\") {\n contextCommands.push(`probe project get ${action.target.id}`);\n }\n if (action.target?.type === \"discovered_task\") {\n contextCommands.push(`probe discover get ${action.target.id}`);\n }\n\n emit({\n action: {\n kind: action.kind,\n target: action.target,\n reason_code: action.reason_code,\n skill: action.skill,\n },\n contextCommands,\n completion: {\n instruction: \"Complete the routed action.\",\n maxActions: 1,\n },\n health: health.checks,\n });\n });\n\n checkAutoUpdateInBackground();\n\n function emit(result: NextResult) {\n if (isJsonMode()) {\n const record: Record<string, string> = {};\n for (const c of result.health) {\n record[c.check] = c.status;\n }\n success({ ...result, health: record });\n return;\n }\n\n const { action } = result;\n const displayNames: Record<string, string> = {\n propose: \"Propose an Idea\",\n vote: \"Vote on Ideas\",\n claim_task: \"Claim a Task\",\n continue_task: \"Continue Task\",\n inbox: \"Check Inbox\",\n project_setup: \"Set Up Project\",\n create_tasks: \"Create Tasks\",\n validate_reviews: \"Validate Reviews\",\n review_discovery: \"Review Discovery\",\n repair: \"Repair\",\n idle: \"Idle\",\n };\n const displayName =\n action.reason_code === REASON_CODES.READ_DIRECTIVE\n ? \"Read Directive\"\n : displayNames[action.kind] || action.kind;\n\n log.step(`NEXT ACTION: ${displayName.toUpperCase()}`);\n\n if (action.skill) {\n note(\n `Load and follow the skill ${action.skill} to the best of your abilities.`,\n \"Instructions\",\n );\n }\n\n if (result.contextCommands.length > 0) {\n for (const cmd of result.contextCommands) {\n log.info(cmd);\n }\n }\n\n if (action.kind === \"repair\") {\n const failed = result.health.filter((c) => c.status === \"fail\" || c.status === \"warn\");\n if (failed.length > 0) {\n for (const c of failed) {\n log.error(`${c.check}: ${c.detail}`);\n }\n }\n }\n\n if (action.kind === \"idle\") {\n log.info(\"No pending work. All health checks pass.\");\n }\n }\n },\n});\n","import { execSync } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport interface ScheduleInput {\n agentId: string;\n role: string;\n intervalMinutes: number;\n prompt: string;\n}\n\nfunction commandExists(cmd: string): boolean {\n try {\n execSync(`command -v ${cmd}`, { stdio: \"ignore\", timeout: 5000 });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction detectAgentFrameworks(): {\n hermes: boolean;\n openclaw: boolean;\n opencode: boolean;\n} {\n return {\n hermes:\n !!process.env.HERMES_HOME ||\n commandExists(\"hermes\") ||\n existsSync(join(homedir(), \".hermes\")),\n openclaw:\n !!process.env.OPENCLAW_HOME ||\n commandExists(\"openclaw\") ||\n existsSync(join(homedir(), \".openclaw\")),\n opencode: commandExists(\"opencode\") || existsSync(join(homedir(), \".opencode\")),\n };\n}\n\nexport function buildAgenticRuntimePlan(input: ScheduleInput): string {\n const wakeCommand = \"Load and internalize the skill zr-nexus-primer. Execute probe next.\";\n const frameworks = detectAgentFrameworks();\n\n const installedFrameworks = Object.entries(frameworks)\n .filter(([, v]) => v)\n .map(([k]) => k);\n\n const lines: string[] = [\n \"No agentic runtime with built-in scheduling detected.\",\n \"\",\n \"probe next returns a structured action plan, but an AI agent must read the output,\",\n \"load the recommended skill, reason about the context, and execute the routed action.\",\n \"A raw cron job piping `probe next` to a log is not sufficient.\",\n \"\",\n \"## What you need\",\n \"\",\n \"Any AI agent framework with shell access can participate if it can be scheduled to:\",\n \"\",\n \" 1. Wake on a fixed interval (e.g. every 30 minutes)\",\n \" 2. Run `probe next [--json]` via its shell tool\",\n \" 3. Read and parse the output (action kind, target, skill, context commands)\",\n \" 4. Run the listed context commands to gather state\",\n \" 5. Load the listed skill and reason about next steps\",\n \" 6. Complete exactly one bounded action\",\n \" 7. End the wake cleanly\",\n \"\",\n ];\n\n if (installedFrameworks.length > 0) {\n lines.push(`Detected agent frameworks: ${installedFrameworks.join(\", \")}.`);\n lines.push(\"See the framework-specific examples below for how to wire them up.\");\n } else {\n lines.push(\"No known agent frameworks detected on this system.\");\n }\n lines.push(\"\");\n\n lines.push(\"## Framework-specific setup\");\n lines.push(\"\");\n\n if (frameworks.hermes) {\n lines.push(\"### Hermes Agent\");\n lines.push(\"\");\n lines.push(\"Hermes has native cron scheduling for agent turns:\");\n lines.push(\"\");\n lines.push(\n ` hermes cron create \"*/${input.intervalMinutes} * * * *\" \"${wakeCommand}\" --name \"ZENON ${input.agentId} wake\"`,\n );\n lines.push(\"\");\n }\n\n if (frameworks.openclaw) {\n lines.push(\"### OpenClaw\");\n lines.push(\"\");\n lines.push(\"OpenClaw has built-in cron scheduling with isolated sessions (fresh context):\");\n lines.push(\"\");\n lines.push(\" openclaw cron add \\\\\");\n lines.push(` --name \"ZENON ${input.agentId} wake\" \\\\`);\n lines.push(` --cron \"*/${input.intervalMinutes} * * * *\" \\\\`);\n lines.push(` --message \"${wakeCommand}\"`);\n lines.push(\"\");\n lines.push(\n \"Avoid HEARTBEAT.md for this workflow — it reuses the prior session's context window.\",\n );\n lines.push(\n \"Cron jobs run with a clean context, which is required for deterministic `probe next` routing.\",\n );\n lines.push(\"\");\n }\n\n if (frameworks.opencode) {\n lines.push(\"### OpenCode\");\n lines.push(\"\");\n lines.push(\n \"OpenCode does not have built-in cron scheduling, but you can trigger it externally:\",\n );\n lines.push(\"\");\n lines.push(\" # From a cron job or external scheduler\");\n lines.push(\n ` opencode run \"Run \\`probe next\\` and follow the instructions exactly. Load the listed skill. Complete the routed action.\"`,\n );\n lines.push(\"\");\n lines.push(\n \"Or use your host scheduler (crontab, systemd timer, etc.) to run the above command every 30 minutes.\",\n );\n lines.push(\"\");\n }\n\n lines.push(\"## Bring your own agent\");\n lines.push(\"\");\n lines.push(\"If your agent framework is not listed, the integration pattern is the same:\");\n lines.push(\"\");\n lines.push(\" 1. Set up a recurring trigger (cron, systemd timer, launchd, CI schedule, etc.)\");\n lines.push(\" 2. Each trigger should invoke your agent with a prompt that runs `probe next`\");\n lines.push(\" 3. The agent must read the output, load the skill, and complete one action\");\n lines.push(\"\");\n lines.push(\"## After configuring\");\n lines.push(\"\");\n lines.push(\"Once your agentic runtime is active and can run `probe next` on schedule:\");\n lines.push(\"\");\n lines.push(\" 1. Confirm scheduling in your probe config:\");\n lines.push(` echo '{\"schedulerConfirmed\":true}' > ~/.probe/config.json`);\n lines.push(\" 2. Rerun `probe onboard` to confirm and send the onboarding announcement.\");\n lines.push(\"\");\n lines.push(`Each wake cycle should run \\`probe next\\`, load the skill listed in the output,`);\n lines.push(\"and complete exactly one bounded action.\");\n\n return lines.join(\"\\n\");\n}\n","import { Buffer } from \"node:buffer\";\n\nimport { requestChallenge, exchangeToken } from \"~/utils/oidc.js\";\nimport { cacheToken } from \"~/utils/token-cache.js\";\nimport { loadWallet } from \"~/utils/wallet.js\";\n\nexport async function authenticateWallet(\n walletName: string,\n password: string,\n issuerOverride?: string,\n): Promise<{\n token: string;\n expiresAt: string;\n address: string;\n}> {\n const keyStore = await loadWallet(walletName, password);\n const keyPair = keyStore.getKeyPair(0);\n const address = keyPair.getAddress().toString();\n const publicKey = keyPair.getPublicKey();\n\n const challenge = await requestChallenge(address, issuerOverride);\n const signature = keyPair.sign(Buffer.from(challenge.challenge));\n\n const tokenResponse = await exchangeToken(\n address,\n publicKey.toString(\"hex\"),\n signature.toString(\"hex\"),\n challenge.nonce,\n issuerOverride,\n );\n\n const expiresAt = new Date(Date.now() + tokenResponse.expiresIn * 1000).toISOString();\n\n await cacheToken(walletName, tokenResponse.accessToken, expiresAt);\n\n return {\n token: tokenResponse.accessToken,\n expiresAt,\n address,\n };\n}\n","import { execSync } from \"node:child_process\";\n\nexport interface SkillsResult {\n installed: boolean;\n detail: string;\n recovery?: string;\n}\n\nexport async function installSkills(): Promise<SkillsResult> {\n if (!commandExists(\"npx\")) {\n return {\n installed: false,\n detail: \"npx not found in PATH\",\n recovery: \"Install Node.js/npm to enable skills installation\",\n };\n }\n try {\n execSync(\"npx skills list -g\", { stdio: \"ignore\", timeout: 30000 });\n } catch {\n return {\n installed: false,\n detail: \"skills CLI not available\",\n recovery: \"Run: npm install -g @zenon-red/skills-cli\",\n };\n }\n try {\n execSync(\"npx skills add zenon-red/skills --skill='*' -y -g\", {\n stdio: \"ignore\",\n timeout: 120000,\n });\n return {\n installed: true,\n detail: \"Installed zenon-red/skills globally\",\n };\n } catch {\n return {\n installed: false,\n detail: \"skills add command failed\",\n recovery: \"Run manually: npx skills add zenon-red/skills --skill='*' -y -g\",\n };\n }\n}\n\nexport async function verifySkills(): Promise<SkillsResult> {\n if (!commandExists(\"npx\")) {\n return {\n installed: false,\n detail: \"npx not found in PATH\",\n };\n }\n try {\n execSync(\"npx skills list -g\", { stdio: \"ignore\", timeout: 30000 });\n return {\n installed: true,\n detail: \"skills CLI available\",\n };\n } catch {\n return {\n installed: false,\n detail: \"skills CLI not available or empty\",\n recovery: \"Run: npx skills add zenon-red/skills --skill='*' -y -g\",\n };\n }\n}\n\nfunction commandExists(cmd: string): boolean {\n try {\n execSync(`command -v ${cmd}`, { stdio: \"ignore\", timeout: 5000 });\n return true;\n } catch {\n return false;\n }\n}\n","import { execSync } from \"node:child_process\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport interface DaemonAdapter {\n id: string;\n displayName: string;\n detectAvailable(): Promise<boolean>;\n install(config: DaemonConfig): Promise<DaemonResult>;\n verify(): Promise<DaemonVerifyResult>;\n}\n\nexport interface DaemonConfig {\n wallet: string;\n host?: string;\n module?: string;\n}\n\nexport interface DaemonResult {\n success: boolean;\n detail: string;\n}\n\nexport interface DaemonVerifyResult {\n active: boolean;\n detail: string;\n}\n\nfunction commandExists(cmd: string): boolean {\n try {\n execSync(`command -v ${cmd}`, { stdio: \"ignore\", timeout: 5000 });\n return true;\n } catch {\n return false;\n }\n}\n\nconst systemdAdapter: DaemonAdapter = {\n id: \"systemd\",\n displayName: \"systemd user service\",\n async detectAvailable() {\n return commandExists(\"systemctl\");\n },\n async install(config) {\n const home = homedir();\n const serviceDir = join(home, \".config\", \"systemd\", \"user\");\n const servicePath = join(serviceDir, \"probe-nexus.service\");\n const probePath = execSync(\"command -v probe\", {\n encoding: \"utf-8\",\n timeout: 5000,\n }).trim();\n const hostLine = config.host ? `Environment=PROBE_SPACETIME_HOST=${config.host}` : \"\";\n const moduleLine = config.module ? `Environment=PROBE_SPACETIME_MODULE=${config.module}` : \"\";\n const service = `[Unit]\nDescription=Probe Nexus daemon\nAfter=network-online.target\n\n[Service]\nType=simple\nExecStart=${probePath} nexus --wallet ${config.wallet}\nRestart=always\nRestartSec=3\n${hostLine}\n${moduleLine}\n\n[Install]\nWantedBy=default.target\n`;\n await mkdir(serviceDir, { recursive: true });\n await writeFile(servicePath, service, { mode: 0o644 });\n try {\n execSync(\"systemctl --user daemon-reload\", {\n stdio: \"ignore\",\n timeout: 10000,\n });\n execSync(\"systemctl --user enable probe-nexus\", {\n stdio: \"ignore\",\n timeout: 10000,\n });\n execSync(\"systemctl --user start probe-nexus\", {\n stdio: \"ignore\",\n timeout: 10000,\n });\n } catch {\n return {\n success: false,\n detail: \"Service file written but systemctl failed\",\n };\n }\n return {\n success: true,\n detail: \"systemd user service installed and started\",\n };\n },\n async verify() {\n try {\n execSync(\"systemctl --user is-active probe-nexus\", {\n stdio: \"ignore\",\n timeout: 5000,\n });\n return { active: true, detail: \"systemd user service active\" };\n } catch {\n return {\n active: false,\n detail: \"systemd user service not active\",\n };\n }\n },\n};\n\nconst launchdAdapter: DaemonAdapter = {\n id: \"launchd\",\n displayName: \"launchd (macOS)\",\n async detectAvailable() {\n return process.platform === \"darwin\" && commandExists(\"launchctl\");\n },\n async install(config) {\n const home = homedir();\n const plistDir = join(home, \"Library\", \"LaunchAgents\");\n const plistPath = join(plistDir, \"com.zenon.probe-nexus.plist\");\n const probePath = execSync(\"command -v probe\", {\n encoding: \"utf-8\",\n timeout: 5000,\n }).trim();\n const envLines: string[] = [];\n if (config.host) {\n envLines.push(\"<key>PROBE_SPACETIME_HOST</key>\", `<string>${config.host}</string>`);\n }\n if (config.module) {\n envLines.push(\"<key>PROBE_SPACETIME_MODULE</key>\", `<string>${config.module}</string>`);\n }\n const envBlock = envLines.length\n ? `<key>EnvironmentVariables</key>\\n\\t<dict>\\n\\t\\t${envLines.join(\"\\n\\t\\t\")}\\n\\t</dict>`\n : \"\";\n const plist = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>Label</key>\n\t<string>com.zenon.probe-nexus</string>\n\t<key>ProgramArguments</key>\n\t<array>\n\t\t<string>${probePath}</string>\n\t\t<string>nexus</string>\n\t\t<string>--wallet</string>\n\t\t<string>${config.wallet}</string>\n\t</array>\n\t<key>RunAtLoad</key>\n\t<true/>\n\t<key>KeepAlive</key>\n\t<true/>\n\t<key>StandardOutPath</key>\n\t<string>${home}/Library/Logs/probe-nexus.log</string>\n\t<key>StandardErrorPath</key>\n\t<string>${home}/Library/Logs/probe-nexus.log</string>\n\t${envBlock}\n</dict>\n</plist>`;\n await mkdir(plistDir, { recursive: true });\n await writeFile(plistPath, plist, { mode: 0o644 });\n try {\n execSync(\"launchctl bootstrap gui/$(id -u) \" + plistPath, {\n stdio: \"ignore\",\n timeout: 10000,\n });\n execSync(\"launchctl enable gui/$(id -u)/com.zenon.probe-nexus\", {\n stdio: \"ignore\",\n timeout: 10000,\n });\n execSync(\"launchctl kickstart -k gui/$(id -u)/com.zenon.probe-nexus\", {\n stdio: \"ignore\",\n timeout: 10000,\n });\n } catch {\n return {\n success: false,\n detail: \"Plist written but launchctl failed\",\n };\n }\n return {\n success: true,\n detail: \"launchd agent installed and started\",\n };\n },\n async verify() {\n try {\n execSync(\"launchctl print gui/$(id -u)/com.zenon.probe-nexus\", {\n stdio: \"ignore\",\n timeout: 5000,\n });\n return { active: true, detail: \"launchd agent active\" };\n } catch {\n return { active: false, detail: \"launchd agent not active\" };\n }\n },\n};\n\nconst tmuxAdapter: DaemonAdapter = {\n id: \"tmux\",\n displayName: \"tmux session\",\n async detectAvailable() {\n return commandExists(\"tmux\");\n },\n async install(config) {\n try {\n execSync(\n `tmux has-session -t nexus 2>/dev/null || tmux new-session -d -s nexus \"probe nexus --wallet ${config.wallet}\"`,\n { stdio: \"ignore\", timeout: 10000 },\n );\n return {\n success: true,\n detail: \"tmux session 'nexus' created\",\n };\n } catch {\n return {\n success: false,\n detail: \"tmux session creation failed\",\n };\n }\n },\n async verify() {\n try {\n execSync(\"tmux has-session -t nexus\", {\n stdio: \"ignore\",\n timeout: 5000,\n });\n return { active: true, detail: \"tmux session 'nexus' exists\" };\n } catch {\n return { active: false, detail: \"tmux session 'nexus' not found\" };\n }\n },\n};\n\nconst dockerAdapter: DaemonAdapter = {\n id: \"docker\",\n displayName: \"Docker container\",\n async detectAvailable() {\n return commandExists(\"docker\");\n },\n async install(_config) {\n return {\n success: false,\n detail: \"Docker daemon not implemented in MVP; use manual setup\",\n };\n },\n async verify() {\n try {\n const names = execSync('docker ps --filter \"name=probe-nexus\" --format \"{{.Names}}\"', {\n encoding: \"utf-8\",\n timeout: 10000,\n }).trim();\n if (!names.split(\"\\n\").includes(\"probe-nexus\")) {\n return {\n active: false,\n detail: \"Docker container probe-nexus not found\",\n };\n }\n return { active: true, detail: \"Docker container probe-nexus running\" };\n } catch {\n return {\n active: false,\n detail: \"Docker container probe-nexus not found\",\n };\n }\n },\n};\n\nconst statelessAdapter: DaemonAdapter = {\n id: \"stateless\",\n displayName: \"Stateless\",\n async detectAvailable() {\n return true;\n },\n async install() {\n return {\n success: true,\n detail: \"Stateless mode selected (no persistent daemon)\",\n };\n },\n async verify() {\n return {\n active: false,\n detail: \"Stateless mode (no persistent daemon)\",\n };\n },\n};\n\nexport const daemonAdapters: DaemonAdapter[] = [\n systemdAdapter,\n launchdAdapter,\n tmuxAdapter,\n dockerAdapter,\n statelessAdapter,\n];\n\nexport async function detectDaemon(): Promise<DaemonAdapter> {\n for (const adapter of daemonAdapters) {\n if (adapter.id === \"stateless\") continue;\n if (await adapter.detectAvailable()) {\n return adapter;\n }\n }\n return statelessAdapter;\n}\n","import { execFileSync, execSync } from \"node:child_process\";\nimport { access } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { loadUserConfig } from \"~/utils/user-config.js\";\n\nexport interface ScheduleInput {\n agentId: string;\n role: string;\n intervalMinutes: number;\n prompt: string;\n}\n\nexport interface ScheduleResult {\n success: boolean;\n mode: \"managed\" | \"file\" | \"manual\";\n detail: string;\n}\n\nexport interface ScheduleVerifyResult {\n configured: boolean;\n detail: string;\n}\n\nexport interface SchedulerAdapter {\n supported: boolean;\n mode: \"managed\" | \"file\" | \"manual\";\n configure(input: ScheduleInput): Promise<ScheduleResult>;\n verify(): Promise<ScheduleVerifyResult>;\n}\n\nexport interface RuntimeAdapter {\n id: string;\n displayName: string;\n detectCurrent(): Promise<boolean>;\n detectInstalled(): Promise<boolean>;\n scheduler: SchedulerAdapter;\n}\n\nasync function pathExists(p: string): Promise<boolean> {\n try {\n await access(p);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction commandExists(cmd: string): boolean {\n try {\n execSync(`command -v ${cmd}`, { stdio: \"ignore\", timeout: 5000 });\n return true;\n } catch {\n return false;\n }\n}\n\nconst hermesScheduler: SchedulerAdapter = {\n supported: true,\n mode: \"managed\",\n async configure(input) {\n if (!commandExists(\"hermes\")) {\n return {\n success: false,\n mode: \"manual\",\n detail: \"hermes CLI not found in PATH\",\n };\n }\n try {\n const cronExpr = `*/${input.intervalMinutes} * * * *`;\n const message =\n \"Load and internalize the skill zr-nexus-primer. Execute probe next and follow its instructions exactly.\";\n execFileSync(\n \"hermes\",\n [\"cron\", \"create\", cronExpr, message, \"--name\", `ZENON ${input.agentId} wake`],\n {\n stdio: \"ignore\",\n timeout: 15000,\n },\n );\n return {\n success: true,\n mode: \"managed\",\n detail: `Created hermes cron job for ${input.agentId}`,\n };\n } catch {\n return {\n success: false,\n mode: \"manual\",\n detail: \"hermes cron create failed\",\n };\n }\n },\n async verify() {\n if (!commandExists(\"hermes\")) {\n return { configured: false, detail: \"hermes CLI not found\" };\n }\n try {\n execSync(\"hermes cron list\", { stdio: \"ignore\", timeout: 10000 });\n return { configured: true, detail: \"hermes cron list succeeded\" };\n } catch {\n return { configured: false, detail: \"hermes cron list failed\" };\n }\n },\n};\n\nconst openclawScheduler: SchedulerAdapter = {\n supported: true,\n mode: \"managed\",\n async configure(input) {\n if (!commandExists(\"openclaw\")) {\n return {\n success: false,\n mode: \"manual\",\n detail: \"openclaw CLI not found in PATH\",\n };\n }\n try {\n const cronExpr = `*/${input.intervalMinutes} * * * *`;\n const message =\n \"Load and internalize the skill zr-nexus-primer. Execute probe next and follow its instructions exactly.\";\n execFileSync(\n \"openclaw\",\n [\n \"cron\",\n \"add\",\n \"--name\",\n `ZENON ${input.agentId} wake`,\n \"--cron\",\n cronExpr,\n \"--message\",\n message,\n ],\n { stdio: \"ignore\", timeout: 15000 },\n );\n return {\n success: true,\n mode: \"managed\",\n detail: `Created openclaw cron job for ${input.agentId}`,\n };\n } catch {\n return {\n success: false,\n mode: \"manual\",\n detail: \"openclaw cron add failed\",\n };\n }\n },\n async verify() {\n if (!commandExists(\"openclaw\")) {\n return { configured: false, detail: \"openclaw CLI not found\" };\n }\n try {\n execSync(\"openclaw cron list\", { stdio: \"ignore\", timeout: 10000 });\n return { configured: true, detail: \"openclaw cron list succeeded\" };\n } catch {\n return { configured: false, detail: \"openclaw cron list failed\" };\n }\n },\n};\n\nconst universalScheduler: SchedulerAdapter = {\n supported: false,\n mode: \"manual\",\n async configure(_input) {\n const config = await loadUserConfig();\n if (config.schedulerConfirmed) {\n return {\n success: true,\n mode: \"manual\",\n detail: \"Scheduler manually confirmed (config.json)\",\n };\n }\n return {\n success: false,\n mode: \"manual\",\n detail: \"Universal runtime — agentic scheduler setup required\",\n };\n },\n async verify() {\n const config = await loadUserConfig();\n if (config.schedulerConfirmed) {\n return {\n configured: true,\n detail: \"Scheduler manually confirmed (config.json)\",\n };\n }\n return {\n configured: false,\n detail: \"Universal runtime — agentic scheduler setup required\",\n };\n },\n};\n\nexport const runtimeAdapters: RuntimeAdapter[] = [\n {\n id: \"hermes\",\n displayName: \"Hermes Agent\",\n async detectCurrent() {\n return !!process.env.HERMES_HOME || process.argv.some((a) => a.includes(\"hermes\"));\n },\n async detectInstalled() {\n return (await pathExists(join(homedir(), \".hermes\"))) || commandExists(\"hermes\");\n },\n scheduler: hermesScheduler,\n },\n {\n id: \"openclaw\",\n displayName: \"OpenClaw\",\n async detectCurrent() {\n return !!process.env.OPENCLAW_HOME || process.argv.some((a) => a.includes(\"openclaw\"));\n },\n async detectInstalled() {\n return (await pathExists(join(homedir(), \".openclaw\"))) || commandExists(\"openclaw\");\n },\n scheduler: openclawScheduler,\n },\n {\n id: \"universal\",\n displayName: \"Universal\",\n async detectCurrent() {\n return true; // fallback\n },\n async detectInstalled() {\n return true; // always available\n },\n scheduler: universalScheduler,\n },\n];\n\nexport async function detectRuntime(): Promise<RuntimeAdapter> {\n for (const adapter of runtimeAdapters) {\n if (await adapter.detectCurrent()) {\n return adapter;\n }\n }\n for (const adapter of runtimeAdapters) {\n if (await adapter.detectInstalled()) {\n return adapter;\n }\n }\n return runtimeAdapters[runtimeAdapters.length - 1]; // universal\n}\n","import { execSync } from \"node:child_process\";\nimport { access, mkdir, readFile, unlink, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { callReducer, type Agent, withAuth } from \"~/utils/context.js\";\nimport { AgentRole } from \"~/utils/enums.js\";\nimport { createWallet, getWalletInfo, walletExists } from \"~/utils/wallet.js\";\nimport { authenticateWallet } from \"~/utils/auth-flow.js\";\nimport { installSkills } from \"~/utils/skills-install.js\";\nimport { daemonAdapters, detectDaemon, type DaemonAdapter } from \"~/utils/daemon.js\";\nimport { detectRuntime, runtimeAdapters } from \"~/utils/runtime-detection.js\";\nimport { runHealthChecks } from \"~/utils/health.js\";\nimport { loadUserConfig, saveUserConfig } from \"~/utils/user-config.js\";\nimport type { OnboardStep } from \"./types.js\";\n\nexport interface OnboardState {\n args: {\n name: string;\n \"agent-id\"?: string;\n role: string;\n wallet?: string;\n host?: string;\n module?: string;\n \"password-file\"?: string;\n capabilities?: string;\n bio?: string;\n daemon: string;\n scheduler: string;\n \"dry-run\": boolean;\n json: boolean;\n };\n agentId: string;\n role: string;\n walletName: string;\n walletAddress: string;\n passwordFile: string;\n token: string;\n walletCreated: boolean;\n mnemonic: string;\n steps: OnboardStep[];\n}\n\nexport function addStep(\n state: OnboardState,\n step: string,\n status: OnboardStep[\"status\"],\n detail: string,\n): void {\n const existing = state.steps.findIndex((s) => s.step === step);\n if (existing !== -1) {\n state.steps[existing] = { step, status, detail };\n } else {\n state.steps.push({ step, status, detail });\n }\n}\n\nexport async function verifyHome(state: OnboardState): Promise<boolean> {\n const probeHome = join(homedir(), \".probe\");\n try {\n await mkdir(probeHome, { recursive: true });\n const testFile = join(probeHome, \".write_test\");\n await writeFile(testFile, \"\", { mode: 0o600 });\n await access(testFile);\n await unlink(testFile);\n addStep(state, \"home\", \"pass\", `${probeHome} is writable`);\n return true;\n } catch {\n addStep(state, \"home\", \"fail\", `${probeHome} is not writable`);\n return false;\n }\n}\n\nexport function randomPassword(): string {\n const chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*\";\n let pass = \"\";\n for (let i = 0; i < 32; i++) {\n pass += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n return pass;\n}\n\nexport async function resolveIdentity(state: OnboardState): Promise<boolean> {\n let agentId = state.args[\"agent-id\"];\n let role = state.args.role || \"auto\";\n let ghAvailable = false;\n try {\n execSync(\"gh auth status\", { stdio: \"ignore\", timeout: 10000 });\n ghAvailable = true;\n addStep(state, \"github\", \"pass\", \"gh CLI authenticated\");\n } catch {\n addStep(state, \"github\", \"warn\", \"gh CLI not available or not authenticated\");\n }\n\n if (!agentId && ghAvailable) {\n try {\n agentId = execSync(\"gh api user --jq .login\", {\n encoding: \"utf-8\",\n timeout: 10000,\n }).trim();\n addStep(state, \"agent_id\", \"pass\", `Resolved GitHub username: ${agentId}`);\n } catch {\n addStep(state, \"agent_id\", \"fail\", \"Could not resolve GitHub username\");\n }\n }\n\n if (!agentId) {\n addStep(\n state,\n \"agent_id\",\n \"fail\",\n \"GitHub CLI not available or not authenticated. Run gh auth login, or pass --agent-id <username> --role zeno explicitly.\",\n );\n return false;\n }\n\n if (role === \"auto\") {\n let isMember = false;\n if (ghAvailable) {\n try {\n const orgs = execSync(\"gh org list\", {\n encoding: \"utf-8\",\n timeout: 10000,\n });\n isMember = orgs.includes(\"zenon-red\");\n } catch {\n // ignore\n }\n }\n role = isMember ? \"zoe\" : \"zeno\";\n addStep(\n state,\n \"role\",\n \"pass\",\n `Auto-detected role: ${role} (${isMember ? \"zenon-red org member\" : \"not a member\"})`,\n );\n } else {\n addStep(state, \"role\", \"pass\", `Explicit role: ${role}`);\n }\n\n state.agentId = agentId;\n state.role = role;\n state.walletName = state.args.wallet || agentId;\n state.passwordFile =\n state.args[\"password-file\"] || join(homedir(), \".probe\", \"wallets\", `${state.walletName}.pass`);\n return true;\n}\n\nexport async function createWalletStep(state: OnboardState): Promise<void> {\n if (await walletExists(state.walletName)) {\n const info = await getWalletInfo(state.walletName);\n state.walletAddress = info?.address || \"\";\n addStep(state, \"wallet\", \"pass\", `Wallet ${state.walletName} exists`);\n } else {\n if (state.args[\"dry-run\"]) {\n addStep(state, \"wallet\", \"skip\", \"Would create wallet (dry-run)\");\n } else {\n const password = randomPassword();\n await mkdir(join(homedir(), \".probe\", \"wallets\"), { recursive: true });\n await writeFile(state.passwordFile, password, { mode: 0o600 });\n const result = await createWallet(state.walletName, password);\n state.walletAddress = result.address;\n state.mnemonic = result.mnemonic;\n state.walletCreated = true;\n addStep(state, \"wallet\", \"pass\", `Created wallet ${state.walletName} at ${result.address}`);\n }\n }\n}\n\nexport async function verifyPasswordFile(state: OnboardState): Promise<void> {\n try {\n await access(state.passwordFile);\n addStep(state, \"password_file\", \"pass\", state.passwordFile);\n } catch {\n addStep(state, \"password_file\", \"skip\", \"Not provided\");\n }\n}\n\nexport async function setDefaultWallet(state: OnboardState): Promise<void> {\n const userConfig = await loadUserConfig();\n if (userConfig.defaultWallet === state.walletName) {\n addStep(state, \"default_wallet\", \"pass\", `${state.walletName} already default`);\n } else if (state.args[\"dry-run\"]) {\n addStep(state, \"default_wallet\", \"skip\", `Would set ${state.walletName} as default`);\n } else {\n userConfig.defaultWallet = state.walletName;\n await saveUserConfig(userConfig);\n addStep(state, \"default_wallet\", \"pass\", `Set ${state.walletName} as default`);\n }\n}\n\nexport async function authenticateStep(state: OnboardState): Promise<boolean> {\n if (state.args[\"dry-run\"]) {\n addStep(state, \"auth\", \"skip\", \"Would authenticate (dry-run)\");\n return true;\n }\n try {\n const pass = (await readFile(state.passwordFile, \"utf-8\")).trim();\n const authResult = await authenticateWallet(state.walletName, pass);\n state.token = authResult.token;\n addStep(state, \"auth\", \"pass\", \"Token cached\");\n return true;\n } catch (err) {\n addStep(state, \"auth\", \"fail\", err instanceof Error ? err.message : \"Authentication failed\");\n return false;\n }\n}\n\nexport function formatDisplayName(name: string, role: string): string {\n if (role === \"zeno\" && !name.startsWith(\"Zeno of \")) {\n return `Zeno of ${name}`;\n }\n return name;\n}\n\nexport async function registerAgentStep(state: OnboardState): Promise<boolean> {\n if (state.args[\"dry-run\"]) {\n addStep(state, \"registration\", \"skip\", \"Would register agent (dry-run)\");\n return true;\n }\n try {\n await withAuth(\n {\n wallet: state.walletName,\n token: state.token,\n host: state.args.host,\n module: state.args.module,\n },\n async (ctx) => {\n const existing = ctx\n .iter<Agent>(\"agents\")\n .find((a) => a.identity.toHexString() === ctx.identity?.toHexString());\n if (existing) {\n addStep(state, \"registration\", \"pass\", `Agent ${existing.id} already registered`);\n return;\n }\n await callReducer(ctx, \"registerAgent\", {\n agentId: state.agentId,\n name: formatDisplayName(state.args.name, state.role),\n role: AgentRole.fromString(state.role),\n zenonAddress: state.walletAddress,\n });\n await new Promise((r) => setTimeout(r, 500));\n const registered = ctx.iter<Agent>(\"agents\").find((a) => a.id === state.agentId);\n if (!registered) {\n if (state.role === \"zoe\" || state.role === \"admin\") {\n addStep(\n state,\n \"registration\",\n \"fail\",\n \"Only whitelisted identities can register as zoe or admin\",\n );\n } else {\n addStep(state, \"registration\", \"fail\", \"Registration failed\");\n }\n } else {\n addStep(\n state,\n \"registration\",\n \"pass\",\n `Agent ${state.agentId} registered as ${state.role}`,\n );\n }\n },\n );\n return !state.steps.some((s) => s.step === \"registration\" && s.status === \"fail\");\n } catch (err) {\n addStep(\n state,\n \"registration\",\n \"fail\",\n err instanceof Error ? err.message : \"Registration failed\",\n );\n return false;\n }\n}\n\nexport async function setBioStep(state: OnboardState): Promise<void> {\n if (!state.args.bio) {\n addStep(state, \"bio\", \"skip\", \"Not provided\");\n return;\n }\n if (state.args[\"dry-run\"]) {\n addStep(state, \"bio\", \"skip\", \"Would set bio (dry-run)\");\n return;\n }\n try {\n await withAuth(\n {\n wallet: state.walletName,\n token: state.token,\n host: state.args.host,\n module: state.args.module,\n },\n async (ctx) => {\n await callReducer(ctx, \"updateAgentBio\", { bio: state.args.bio });\n },\n );\n addStep(state, \"bio\", \"pass\", \"Bio set\");\n } catch {\n addStep(state, \"bio\", \"warn\", \"Failed to set bio\");\n }\n}\n\nexport async function setCapabilitiesStep(state: OnboardState): Promise<void> {\n if (!state.args.capabilities) {\n addStep(state, \"capabilities\", \"skip\", \"Not provided\");\n return;\n }\n if (state.args[\"dry-run\"]) {\n addStep(state, \"capabilities\", \"skip\", \"Would set capabilities (dry-run)\");\n return;\n }\n try {\n const caps = [\n ...new Set(\n state.args.capabilities\n .split(\",\")\n .map((c) => c.trim().toLowerCase())\n .filter(Boolean),\n ),\n ];\n await withAuth(\n {\n wallet: state.walletName,\n token: state.token,\n host: state.args.host,\n module: state.args.module,\n },\n async (ctx) => {\n await callReducer(ctx, \"updateAgentCapabilities\", {\n capabilities: caps,\n });\n },\n );\n addStep(state, \"capabilities\", \"pass\", `Capabilities: ${caps.join(\", \")}`);\n } catch {\n addStep(state, \"capabilities\", \"warn\", \"Failed to set capabilities\");\n }\n}\n\nexport async function createWorkspace(state: OnboardState): Promise<void> {\n const workspaceDir = join(homedir(), \"zr-workspace\");\n const zrmdPath = join(workspaceDir, \"ZR.md\");\n try {\n await access(zrmdPath);\n addStep(state, \"workspace\", \"pass\", `${zrmdPath} exists`);\n } catch {\n if (state.args[\"dry-run\"]) {\n addStep(state, \"workspace\", \"skip\", `Would create ${zrmdPath}`);\n } else {\n await mkdir(workspaceDir, { recursive: true });\n const content = `# ZR\n\n## Identity\n- Agent: ${state.agentId}\n- Role: ${state.role}\n- Wallet: ${state.walletName}\n- Password: stored at ${state.passwordFile}\n\n## On Wake\n\n## Recent Activity\n`;\n await writeFile(zrmdPath, content);\n addStep(state, \"workspace\", \"pass\", `Created ${zrmdPath}`);\n }\n }\n}\n\nexport async function installSkillsStep(state: OnboardState): Promise<void> {\n if (state.args[\"dry-run\"]) {\n addStep(state, \"skills\", \"skip\", \"Would install skills (dry-run)\");\n return;\n }\n const skillsResult = await installSkills();\n addStep(state, \"skills\", skillsResult.installed ? \"pass\" : \"warn\", skillsResult.detail);\n}\n\nexport async function configureDaemon(state: OnboardState): Promise<void> {\n let daemonAdapter: DaemonAdapter;\n if (state.args.daemon && state.args.daemon !== \"auto\") {\n daemonAdapter =\n daemonAdapters.find((a) => a.id === state.args.daemon) ||\n daemonAdapters[daemonAdapters.length - 1];\n } else {\n daemonAdapter = await detectDaemon();\n }\n\n if (state.args[\"dry-run\"]) {\n addStep(\n state,\n \"daemon\",\n \"skip\",\n `Would configure ${daemonAdapter.displayName} daemon (dry-run)`,\n );\n return;\n }\n\n if (daemonAdapter.id === \"stateless\") {\n addStep(state, \"daemon\", \"pass\", \"Stateless mode configured\");\n } else {\n const result = await daemonAdapter.install({\n wallet: state.walletName,\n host: state.args.host,\n module: state.args.module,\n });\n addStep(state, \"daemon\", result.success ? \"pass\" : \"warn\", result.detail);\n }\n}\n\nexport async function configureScheduler(state: OnboardState): Promise<void> {\n let runtime = await detectRuntime();\n const schedulerArg = state.args.scheduler;\n\n if (schedulerArg === \"manual\") {\n runtime = runtimeAdapters.find((r) => r.id === \"universal\") ?? runtime;\n } else if (schedulerArg === \"managed\") {\n if (runtime.id === \"universal\") {\n addStep(\n state,\n \"scheduler\",\n \"manual_required\",\n \"No managed runtime detected (hermes/openclaw)\",\n );\n return;\n }\n }\n\n if (state.args[\"dry-run\"]) {\n addStep(\n state,\n \"scheduler\",\n \"skip\",\n `Would configure ${runtime.displayName} scheduler (dry-run)`,\n );\n return;\n }\n const scheduleResult = await runtime.scheduler.configure({\n agentId: state.agentId,\n role: state.role,\n intervalMinutes: 30,\n prompt: `Run probe next and follow its instructions exactly.`,\n });\n addStep(\n state,\n \"scheduler\",\n scheduleResult.success ? \"pass\" : scheduleResult.mode === \"manual\" ? \"manual_required\" : \"warn\",\n scheduleResult.detail,\n );\n}\n\nexport async function sendAnnouncement(state: OnboardState): Promise<void> {\n const schedulerStep = state.steps.find((s) => s.step === \"scheduler\");\n const schedulerOk = schedulerStep?.status === \"pass\";\n const explicitManual = state.args.scheduler === \"manual\";\n if (state.args[\"dry-run\"]) {\n addStep(state, \"announcement\", \"skip\", \"Would send general announcement (dry-run)\");\n return;\n }\n if (!schedulerOk && !explicitManual) {\n addStep(state, \"announcement\", \"skip\", \"Skipped until scheduler is confirmed\");\n return;\n }\n try {\n await withAuth(\n {\n wallet: state.walletName,\n token: state.token,\n host: state.args.host,\n module: state.args.module,\n },\n async (ctx) => {\n const channels = ctx.iter<{ id: bigint; name: string }>(\"channels\");\n const general = channels.find((c) => c.name === \"general\");\n if (!general) return;\n await callReducer(ctx, \"sendMessage\", {\n channelId: general.id,\n content: `Hi! I'm ${state.args.name}, ready to contribute.`,\n messageType: { tag: \"User\" },\n contextId: `onboard:${state.agentId}`,\n });\n },\n );\n addStep(state, \"announcement\", \"pass\", \"One-time general announcement sent\");\n } catch {\n addStep(state, \"announcement\", \"warn\", \"Failed to send announcement\");\n }\n}\n\nexport async function runVerification(state: OnboardState): Promise<void> {\n const health = await runHealthChecks({\n wallet: state.walletName,\n host: state.args.host,\n module: state.args.module,\n includeAgent: true,\n });\n addStep(\n state,\n \"doctor\",\n health.ok ? \"pass\" : \"warn\",\n `wallet/auth/nexus ${health.ok ? \"ok\" : \"issues detected\"}`,\n );\n}\n","import { defineCommand } from \"citty\";\nimport { log } from \"@clack/prompts\";\nimport { forceHelpRequested, printHelp } from \"~/utils/help.js\";\nimport { error, info, isJsonMode, note, setJsonMode, success, warning } from \"~/utils/output.js\";\nimport { buildAgenticRuntimePlan } from \"~/utils/scheduler-plans.js\";\nimport type { OnboardStep } from \"~/utils/onboard/types.js\";\nimport {\n authenticateStep,\n configureDaemon,\n configureScheduler,\n createWalletStep,\n createWorkspace,\n installSkillsStep,\n registerAgentStep,\n resolveIdentity,\n runVerification,\n sendAnnouncement,\n setBioStep,\n setCapabilitiesStep,\n setDefaultWallet,\n verifyHome,\n verifyPasswordFile,\n} from \"~/utils/onboard/steps.js\";\n\nexport default defineCommand({\n meta: {\n name: \"onboard\",\n description: \"Idempotent agent setup for wallet, auth, registration, and scheduled wakes\",\n },\n args: {\n name: {\n type: \"string\",\n description: \"Agent display name (required)\",\n required: false,\n },\n \"agent-id\": {\n type: \"string\",\n description: \"GitHub username / agent ID override\",\n },\n role: {\n type: \"string\",\n description: \"Role: auto, zeno, zoe, admin\",\n default: \"auto\",\n },\n wallet: {\n type: \"string\",\n description: \"Wallet name override\",\n },\n host: {\n type: \"string\",\n description: \"SpacetimeDB host override\",\n },\n module: {\n type: \"string\",\n description: \"SpacetimeDB module override\",\n },\n \"password-file\": {\n type: \"string\",\n description: \"Path to wallet password file\",\n },\n capabilities: {\n type: \"string\",\n description: \"Comma-separated capabilities\",\n },\n bio: {\n type: \"string\",\n description: \"Agent bio\",\n },\n daemon: {\n type: \"string\",\n description: \"Daemon: auto, systemd, tmux, docker, stateless\",\n default: \"auto\",\n },\n scheduler: {\n type: \"string\",\n description: \"Scheduler: auto, managed, manual\",\n default: \"auto\",\n },\n \"dry-run\": {\n type: \"boolean\",\n description: \"Print plan without side effects\",\n default: false,\n },\n json: {\n type: \"boolean\",\n description: \"Output JSON only\",\n default: false,\n },\n },\n async run({ args }) {\n if (args.json) setJsonMode(true);\n\n const allowedSchedulers = new Set([\"auto\", \"managed\", \"manual\"]);\n if (!allowedSchedulers.has(String(args.scheduler))) {\n error(\n \"INVALID_SCHEDULER\",\n `Invalid --scheduler value: ${args.scheduler}`,\n \"Use one of: auto, managed, manual\",\n );\n }\n\n if (forceHelpRequested() || !args.name) {\n printHelp({\n command: \"probe onboard\",\n description: \"Complete required local and Nexus setup for autonomous participation\",\n usage: [\n 'probe onboard --name \"Alpha Centauri\"',\n 'probe onboard --name \"Alpha Centauri\" --role zeno --dry-run',\n ],\n options: [\n { name: \"--name\", detail: \"Required display name\" },\n { name: \"--agent-id\", detail: \"GitHub username override\" },\n { name: \"--role\", detail: \"auto | zeno | zoe | admin (default: auto)\" },\n { name: \"--wallet\", detail: \"Wallet name\" },\n { name: \"--host, --module\", detail: \"SpacetimeDB overrides\" },\n { name: \"--password-file\", detail: \"Path to password file\" },\n { name: \"--capabilities\", detail: \"Comma-separated list\" },\n { name: \"--bio\", detail: \"Agent bio text\" },\n { name: \"--daemon\", detail: \"auto | systemd | tmux | docker | stateless\" },\n { name: \"--scheduler\", detail: \"auto | managed | manual\" },\n { name: \"--dry-run\", detail: \"Plan only, no side effects\" },\n { name: \"--json\", detail: \"JSON output\" },\n ],\n });\n if (!args.name) {\n error(\n \"NAME_REQUIRED\",\n \"--name is required. Example: probe onboard --name 'Alpha Centauri'\",\n );\n }\n return;\n }\n\n const steps: OnboardStep[] = [];\n const state = {\n args: args as unknown as Parameters<typeof resolveIdentity>[0][\"args\"],\n agentId: \"\",\n role: \"\",\n walletName: \"\",\n walletAddress: \"\",\n passwordFile: \"\",\n token: \"\",\n walletCreated: false,\n mnemonic: \"\",\n steps,\n };\n\n // 1. Verify writable home\n if (!(await verifyHome(state))) {\n finish(state);\n return;\n }\n\n // 2-3. GitHub CLI + identity + role\n if (!(await resolveIdentity(state))) {\n finish(state);\n return;\n }\n\n // 4. Wallet\n await createWalletStep(state);\n\n // 5. Password file\n await verifyPasswordFile(state);\n\n // 6. Default wallet\n await setDefaultWallet(state);\n\n // 7. Auth\n if (!(await authenticateStep(state))) {\n finish(state);\n return;\n }\n\n // 8. Registration\n if (!(await registerAgentStep(state))) {\n finish(state);\n return;\n }\n\n // 9. Bio\n await setBioStep(state);\n\n // 10. Capabilities\n await setCapabilitiesStep(state);\n\n // 11. ZR.md\n await createWorkspace(state);\n\n // 12. Skills\n await installSkillsStep(state);\n\n // 13. Daemon\n await configureDaemon(state);\n\n // 14. Scheduler\n await configureScheduler(state);\n\n // 15. Announcement\n await sendAnnouncement(state);\n\n // 16. Verification\n await runVerification(state);\n\n finish(state);\n\n function finish(s: typeof state) {\n const hasFail = s.steps.some((st) => st.status === \"fail\");\n const hasManualRequired = s.steps.some((st) => st.status === \"manual_required\");\n const ok = !hasFail && !hasManualRequired;\n const passCount = s.steps.filter((st) => st.status === \"pass\").length;\n const warnCount = s.steps.filter((st) => st.status === \"warn\").length;\n const failCount = s.steps.filter((st) => st.status === \"fail\").length;\n\n const summary = {\n ok,\n agentId: s.agentId,\n name: args.name,\n role: s.role,\n wallet: s.walletName,\n next: ok\n ? \"Run probe next on scheduled wakes\"\n : hasManualRequired\n ? \"Complete manual-required steps and rerun probe onboard\"\n : \"Fix failed steps and rerun probe onboard\",\n };\n success(summary);\n\n if (!isJsonMode()) {\n const lines = [\n `Agent: ${s.agentId}`,\n `Name: ${args.name}`,\n `Role: ${s.role}`,\n `Wallet: ${s.walletName}`,\n `Steps: ${passCount} passed, ${failCount} failed, ${warnCount} warnings`,\n ];\n note(lines.join(\"\\n\"), ok ? \"Onboard Complete\" : \"Onboard Incomplete\");\n\n const failedSteps = s.steps.filter((st) => st.status === \"fail\");\n if (failedSteps.length > 0) {\n for (const step of failedSteps) {\n log.error(`${step.step}: ${step.detail}`);\n }\n }\n\n if (s.mnemonic) {\n warning(\"Save this mnemonic securely — it will not be shown again\");\n info(s.mnemonic);\n }\n\n const schedulerStep = s.steps.find(\n (st) => st.step === \"scheduler\" && st.status === \"manual_required\",\n );\n if (schedulerStep) {\n warning(\"Scheduler setup required — autonomous participation blocked\");\n note(\n buildAgenticRuntimePlan({\n agentId: s.agentId,\n role: s.role,\n intervalMinutes: 30,\n prompt: \"Run probe next and follow its instructions exactly.\",\n }),\n \"Agentic Runtime Setup\",\n );\n }\n }\n }\n },\n});\n","import { error } from \"~/utils/output.js\";\n\nconst CONNECTION_ERROR_MARKERS = [\n \"connection\",\n \"subscription error\",\n \"authentication required\",\n \"unauthorized\",\n \"401\",\n \"econnrefused\",\n \"etimedout\",\n \"enotfound\",\n \"timeout\",\n];\n\nexport const isConnectionLikeError = (message: string): boolean => {\n const lowered = message.toLowerCase();\n return CONNECTION_ERROR_MARKERS.some((marker) => lowered.includes(marker));\n};\n\nexport const failWithConnectionOrUnexpected = (message: string): never => {\n if (isConnectionLikeError(message)) {\n error(\"CONNECTION_ERROR\", message);\n }\n error(\"UNEXPECTED_ERROR\", message);\n};\n","import { getConfig } from \"~/utils/config.js\";\nimport {\n type Agent,\n CommandContext,\n callReducer,\n callProcedure,\n withAuth,\n} from \"~/utils/context.js\";\nimport { AgentRole, AgentStatus } from \"~/utils/enums.js\";\nimport { failWithConnectionOrUnexpected } from \"~/utils/errors.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\";\nimport type { GenerateVoiceResult } from \"~/module_bindings/types.js\";\n\nconst MAX_VOICE_TRANSCRIPT_LENGTH = 500;\nconst DEFAULT_VOICE_CONTEXT_TYPE = \"status_update\";\n\nexport interface AgentCommandArgs {\n action?: string;\n agentId?: string;\n name?: string;\n role?: string;\n address?: string;\n wallet?: string;\n task?: string;\n limit?: string;\n capabilities?: string;\n set?: string;\n agent?: string;\n clear?: boolean;\n audioUrl?: string;\n contextType?: string;\n host?: string;\n module?: string;\n}\n\nconst normalizeCapabilities = (value?: string): string[] => {\n if (!value) return [];\n return [\n ...new Set(\n value\n .split(\",\")\n .map((item) => item.trim().toLowerCase())\n .filter(Boolean),\n ),\n ];\n};\n\nexport const currentAgentForIdentity = (ctx: CommandContext): Agent | undefined => {\n return ctx\n .iter<Agent>(\"agents\")\n .find((a) => a.identity.toHexString() === ctx.identity?.toHexString());\n};\n\nconst renderAgent = (agent: Agent, identity?: string) => ({\n id: agent.id,\n name: agent.name,\n role: AgentRole.display(agent.role),\n status: AgentStatus.display(agent.status),\n lastHeartbeat: formatTimestamp(agent.lastHeartbeat),\n currentTaskId: agent.currentTaskId ? agent.currentTaskId.toString() : \"\",\n capabilities: agent.capabilities.join(\",\"),\n identity: identity || \"\",\n});\n\nconst renderAgentBio = (agent: Agent) => ({\n agentId: agent.id,\n name: agent.name,\n bio: agent.bio,\n});\n\nexport const runAgentAction = async (args: AgentCommandArgs): Promise<void> => {\n const action = args.action;\n if (!action) {\n error(\"ACTION_REQUIRED\", \"Agent action required\");\n }\n\n try {\n switch (action) {\n case \"register\": {\n const agentId = args.agentId;\n const name = args.name;\n const role = args.role || \"zeno\";\n\n if (!agentId || !name) error(\"ARGS_REQUIRED\", \"Agent ID and name required\");\n\n const config = await getConfig();\n const walletName = args.wallet || config.defaultWallet;\n if (!args.address && !walletName)\n error(\"WALLET_REQUIRED\", \"--address or --wallet required (or set default wallet)\");\n\n let address = args.address;\n const capabilities = normalizeCapabilities(args.capabilities);\n if (!address && walletName) {\n const wallet = await getWalletInfo(walletName);\n if (!wallet) error(\"WALLET_NOT_FOUND\", `Wallet not found: ${walletName}`);\n address = wallet.address;\n }\n\n try {\n await withAuth(\n { host: args.host, module: args.module, wallet: walletName },\n async (ctx) => {\n await callReducer(ctx, \"registerAgent\", {\n agentId,\n name,\n role: AgentRole.fromString(role),\n zenonAddress: address as string,\n });\n\n if (capabilities.length > 0) {\n await callReducer(ctx, \"updateAgentCapabilities\", {\n capabilities,\n });\n }\n\n await new Promise((r) => setTimeout(r, 500));\n const registered = ctx.iter<Agent>(\"agents\").find((a) => a.id === agentId);\n if (!registered) {\n if (role === \"zoe\" || role === \"admin\") {\n error(\"UNAUTHORIZED\", \"Only whitelisted identities can register as zoe or admin\");\n }\n error(\"REGISTRATION_FAILED\", \"Registration failed\");\n }\n },\n );\n success({\n registered: true,\n agentId,\n name,\n role,\n address,\n capabilities,\n });\n if (!isJsonMode()) {\n console.log(\n toonList(\"agent_registered\", [\n {\n agentId,\n name,\n role,\n address,\n capabilities: capabilities.join(\",\"),\n },\n ]),\n );\n }\n } catch (err) {\n error(\"REDUCER_FAILED\", err instanceof Error ? err.message : \"Unknown error\");\n }\n break;\n }\n\n case \"status\": {\n if (args.agentId || args.task || args.capabilities) {\n error(\n \"INVALID_USAGE\",\n \"Use `probe agent set-status <online|offline|working|busy>` to update status. `probe agent status` only shows current status.\",\n );\n }\n\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n const myAgent = currentAgentForIdentity(ctx);\n if (!myAgent)\n error(\"NOT_REGISTERED\", \"Agent not registered. Run `probe agent register` first.\");\n\n success(myAgent);\n if (!isJsonMode()) {\n console.log(toonList(\"agent\", [renderAgent(myAgent, ctx.identity?.toHexString())]));\n }\n },\n );\n break;\n }\n\n case \"set-status\": {\n const nextStatus = args.agentId;\n if (!nextStatus) {\n error(\"STATUS_REQUIRED\", \"Status required. Use: online, offline, working, busy\");\n }\n if (args.capabilities) {\n error(\n \"INVALID_USAGE\",\n \"Use `probe agent capabilities --set <list>` to update capabilities.\",\n );\n }\n\n const normalized = nextStatus.toLowerCase();\n const allowed = new Set([\"online\", \"offline\", \"working\", \"busy\"]);\n if (!allowed.has(normalized)) {\n error(\n \"INVALID_STATUS\",\n `Invalid status: ${nextStatus}. Use: online, offline, working, busy`,\n );\n }\n\n const mapped = AgentStatus.fromString(normalized);\n const isWorking = AgentStatus.is.working(mapped);\n if (isWorking && !args.task) {\n error(\"TASK_REQUIRED\", \"--task is required when setting status to working\");\n }\n if (!isWorking && args.task) {\n error(\"TASK_NOT_ALLOWED\", \"--task is only allowed when setting status to working\");\n }\n\n try {\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n await callReducer(ctx, \"setAgentStatus\", {\n status: mapped,\n taskId: isWorking ? BigInt(args.task as string) : undefined,\n });\n },\n );\n\n success({\n updated: true,\n status: normalized,\n taskId: args.task || null,\n });\n if (!isJsonMode()) {\n console.log(\n toonList(\"agent_status_updated\", [\n {\n status: normalized,\n taskId: args.task || \"\",\n },\n ]),\n );\n }\n } catch (err) {\n error(\"REDUCER_FAILED\", err instanceof Error ? err.message : \"Unknown error\");\n }\n break;\n }\n\n case \"capabilities\": {\n if (!args.set) error(\"CAPABILITIES_REQUIRED\", \"--set is required\");\n\n const capabilities = normalizeCapabilities(args.set);\n try {\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n await callReducer(ctx, \"updateAgentCapabilities\", {\n capabilities,\n });\n const myAgent = currentAgentForIdentity(ctx);\n success({ updated: true, agentId: myAgent?.id, capabilities });\n if (!isJsonMode()) {\n console.log(\n toonList(\"agent_capabilities_updated\", [\n {\n agentId: myAgent?.id || \"\",\n capabilities: capabilities.join(\",\"),\n },\n ]),\n );\n }\n },\n );\n } catch (err) {\n error(\"REDUCER_FAILED\", err instanceof Error ? err.message : \"Unknown error\");\n }\n break;\n }\n\n case \"me\": {\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n const myAgent = currentAgentForIdentity(ctx);\n if (!myAgent)\n error(\"NOT_REGISTERED\", \"Agent not registered. Run `probe agent register` first.\");\n\n success(myAgent);\n if (!isJsonMode()) {\n console.log(toonList(\"agent\", [renderAgent(myAgent, ctx.identity?.toHexString())]));\n }\n },\n );\n break;\n }\n\n case \"bio\": {\n const bioFromPositional = args.agentId?.trim();\n const hasSet = typeof args.set === \"string\";\n const hasClear = Boolean(args.clear);\n const hasPositionalBio = Boolean(bioFromPositional);\n const targetAgentId = args.agent?.trim();\n\n if (hasSet && hasClear) {\n error(\"INVALID_USAGE\", \"Use either --set or --clear, not both.\");\n }\n if (hasSet && hasPositionalBio) {\n error(\n \"INVALID_USAGE\",\n \"Provide bio text either as positional argument or --set, not both.\",\n );\n }\n if (targetAgentId && (hasSet || hasClear || hasPositionalBio)) {\n error(\n \"INVALID_USAGE\",\n \"--agent is read-only. Do not combine with --set, --clear, or positional bio text.\",\n );\n }\n\n const isWrite = hasSet || hasClear || hasPositionalBio;\n\n if (isWrite) {\n const bio = hasClear ? \"\" : (hasSet ? args.set : bioFromPositional) || \"\";\n try {\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n await callReducer(ctx, \"updateAgentBio\", { bio });\n const myAgent = currentAgentForIdentity(ctx);\n success({\n updated: true,\n agentId: myAgent?.id,\n bio,\n });\n if (!isJsonMode()) {\n console.log(toonList(\"agent_bio_updated\", [{ agentId: myAgent?.id || \"\", bio }]));\n }\n },\n );\n } catch (err) {\n error(\"REDUCER_FAILED\", err instanceof Error ? err.message : \"Unknown error\");\n }\n break;\n }\n\n if (targetAgentId) {\n await using ctx = await CommandContext.create({\n host: args.host,\n module: args.module,\n });\n const agent = ctx.iter<Agent>(\"agents\").find((a) => a.id === targetAgentId);\n if (!agent) {\n error(\"AGENT_NOT_FOUND\", `Agent not found: ${targetAgentId}`);\n }\n success(renderAgentBio(agent));\n if (!isJsonMode()) {\n console.log(toonList(\"agent_bio\", [renderAgentBio(agent)]));\n }\n break;\n }\n\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n const myAgent = currentAgentForIdentity(ctx);\n if (!myAgent)\n error(\"NOT_REGISTERED\", \"Agent not registered. Run `probe agent register` first.\");\n\n success(renderAgentBio(myAgent));\n if (!isJsonMode()) {\n console.log(toonList(\"agent_bio\", [renderAgentBio(myAgent)]));\n }\n },\n );\n break;\n }\n\n case \"heartbeat\": {\n try {\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n const myAgent = currentAgentForIdentity(ctx);\n if (!myAgent) error(\"NOT_REGISTERED\", \"Agent not registered\");\n\n await callReducer(ctx, \"heartbeat\", {\n agentId: myAgent.id,\n });\n success({ heartbeat: true });\n if (!isJsonMode()) {\n console.log(\n toonList(\"agent_heartbeat\", [\n {\n agentId: myAgent.id,\n status: AgentStatus.display(myAgent.status),\n },\n ]),\n );\n }\n },\n );\n } catch (err) {\n error(\"REDUCER_FAILED\", err instanceof Error ? err.message : \"Unknown error\");\n }\n break;\n }\n\n case \"list\": {\n await using ctx = await CommandContext.create({\n host: args.host,\n module: args.module,\n });\n const limit = args.limit ? parseInt(args.limit, 10) : undefined;\n if (limit !== undefined && (!Number.isFinite(limit) || limit <= 0)) {\n error(\"INVALID_LIMIT\", \"--limit must be a positive integer\");\n }\n\n let onlineAgents = ctx\n .iter<Agent>(\"agents\")\n .filter((a) => !AgentStatus.is.offline(a.status));\n onlineAgents = onlineAgents.sort((a, b) => {\n const aMicros = toMicros(a.lastHeartbeat || a.createdAt || a.lastActiveAt);\n const bMicros = toMicros(b.lastHeartbeat || b.createdAt || b.lastActiveAt);\n if (aMicros !== bMicros) return bMicros > aMicros ? 1 : -1;\n return b.id.localeCompare(a.id);\n });\n if (limit !== undefined) onlineAgents = onlineAgents.slice(0, limit);\n\n success({ agents: onlineAgents, count: onlineAgents.length });\n if (!isJsonMode()) {\n console.log(\n toonList(\n \"agents\",\n onlineAgents.map((a) => ({\n id: a.id,\n name: a.name,\n role: AgentRole.display(a.role),\n status: AgentStatus.display(a.status),\n last_heartbeat: formatTimestamp(a.lastHeartbeat),\n capabilities: a.capabilities.join(\",\"),\n })),\n ),\n );\n }\n break;\n }\n\n case \"identity\": {\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n const identityHex = ctx.identity?.toHexString();\n success({ identity: identityHex, wallet: args.wallet });\n if (!isJsonMode()) {\n console.log(\n toonList(\"identity\", [\n {\n identity: identityHex || \"\",\n wallet: args.wallet || \"\",\n },\n ]),\n );\n }\n },\n );\n break;\n }\n\n case \"voice\": {\n const transcript = args.agentId?.trim();\n if (!transcript) {\n error(\n \"TRANSCRIPT_REQUIRED\",\n \"Transcript required. Provide as first positional argument.\",\n );\n }\n if (transcript.length > MAX_VOICE_TRANSCRIPT_LENGTH) {\n error(\n \"TRANSCRIPT_TOO_LONG\",\n `Transcript exceeds ${MAX_VOICE_TRANSCRIPT_LENGTH} characters.`,\n );\n }\n if (!args.audioUrl) {\n error(\"AUDIO_URL_REQUIRED\", \"--audioUrl is required for voice announcements.\");\n }\n\n try {\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n const contextType = args.contextType || DEFAULT_VOICE_CONTEXT_TYPE;\n const result = await callProcedure<GenerateVoiceResult>(ctx, \"generate_voice\", {\n transcript,\n audioUrl: args.audioUrl,\n contextType,\n });\n\n const data = {\n ok: true,\n announcementId: result.id,\n seq: result.seq,\n agentName: result.agentName,\n keyPrefix: result.keyPrefix,\n audioUrl: args.audioUrl,\n contextType,\n };\n\n success(data);\n if (!isJsonMode()) {\n console.log(\n toonList(\"voice_announcement\", [\n {\n id: result.id,\n seq: result.seq,\n agentName: result.agentName,\n keyPrefix: result.keyPrefix,\n audioUrl: args.audioUrl || \"\",\n },\n ]),\n );\n }\n },\n );\n } catch (err) {\n error(\"PROCEDURE_FAILED\", err instanceof Error ? err.message : \"Unknown error\");\n }\n break;\n }\n\n default:\n error(\n \"INVALID_ACTION\",\n `Invalid action: ${action}`,\n \"Use: register, status, set-status, capabilities, bio, me, heartbeat, list, identity, voice\",\n );\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n failWithConnectionOrUnexpected(message);\n }\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 meta: { name: \"agent\", description: \"Agent management\" },\n args: {\n action: {\n type: \"positional\",\n description:\n \"Action: register, status, set-status, capabilities, bio, me, heartbeat, list, identity, voice\",\n required: false,\n },\n agentId: {\n type: \"positional\",\n description: \"Action-dependent value (agent ID, status, bio text, or transcript)\",\n required: false,\n },\n name: { type: \"positional\", description: \"Display name\", required: false },\n role: {\n type: \"positional\",\n description: \"Role: zoe, admin, zeno\",\n required: false,\n },\n address: { type: \"string\", description: \"Zenon address\" },\n wallet: { type: \"string\", description: \"Wallet name\" },\n task: { type: \"string\", description: \"Current task ID\" },\n limit: { type: \"string\", description: \"Limit agents returned for list\" },\n capabilities: {\n type: \"string\",\n description: \"Comma-separated capability list\",\n },\n set: {\n type: \"string\",\n description: \"Set capabilities for capabilities action or bio text for bio action\",\n },\n agent: { type: \"string\", description: \"Agent ID for bio action lookup\" },\n clear: { type: \"boolean\", description: \"Clear bio for bio action\" },\n json: { type: \"boolean\", description: \"Output JSON\", default: false },\n audioUrl: { type: \"string\", description: \"Audio URL for voice announcements\" },\n contextType: { type: \"string\", description: \"Context type for voice (default: status_update)\" },\n host: { type: \"string\", description: \"SpacetimeDB host\" },\n module: { type: \"string\", description: \"Module name\" },\n },\n async run({ args }) {\n if (args.json) setJsonMode(true);\n\n if (!args.action) {\n printHelp({\n command: \"probe agent\",\n description: \"Agent lifecycle and identity commands\",\n usage: [\n \"probe agent <action> [options]\",\n 'probe agent register agent-1 \"Builder\" zeno --wallet my-wallet',\n \"probe agent set-status working --task 42\",\n 'probe agent capabilities --set \"gh,coding,review\"',\n 'probe agent bio \"Build systems and task orchestration\"',\n \"probe agent heartbeat\",\n 'probe agent voice \"Hello from Zoe\" --audioUrl https://audio.zenon.red/voice/zoe/123.mp3',\n ],\n actions: [\n {\n name: \"register <agentId> <name> [role]\",\n detail: \"Register a new agent identity\",\n },\n { name: \"status\", detail: \"Show current agent status\" },\n {\n name: \"set-status <online|offline|working|busy>\",\n detail: \"Update current agent status\",\n },\n {\n name: \"capabilities --set <list>\",\n detail: \"Set capabilities for authenticated agent\",\n },\n {\n name: \"bio [--set <text>|--clear|--agent <id>]\",\n detail: \"View or update agent bio\",\n },\n { name: \"me\", detail: \"Show current authenticated agent profile\" },\n { name: \"heartbeat\", detail: \"Send heartbeat only\" },\n { name: \"list\", detail: \"List online agents\" },\n { name: \"identity\", detail: \"Show current authenticated identity\" },\n {\n name: \"voice <transcript> --audioUrl <url>\",\n detail: \"Submit a voice announcement (BYO audio URL)\",\n },\n ],\n options: [\n { name: \"--wallet\", detail: \"Wallet to use for authenticated calls\" },\n { name: \"--address\", detail: \"Zenon address for register\" },\n { name: \"--task\", detail: \"Task ID required with status working\" },\n { name: \"--limit\", detail: \"Max agents returned for list\" },\n {\n name: \"--capabilities\",\n detail: \"Comma-separated capabilities for register/status\",\n },\n {\n name: \"--set\",\n detail: \"Set value for capabilities or bio action\",\n },\n { name: \"--agent\", detail: \"Agent ID for bio action lookup\" },\n {\n name: \"--clear\",\n detail: \"Clear bio for authenticated agent\",\n },\n {\n name: \"--audioUrl\",\n detail: \"Audio URL for voice announcements (required)\",\n },\n {\n name: \"--contextType\",\n detail: \"Context type for voice (default: status_update)\",\n },\n {\n name: \"--host, --module\",\n detail: \"Nexus SpacetimeDB target overrides\",\n },\n ],\n notes: [\n \"Valid register roles: zeno (default), zoe, admin. Non-whitelisted identities cannot register as zoe/admin.\",\n \"Use `probe task list` to discover task IDs before `probe agent set-status working --task <id>`.\",\n \"`probe agent status` shows current status; `probe agent set-status <online|offline|working|busy>` updates status.\",\n ],\n });\n return;\n }\n\n await runAgentAction(args as AgentCommandArgs);\n },\n});\n","import { defineCommand } from \"citty\";\nimport { CommandContext, callReducer, type DiscoveredTask, withAuth } from \"~/utils/context.js\";\nimport { failWithConnectionOrUnexpected } from \"~/utils/errors.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 const value = input.toLowerCase();\n if (value === \"approve\") return { tag: \"ApproveAsTask\" };\n if (value === \"reject\") return { tag: \"Reject\" };\n if (value === \"escalate_to_idea\") return { tag: \"EscalateToIdea\" };\n return null;\n};\n\nconst discoveryStatusTag = (status: unknown): string => {\n if (status && typeof status === \"object\" && \"tag\" in status) {\n return String((status as { tag: string }).tag);\n }\n return String(status);\n};\n\nconst discoveryStatusDisplay = (status: unknown): string => {\n const tag = discoveryStatusTag(status);\n const map: Record<string, string> = {\n PendingReview: \"pending_review\",\n Approved: \"approved\",\n Rejected: \"rejected\",\n EscalatedToIdea: \"escalated_to_idea\",\n };\n return map[tag] ?? tag;\n};\n\nexport default defineCommand({\n meta: { name: \"discover\", description: \"Discovered task management\" },\n args: {\n action: {\n type: \"positional\",\n description: \"Action: report, review, list, get\",\n required: false,\n },\n id: {\n type: \"positional\",\n description: \"Discovered task ID\",\n required: false,\n },\n decision: {\n type: \"positional\",\n description: \"Decision: approve, reject, escalate_to_idea\",\n required: false,\n },\n task: { type: \"string\", description: \"Current task ID\" },\n project: { type: \"string\", description: \"Project ID\" },\n title: { type: \"string\", description: \"Task title\" },\n type: {\n type: \"string\",\n description: \"Task type: bug, improvement, feature\",\n },\n severity: {\n type: \"string\",\n description: \"Severity: low, medium, high, critical\",\n },\n status: { type: \"string\", description: \"Filter by status\" },\n limit: { type: \"string\", description: \"Limit discovered tasks returned\" },\n description: { type: \"string\", description: \"Description\" },\n reason: { type: \"string\", description: \"Rejection reason\" },\n wallet: { type: \"string\", description: \"Wallet name\" },\n json: { type: \"boolean\", description: \"Output JSON\", default: false },\n host: { type: \"string\", description: \"SpacetimeDB host\" },\n module: { type: \"string\", description: \"Module name\" },\n },\n async run({ args }) {\n if (args.json) setJsonMode(true);\n\n if (!args.action) {\n printHelp({\n command: \"probe discover\",\n description: \"Discovered task reporting and review\",\n usage: [\n \"probe discover <action> [options]\",\n 'probe discover report --task 12 --project 1 --title \"Fix parse\"',\n \"probe discover review 9 approve\",\n ],\n actions: [\n {\n name: \"report\",\n detail: \"Report a discovered task from current work\",\n },\n {\n name: \"review <id> <approve|reject|escalate_to_idea>\",\n detail: \"Approve, reject, or escalate discovery\",\n },\n { name: \"list\", detail: \"List discovered tasks\" },\n { name: \"get <id>\", detail: \"Show one discovered task\" },\n ],\n options: [\n { name: \"--task, --project, --title\", detail: \"Required for report\" },\n { name: \"--type\", detail: \"Task type: bug, improvement, feature\" },\n {\n name: \"--severity\",\n detail: \"Severity: low, medium, high, critical\",\n },\n { name: \"--reason\", detail: \"Reason for rejection/escalation\" },\n { name: \"--limit\", detail: \"Max discovered tasks returned for list\" },\n { name: \"--wallet\", detail: \"Wallet to use for authenticated calls\" },\n {\n name: \"--host, --module\",\n detail: \"Nexus SpacetimeDB target overrides\",\n },\n ],\n notes: [\n \"Find current task IDs with `probe task list` and project IDs with `probe project list`.\",\n ],\n });\n return;\n }\n\n const action = args.action;\n\n try {\n switch (action) {\n case \"report\": {\n if (!args.task || !args.project || !args.title) {\n error(\"ARGS_REQUIRED\", \"--task, --project, and --title required\");\n }\n\n try {\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n await callReducer(ctx, \"discoverTask\", {\n currentTaskId: BigInt(args.task!),\n projectId: BigInt(args.project!),\n title: args.title,\n description: args.description || \"\",\n priority: 5,\n taskType: args.type || \"improvement\",\n severity: args.severity || \"medium\",\n });\n },\n );\n success({ reported: true, title: args.title });\n if (!isJsonMode()) {\n console.log(\n toonList(\"discovery_reported\", [\n {\n title: args.title,\n taskId: args.task,\n projectId: args.project,\n },\n ]),\n );\n }\n } catch (err) {\n error(\"REDUCER_FAILED\", err instanceof Error ? err.message : \"Unknown error\");\n }\n break;\n }\n\n case \"review\": {\n const discId = args.id;\n const decisionInput = args.decision;\n if (!discId || !decisionInput) error(\"ARGS_REQUIRED\", \"ID and decision required\");\n\n const decision = decisionInput.toLowerCase();\n\n const validDecisions = [\"approve\", \"reject\", \"escalate_to_idea\"];\n if (!validDecisions.includes(decision)) {\n error(\n \"INVALID_DECISION\",\n `Invalid decision: ${decisionInput}. Use: ${validDecisions.join(\", \")}`,\n );\n }\n\n const decisionValue = toDiscoveryDecision(decision);\n if (!decisionValue) {\n error(\n \"INVALID_DECISION\",\n `Invalid decision: ${decisionInput}. Use: ${validDecisions.join(\", \")}`,\n );\n }\n\n try {\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n await callReducer(ctx, \"reviewDiscoveredTask\", {\n discoveryId: BigInt(discId),\n decision: decisionValue,\n reason: args.reason || undefined,\n });\n },\n );\n success({ reviewed: true, id: discId, decision });\n if (!isJsonMode()) {\n console.log(\n toonList(\"discovery_reviewed\", [\n {\n id: discId,\n decision,\n reason: args.reason || \"\",\n },\n ]),\n );\n }\n } catch (err) {\n error(\"REDUCER_FAILED\", err instanceof Error ? err.message : \"Unknown error\");\n }\n break;\n }\n\n case \"list\": {\n await using ctx = await CommandContext.create({\n host: args.host,\n module: args.module,\n });\n let discovered = ctx.iter<DiscoveredTask>(\"discovered_tasks\");\n const limit = args.limit ? parseInt(args.limit, 10) : undefined;\n\n if (limit !== undefined && (!Number.isFinite(limit) || limit <= 0)) {\n error(\"INVALID_LIMIT\", \"--limit must be a positive integer\");\n }\n\n if (args.status) {\n const filter = args.status.toLowerCase().replace(/[_\\s]/g, \"\");\n discovered = discovered.filter(\n (d) => discoveryStatusDisplay(d.status).replace(/[_\\s]/g, \"\") === filter,\n );\n }\n discovered = discovered.sort((a, b) => {\n const aMicros = toMicros(a.createdAt);\n const bMicros = toMicros(b.createdAt);\n if (aMicros !== bMicros) return bMicros > aMicros ? 1 : -1;\n if (a.id === b.id) return 0;\n return b.id > a.id ? 1 : -1;\n });\n if (limit !== undefined) discovered = discovered.slice(0, limit);\n\n success({ discoveredTasks: discovered, count: discovered.length });\n if (!isJsonMode()) {\n console.log(\n toonList(\n \"discovered_tasks\",\n discovered.map((d) => ({\n id: d.id.toString(),\n title: d.title,\n taskType: d.taskType,\n severity: d.severity,\n status: discoveryStatusDisplay(d.status),\n projectId: d.projectId,\n })),\n ),\n );\n }\n break;\n }\n\n case \"get\": {\n const discoveryId = args.id;\n if (!discoveryId) error(\"DISCOVERY_ID_REQUIRED\", \"Discovery ID required\");\n\n await using ctx = await CommandContext.create({\n host: args.host,\n module: args.module,\n });\n const discovery = ctx\n .iter<DiscoveredTask>(\"discovered_tasks\")\n .find((d) => d.id.toString() === discoveryId);\n if (!discovery) error(\"DISCOVERY_NOT_FOUND\", `Discovery not found: ${discoveryId}`);\n\n success(discovery);\n if (!isJsonMode()) {\n console.log(\n toonList(\"discovered_task\", [\n {\n id: discovery.id.toString(),\n title: discovery.title,\n status: discoveryStatusDisplay(discovery.status),\n taskType: discovery.taskType,\n severity: discovery.severity,\n priority: discovery.priority,\n projectId: discovery.projectId.toString(),\n currentTaskId: discovery.currentTaskId.toString(),\n description: discovery.description,\n reviewedBy: discovery.reviewedBy || \"\",\n reviewedAt: discovery.reviewedAt ? formatTimestamp(discovery.reviewedAt) : \"\",\n rejectionReason: discovery.rejectionReason || \"\",\n createdTaskId: discovery.createdTaskId ? discovery.createdTaskId.toString() : \"\",\n },\n ]),\n );\n }\n break;\n }\n\n default:\n error(\"INVALID_ACTION\", `Invalid action: ${action}`, \"Use: report, review, list, get\");\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n failWithConnectionOrUnexpected(message);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport {\n CommandContext,\n callReducer,\n type EvaluationDimension,\n type Idea,\n type Vote,\n withAuth,\n} from \"~/utils/context.js\";\nimport { IdeaStatus } from \"~/utils/enums.js\";\nimport { currentAgentForIdentity } from \"~/commands/nexus/agent-handlers.js\";\nimport { printHelp } from \"~/utils/help.js\";\nimport { failWithConnectionOrUnexpected } from \"~/utils/errors.js\";\nimport { error, isJsonMode, setJsonMode, success } from \"~/utils/output.js\";\nimport { toMicros } from \"~/utils/time.js\";\nimport { toonList } from \"~/utils/toon.js\";\n\nconst SCORE_FLAGS = [\n [\"ecosystem-impact\", \"ecosystem_impact\"],\n [\"implementation-readiness\", \"implementation_readiness\"],\n [\"dependency-independence\", \"dependency_independence\"],\n [\"documentation-leverage\", \"documentation_leverage\"],\n [\"maintenance-sustainability\", \"maintenance_sustainability\"],\n [\"agent-capability-fit\", \"agent_capability_fit\"],\n [\"execution-clarity\", \"execution_clarity\"],\n] as const;\n\ntype DimensionScoreInput = { dimension: string; score: number };\n\nconst sortIdeasNewest = (ideas: Idea[]): Idea[] => {\n return ideas.sort((a, b) => {\n const aMicros = toMicros(a.createdAt);\n const bMicros = toMicros(b.createdAt);\n if (aMicros !== bMicros) return bMicros > aMicros ? 1 : -1;\n if (a.id === b.id) return 0;\n return b.id > a.id ? 1 : -1;\n });\n};\n\nconst renderIdeaList = (ideas: Idea[]) => {\n return ideas.map((i) => ({\n id: i.id.toString(),\n title: i.title,\n category: i.category,\n status: IdeaStatus.display(i.status),\n votes: `${i.totalVotes}/${i.quorum}`,\n up: i.upVotes,\n veto: i.vetoCount,\n }));\n};\n\nfunction normalizeScore(rawScore: unknown, label: string): number {\n const score = Number(rawScore);\n if (!Number.isInteger(score)) {\n error(\"INVALID_SCORES\", `Score for '${label}' must be an integer`);\n }\n return score;\n}\n\nfunction validateDimensionScores(\n scores: DimensionScoreInput[],\n dimensions: EvaluationDimension[],\n): void {\n const activeDimensions = dimensions\n .filter((d) => d.active)\n .sort((a, b) => a.sortOrder - b.sortOrder);\n const scoreMap = new Map(scores.map((s) => [s.dimension, s.score]));\n\n for (const dim of activeDimensions) {\n if (!scoreMap.has(dim.name)) {\n error(\"MISSING_DIMENSION\", `Missing score for dimension: ${dim.label || dim.name}`);\n }\n const score = scoreMap.get(dim.name)!;\n if (score < dim.minScore || score > dim.maxScore) {\n error(\n \"INVALID_SCORE\",\n `Score for '${dim.name}' must be between ${dim.minScore} and ${dim.maxScore}`,\n );\n }\n }\n\n const activeNames = new Set(activeDimensions.map((d) => d.name));\n for (const score of scores) {\n if (!activeNames.has(score.dimension)) {\n error(\"UNKNOWN_DIMENSION\", `Unknown dimension: ${score.dimension}`);\n }\n }\n}\n\nfunction addScore(\n scores: Map<string, DimensionScoreInput>,\n dimension: string,\n rawScore: unknown,\n): void {\n const normalizedDimension = dimension.trim().replaceAll(\"-\", \"_\");\n if (!normalizedDimension) {\n error(\"INVALID_SCORES\", \"Dimension names cannot be empty\");\n }\n if (scores.has(normalizedDimension)) {\n error(\"INVALID_SCORES\", `Dimension '${normalizedDimension}' was provided more than once`);\n }\n scores.set(normalizedDimension, {\n dimension: normalizedDimension,\n score: normalizeScore(rawScore, normalizedDimension),\n });\n}\n\nfunction parseScorePairs(rawValue: unknown): Array<[string, string]> {\n if (rawValue === undefined) return [];\n const values = Array.isArray(rawValue) ? rawValue : [rawValue];\n return values.flatMap((value) =>\n String(value)\n .split(\",\")\n .map((part) => part.trim())\n .filter(Boolean)\n .map((part) => {\n const separator = part.indexOf(\"=\");\n if (separator <= 0 || separator === part.length - 1) {\n error(\"INVALID_SCORES\", \"--score entries must use dimension=value syntax\");\n }\n return [part.slice(0, separator), part.slice(separator + 1)] as [string, string];\n }),\n );\n}\n\nfunction buildDimensionScores(args: Record<string, unknown>): DimensionScoreInput[] {\n const scores = new Map<string, DimensionScoreInput>();\n\n for (const [flag, dimension] of SCORE_FLAGS) {\n if (args[flag] !== undefined) {\n addScore(scores, dimension, args[flag]);\n }\n }\n\n for (const [dimension, rawScore] of parseScorePairs(args.score)) {\n addScore(scores, dimension, rawScore);\n }\n\n if (scores.size === 0) {\n error(\"ARGS_REQUIRED\", \"Provide dimension scores with score flags or --score dimension=value\");\n }\n\n return [...scores.values()];\n}\n\nexport default defineCommand({\n meta: { name: \"idea\", description: \"Idea management\" },\n args: {\n action: {\n type: \"positional\",\n description: \"Action: list, pending, propose, vote, get, dimensions\",\n required: false,\n },\n id: { type: \"positional\", description: \"Idea ID\", required: false },\n title: { type: \"string\", description: \"Idea title\" },\n category: { type: \"string\", description: \"Category\" },\n description: { type: \"string\", description: \"Description\" },\n status: { type: \"string\", description: \"Filter by status\" },\n limit: { type: \"string\", description: \"Limit ideas returned\" },\n \"ecosystem-impact\": { type: \"string\", description: \"Ecosystem Impact score\" },\n \"implementation-readiness\": {\n type: \"string\",\n description: \"Implementation Readiness score\",\n },\n \"dependency-independence\": {\n type: \"string\",\n description: \"Dependency Independence score\",\n },\n \"documentation-leverage\": {\n type: \"string\",\n description: \"Documentation Leverage score\",\n },\n \"maintenance-sustainability\": {\n type: \"string\",\n description: \"Maintenance Sustainability score\",\n },\n \"agent-capability-fit\": {\n type: \"string\",\n description: \"Agent Capability Fit score\",\n },\n \"execution-clarity\": { type: \"string\", description: \"Execution Clarity score\" },\n score: {\n type: \"string\",\n description: \"Additional dimension score as name=value; repeatable\",\n multiple: true,\n },\n wallet: { type: \"string\", description: \"Wallet name\" },\n json: { type: \"boolean\", description: \"Output JSON\", default: false },\n host: { type: \"string\", description: \"SpacetimeDB host\" },\n module: { type: \"string\", description: \"Module name\" },\n },\n async run({ args }) {\n if (args.json) setJsonMode(true);\n\n if (!args.action) {\n printHelp({\n command: \"probe idea\",\n description: \"Idea discovery, review, and voting\",\n usage: [\n \"probe idea <action> [options]\",\n \"probe idea list --status voting\",\n \"probe idea dimensions\",\n \"probe idea vote 42 --ecosystem-impact 8 --execution-clarity 9 --implementation-readiness 7\",\n ],\n actions: [\n { name: \"list\", detail: \"List ideas with optional filters\" },\n { name: \"pending\", detail: \"List voting ideas you have not voted on\" },\n { name: \"get <id>\", detail: \"Show one idea\" },\n { name: \"dimensions\", detail: \"List active evaluation dimensions\" },\n { name: \"propose\", detail: \"Propose a new idea\" },\n { name: \"vote <id>\", detail: \"Vote on an idea with dimension scores\" },\n ],\n options: [\n { name: \"--title\", detail: \"Idea title for propose\" },\n { name: \"--description\", detail: \"Idea description for propose\" },\n { name: \"--category\", detail: \"Idea category for propose/list\" },\n { name: \"--ecosystem-impact\", detail: \"Ecosystem impact score\" },\n {\n name: \"--implementation-readiness\",\n detail: \"Implementation readiness score\",\n },\n {\n name: \"--dependency-independence\",\n detail: \"Dependency independence score\",\n },\n {\n name: \"--documentation-leverage\",\n detail: \"Documentation leverage score\",\n },\n {\n name: \"--maintenance-sustainability\",\n detail: \"Maintenance sustainability score\",\n },\n {\n name: \"--agent-capability-fit\",\n detail: \"Agent capability fit score\",\n },\n { name: \"--execution-clarity\", detail: \"Execution clarity score\" },\n { name: \"--score\", detail: \"Additional dimension score as name=value; repeatable\" },\n { name: \"--status\", detail: \"Status filter for list\" },\n { name: \"--limit\", detail: \"Max ideas returned for list/pending\" },\n { name: \"--wallet\", detail: \"Wallet to use for authenticated calls\" },\n {\n name: \"--host, --module\",\n detail: \"Nexus SpacetimeDB target overrides\",\n },\n ],\n notes: [\n \"Find idea IDs with `probe idea list` before using get/vote.\",\n \"Use `probe idea dimensions` to list active score dimensions.\",\n \"All active dimensions are required. Use explicit flags for default dimensions and repeatable --score name=value for custom dimensions.\",\n \"If a missing-dimension error names a dimension without a dedicated flag, use --score and consider updating Probe.\",\n ],\n });\n return;\n }\n\n const action = args.action;\n\n try {\n switch (action) {\n case \"list\": {\n await using ctx = await CommandContext.create({\n host: args.host,\n module: args.module,\n });\n let ideas = ctx.iter<Idea>(\"ideas\");\n const limit = args.limit ? parseInt(args.limit, 10) : undefined;\n\n if (limit !== undefined && (!Number.isFinite(limit) || limit <= 0)) {\n error(\"INVALID_LIMIT\", \"--limit must be a positive integer\");\n }\n\n if (args.status) ideas = ideas.filter((i) => IdeaStatus.matches(i.status, args.status!));\n if (args.category) ideas = ideas.filter((i) => i.category === args.category);\n ideas = sortIdeasNewest(ideas);\n if (limit !== undefined) ideas = ideas.slice(0, limit);\n\n success({ ideas, count: ideas.length });\n if (!isJsonMode()) {\n console.log(toonList(\"ideas\", renderIdeaList(ideas)));\n }\n break;\n }\n\n case \"pending\": {\n const limit = args.limit ? parseInt(args.limit, 10) : undefined;\n\n if (limit !== undefined && (!Number.isFinite(limit) || limit <= 0)) {\n error(\"INVALID_LIMIT\", \"--limit must be a positive integer\");\n }\n\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n const myAgent = currentAgentForIdentity(ctx);\n if (!myAgent) {\n error(\"NOT_REGISTERED\", \"Agent not registered. Run `probe agent register` first.\");\n }\n\n const votedIdeaIds = new Set(\n ctx\n .iter<Vote>(\"votes\")\n .filter((v) => v.agentId === myAgent.id)\n .map((v) => v.ideaId),\n );\n\n let ideas = ctx\n .iter<Idea>(\"ideas\")\n .filter((i) => IdeaStatus.is.voting(i.status))\n .filter((i) => !votedIdeaIds.has(i.id));\n\n ideas = sortIdeasNewest(ideas);\n\n if (limit !== undefined) ideas = ideas.slice(0, limit);\n\n success({ ideas, count: ideas.length });\n if (!isJsonMode()) {\n console.log(toonList(\"ideas\", renderIdeaList(ideas)));\n }\n },\n );\n break;\n }\n\n case \"get\": {\n const ideaId = args.id;\n if (!ideaId) error(\"IDEA_ID_REQUIRED\", \"Idea ID required\");\n\n await using ctx = await CommandContext.create({\n host: args.host,\n module: args.module,\n });\n const idea = ctx.iter<Idea>(\"ideas\").find((i) => i.id.toString() === ideaId);\n if (!idea) error(\"IDEA_NOT_FOUND\", `Idea not found: ${ideaId}`);\n\n success(idea);\n if (!isJsonMode()) {\n console.log(\n toonList(\"idea\", [\n {\n id: idea.id.toString(),\n title: idea.title,\n category: idea.category,\n status: IdeaStatus.display(idea.status),\n totalVotes: idea.totalVotes,\n quorum: idea.quorum,\n upVotes: idea.upVotes,\n downVotes: idea.downVotes,\n vetoCount: idea.vetoCount,\n approvalThreshold: idea.approvalThreshold,\n vetoThreshold: idea.vetoThreshold,\n computedScore: idea.computedScore,\n description: idea.description,\n },\n ]),\n );\n }\n break;\n }\n\n case \"dimensions\": {\n await using ctx = await CommandContext.create({\n host: args.host,\n module: args.module,\n });\n const dimensions = ctx\n .iter<EvaluationDimension>(\"evaluation_dimensions\")\n .filter((dimension) => dimension.active)\n .sort((a, b) => a.sortOrder - b.sortOrder);\n\n success({ dimensions, count: dimensions.length });\n if (!isJsonMode()) {\n console.log(\n toonList(\n \"evaluation_dimensions\",\n dimensions.map((dimension) => ({\n name: dimension.name,\n label: dimension.label,\n weight: dimension.weight,\n range: `${dimension.minScore}-${dimension.maxScore}`,\n description: dimension.description,\n })),\n ),\n );\n }\n break;\n }\n\n case \"propose\": {\n const title = String(args.title || \"\").trim();\n if (!title) error(\"ARGS_REQUIRED\", \"Title required\");\n const description = String(args.description || \"\").trim();\n if (!description) {\n error(\"DESCRIPTION_REQUIRED\", \"Description required and cannot be empty\");\n }\n const category = String(args.category || \"general\");\n let published: Idea | undefined;\n\n try {\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n const myAgent = currentAgentForIdentity(ctx);\n await callReducer(ctx, \"proposeIdea\", {\n title,\n description,\n category,\n });\n\n published = sortIdeasNewest(ctx.iter<Idea>(\"ideas\")).find(\n (idea) =>\n idea.title === title &&\n idea.category === category &&\n idea.description === description &&\n (!myAgent || idea.createdBy === myAgent.id),\n );\n },\n );\n success({\n proposed: true,\n idea: published\n ? {\n id: published.id.toString(),\n title: published.title,\n category: published.category,\n descriptionLength: published.description.length,\n }\n : {\n title,\n category,\n descriptionLength: description.length,\n },\n });\n if (!isJsonMode()) {\n console.log(\n toonList(\"idea_proposed\", [\n {\n id: published?.id.toString() || \"\",\n title,\n category,\n descriptionLength: published\n ? published.description.length\n : description.length,\n },\n ]),\n );\n }\n } catch (err) {\n error(\"REDUCER_FAILED\", err instanceof Error ? err.message : \"Unknown error\");\n }\n break;\n }\n\n case \"vote\": {\n const ideaId = args.id;\n if (!ideaId) error(\"ARGS_REQUIRED\", \"Idea ID required\");\n const dimensionScores = buildDimensionScores(args);\n\n try {\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n const activeDimensions = ctx.iter<EvaluationDimension>(\"evaluation_dimensions\");\n validateDimensionScores(dimensionScores, activeDimensions);\n\n await callReducer(ctx, \"voteIdea\", {\n ideaId: BigInt(ideaId),\n scores: dimensionScores,\n });\n },\n );\n success({ voted: true, ideaId, scores: dimensionScores });\n if (!isJsonMode()) {\n console.log(\n toonList(\"idea_voted\", [\n {\n ideaId,\n scores: JSON.stringify(dimensionScores),\n },\n ]),\n );\n }\n } catch (err) {\n error(\"REDUCER_FAILED\", err instanceof Error ? err.message : \"Unknown error\");\n }\n break;\n }\n\n default:\n error(\n \"INVALID_ACTION\",\n `Invalid action: ${action}`,\n \"Use: list, pending, propose, vote, get, dimensions\",\n );\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n failWithConnectionOrUnexpected(message);\n }\n },\n});\n","import type { MessageType as MessageTypeTag } from \"~/module_bindings/types.js\";\nimport {\n type Channel,\n CommandContext,\n callReducer,\n type Message,\n type Project,\n type ProjectMessage,\n withAuth,\n} from \"~/utils/context.js\";\nimport { MessageType } from \"~/utils/enums.js\";\nimport { failWithConnectionOrUnexpected } from \"~/utils/errors.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 action?: string;\n target?: string;\n content?: string;\n type?: string;\n context?: string;\n limit?: string;\n wallet?: string;\n host?: string;\n module?: string;\n}\n\nconst isNumeric = (str: string): boolean => /^\\d+$/.test(str);\nconst matchesContext = (message: Message | ProjectMessage, context?: string): boolean => {\n if (!context) return true;\n const normalized = context.trim();\n if (!normalized) return true;\n return message.id.toString() === normalized || (message.contextId || \"\") === normalized;\n};\n\nconst isUserMessage = (messageType: MessageTypeTag): boolean => MessageType.is.user(messageType);\nconst isDirectiveMessage = (messageType: MessageTypeTag): boolean =>\n MessageType.is.directive(messageType);\n\nexport const runMessageAction = async (args: MessageCommandArgs): Promise<void> => {\n const action = args.action;\n if (!action) {\n error(\"ACTION_REQUIRED\", \"Message action required\");\n }\n\n try {\n switch (action) {\n case \"list\": {\n const targetInput = args.target;\n const limit = parseInt(args.limit || \"20\", 10);\n if (!Number.isFinite(limit) || limit <= 0) {\n error(\"INVALID_LIMIT\", \"--limit must be a positive integer\");\n }\n\n await using ctx = await CommandContext.create({\n host: args.host,\n module: args.module,\n });\n const channels = ctx.iter<Channel>(\"channels\");\n const projects = ctx.iter<Project>(\"projects\");\n\n let messages: (Message | ProjectMessage)[] = [];\n let targetLabel = \"all\";\n\n if (targetInput) {\n if (isNumeric(targetInput)) {\n const projectId = BigInt(targetInput);\n const projectMessages = ctx.iter<ProjectMessage>(\"project_messages\");\n const project = projects.find((p) => p.id === projectId);\n\n messages = projectMessages\n .filter((m) => m.projectId === projectId && isUserMessage(m.messageType))\n .map((m) => ({ ...m, _type: \"project\" as const }));\n targetLabel = project ? `project:${project.name}` : `project:${projectId}`;\n } else {\n const channel = channels.find(\n (c) => c.name === targetInput || c.id.toString() === targetInput,\n );\n if (channel) {\n const channelMessages = ctx.iter<Message>(\"messages\");\n messages = channelMessages\n .filter((m) => m.channelId === channel.id && isUserMessage(m.messageType))\n .map((m) => ({ ...m, _type: \"channel\" as const }));\n targetLabel = `#${channel.name}`;\n }\n }\n } else {\n const channelMessages = ctx.iter<Message>(\"messages\");\n const projectMessages = ctx.iter<ProjectMessage>(\"project_messages\");\n\n messages = [\n ...channelMessages\n .filter((m) => isUserMessage(m.messageType))\n .map((m) => ({ ...m, _type: \"channel\" as const })),\n ...projectMessages\n .filter((m) => isUserMessage(m.messageType))\n .map((m) => ({ ...m, _type: \"project\" as const })),\n ];\n }\n\n messages = messages.filter((m) => matchesContext(m, args.context));\n\n messages.sort((a, b) => {\n const aTime = toMicros(a.createdAt);\n const bTime = toMicros(b.createdAt);\n if (aTime < bTime) return 1;\n if (aTime > bTime) return -1;\n return 0;\n });\n\n messages = messages.slice(0, limit);\n\n const channelMap = new Map(channels.map((c) => [c.id.toString(), c.name]));\n const projectMap = new Map(projects.map((p) => [p.id.toString(), p.name]));\n\n success({ messages, count: messages.length, target: targetLabel });\n if (!isJsonMode()) {\n console.log(\n toonList(\n \"messages\",\n messages.map((m) => {\n const isProject = \"_type\" in m && m._type === \"project\";\n const location = isProject\n ? `project:${projectMap.get((m as ProjectMessage).projectId.toString()) || (m as ProjectMessage).projectId}`\n : `#${channelMap.get((m as Message).channelId.toString()) || (m as Message).channelId}`;\n\n return {\n id: m.id.toString(),\n location,\n senderId: m.senderId,\n content: m.content,\n messageType: MessageType.display(m.messageType),\n contextId: m.contextId || null,\n createdAt: formatTimestamp(m.createdAt),\n };\n }),\n ),\n );\n }\n break;\n }\n\n case \"directives\": {\n const targetInput = args.target;\n const limit = parseInt(args.limit || \"20\", 10);\n if (!Number.isFinite(limit) || limit <= 0) {\n error(\"INVALID_LIMIT\", \"--limit must be a positive integer\");\n }\n\n await using ctx = await CommandContext.create({\n host: args.host,\n module: args.module,\n });\n const channels = ctx.iter<Channel>(\"channels\");\n const projects = ctx.iter<Project>(\"projects\");\n\n let messages: (Message | ProjectMessage)[] = [];\n let targetLabel = \"all\";\n\n if (targetInput) {\n if (isNumeric(targetInput)) {\n const projectId = BigInt(targetInput);\n const projectMessages = ctx.iter<ProjectMessage>(\"project_messages\");\n const project = projects.find((p) => p.id === projectId);\n\n messages = projectMessages\n .filter((m) => m.projectId === projectId && isDirectiveMessage(m.messageType))\n .map((m) => ({ ...m, _type: \"project\" as const }));\n targetLabel = project ? `project:${project.name}` : `project:${projectId}`;\n } else {\n const channel = channels.find(\n (c) => c.name === targetInput || c.id.toString() === targetInput,\n );\n if (channel) {\n const channelMessages = ctx.iter<Message>(\"messages\");\n messages = channelMessages\n .filter((m) => m.channelId === channel.id && isDirectiveMessage(m.messageType))\n .map((m) => ({ ...m, _type: \"channel\" as const }));\n targetLabel = `#${channel.name}`;\n }\n }\n } else {\n const channelMessages = ctx.iter<Message>(\"messages\");\n const projectMessages = ctx.iter<ProjectMessage>(\"project_messages\");\n\n messages = [\n ...channelMessages\n .filter((m) => isDirectiveMessage(m.messageType))\n .map((m) => ({ ...m, _type: \"channel\" as const })),\n ...projectMessages\n .filter((m) => isDirectiveMessage(m.messageType))\n .map((m) => ({ ...m, _type: \"project\" as const })),\n ];\n }\n\n messages = messages.filter((m) => matchesContext(m, args.context));\n\n messages.sort((a, b) => {\n const aTime = toMicros(a.createdAt);\n const bTime = toMicros(b.createdAt);\n if (aTime < bTime) return 1;\n if (aTime > bTime) return -1;\n return 0;\n });\n\n messages = messages.slice(0, limit);\n\n const channelMap = new Map(channels.map((c) => [c.id.toString(), c.name]));\n const projectMap = new Map(projects.map((p) => [p.id.toString(), p.name]));\n\n success({ messages, count: messages.length, target: targetLabel });\n if (!isJsonMode()) {\n console.log(\n toonList(\n \"directives\",\n messages.map((m) => {\n const isProject = \"_type\" in m && m._type === \"project\";\n const location = isProject\n ? `project:${projectMap.get((m as ProjectMessage).projectId.toString()) || (m as ProjectMessage).projectId}`\n : `#${channelMap.get((m as Message).channelId.toString()) || (m as Message).channelId}`;\n\n return {\n id: m.id.toString(),\n location,\n senderId: m.senderId,\n content: m.content,\n messageType: MessageType.display(m.messageType),\n contextId: m.contextId || null,\n createdAt: formatTimestamp(m.createdAt),\n };\n }),\n ),\n );\n }\n break;\n }\n\n case \"directive\": {\n const targetInput = args.target;\n const content = args.content;\n if (!targetInput || !content) {\n error(\n \"ARGS_REQUIRED\",\n \"Target and directive content required. Usage: probe message directive <target> <content>\",\n );\n }\n\n try {\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n if (isNumeric(targetInput)) {\n const projectId = BigInt(targetInput);\n const projects = ctx.iter<Project>(\"projects\");\n const projectChannels = ctx.iter<{ projectId: bigint }>(\"project_channels\");\n\n const project = projects.find((p) => p.id === projectId);\n if (!project) {\n error(\"PROJECT_NOT_FOUND\", `Project '${targetInput}' not found`);\n }\n\n const projectChannel = projectChannels.find((pc) => pc.projectId === projectId);\n if (!projectChannel) {\n error(\n \"PROJECT_CHANNEL_NOT_FOUND\",\n `Project channel for '${targetInput}' not found`,\n );\n }\n\n await callReducer(ctx, \"sendProjectMessage\", {\n projectId,\n content,\n messageType: MessageType.fromString(\"directive\"),\n contextId: args.context,\n });\n\n success({\n sent: true,\n projectId: projectId.toString(),\n projectName: project.name,\n messageType: \"directive\",\n });\n if (!isJsonMode()) {\n console.log(\n toonList(\"directive_sent\", [\n {\n target: `project:${project.name}`,\n contextId: args.context || null,\n },\n ]),\n );\n }\n } else {\n const channels = ctx.iter<Channel>(\"channels\");\n const channel = channels.find(\n (c) => c.name === targetInput || c.id.toString() === targetInput,\n );\n if (!channel) {\n error(\n \"CHANNEL_NOT_FOUND\",\n `Channel '${targetInput}' not found. Available: ${channels.map((c) => c.name).join(\", \")}`,\n );\n }\n\n await callReducer(ctx, \"sendMessage\", {\n channelId: channel.id,\n content,\n messageType: MessageType.fromString(\"directive\"),\n contextId: args.context,\n });\n\n success({\n sent: true,\n channelId: channel.id.toString(),\n channelName: channel.name,\n messageType: \"directive\",\n });\n if (!isJsonMode()) {\n console.log(\n toonList(\"directive_sent\", [\n {\n target: `#${channel.name}`,\n contextId: args.context || null,\n },\n ]),\n );\n }\n }\n },\n );\n } catch (err) {\n error(\"REDUCER_FAILED\", err instanceof Error ? err.message : \"Unknown error\");\n }\n break;\n }\n\n case \"send\": {\n const targetInput = args.target;\n const content = args.content;\n if (!targetInput || !content) {\n error(\n \"ARGS_REQUIRED\",\n \"Target and message content required. Usage: probe message send <target> <content>\",\n );\n }\n\n if ((args.type || \"user\").toLowerCase() === \"directive\") {\n error(\n \"INVALID_TYPE\",\n \"'directive' is not allowed with 'message send'. Use: probe message directive <target> <content>\",\n );\n }\n\n try {\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n if (isNumeric(targetInput)) {\n const projectId = BigInt(targetInput);\n const projects = ctx.iter<Project>(\"projects\");\n const projectChannels = ctx.iter<{ projectId: bigint }>(\"project_channels\");\n\n const project = projects.find((p) => p.id === projectId);\n if (!project) {\n error(\"PROJECT_NOT_FOUND\", `Project '${targetInput}' not found`);\n }\n\n const projectChannel = projectChannels.find((pc) => pc.projectId === projectId);\n if (!projectChannel) {\n error(\n \"PROJECT_CHANNEL_NOT_FOUND\",\n `Project channel for '${targetInput}' not found`,\n );\n }\n\n await callReducer(ctx, \"sendProjectMessage\", {\n projectId,\n content,\n messageType: MessageType.fromString(args.type || \"user\"),\n contextId: args.context,\n });\n\n success({\n sent: true,\n projectId: projectId.toString(),\n projectName: project.name,\n });\n if (!isJsonMode()) {\n console.log(\n toonList(\"message_sent\", [\n {\n target: `project:${project.name}`,\n messageType: args.type || \"user\",\n contextId: args.context || null,\n },\n ]),\n );\n }\n } else {\n const channels = ctx.iter<Channel>(\"channels\");\n const channel = channels.find(\n (c) => c.name === targetInput || c.id.toString() === targetInput,\n );\n if (!channel) {\n error(\n \"CHANNEL_NOT_FOUND\",\n `Channel '${targetInput}' not found. Available: ${channels.map((c) => c.name).join(\", \")}`,\n );\n }\n\n await callReducer(ctx, \"sendMessage\", {\n channelId: channel.id,\n content,\n messageType: MessageType.fromString(args.type || \"user\"),\n contextId: args.context,\n });\n\n success({\n sent: true,\n channelId: channel.id.toString(),\n channelName: channel.name,\n });\n if (!isJsonMode()) {\n console.log(\n toonList(\"message_sent\", [\n {\n target: `#${channel.name}`,\n messageType: args.type || \"user\",\n contextId: args.context || null,\n },\n ]),\n );\n }\n }\n },\n );\n } catch (err) {\n error(\"REDUCER_FAILED\", err instanceof Error ? err.message : \"Unknown error\");\n }\n break;\n }\n\n case \"channels\": {\n await using ctx = await CommandContext.create({\n host: args.host,\n module: args.module,\n });\n const channels = ctx.iter<Channel>(\"channels\");\n const projects = ctx.iter<Project>(\"projects\");\n const projectChannels = ctx.iter<{ projectId: bigint }>(\"project_channels\");\n\n const projectChannelSet = new Set(projectChannels.map((pc) => pc.projectId.toString()));\n const projectsWithChannels = projects.filter((p) => projectChannelSet.has(p.id.toString()));\n\n success({\n channels,\n projects: projectsWithChannels,\n channelCount: channels.length,\n projectCount: projectsWithChannels.length,\n });\n if (!isJsonMode()) {\n console.log(\n toonList(\n \"channels\",\n channels.map((c) => ({\n id: c.id.toString(),\n name: c.name,\n createdBy: c.createdBy,\n })),\n ),\n );\n console.log(\n toonList(\n \"projects\",\n projectsWithChannels.map((p) => ({\n id: p.id.toString(),\n name: p.name,\n repo: p.githubRepo,\n })),\n ),\n );\n }\n break;\n }\n\n default:\n error(\n \"INVALID_ACTION\",\n `Invalid action: ${action}`,\n \"Use: list, send, directive, directives, channels\",\n );\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n failWithConnectionOrUnexpected(message);\n }\n};\n","import { defineCommand } from \"citty\";\nimport { printHelp } from \"~/utils/help.js\";\nimport { setJsonMode } from \"~/utils/output.js\";\nimport { type MessageCommandArgs, runMessageAction } from \"./message-handlers.js\";\n\nexport default defineCommand({\n meta: { name: \"message\", description: \"Message management\" },\n args: {\n action: {\n type: \"positional\",\n description: \"Action: list, send, directive, directives, channels\",\n required: false,\n },\n target: {\n type: \"positional\",\n description: \"Channel name, project ID, or message content\",\n required: false,\n },\n content: {\n type: \"positional\",\n description: \"Message content (if target is channel/project)\",\n required: false,\n },\n type: {\n type: \"string\",\n description: \"Message type: user, system\",\n default: \"user\",\n },\n context: {\n type: \"string\",\n description: \"Thread context ID (message ID or entity ref like task:42)\",\n },\n limit: { type: \"string\", description: \"Limit messages\", default: \"20\" },\n wallet: { type: \"string\", description: \"Wallet name\" },\n json: { type: \"boolean\", description: \"Output JSON\", default: false },\n host: { type: \"string\", description: \"SpacetimeDB host\" },\n module: { type: \"string\", description: \"Module name\" },\n },\n async run({ args }) {\n if (args.json) setJsonMode(true);\n\n if (!args.action) {\n printHelp({\n command: \"probe message\",\n description: \"Channel and project messaging commands\",\n usage: [\n \"probe message <action> [target] [content] [options]\",\n \"probe message list --limit 50\",\n 'probe message send general \"hello team\"',\n 'probe message directive zoe \"Focus on project stability\" --context project:1',\n ],\n actions: [\n {\n name: \"list [target]\",\n detail: \"List user messages (all, channel, or project)\",\n },\n {\n name: \"directives [target]\",\n detail: \"List directive messages (all, channel, or project)\",\n },\n {\n name: \"send <target> <content>\",\n detail: \"Send to target channel/project\",\n },\n {\n name: \"directive <target> <content>\",\n detail: \"Send directive to target channel/project\",\n },\n { name: \"channels\", detail: \"List channels and project channels\" },\n ],\n options: [\n {\n name: \"--type\",\n detail: \"Message type: user, system (default: user)\",\n },\n {\n name: \"--context\",\n detail: \"Optional thread context ID (message ID or entity ref)\",\n },\n {\n name: \"--limit\",\n detail: \"Max messages returned for list (default: 20)\",\n },\n { name: \"--wallet\", detail: \"Wallet to use for send\" },\n {\n name: \"--host, --module\",\n detail: \"Nexus SpacetimeDB target overrides\",\n },\n ],\n examples: [\n \"probe message send general hello\",\n 'probe message directive zoe \"Pause new work\" --context project:1',\n \"probe message directives zoe --limit 1\",\n 'probe message send zoe \"hello there\"',\n 'probe message send zoe \"reviewed\" --context 123',\n 'probe message send 1 \"project update\"',\n \"probe message list zoe --limit 10\",\n ],\n notes: [\n \"Quotes are only required when target/content contains spaces.\",\n \"Use `probe message channels` to discover available channel names and project IDs.\",\n ],\n });\n return;\n }\n\n await runMessageAction(args as MessageCommandArgs);\n },\n});\n","import { defineCommand } from \"citty\";\nimport { CommandContext, callReducer, type Project, withAuth } from \"~/utils/context.js\";\nimport { ProjectStatus } from \"~/utils/enums.js\";\nimport { failWithConnectionOrUnexpected } from \"~/utils/errors.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 meta: { name: \"project\", description: \"Project commands\" },\n args: {\n action: {\n type: \"positional\",\n description: \"Action: list, get, create, status, set-status\",\n required: false,\n },\n id: { type: \"positional\", description: \"Project ID\", required: false },\n value: {\n type: \"positional\",\n description: \"Status value for set-status: active|paused\",\n required: false,\n },\n status: { type: \"string\", description: \"Filter by status\" },\n limit: { type: \"string\", description: \"Limit projects returned\" },\n name: { type: \"string\", description: \"Project name\" },\n description: { type: \"string\", description: \"Project description\" },\n \"github-repo\": { type: \"string\", description: \"GitHub repository URL\" },\n \"source-idea\": { type: \"string\", description: \"Source idea ID\" },\n wallet: { type: \"string\", description: \"Wallet name\" },\n json: { type: \"boolean\", description: \"Output JSON\", default: false },\n host: { type: \"string\", description: \"SpacetimeDB host\" },\n module: { type: \"string\", description: \"Module name\" },\n },\n async run({ args }) {\n if (args.json) setJsonMode(true);\n\n if (!args.action) {\n printHelp({\n command: \"probe project\",\n description: \"Project listing and lookup commands\",\n usage: [\n \"probe project <action> [options]\",\n \"probe project list --status active\",\n \"probe project get 1\",\n \"probe project status 1\",\n \"probe project set-status 1 paused --wallet admin-wallet\",\n ],\n actions: [\n { name: \"list\", detail: \"List projects with optional status filter\" },\n { name: \"get <id>\", detail: \"Show one project by ID\" },\n { name: \"create\", detail: \"Create a new project\" },\n { name: \"status <id>\", detail: \"Show only project status\" },\n {\n name: \"set-status <id> <active|paused>\",\n detail: \"Update project status (admin/zoe)\",\n },\n ],\n options: [\n { name: \"--status\", detail: \"Status filter for list: active|paused\" },\n { name: \"--limit\", detail: \"Max projects returned for list\" },\n { name: \"--name\", detail: \"Project name (create)\" },\n { name: \"--description\", detail: \"Project description (create)\" },\n { name: \"--github-repo\", detail: \"GitHub repository URL (create)\" },\n { name: \"--source-idea\", detail: \"Source idea ID (create)\" },\n { name: \"--wallet\", detail: \"Wallet to use for authenticated calls\" },\n {\n name: \"--host, --module\",\n detail: \"Nexus SpacetimeDB target overrides\",\n },\n ],\n notes: [\n \"Only admin/zoe identities can call set-status.\",\n \"Find idea IDs with `probe idea list` before using --source-idea.\",\n \"Find project IDs with `probe project list` before using get/create follow-up commands.\",\n ],\n });\n return;\n }\n\n const action = args.action;\n\n try {\n switch (action) {\n case \"list\": {\n await using ctx = await CommandContext.create({\n host: args.host,\n module: args.module,\n });\n let projects = ctx.iter<Project>(\"projects\");\n const limit = args.limit ? parseInt(args.limit, 10) : undefined;\n\n if (limit !== undefined && (!Number.isFinite(limit) || limit <= 0)) {\n error(\"INVALID_LIMIT\", \"--limit must be a positive integer\");\n }\n\n if (args.status)\n projects = projects.filter((p) =>\n ProjectStatus.matches(p.status, args.status as string),\n );\n projects = projects.sort((a, b) => {\n const aMicros = toMicros(a.createdAt);\n const bMicros = toMicros(b.createdAt);\n if (aMicros !== bMicros) return bMicros > aMicros ? 1 : -1;\n if (a.id === b.id) return 0;\n return b.id > a.id ? 1 : -1;\n });\n if (limit !== undefined) projects = projects.slice(0, limit);\n\n success({ projects, count: projects.length });\n if (!isJsonMode()) {\n console.log(\n toonList(\n \"projects\",\n projects.map((p) => ({\n id: p.id,\n name: p.name,\n status: ProjectStatus.display(p.status),\n githubRepo: p.githubRepo,\n })),\n ),\n );\n }\n break;\n }\n\n case \"get\": {\n const projectId = args.id;\n if (!projectId) error(\"PROJECT_ID_REQUIRED\", \"Project ID required\");\n\n await using ctx = await CommandContext.create({\n host: args.host,\n module: args.module,\n });\n const project = ctx.iter<Project>(\"projects\").find((p) => p.id.toString() === projectId);\n if (!project) error(\"PROJECT_NOT_FOUND\", `Project not found: ${projectId}`);\n\n success(project);\n if (!isJsonMode()) {\n console.log(\n toonList(\"project\", [\n {\n id: project.id.toString(),\n name: project.name,\n status: ProjectStatus.display(project.status),\n githubRepo: project.githubRepo,\n description: project.description,\n },\n ]),\n );\n }\n break;\n }\n\n case \"status\": {\n const projectId = args.id;\n if (!projectId) error(\"PROJECT_ID_REQUIRED\", \"Project ID required\");\n\n await using ctx = await CommandContext.create({\n host: args.host,\n module: args.module,\n });\n const project = ctx.iter<Project>(\"projects\").find((p) => p.id.toString() === projectId);\n if (!project) error(\"PROJECT_NOT_FOUND\", `Project not found: ${projectId}`);\n\n const status = ProjectStatus.display(project.status);\n success({ projectId, status });\n if (!isJsonMode()) {\n console.log(\n toonList(\"project_status\", [\n {\n id: project.id.toString(),\n name: project.name,\n status,\n },\n ]),\n );\n }\n break;\n }\n\n case \"create\": {\n if (!args.name || !args[\"github-repo\"] || !args[\"source-idea\"]) {\n error(\"ARGS_REQUIRED\", \"--name, --github-repo, and --source-idea required\");\n }\n\n try {\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n await callReducer(ctx, \"createProject\", {\n sourceIdeaId: BigInt(args[\"source-idea\"] as string),\n name: args.name,\n githubRepo: args[\"github-repo\"],\n description: args.description || \"\",\n });\n },\n );\n success({\n created: true,\n name: args.name,\n githubRepo: args[\"github-repo\"],\n sourceIdeaId: args[\"source-idea\"],\n });\n if (!isJsonMode()) {\n console.log(\n toonList(\"project_created\", [\n {\n name: args.name,\n githubRepo: args[\"github-repo\"],\n sourceIdeaId: args[\"source-idea\"],\n },\n ]),\n );\n }\n } catch (err) {\n error(\"REDUCER_FAILED\", err instanceof Error ? err.message : \"Unknown error\");\n }\n break;\n }\n\n case \"set-status\": {\n const projectId = args.id;\n const nextStatus = args.value;\n if (!projectId || !nextStatus) {\n error(\n \"ARGS_REQUIRED\",\n \"Project ID and status required. Use: probe project set-status <id> <active|paused>\",\n );\n }\n\n const normalized = nextStatus.toLowerCase().replace(/[_\\s]/g, \"\");\n if (![\"active\", \"paused\"].includes(normalized)) {\n error(\"INVALID_STATUS\", `Invalid status: ${nextStatus}. Use: active, paused`);\n }\n\n try {\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n await callReducer(ctx, \"updateProjectStatus\", {\n projectId: BigInt(projectId),\n status: ProjectStatus.fromString(nextStatus),\n });\n },\n );\n\n success({ updated: true, projectId, status: normalized });\n if (!isJsonMode()) {\n console.log(\n toonList(\"project_status_updated\", [\n {\n projectId,\n status: normalized,\n },\n ]),\n );\n }\n } catch (err) {\n error(\"REDUCER_FAILED\", err instanceof Error ? err.message : \"Unknown error\");\n }\n break;\n }\n\n default:\n error(\n \"INVALID_ACTION\",\n `Invalid action: ${action}`,\n \"Use: list, get, create, status, set-status\",\n );\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n failWithConnectionOrUnexpected(message);\n }\n },\n});\n","import {\n CommandContext,\n callReducer,\n type Project,\n type Task,\n type TaskDependency,\n withAuth,\n} from \"~/utils/context.js\";\nimport { failWithConnectionOrUnexpected } from \"~/utils/errors.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 action?: string;\n id?: string;\n status?: string;\n project?: string;\n title?: string;\n description?: string;\n priority?: string;\n assigned?: boolean;\n wallet?: string;\n \"github-pr-url\"?: string;\n \"github-issue-url\"?: string;\n \"add-dep\"?: string;\n list?: boolean;\n timeout?: string;\n limit?: string;\n host?: string;\n module?: string;\n}\n\nconst normalizeGitHubRepoUrl = (githubRepo: string): string | undefined => {\n const value = githubRepo.trim().replace(/\\.git$/i, \"\");\n if (!value) return undefined;\n\n if (/^[\\w.-]+\\/[\\w.-]+$/.test(value)) {\n return `https://github.com/${value}`;\n }\n\n const sshMatch = value.match(/^git@github\\.com:([\\w.-]+\\/[\\w.-]+)$/i);\n if (sshMatch) {\n return `https://github.com/${sshMatch[1]}`;\n }\n\n if (value.startsWith(\"http://\") || value.startsWith(\"https://\")) {\n try {\n const parsed = new URL(value);\n if (parsed.hostname !== \"github.com\") return undefined;\n const parts = parsed.pathname.split(\"/\").filter(Boolean);\n if (parts.length < 2) return undefined;\n return `https://github.com/${parts[0]}/${parts[1]}`;\n } catch {\n return undefined;\n }\n }\n\n return undefined;\n};\n\nexport const runTaskAction = async (args: TaskCommandArgs): Promise<void> => {\n const action = args.action;\n if (!action) {\n error(\"ACTION_REQUIRED\", \"Task action required\");\n }\n\n try {\n switch (action) {\n case \"list\": {\n await using ctx = await CommandContext.create({\n host: args.host,\n module: args.module,\n });\n let tasks = ctx.iter<Task>(\"tasks\");\n const statusFilter = args.status;\n const limit = args.limit ? parseInt(args.limit, 10) : undefined;\n\n if (limit !== undefined && (!Number.isFinite(limit) || limit <= 0)) {\n error(\"INVALID_LIMIT\", \"--limit must be a positive integer\");\n }\n\n if (statusFilter) tasks = tasks.filter((t) => TaskStatus.matches(t.status, statusFilter));\n if (args.project) tasks = tasks.filter((t) => t.projectId.toString() === args.project);\n if (args.assigned) tasks = tasks.filter((t) => t.assignedTo);\n tasks = tasks.sort((a, b) => {\n const aMicros = toMicros(a.createdAt);\n const bMicros = toMicros(b.createdAt);\n if (aMicros !== bMicros) return bMicros > aMicros ? 1 : -1;\n if (a.id === b.id) return 0;\n return b.id > a.id ? 1 : -1;\n });\n if (limit !== undefined) tasks = tasks.slice(0, limit);\n\n success({ tasks, count: tasks.length });\n if (!isJsonMode()) {\n console.log(\n toonList(\n \"tasks\",\n tasks.map((t) => ({\n id: t.id.toString(),\n title: t.title,\n status: TaskStatus.display(t.status),\n priority: t.priority,\n assignedTo: t.assignedTo || \"\",\n projectId: t.projectId,\n })),\n ),\n );\n }\n break;\n }\n\n case \"ready\": {\n await using ctx = await CommandContext.create({\n host: args.host,\n module: args.module,\n });\n const tasks = ctx.iter<Task>(\"tasks\");\n const deps = ctx.iter<TaskDependency>(\"task_dependencies\");\n const taskById = new Map(tasks.map((t) => [t.id.toString(), t]));\n const limit = args.limit ? parseInt(args.limit, 10) : undefined;\n\n if (limit !== undefined && (!Number.isFinite(limit) || limit <= 0)) {\n error(\"INVALID_LIMIT\", \"--limit must be a positive integer\");\n }\n\n const ready = tasks\n .filter((t) => TaskStatus.is.open(t.status))\n .filter((t) => {\n const incomingDeps = deps.filter((dep) => dep.taskId === t.id);\n const hasOpenBlocker = incomingDeps.some((dep) => {\n const depTag =\n typeof dep.dependencyType === \"string\"\n ? dep.dependencyType\n : dep.dependencyType.tag;\n if (\n depTag !== \"Blocks\" &&\n depTag !== \"ParentChild\" &&\n depTag !== \"blocks\" &&\n depTag !== \"parent-child\"\n )\n return false;\n const blocker = taskById.get(dep.dependsOnId.toString());\n if (!blocker) return false;\n return !TaskStatus.is.completed(blocker.status);\n });\n return !hasOpenBlocker;\n })\n .filter((t) => !args.project || t.projectId.toString() === args.project)\n .filter((t) => !args.assigned || Boolean(t.assignedTo))\n .sort((a, b) => {\n if (a.priority !== b.priority) return a.priority - b.priority;\n const aMicros = toMicros(a.createdAt);\n const bMicros = toMicros(b.createdAt);\n if (aMicros < bMicros) return -1;\n if (aMicros > bMicros) return 1;\n return 0;\n });\n\n const readyTasks = (limit !== undefined ? ready.slice(0, limit) : ready).map((t) => ({\n id: t.id.toString(),\n title: t.title,\n status: t.status.tag.toLowerCase(),\n priority: t.priority,\n assignedTo: t.assignedTo || \"\",\n projectId: t.projectId.toString(),\n blockedBy: [] as string[],\n }));\n\n success({ tasks: readyTasks, count: readyTasks.length });\n if (!isJsonMode()) {\n console.log(\n toonList(\n \"tasks\",\n readyTasks.map((t) => ({\n id: t.id,\n title: t.title,\n status: t.status,\n priority: t.priority,\n assignedTo: t.assignedTo,\n projectId: t.projectId,\n })),\n ),\n );\n }\n break;\n }\n\n case \"get\": {\n const taskId = args.id;\n if (!taskId) error(\"TASK_ID_REQUIRED\", \"Task ID required\");\n\n await using ctx = await CommandContext.create({\n host: args.host,\n module: args.module,\n });\n const task = ctx.iter<Task>(\"tasks\").find((t) => t.id.toString() === taskId);\n if (!task) error(\"TASK_NOT_FOUND\", `Task not found: ${taskId}`);\n\n success(task);\n if (!isJsonMode()) {\n console.log(\n toonList(\"task\", [\n {\n id: task.id.toString(),\n title: task.title,\n status: TaskStatus.display(task.status),\n priority: task.priority,\n assignedTo: task.assignedTo || \"\",\n projectId: task.projectId.toString(),\n githubIssueUrl: task.githubIssueUrl || \"\",\n githubPrUrl: task.githubPrUrl || \"\",\n description: task.description,\n },\n ]),\n );\n }\n break;\n }\n\n case \"create\": {\n if (!args.project || !args.title) error(\"ARGS_REQUIRED\", \"--project and --title required\");\n\n const priority = parseInt(args.priority || \"5\", 10);\n if (priority < 1 || priority > 10) error(\"INVALID_PRIORITY\", \"Priority must be 1-10\");\n\n try {\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n await callReducer(ctx, \"createTask\", {\n projectId: BigInt(args.project as string),\n title: args.title,\n description: args.description || \"\",\n priority,\n sourceIdeaId: undefined,\n githubIssueUrl: args[\"github-issue-url\"],\n });\n },\n );\n success({\n created: true,\n projectId: args.project,\n title: args.title,\n issue: args[\"github-issue-url\"],\n });\n if (!isJsonMode()) {\n console.log(\n toonList(\"task_created\", [\n {\n projectId: args.project,\n title: args.title,\n githubIssueUrl: args[\"github-issue-url\"] || \"\",\n },\n ]),\n );\n }\n } catch (err) {\n error(\"REDUCER_FAILED\", err instanceof Error ? err.message : \"Unknown error\");\n }\n break;\n }\n\n case \"claim\": {\n const taskId = args.id;\n if (!taskId) error(\"TASK_ID_REQUIRED\", \"Task ID required\");\n\n try {\n let repositoryUrl: string | undefined;\n let contributingUrl: string | undefined;\n\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n await callReducer(ctx, \"claimTask\", { taskId: BigInt(taskId) });\n\n const task = ctx.iter<Task>(\"tasks\").find((t) => t.id.toString() === taskId);\n const project = task\n ? ctx.iter<Project>(\"projects\").find((p) => p.id === task.projectId)\n : undefined;\n\n if (project?.githubRepo) {\n repositoryUrl = normalizeGitHubRepoUrl(project.githubRepo);\n if (repositoryUrl) {\n contributingUrl = `${repositoryUrl}/blob/main/CONTRIBUTING.md`;\n }\n }\n },\n );\n success({\n claimed: true,\n taskId,\n repositoryUrl,\n contributingUrl,\n nextSteps: [\n repositoryUrl\n ? `Fork the target repository: ${repositoryUrl}`\n : \"Fork the target repository to your GitHub account using gh cli\",\n contributingUrl\n ? `Read CONTRIBUTING.md before starting: ${contributingUrl}`\n : \"Read CONTRIBUTING.md in the target repository before starting\",\n \"Verify behavior independently by tracing relevant code flow and runtime path before implementing changes.\",\n ],\n });\n\n if (!isJsonMode()) {\n console.log(\n toonList(\"task_claimed\", [\n {\n taskId,\n repositoryUrl: repositoryUrl || \"\",\n contributingUrl: contributingUrl || \"\",\n },\n ]),\n );\n console.log(\"\");\n console.log(\"Next steps:\");\n if (repositoryUrl) {\n console.log(`1. Fork the target repository: ${repositoryUrl}`);\n } else {\n console.log(\"1. Fork the target repository to your GitHub account\");\n }\n if (contributingUrl) {\n console.log(`2. Read CONTRIBUTING.md before starting: ${contributingUrl}`);\n } else {\n console.log(\"2. Read CONTRIBUTING.md in the target repository before starting\");\n }\n console.log(\n \"3. Verify behavior independently by tracing relevant code flow and runtime path before implementing changes.\",\n );\n }\n } catch (err) {\n error(\"REDUCER_FAILED\", err instanceof Error ? err.message : \"Unknown error\");\n }\n break;\n }\n\n case \"update\": {\n const taskId = args.id;\n if (!taskId) error(\"TASK_ID_REQUIRED\", \"Task ID required\");\n if (!args.status && !args[\"github-pr-url\"])\n error(\"UPDATE_REQUIRED\", \"--status or --github-pr-url required\");\n\n try {\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n await callReducer(ctx, \"updateTaskStatus\", {\n taskId: BigInt(taskId),\n status: args.status ? TaskStatus.fromString(args.status) : (undefined as never),\n githubPrUrl: args[\"github-pr-url\"],\n archiveReason: undefined,\n });\n },\n );\n success({\n updated: true,\n taskId,\n status: args.status,\n pr: args[\"github-pr-url\"],\n });\n if (!isJsonMode()) {\n console.log(\n toonList(\"task_updated\", [\n {\n taskId,\n status: args.status || \"\",\n githubPrUrl: args[\"github-pr-url\"] || \"\",\n },\n ]),\n );\n }\n } catch (err) {\n error(\"REDUCER_FAILED\", err instanceof Error ? err.message : \"Unknown error\");\n }\n break;\n }\n\n case \"review\": {\n const taskId = args.id;\n if (!taskId) error(\"TASK_ID_REQUIRED\", \"Task ID required\");\n\n try {\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n await callReducer(ctx, \"updateTaskStatus\", {\n taskId: BigInt(taskId),\n status: { tag: \"Review\" },\n githubPrUrl: args[\"github-pr-url\"],\n archiveReason: undefined,\n });\n },\n );\n success({\n reviewed: true,\n taskId,\n status: \"review\",\n pr: args[\"github-pr-url\"],\n });\n if (!isJsonMode()) {\n console.log(\n toonList(\"task_review\", [\n {\n taskId,\n status: \"review\",\n githubPrUrl: args[\"github-pr-url\"] || \"\",\n },\n ]),\n );\n }\n } catch (err) {\n error(\"REDUCER_FAILED\", err instanceof Error ? err.message : \"Unknown error\");\n }\n break;\n }\n\n case \"deps\": {\n const taskId = args.id;\n if (!taskId) error(\"TASK_ID_REQUIRED\", \"Task ID required\");\n const taskIdBigInt = BigInt(taskId);\n\n if (args[\"add-dep\"]) {\n try {\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n await callReducer(ctx, \"addTaskDependency\", {\n taskId: taskIdBigInt,\n dependsOnId: BigInt(args[\"add-dep\"] as string),\n dependencyType: { tag: \"Blocks\" },\n });\n },\n );\n success({ added: true, taskId, dependsOn: args[\"add-dep\"] });\n if (!isJsonMode()) {\n console.log(\n toonList(\"dependency_added\", [\n {\n taskId,\n dependsOnId: args[\"add-dep\"],\n dependencyType: \"blocks\",\n },\n ]),\n );\n }\n } catch (err) {\n error(\"REDUCER_FAILED\", err instanceof Error ? err.message : \"Unknown error\");\n }\n } else if (args.list) {\n await using ctx = await CommandContext.create({\n host: args.host,\n module: args.module,\n });\n const deps = ctx.iter<TaskDependency>(\"task_dependencies\");\n const taskDeps = deps.filter(\n (d) => d.taskId === taskIdBigInt || d.dependsOnId === taskIdBigInt,\n );\n\n success({ dependencies: taskDeps });\n if (!isJsonMode()) {\n console.log(\n toonList(\n \"task_dependencies\",\n taskDeps.map((dep) => ({\n id: dep.id.toString(),\n taskId: dep.taskId.toString(),\n dependsOnId: dep.dependsOnId.toString(),\n dependencyType: dep.dependencyType,\n })),\n ),\n );\n }\n } else {\n error(\n \"DEPS_ACTION_REQUIRED\",\n \"Use --add-dep <taskId> to add a dependency or --list to view dependencies\",\n \"Examples: probe task deps 42 --list | probe task deps 42 --add-dep 17\",\n );\n }\n break;\n }\n\n case \"watch\": {\n const timeout = Math.min(parseInt(args.timeout || \"60\", 10), 300);\n\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n if (!isJsonMode()) {\n console.log(\n toonList(\"task_watch\", [\n {\n timeoutSeconds: timeout,\n statusFilter: args.status || \"\",\n },\n ]),\n );\n }\n\n const waitForStop = new Promise<void>((resolve) => {\n const timer = setTimeout(() => {\n process.off(\"SIGINT\", onSignal);\n process.off(\"SIGTERM\", onSignal);\n resolve();\n }, timeout * 1000);\n\n const onSignal = () => {\n clearTimeout(timer);\n process.off(\"SIGINT\", onSignal);\n process.off(\"SIGTERM\", onSignal);\n resolve();\n };\n\n process.on(\"SIGINT\", onSignal);\n process.on(\"SIGTERM\", onSignal);\n });\n\n ctx.db.tasks.onInsert((_ctx, task) => {\n if (!args.status || TaskStatus.matches(task.status, args.status)) {\n console.log(\n toonList(\"tasks\", [\n {\n id: task.id.toString(),\n title: task.title,\n change_type: \"created\",\n },\n ]),\n );\n }\n });\n\n ctx.db.tasks.onUpdate((_ctx, _old, newTask) => {\n if (!args.status || TaskStatus.matches(newTask.status, args.status)) {\n console.log(\n toonList(\"tasks\", [\n {\n id: newTask.id.toString(),\n title: newTask.title,\n change_type: \"updated\",\n },\n ]),\n );\n }\n });\n\n await waitForStop;\n },\n );\n break;\n }\n\n default:\n error(\n \"INVALID_ACTION\",\n `Invalid action: ${action}`,\n \"Use: list, ready, get, create, claim, update, review, deps, watch\",\n );\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n failWithConnectionOrUnexpected(message);\n }\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 meta: { name: \"task\", description: \"Task management\" },\n args: {\n action: {\n type: \"positional\",\n description: \"Action: list, ready, get, create, claim, update, review, deps, watch\",\n required: false,\n },\n id: { type: \"positional\", description: \"Task ID\", required: false },\n status: { type: \"string\", description: \"Status filter or new status\" },\n project: { type: \"string\", description: \"Project ID\" },\n title: { type: \"string\", description: \"Task title\" },\n description: { type: \"string\", description: \"Task description\" },\n priority: { type: \"string\", description: \"Priority 1-10\" },\n assigned: {\n type: \"boolean\",\n description: \"Show only assigned tasks\",\n default: false,\n },\n wallet: { type: \"string\", description: \"Wallet name\" },\n \"github-pr-url\": { type: \"string\", description: \"GitHub PR URL\" },\n \"github-issue-url\": { type: \"string\", description: \"GitHub issue URL\" },\n \"add-dep\": { type: \"string\", description: \"Add dependency task ID\" },\n list: { type: \"boolean\", description: \"List dependencies\", default: false },\n timeout: { type: \"string\", description: \"Watch timeout (seconds)\" },\n limit: { type: \"string\", description: \"Limit rows for list/ready\" },\n json: { type: \"boolean\", description: \"Output JSON\", default: false },\n host: { type: \"string\", description: \"SpacetimeDB host\" },\n module: { type: \"string\", description: \"Module name\" },\n },\n async run({ args }) {\n if (args.json) setJsonMode(true);\n\n if (!args.action) {\n printHelp({\n command: \"probe task\",\n description: \"Task management commands\",\n usage: [\n \"probe task <action> [options]\",\n \"probe task list --project 1 --status open\",\n 'probe task create --project 1 --title \"Fix bug\" --priority 5',\n ],\n actions: [\n { name: \"list\", detail: \"List tasks with optional filters\" },\n { name: \"ready\", detail: \"List immediately claimable open tasks\" },\n { name: \"get <id>\", detail: \"Show one task\" },\n { name: \"create\", detail: \"Create a new task\" },\n { name: \"claim <id>\", detail: \"Claim a task for your identity\" },\n { name: \"update <id>\", detail: \"Update status and optional PR URL\" },\n { name: \"review <id>\", detail: \"Mark a task as ready for review\" },\n { name: \"deps <id>\", detail: \"List or add task dependencies\" },\n { name: \"watch\", detail: \"Watch task changes in real time\" },\n ],\n options: [\n { name: \"--project\", detail: \"Project ID\" },\n { name: \"--title\", detail: \"Task title (create)\" },\n { name: \"--description\", detail: \"Task description\" },\n { name: \"--priority\", detail: \"Priority from 1 to 10 (default: 5)\" },\n { name: \"--status\", detail: \"Filter or new status\" },\n { name: \"--limit\", detail: \"Limit rows for list/ready\" },\n {\n name: \"--github-pr-url\",\n detail: \"GitHub PR URL for update/review\",\n },\n { name: \"--github-issue-url\", detail: \"GitHub issue URL for create\" },\n { name: \"--wallet\", detail: \"Wallet to use for authenticated calls\" },\n {\n name: \"--host, --module\",\n detail: \"Nexus SpacetimeDB target overrides\",\n },\n ],\n notes: [\n \"Use full long-form flags only; short aliases are intentionally disabled.\",\n \"Find project IDs with `probe project list`; find task IDs with `probe task list`.\",\n ],\n });\n return;\n }\n\n await runTaskAction(args as TaskCommandArgs);\n },\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 { key: \"agents\", name: \"agents\" },\n { key: \"tasks\", name: \"tasks\" },\n { key: \"ideas\", name: \"ideas\" },\n { key: \"messages\", name: \"messages\" },\n { key: \"channels\", name: \"channels\" },\n { key: \"projects\", name: \"projects\" },\n { key: \"votes\", name: \"votes\" },\n { key: \"discovered_tasks\", name: \"discovered_tasks\" },\n { key: \"task_dependencies\", name: \"task_dependencies\" },\n { key: \"identity_roles\", name: \"identity_roles\" },\n { key: \"config\", name: \"config\" },\n { key: \"project_channels\", name: \"project_channels\" },\n { key: \"project_messages\", name: \"project_messages\" },\n] as const;\n\ntype DaemonEvent = {\n type: string;\n source: \"nexus\";\n at: string;\n [key: string]: unknown;\n};\n\ntype SessionEnd = {\n reason: \"disconnected\" | \"heartbeat_failed\" | \"stop\";\n details?: unknown;\n};\n\ntype LogLevel = \"critical\" | \"info\" | \"debug\";\n\ntype ObservableTable = {\n onInsert?: (cb: (_ctx: unknown, row: unknown) => void) => void;\n onUpdate?: (cb: (_ctx: unknown, oldRow: unknown, newRow: unknown) => void) => void;\n onDelete?: (cb: (_ctx: unknown, row: unknown) => void) => void;\n};\n\nconst CRITICAL_EVENTS = new Set([\n \"connected\",\n \"ready\",\n \"disconnected\",\n \"reconnecting\",\n \"reconnected\",\n \"subscription_applied\",\n \"subscription_error\",\n \"auth_failed\",\n \"heartbeat_failed\",\n \"heartbeat_recovered\",\n \"shutdown\",\n]);\n\nconst jsonReplacer = (_key: string, value: unknown): unknown => {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n};\n\nconst nowIso = (): string => new Date().toISOString();\n\nconst sleep = (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms));\n\nconst withJitter = (baseMs: number): number => {\n const jitter = Math.floor(Math.random() * (HEARTBEAT_JITTER_MS * 2 + 1) - HEARTBEAT_JITTER_MS);\n return Math.max(1_000, baseMs + jitter);\n};\n\nconst backoffMs = (attempt: number): number => {\n const base = Math.min(RECONNECT_MAX_MS, RECONNECT_BASE_MS * 2 ** Math.max(0, attempt - 1));\n return withJitter(base);\n};\n\nconst normalizeError = (err: unknown): string => {\n if (err instanceof Error) {\n return err.message;\n }\n return String(err);\n};\n\nconst sanitizeValue = (value: unknown): unknown => {\n if (value instanceof Error) {\n return { name: value.name, message: value.message };\n }\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\" ||\n value === null\n ) {\n return value;\n }\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n try {\n return JSON.parse(JSON.stringify(value, jsonReplacer));\n } catch {\n return String(value);\n }\n};\n\nconst resolveLogLevel = (value: unknown): LogLevel => {\n if (value === \"critical\" || value === \"info\" || value === \"debug\") {\n return value;\n }\n return \"critical\";\n};\n\nconst shouldEmit = (eventType: string, level: LogLevel): boolean => {\n if (level === \"debug\") {\n return true;\n }\n if (CRITICAL_EVENTS.has(eventType)) {\n return true;\n }\n if (level === \"info\" && eventType.startsWith(\"heartbeat_\")) {\n return true;\n }\n return false;\n};\n\nconst resolveLogStream = async (pathValue?: string): Promise<WriteStream | null> => {\n if (!pathValue) {\n return null;\n }\n const absolutePath = resolve(pathValue);\n await mkdir(dirname(absolutePath), { recursive: true });\n return createWriteStream(absolutePath, { flags: \"a\" });\n};\n\nconst connectErrorLooksAuthRelated = (message: string): boolean => {\n const lowered = message.toLowerCase();\n return (\n lowered.includes(\"authentication required\") ||\n lowered.includes(\"unauthorized\") ||\n lowered.includes(\"401\")\n );\n};\n\nexport const nexusDaemonArgs = {\n wallet: {\n type: \"string\",\n description: \"Wallet name for authenticated connection\",\n },\n host: {\n type: \"string\",\n description: \"SpacetimeDB host override\",\n },\n module: {\n type: \"string\",\n description: \"SpacetimeDB module override\",\n },\n sender: {\n type: \"string\",\n description: \"Optional sender filter (debug table events only)\",\n },\n \"log-file\": {\n type: \"string\",\n description: \"Optional path to append JSONL daemon events\",\n },\n \"log-level\": {\n type: \"string\",\n description: \"critical, info, or debug\",\n default: \"critical\",\n },\n pretty: {\n type: \"boolean\",\n description: \"Human-readable lifecycle logs to stderr\",\n default: false,\n },\n json: {\n type: \"boolean\",\n description: \"Reserved for CLI consistency\",\n default: false,\n },\n} as const;\n\nexport async function runNexusDaemon(args: Record<string, unknown>): Promise<void> {\n const logLevel = resolveLogLevel(args[\"log-level\"]);\n const pretty = !!args.pretty;\n const prettyLogger = pretty\n ? createConsola({\n stdout: process.stderr,\n stderr: process.stderr,\n })\n : null;\n\n let logStream: WriteStream | null = null;\n try {\n logStream = await resolveLogStream(args[\"log-file\"] as string | undefined);\n } catch (err) {\n const message = normalizeError(err);\n const fallback = JSON.stringify({\n source: \"nexus\",\n at: nowIso(),\n type: \"log_file_error\",\n message,\n });\n console.log(fallback);\n return;\n }\n\n const writeEvent = (event: DaemonEvent): void => {\n const line = JSON.stringify(event, jsonReplacer);\n console.log(line);\n if (logStream) {\n logStream.write(`${line}\\n`);\n }\n };\n\n const emit = (event: { type: string; [key: string]: unknown }): void => {\n if (!shouldEmit(event.type, logLevel)) {\n return;\n }\n\n const fullEvent: DaemonEvent = {\n source: \"nexus\",\n at: nowIso(),\n ...event,\n };\n\n writeEvent(fullEvent);\n\n if (!prettyLogger) {\n return;\n }\n\n const type = String(event.type);\n if (type === \"connected\") {\n prettyLogger.info(\"Connected to Nexus\");\n } else if (type === \"reconnected\") {\n prettyLogger.success(\"Reconnected to Nexus\");\n } else if (type === \"disconnected\") {\n prettyLogger.warn(\"Disconnected from Nexus\");\n } else if (type === \"reconnecting\") {\n prettyLogger.info(\"Reconnecting to Nexus\");\n } else if (type === \"auth_failed\") {\n prettyLogger.error(\"Authentication failed\");\n } else if (type === \"heartbeat_failed\") {\n prettyLogger.warn(\"Heartbeat failed repeatedly\");\n } else if (type === \"shutdown\") {\n prettyLogger.info(\"Nexus daemon shutting down\");\n }\n };\n\n let stopping = false;\n let stopSignal: \"SIGINT\" | \"SIGTERM\" | null = null;\n\n const stopWaiter = new Promise<void>((resolve) => {\n const onSigint = () => {\n if (stopping) {\n return;\n }\n stopping = true;\n stopSignal = \"SIGINT\";\n resolve();\n };\n const onSigterm = () => {\n if (stopping) {\n return;\n }\n stopping = true;\n stopSignal = \"SIGTERM\";\n resolve();\n };\n process.on(\"SIGINT\", onSigint);\n process.on(\"SIGTERM\", onSigterm);\n });\n\n let reconnectAttempt = 0;\n let downtimeStartedAt: number | null = null;\n let hasConnectedOnce = false;\n\n while (!stopping) {\n let sessionEnd: SessionEnd | null = null;\n\n try {\n await withAuth(\n {\n host: args.host as string | undefined,\n module: args.module as string | undefined,\n wallet: args.wallet as string | undefined,\n onDisconnect: (...disconnectArgs: unknown[]) => {\n if (!sessionEnd) {\n sessionEnd = {\n reason: \"disconnected\",\n details: disconnectArgs.map(sanitizeValue),\n };\n }\n },\n },\n async (ctx) => {\n const effectiveWallet = ctx.auth?.wallet || args.wallet || null;\n const currentAgent = ctx\n .iter<Agent>(\"agents\")\n .find((a) => a.identity.toHexString() === ctx.identity?.toHexString());\n\n if (!hasConnectedOnce) {\n emit({\n type: \"connected\",\n identity: ctx.identity?.toHexString(),\n wallet: effectiveWallet,\n host: args.host || ctx.config.spacetime.host,\n module: args.module || ctx.config.spacetime.module,\n });\n } else {\n emit({\n type: \"reconnected\",\n attempts: reconnectAttempt,\n downtime_ms: downtimeStartedAt ? Date.now() - downtimeStartedAt : null,\n identity: ctx.identity?.toHexString(),\n });\n }\n\n hasConnectedOnce = true;\n reconnectAttempt = 0;\n downtimeStartedAt = null;\n\n emit({ type: \"subscription_applied\" });\n emit({\n type: \"ready\",\n identity: ctx.identity?.toHexString(),\n wallet: effectiveWallet,\n log_file: args[\"log-file\"] || null,\n log_level: logLevel,\n auto_heartbeat: !!currentAgent,\n });\n\n if (logLevel === \"debug\") {\n for (const tableSpec of OBSERVED_TABLES) {\n const table = ctx.db[tableSpec.key] as ObservableTable;\n table.onInsert?.((_eventCtx, row) => {\n if (\n args.sender &&\n (tableSpec.name === \"messages\" || tableSpec.name === \"project_messages\")\n ) {\n const senderId = (row as { senderId?: unknown }).senderId;\n if (senderId !== args.sender) {\n return;\n }\n }\n emit({\n type: \"table_insert\",\n table: tableSpec.name,\n row: sanitizeValue(row),\n });\n });\n\n table.onUpdate?.((_eventCtx, oldRow, newRow) => {\n if (\n args.sender &&\n (tableSpec.name === \"messages\" || tableSpec.name === \"project_messages\")\n ) {\n const senderId = (newRow as { senderId?: unknown }).senderId;\n if (senderId !== args.sender) {\n return;\n }\n }\n emit({\n type: \"table_update\",\n table: tableSpec.name,\n old_row: sanitizeValue(oldRow),\n new_row: sanitizeValue(newRow),\n });\n });\n\n table.onDelete?.((_eventCtx, row) => {\n if (\n args.sender &&\n (tableSpec.name === \"messages\" || tableSpec.name === \"project_messages\")\n ) {\n const senderId = (row as { senderId?: unknown }).senderId;\n if (senderId !== args.sender) {\n return;\n }\n }\n emit({\n type: \"table_delete\",\n table: tableSpec.name,\n row: sanitizeValue(row),\n });\n });\n }\n }\n\n let heartbeatTimer: ReturnType<typeof setTimeout> | null = null;\n let heartbeatInFlight = false;\n let consecutiveHeartbeatFailures = 0;\n\n const scheduleHeartbeat = () => {\n if (stopping || !currentAgent) {\n return;\n }\n\n heartbeatTimer = setTimeout(async () => {\n if (!currentAgent || heartbeatInFlight || stopping) {\n scheduleHeartbeat();\n return;\n }\n\n heartbeatInFlight = true;\n try {\n await callReducer(ctx, \"heartbeat\", {\n agentId: currentAgent.id,\n });\n if (consecutiveHeartbeatFailures > 0) {\n emit({\n type: \"heartbeat_recovered\",\n failed_count_before_recovery: consecutiveHeartbeatFailures,\n });\n }\n consecutiveHeartbeatFailures = 0;\n } catch (err) {\n consecutiveHeartbeatFailures += 1;\n if (consecutiveHeartbeatFailures >= HEARTBEAT_FAILURE_THRESHOLD && !sessionEnd) {\n sessionEnd = {\n reason: \"heartbeat_failed\",\n details: {\n consecutive_failures: consecutiveHeartbeatFailures,\n message: normalizeError(err),\n },\n };\n emit({\n type: \"heartbeat_failed\",\n consecutive_failures: consecutiveHeartbeatFailures,\n message: normalizeError(err),\n });\n }\n } finally {\n heartbeatInFlight = false;\n scheduleHeartbeat();\n }\n }, withJitter(HEARTBEAT_INTERVAL_MS));\n };\n\n if (currentAgent) {\n scheduleHeartbeat();\n }\n\n while (!stopping && !sessionEnd) {\n await Promise.race([stopWaiter, sleep(200)]);\n }\n\n if (heartbeatTimer) {\n clearTimeout(heartbeatTimer);\n }\n },\n );\n } catch (err) {\n const message = normalizeError(err);\n if (connectErrorLooksAuthRelated(message)) {\n emit({ type: \"auth_failed\", message });\n break;\n }\n\n emit({ type: \"subscription_error\", message });\n sessionEnd = {\n reason: \"disconnected\",\n details: { message },\n };\n }\n\n if (stopping) {\n break;\n }\n\n const reason = sessionEnd?.reason || \"disconnected\";\n emit({\n type: \"disconnected\",\n reason,\n details: sanitizeValue(sessionEnd?.details || null),\n });\n\n if (downtimeStartedAt === null) {\n downtimeStartedAt = Date.now();\n }\n\n reconnectAttempt += 1;\n const waitMs = backoffMs(reconnectAttempt);\n emit({\n type: \"reconnecting\",\n attempt: reconnectAttempt,\n backoff_ms: waitMs,\n });\n\n await Promise.race([stopWaiter, sleep(waitMs)]);\n }\n\n emit({ type: \"shutdown\", signal: stopSignal || \"unknown\" });\n\n if (logStream) {\n logStream.end();\n }\n}\n\nexport default defineCommand({\n meta: {\n name: \"nexus\",\n description: \"Persistent Nexus daemon (keepalive + critical telemetry)\",\n },\n args: nexusDaemonArgs,\n async run({ args }) {\n if (forceHelpRequested()) {\n printHelp({\n command: \"probe nexus\",\n description: \"Run persistent Nexus keepalive + critical event logger\",\n usage: [\n \"probe nexus [options]\",\n \"probe nexus --wallet agent-wallet\",\n \"probe nexus --wallet agent-wallet --log-file ./logs/nexus-events.jsonl\",\n \"probe nexus --log-level debug --sender zoe-1\",\n \"probe nexus --pretty\",\n ],\n options: [\n {\n name: \"--wallet\",\n detail: \"Wallet for authenticated persistent connection\",\n },\n {\n name: \"--host, --module\",\n detail: \"Nexus SpacetimeDB target overrides\",\n },\n { name: \"--log-level\", detail: \"critical (default), info, or debug\" },\n {\n name: \"--sender\",\n detail: \"Sender filter for debug message events only\",\n },\n {\n name: \"--log-file\",\n detail: \"Optional JSONL file path for daemon events\",\n },\n {\n name: \"--pretty\",\n detail: \"Human-readable lifecycle logs to stderr\",\n },\n ],\n notes: [\n \"stdout is always structured JSONL for machine parsing.\",\n \"Default mode logs critical connection lifecycle and heartbeat health events only.\",\n \"Use --log-level debug to emit full table insert/update/delete payloads.\",\n ],\n });\n return;\n }\n\n await runNexusDaemon(args as Record<string, unknown>);\n },\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 ActionEventType: (value) => {\n if (!Array.isArray(value)) return value;\n const variants = ['Issued', 'Completed', 'Skipped', 'Failed', 'Expired'];\n return variants[value[0]] ?? `variant_${value[0]}`;\n },\n ActionKind: (value) => {\n if (!Array.isArray(value)) return value;\n const variants = ['Repair', 'Inbox', 'Vote', 'Propose', 'ContinueTask', 'ClaimTask', 'ProjectSetup', 'CreateTasks', 'ValidateReviews', 'ReviewDiscovery', 'Idle'];\n return variants[value[0]] ?? `variant_${value[0]}`;\n },\n ActionStatus: (value) => {\n if (!Array.isArray(value)) return value;\n const variants = ['Issued', 'Completed', 'Skipped', 'Failed', 'Expired'];\n return variants[value[0]] ?? `variant_${value[0]}`;\n },\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 AnnouncementStatus: (value) => {\n if (!Array.isArray(value)) return value;\n const variants = ['Pending', 'Ready', 'Failed'];\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 agent_action_events: {\n 'event_code': optionDecoder(),\n 'note': optionDecoder(),\n 'created_at': timestampDecoder,\n },\n agent_actions: {\n 'target_type': optionDecoder(),\n 'target_id': optionDecoder(),\n 'created_at': timestampDecoder,\n 'updated_at': timestampDecoder,\n 'kind': enumDecoders.ActionKind,\n 'status': enumDecoders.ActionStatus,\n },\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 voice_announcements: {\n 'context_type': optionDecoder(),\n 'context_id': optionDecoder(),\n 'finalized_at': optionDecoder(timestampDecoder),\n 'failed_at': optionDecoder(timestampDecoder),\n 'error_message': optionDecoder(),\n 'created_at': timestampDecoder,\n 'status': enumDecoders.AnnouncementStatus,\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 name: string;\n type: string;\n}\n\nexport interface SqlSchema {\n columns: SqlColumn[];\n}\n\nexport interface SqlStatementResult {\n schema: SqlSchema | unknown;\n rows: unknown[];\n}\n\nexport interface SqlRowObject {\n [key: string]: unknown;\n}\n\nexport interface SqlSchemaElement {\n name: { some?: string } | string;\n algebraic_type?: unknown;\n type?: string;\n}\n\nexport interface SqlSchemaAlt {\n elements?: SqlSchemaElement[];\n}\n\nconst extractColumnName = (element: SqlSchemaElement): string | undefined => {\n if (typeof element.name === \"string\") {\n return element.name;\n }\n if (element.name && typeof element.name === \"object\" && \"some\" in element.name) {\n return element.name.some;\n }\n return undefined;\n};\n\nexport interface SqlRequestOptions {\n host: string;\n moduleName: string;\n token: string;\n sql: string;\n timeoutMs: number;\n}\n\nexport interface SqlRequestSuccess {\n results: SqlStatementResult[];\n durationMs: number;\n}\n\nexport class SqlRequestError extends Error {\n readonly status: number;\n readonly responseBody: string;\n\n constructor(status: number, responseBody: string, message?: string) {\n super(message || `SQL request failed with status ${status}`);\n this.name = \"SqlRequestError\";\n this.status = status;\n this.responseBody = responseBody;\n }\n}\n\nexport const normalizeSqlHttpBase = (host: string): string => {\n const url = new URL(host);\n if (url.protocol === \"ws:\") {\n url.protocol = \"http:\";\n } else if (url.protocol === \"wss:\") {\n url.protocol = \"https:\";\n } else if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n throw new Error(`Unsupported host protocol: ${url.protocol}`);\n }\n return url.toString();\n};\n\nexport const buildSqlEndpoint = (host: string, moduleName: string): string => {\n const base = normalizeSqlHttpBase(host);\n const url = new URL(base);\n const basePath = url.pathname.replace(/\\/$/, \"\");\n url.pathname = `${basePath}/v1/database/${encodeURIComponent(moduleName)}/sql`;\n return url.toString();\n};\n\nconst parseResults = (payload: unknown): SqlStatementResult[] => {\n if (!Array.isArray(payload)) {\n throw new Error(\"Invalid SQL response: expected array of statement results\");\n }\n return payload.map((statement) => {\n const record = statement as { schema?: unknown; rows?: unknown };\n const rows = Array.isArray(record.rows) ? record.rows : [];\n return {\n schema: record.schema,\n rows,\n };\n });\n};\n\nexport const executeSqlRequest = async (options: SqlRequestOptions): Promise<SqlRequestSuccess> => {\n const endpoint = buildSqlEndpoint(options.host, options.moduleName);\n const controller = new AbortController();\n const timeoutHandle = setTimeout(() => controller.abort(), options.timeoutMs);\n const started = Date.now();\n\n try {\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${options.token}`,\n \"Content-Type\": \"text/plain\",\n Accept: \"application/json\",\n },\n body: options.sql,\n signal: controller.signal,\n });\n\n const responseText = await response.text();\n if (!response.ok) {\n throw new SqlRequestError(response.status, responseText);\n }\n\n let parsed: unknown;\n try {\n parsed = responseText ? JSON.parse(responseText) : [];\n } catch {\n throw new Error(\"Invalid SQL response: expected JSON payload\");\n }\n\n return {\n results: parseResults(parsed),\n durationMs: Date.now() - started,\n };\n } finally {\n clearTimeout(timeoutHandle);\n }\n};\n\n// Extract column names from schema for use in responses\nexport const extractColumnNames = (result: SqlStatementResult): string[] => {\n const schema = result.schema as SqlSchema | SqlSchemaAlt | undefined;\n\n if (schema && \"elements\" in schema && Array.isArray(schema.elements)) {\n return schema.elements\n .map(extractColumnName)\n .filter((name): name is string => name !== undefined);\n } else if (schema && \"columns\" in schema && Array.isArray(schema.columns)) {\n return schema.columns.map((col) => col.name);\n }\n\n return [];\n};\n\n// Parse SQL error to provide helpful suggestions\nexport const parseSqlError = (responseBody: string): { message: string; suggestion?: string } => {\n // Try to parse as JSON first, fallback to plain text\n let errorMsg: string;\n try {\n const parsed = JSON.parse(responseBody);\n errorMsg = parsed.error || responseBody;\n } catch {\n errorMsg = responseBody;\n }\n\n // Common SpacetimeDB SQL errors with suggestions\n if (errorMsg.includes(\"ORDER BY\")) {\n return {\n message: errorMsg,\n suggestion:\n \"SpacetimeDB SQL does not support ORDER BY. Remove it or filter/sort results locally.\",\n };\n }\n if (errorMsg.includes(\"IS NULL\") || errorMsg.includes(\"IS NOT NULL\")) {\n return {\n message: errorMsg,\n suggestion: 'Use \"column = NULL\" or \"column != NULL\" instead of IS NULL / IS NOT NULL.',\n };\n }\n if (errorMsg.includes(\"JOIN\")) {\n return {\n message: errorMsg,\n suggestion:\n \"SpacetimeDB has limited JOIN support. Try querying single tables or use multiple queries.\",\n };\n }\n if (errorMsg.includes(\"no such table\")) {\n return {\n message: errorMsg,\n suggestion: \"Check the table name. Common tables: tasks, projects, agents, ideas, messages.\",\n };\n }\n if (errorMsg.includes(\"no such column\")) {\n return {\n message: errorMsg,\n suggestion: \"Check the column name. Use SELECT * to see all available columns.\",\n };\n }\n\n return { 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 executeSqlRequest,\n extractColumnNames,\n parseSqlError,\n SqlRequestError,\n type 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 if (err instanceof SqlRequestError) {\n if (err.status === 401) {\n error(\"AUTH_REQUIRED\", \"Authentication required. Run `probe auth <wallet> --save` first.\");\n }\n const { message, suggestion } = parseSqlError(err.responseBody);\n // Error parsed with potential suggestion\n if (err.status === 400) {\n error(\"SQL_INVALID\", message, suggestion);\n }\n error(\"SQL_FAILED\", message, suggestion);\n }\n\n if (err instanceof Error && err.name === \"AbortError\") {\n error(\"SQL_UNAVAILABLE\", `SQL request timed out after ${timeoutMs}ms`);\n }\n\n error(\"SQL_UNAVAILABLE\", err instanceof Error ? err.message : \"SQL request failed\");\n};\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\nconst buildMeta = (results: SqlStatementResult[], durationMs: number) => ({\n duration_ms: durationMs,\n query_count: results.length,\n row_count_total: results.reduce((sum, item) => sum + item.rows.length, 0),\n});\n\n// Build flat response structure for JSON mode\ninterface QueryResult {\n columns: string[];\n rows: Record<string, unknown>[];\n}\n\nconst buildFlatResponse = (\n results: SqlStatementResult[],\n shouldDecode: boolean,\n tableName?: string,\n): Record<string, QueryResult> => {\n const response: Record<string, QueryResult> = {};\n\n for (let index = 0; index < results.length; index += 1) {\n const statement = results[index];\n const columns = extractColumnNames(statement);\n const decoders = shouldDecode && tableName ? TABLE_DECODERS[tableName] : undefined;\n\n const rowObjects = (statement.rows as unknown[][]).map((row) => {\n const obj: Record<string, unknown> = {};\n for (let i = 0; i < columns.length; i++) {\n const colName = columns[i];\n const value = row[i];\n const decoder = decoders?.[colName];\n obj[colName] = decoder ? decoder(value) : value;\n }\n return obj;\n });\n\n response[`query_${index + 1}`] = { columns, rows: rowObjects };\n }\n\n if (results.length === 0) {\n response.query_1 = { columns: [], rows: [] };\n }\n\n return response;\n};\n\nconst formatStatementsToToon = (\n results: SqlStatementResult[],\n metaEnabled: boolean,\n durationMs: number,\n shouldDecode: boolean,\n tableName?: string,\n): string => {\n const payload: Record<string, unknown> = {};\n const decoders = shouldDecode && tableName ? TABLE_DECODERS[tableName] : undefined;\n\n for (let index = 0; index < results.length; index += 1) {\n const statement = results[index];\n const columns = extractColumnNames(statement);\n\n const rowObjects = (statement.rows as unknown[][]).map((row) => {\n const obj: Record<string, unknown> = {};\n for (let i = 0; i < columns.length; i++) {\n const colName = columns[i];\n const value = row[i];\n const decoder = decoders?.[colName];\n obj[colName] = decoder ? decoder(value) : value;\n }\n return obj;\n });\n\n payload[`query_${index + 1}`] = rowObjects;\n }\n\n if (results.length === 0) {\n payload.query_1 = [];\n }\n\n if (metaEnabled) {\n const meta = buildMeta(results, durationMs);\n payload.meta = [meta];\n }\n\n return formatToon(payload);\n};\n\nexport default defineCommand({\n meta: {\n name: \"query\",\n description: \"Run SQL read queries against Nexus\",\n },\n args: {\n sql: {\n type: \"positional\",\n description: \"SQL query string\",\n required: false,\n },\n file: {\n type: \"string\",\n description: \"Read SQL from file path\",\n },\n wallet: {\n type: \"string\",\n description: \"Wallet name override\",\n },\n host: {\n type: \"string\",\n description: \"SpacetimeDB host override\",\n },\n module: {\n type: \"string\",\n description: \"SpacetimeDB module override\",\n },\n timeout: {\n type: \"string\",\n description: \"Request timeout in milliseconds\",\n },\n meta: {\n type: \"boolean\",\n description: \"Include metadata in output\",\n default: false,\n },\n json: {\n type: \"boolean\",\n description: \"Output JSON only\",\n default: false,\n },\n tables: {\n type: \"boolean\",\n description: \"List all available tables\",\n default: false,\n },\n decode: {\n type: \"boolean\",\n description: \"Decode algebraic types to human-readable values\",\n default: true,\n },\n raw: {\n type: \"boolean\",\n description: \"Output raw algebraic type arrays (no decoding)\",\n default: false,\n },\n },\n async run({ args }) {\n if (args.json) {\n setJsonMode(true);\n }\n\n const hasSql = args.sql || args.file;\n\n // Handle --tables flag\n if (args.tables) {\n if (isJsonMode()) {\n success({ tables: KNOWN_TABLES });\n } else {\n console.log(formatToon({ tables: KNOWN_TABLES }));\n }\n return;\n }\n\n // Validate arguments\n if (!hasSql) {\n printHelp({\n command: \"probe query\",\n description: \"Execute SQL against the configured Nexus SpacetimeDB module\",\n usage: [\n 'probe query \"SELECT * FROM tasks LIMIT 5\"',\n \"probe query --file ./query.sql --meta\",\n \"probe query --tables\",\n ],\n options: [\n { name: \"--file\", detail: \"Read SQL from file\" },\n {\n name: \"--wallet\",\n detail: \"Wallet override (defaults to config defaultWallet)\",\n },\n {\n name: \"--host, --module\",\n detail: \"Nexus SpacetimeDB target overrides\",\n },\n {\n name: \"--timeout\",\n detail: `Request timeout in ms (default: ${DEFAULT_TIMEOUT_MS})`,\n },\n { name: \"--meta\", detail: \"Include metadata in output\" },\n { name: \"--json\", detail: \"JSON output mode with keyed objects\" },\n { name: \"--tables\", detail: \"List all available tables\" },\n {\n name: \"--decode\",\n detail: \"Decode algebraic types (default: true)\",\n },\n {\n name: \"--raw\",\n detail: \"Output raw algebraic arrays (no decoding)\",\n },\n ],\n notes: [\n \"This command is read-only and intended for SQL queries against Nexus tables.\",\n 'JSON mode returns keyed objects: {\"query_1\": {\"columns\": [...], \"rows\": [{\"id\": 1, ...}]}}',\n \"Use --raw to see raw SpacetimeDB algebraic type arrays.\",\n ],\n });\n return;\n }\n\n const timeoutMs = args.timeout ? Number.parseInt(args.timeout, 10) : DEFAULT_TIMEOUT_MS;\n if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n error(\"INVALID_TIMEOUT\", `Invalid timeout: ${args.timeout}`);\n }\n\n const config = await getConfig();\n const walletName = args.wallet || config.defaultWallet;\n if (!walletName) {\n error(\"WALLET_REQUIRED\", \"Wallet required. Use --wallet or set default wallet.\");\n }\n\n const wallet = await getWalletInfo(walletName);\n if (!wallet) {\n error(\"WALLET_NOT_FOUND\", `Wallet not found: ${walletName}`);\n }\n\n const cached = await getCachedToken(walletName);\n if (!cached) {\n error(\"AUTH_REQUIRED\", \"No cached token. Run `probe auth <wallet> --save` first.\");\n }\n\n const host = args.host || config.spacetime.host;\n const moduleName = args.module || config.spacetime.module;\n const sql = args.file ? await readFile(args.file, \"utf-8\") : (args.sql ?? \"\");\n if (!sql.trim()) {\n error(\"SQL_REQUIRED\", \"SQL query is empty\");\n }\n\n // Determine if we should decode algebraic types\n const shouldDecode = args.raw ? false : (args.decode ?? true);\n const tableName = inferTableName(sql);\n\n try {\n const { results, durationMs } = await executeSqlRequest({\n host,\n moduleName,\n token: cached.token,\n sql,\n timeoutMs,\n });\n\n if (isJsonMode()) {\n const flatResponse = buildFlatResponse(results, shouldDecode, tableName);\n if (args.meta) {\n success({ ...flatResponse, meta: buildMeta(results, durationMs) });\n } else {\n success(flatResponse);\n }\n return;\n }\n\n console.log(\n formatStatementsToToon(results, Boolean(args.meta), durationMs, shouldDecode, tableName),\n );\n } catch (err) {\n handleQueryError(err, timeoutMs);\n }\n },\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 { error, isJsonMode, setJsonMode, success, successMessage } from \"~/utils/output.js\";\nimport { loadWallet } from \"~/utils/wallet.js\";\n\nexport default defineCommand({\n meta: {\n name: \"sign\",\n description: \"Sign a message using wallet private key\",\n },\n args: {\n name: {\n type: \"positional\",\n description: \"Wallet name\",\n required: false,\n },\n message: {\n type: \"positional\",\n description: \"Message to sign\",\n required: false,\n },\n \"message-file\": {\n type: \"string\",\n description: \"Read message from file\",\n },\n \"password-file\": {\n type: \"string\",\n description: \"Read password from file\",\n },\n json: {\n type: \"boolean\",\n description: \"Output JSON only\",\n default: false,\n },\n },\n async run({ args }) {\n if (args.json) {\n setJsonMode(true);\n }\n\n const name = args.name;\n\n if (!name) {\n printHelp({\n command: \"probe sign\",\n description: \"Sign arbitrary text using wallet private key\",\n usage: [\n \"probe sign <wallet-name> <message> [options]\",\n \"probe sign <wallet-name> --message-file ./payload.txt [options]\",\n ],\n options: [\n { name: \"--message-file\", detail: \"Read message content from file\" },\n { name: \"--password-file\", detail: \"Read wallet password from file\" },\n { name: \"--json\", detail: \"JSON output for agents\" },\n ],\n });\n return;\n }\n\n let message: string;\n\n if (args[\"message-file\"]) {\n try {\n message = await readFile(args[\"message-file\"], \"utf-8\");\n } catch {\n error(\"FILE_READ_ERROR\", `Failed to read message file: ${args[\"message-file\"]}`);\n }\n } else if (args.message) {\n message = args.message;\n } else {\n error(\"MESSAGE_REQUIRED\", \"Message or message-file required\");\n }\n\n const walletPassword = await resolvePasswordInput({\n passwordFile: args[\"password-file\"],\n promptMessage: \"Enter wallet password:\",\n jsonModeError: \"Password file required in JSON mode or provide PROBE_WALLET_PASSWORD\",\n });\n\n try {\n const keyStore = await loadWallet(name, walletPassword);\n const keyPair = keyStore.getKeyPair(0);\n\n const signature = keyPair.sign(Buffer.from(message));\n const publicKey = keyPair.getPublicKey();\n const address = keyPair.getAddress();\n\n success({\n wallet: name,\n message,\n signature: signature.toString(\"hex\"),\n publicKey: publicKey.toString(\"hex\"),\n address: address.toString(),\n });\n\n if (!isJsonMode()) {\n successMessage(\"Message signed successfully\");\n console.log(`Signature: ${signature.toString(\"hex\")}`);\n }\n } catch (err) {\n error(\"SIGN_ERROR\", err instanceof Error ? err.message : \"Failed to sign message\");\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { printHelp } from \"~/utils/help.js\";\nimport { error, info, isJsonMode, setJsonMode, success } from \"~/utils/output.js\";\nimport { clearCachedToken, getCachedToken } from \"~/utils/token-cache.js\";\n\nexport default defineCommand({\n meta: {\n name: \"token\",\n description: \"Show cached JWT token for wallet\",\n },\n args: {\n name: {\n type: \"positional\",\n description: \"Wallet name\",\n required: false,\n },\n clear: {\n type: \"boolean\",\n description: \"Clear cached token now (next auth call gets a new token)\",\n default: false,\n },\n json: {\n type: \"boolean\",\n description: \"Output JSON only\",\n default: false,\n },\n },\n async run({ args }) {\n if (args.json) {\n setJsonMode(true);\n }\n\n const name = args.name;\n\n if (!name) {\n printHelp({\n command: \"probe token\",\n description: \"Inspect or clear cached authentication token\",\n usage: [\"probe token <wallet-name> [options]\", \"probe token <wallet-name> --clear\"],\n options: [\n { name: \"--clear\", detail: \"Clear cached token now (recommended)\" },\n { name: \"--json\", detail: \"JSON output for agents\" },\n ],\n });\n return;\n }\n\n if (args.clear) {\n await clearCachedToken(name);\n\n success({ cleared: name });\n\n if (!isJsonMode()) {\n info(`Token cache cleared for \"${name}\". Run 'probe auth' to get a new token.`);\n }\n return;\n }\n\n try {\n const cached = await getCachedToken(name);\n\n if (!cached) {\n error(\n \"TOKEN_NOT_FOUND\",\n `No cached token for wallet '${name}'`,\n `Run 'probe auth ${name} --save' to authenticate`,\n );\n }\n\n const expiresAt = new Date(cached.expiresAt);\n const now = new Date();\n const expiresIn = Math.floor((expiresAt.getTime() - now.getTime()) / 1000);\n const valid = expiresIn > 0;\n\n success({\n wallet: name,\n token: cached.token,\n expiresAt: cached.expiresAt,\n expiresIn: Math.max(0, expiresIn),\n valid,\n });\n\n if (!isJsonMode()) {\n console.log(`Wallet: ${name}`);\n console.log(`Token: ${cached.token.slice(0, 50)}...`);\n console.log(`Expires: ${expiresAt.toUTCString()}`);\n console.log(`Status: ${valid ? \"Valid\" : \"Expired\"}`);\n\n if (!valid) {\n info(\"Token has expired. Run with --clear to remove it and re-authenticate.\");\n }\n }\n } catch (err) {\n error(\"TOKEN_ERROR\", err instanceof Error ? err.message : \"Failed to read token\");\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { confirm } from \"@clack/prompts\";\nimport { printHelp } from \"~/utils/help.js\";\nimport { error, info, isJsonMode, setJsonMode, success } from \"~/utils/output.js\";\nimport { toonList } from \"~/utils/toon.js\";\nimport {\n type InstallMethod,\n type InstallMethodArg,\n detectMethod,\n fetchGitHubReleaseByVersion,\n fetchLatestGitHubRelease,\n fetchLatestNpmVersion,\n getCurrentVersion,\n normalizeVersion,\n upgradeViaBinary,\n upgradeViaNpm,\n} from \"~/utils/upgrade.js\";\n\nconst VALID_METHODS = new Set<InstallMethodArg>([\"auto\", \"npm\", \"binary\"]);\n\nconst printUpgradeResult = (data: {\n method: InstallMethod;\n currentVersion: string;\n targetVersion: string;\n latestVersion: string;\n updateAvailable: boolean;\n updated: boolean;\n checkOnly: boolean;\n}): void => {\n success(data);\n if (isJsonMode()) {\n return;\n }\n\n console.log(\n toonList(\"upgrade_result\", [\n {\n method: data.method,\n currentVersion: data.currentVersion,\n targetVersion: data.targetVersion,\n latestVersion: data.latestVersion,\n updated: data.updated,\n checkOnly: data.checkOnly,\n },\n ]),\n );\n};\n\nexport default defineCommand({\n meta: {\n name: \"upgrade\",\n description: \"Upgrade Probe to the latest or a specific version\",\n },\n args: {\n target: {\n type: \"positional\",\n description: \"Version to upgrade to (e.g. 1.2.0 or v1.2.0)\",\n required: false,\n },\n check: {\n type: \"boolean\",\n description: \"Check for updates without upgrading\",\n default: false,\n },\n method: {\n type: \"string\",\n description: \"Installation method: auto, npm, binary\",\n },\n yes: {\n type: \"boolean\",\n description: \"Skip confirmation prompts\",\n default: false,\n },\n json: {\n type: \"boolean\",\n description: \"Output JSON only\",\n default: false,\n },\n },\n async run({ args }) {\n if (args.json) setJsonMode(true);\n\n if (args.target === \"--help\" || args.target === \"-h\") {\n printHelp({\n command: \"probe upgrade\",\n description: \"Upgrade Probe to the latest or a specific version\",\n usage: [\n \"probe upgrade\",\n \"probe upgrade --check\",\n \"probe upgrade 1.2.0\",\n \"probe upgrade --method npm\",\n \"probe upgrade --method binary --yes\",\n \"probe upgrade --json --check\",\n ],\n options: [\n {\n name: \"--check\",\n detail: \"Check for updates without upgrading\",\n },\n { name: \"--method\", detail: \"Force install method: auto, npm, binary\" },\n { name: \"--yes\", detail: \"Skip confirmation prompts\" },\n { name: \"--json\", detail: \"JSON output\" },\n ],\n });\n return;\n }\n\n const methodArg = args.method as InstallMethodArg | undefined;\n if (methodArg && !VALID_METHODS.has(methodArg)) {\n error(\n \"INVALID_METHOD\",\n `Invalid --method value: ${args.method}`,\n \"Use: --method auto | npm | binary\",\n );\n }\n\n const currentVersion = getCurrentVersion();\n const method = detectMethod(methodArg);\n\n // Resolve target version\n let targetVersion: string | undefined;\n let latestVersion: string | undefined;\n let targetRelease: Awaited<ReturnType<typeof fetchGitHubReleaseByVersion>> | undefined;\n\n try {\n if (args.target) {\n targetVersion = normalizeVersion(args.target);\n if (method === \"binary\") {\n targetRelease = await fetchGitHubReleaseByVersion(targetVersion);\n }\n } else if (method === \"npm\") {\n latestVersion = await fetchLatestNpmVersion();\n targetVersion = latestVersion;\n } else {\n const gh = await fetchLatestGitHubRelease();\n latestVersion = gh.version;\n targetVersion = gh.version;\n targetRelease = gh.release;\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to check latest version\";\n if (!args.target && method === \"binary\" && message.includes(\"GitHub API returned 404\")) {\n error(\n \"NO_RELEASES_PUBLISHED\",\n \"No GitHub releases are published yet for binary upgrades.\",\n \"Use: npm install -g @zenon-red/probe (or your package manager) until the first release is published.\",\n );\n }\n error(\"VERSION_LOOKUP_FAILED\", message);\n }\n\n if (!targetVersion) {\n error(\"VERSION_LOOKUP_FAILED\", \"Could not determine target version.\");\n }\n\n const updateAvailable = targetVersion !== currentVersion;\n\n // Check-only mode\n if (args.check) {\n printUpgradeResult({\n method,\n currentVersion,\n targetVersion: targetVersion,\n latestVersion: latestVersion || targetVersion,\n updateAvailable,\n updated: false,\n checkOnly: true,\n });\n return;\n }\n\n if (method === \"unknown\") {\n error(\n \"METHOD_UNKNOWN\",\n \"Could not detect installation method for in-place upgrade.\",\n \"Use --method npm|binary explicitly, or run your package manager upgrade command (e.g. `bun add -g @zenon-red/probe`).\",\n );\n }\n\n if (!updateAvailable) {\n printUpgradeResult({\n method,\n currentVersion,\n targetVersion: targetVersion,\n latestVersion: latestVersion || targetVersion,\n updateAvailable: false,\n updated: false,\n checkOnly: false,\n });\n return;\n }\n\n if (!isJsonMode() && !args.yes) {\n const shouldUpgrade = await confirm({\n message: `Upgrade Probe from ${currentVersion} to ${targetVersion}?`,\n });\n if (!shouldUpgrade) {\n info(\"Upgrade cancelled\");\n process.exit(0);\n }\n }\n\n // Perform upgrade\n try {\n if (method === \"npm\") {\n await upgradeViaNpm(targetVersion);\n } else {\n const release = targetRelease || (await fetchGitHubReleaseByVersion(targetVersion));\n await upgradeViaBinary(release, targetVersion);\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Upgrade failed\";\n const code = message.includes(\"CHECKSUM_MISMATCH\")\n ? \"CHECKSUM_MISMATCH\"\n : message.includes(\"ROLLBACK_FAILED\")\n ? \"ROLLBACK_FAILED\"\n : message.includes(\"PERMISSION\") || message.includes(\"EACCES\")\n ? \"PERMISSION_DENIED\"\n : \"UPGRADE_FAILED\";\n error(code, message);\n }\n\n printUpgradeResult({\n method,\n currentVersion,\n targetVersion: targetVersion,\n latestVersion: latestVersion || targetVersion,\n updateAvailable: true,\n updated: true,\n checkOnly: false,\n });\n },\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 error,\n isJsonMode,\n setJsonMode,\n success,\n successMessage,\n warning,\n} from \"~/utils/output.js\";\nimport { loadUserConfig, saveUserConfig } from \"~/utils/user-config.js\";\nimport { createWallet as createWalletUtil, listWallets } from \"~/utils/wallet.js\";\n\nexport default defineCommand({\n meta: {\n name: \"create\",\n description: \"Create a new wallet with randomly generated mnemonic\",\n },\n args: {\n name: {\n type: \"positional\",\n description: \"Wallet identifier\",\n required: false,\n },\n \"password-file\": {\n type: \"string\",\n description: \"Read password from file\",\n },\n \"set-default\": {\n type: \"boolean\",\n description: \"Set this wallet as the default\",\n default: false,\n },\n json: {\n type: \"boolean\",\n description: \"Output JSON only\",\n default: false,\n },\n },\n async run({ args }) {\n if (args.json) {\n setJsonMode(true);\n }\n\n const name = args.name;\n\n if (forceHelpRequested() || !name) {\n printHelp({\n command: \"probe wallet create\",\n description: \"Create a new encrypted wallet\",\n usage: [\n \"probe wallet create <name> [options]\",\n \"probe wallet create agent-wallet --set-default\",\n ],\n options: [\n { name: \"--password-file\", detail: \"Read wallet password from file\" },\n { name: \"--set-default\", detail: \"Set created wallet as default\" },\n { name: \"--json\", detail: \"JSON output for agents\" },\n ],\n notes: [\n \"Password source order: --password-file, PROBE_WALLET_PASSWORD, interactive prompt.\",\n ],\n });\n return;\n }\n\n if (!/^[a-zA-Z0-9_-]+$/.test(name)) {\n error(\"INVALID_NAME\", \"Wallet name must be alphanumeric with hyphens or underscores only\");\n }\n\n const config = await getConfig();\n const walletPassword = await resolvePasswordInput({\n passwordFile: args[\"password-file\"],\n promptMessage: \"Enter password to encrypt wallet:\",\n confirmPromptMessage: \"Confirm password:\",\n minLength: config.passwordMinLength,\n jsonModeError:\n \"Password required via PROBE_WALLET_PASSWORD env, --password-file, or interactive prompt\",\n });\n\n try {\n const result = await createWalletUtil(name, walletPassword);\n\n let setAsDefault = args[\"set-default\"];\n if (!setAsDefault) {\n const wallets = await listWallets();\n if (wallets.length === 1) {\n setAsDefault = true;\n }\n }\n\n if (setAsDefault) {\n const userConfig = await loadUserConfig();\n userConfig.defaultWallet = result.name;\n await saveUserConfig(userConfig);\n }\n\n success({\n name: result.name,\n address: result.address,\n publicKey: result.publicKey,\n mnemonic: result.mnemonic,\n default: setAsDefault,\n });\n\n if (!isJsonMode()) {\n successMessage(`Wallet \"${result.name}\" created successfully`);\n console.log(`Address: ${result.address}`);\n console.log(`\\nMnemonic: ${result.mnemonic}`);\n warning(\"Save this mnemonic securely - it cannot be recovered!\");\n if (setAsDefault) {\n console.log(`\\nSet as default wallet`);\n }\n }\n } catch (err) {\n error(\"WALLET_CREATE_ERROR\", err instanceof Error ? err.message : \"Failed to create wallet\");\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { forceHelpRequested, printHelp } from \"~/utils/help.js\";\nimport { error, isJsonMode, setJsonMode, success, successMessage } from \"~/utils/output.js\";\nimport { loadUserConfig, saveUserConfig } from \"~/utils/user-config.js\";\nimport { walletExists } from \"~/utils/wallet.js\";\n\nexport default defineCommand({\n meta: {\n name: \"default\",\n description: \"Set the default wallet\",\n },\n args: {\n name: {\n type: \"positional\",\n description: \"Wallet name to set as default\",\n required: false,\n },\n json: {\n type: \"boolean\",\n description: \"Output JSON only\",\n default: false,\n },\n },\n async run({ args }) {\n if (args.json) {\n setJsonMode(true);\n }\n\n const name = args.name;\n\n if (forceHelpRequested() || !name) {\n printHelp({\n command: \"probe wallet default\",\n description: \"Set the default wallet used by commands\",\n usage: [\"probe wallet default <name> [options]\", \"probe wallet default agent-wallet\"],\n options: [{ name: \"--json\", detail: \"JSON output for agents\" }],\n });\n return;\n }\n\n const exists = await walletExists(name);\n if (!exists) {\n error(\"WALLET_NOT_FOUND\", `Wallet '${name}' does not exist`);\n }\n\n const userConfig = await loadUserConfig();\n userConfig.defaultWallet = name;\n await saveUserConfig(userConfig);\n\n success({ defaultWallet: name });\n\n if (!isJsonMode()) {\n successMessage(`Default wallet set to '${name}'`);\n }\n },\n});\n","import { confirm } from \"@clack/prompts\";\nimport { defineCommand } from \"citty\";\nimport { forceHelpRequested, printHelp } from \"~/utils/help.js\";\nimport { error, info, isJsonMode, setJsonMode, success, successMessage } from \"~/utils/output.js\";\nimport { deleteWallet, walletExists } from \"~/utils/wallet.js\";\n\nexport default defineCommand({\n meta: {\n name: \"delete\",\n description: \"Delete a wallet\",\n },\n args: {\n name: {\n type: \"positional\",\n description: \"Wallet name\",\n required: false,\n },\n yes: {\n type: \"boolean\",\n description: \"Skip confirmation prompt\",\n default: false,\n },\n json: {\n type: \"boolean\",\n description: \"Output JSON only\",\n default: false,\n },\n },\n async run({ args }) {\n if (args.json) {\n setJsonMode(true);\n }\n\n const name = args.name;\n\n if (forceHelpRequested() || !name) {\n printHelp({\n command: \"probe wallet delete\",\n description: \"Delete a wallet from local storage\",\n usage: [\"probe wallet delete <name> [options]\", \"probe wallet delete old-wallet --yes\"],\n options: [\n { name: \"--yes\", detail: \"Skip interactive confirmation prompt\" },\n { name: \"--json\", detail: \"JSON output for agents\" },\n ],\n });\n return;\n }\n\n const exists = await walletExists(name);\n if (!exists) {\n error(\n \"WALLET_NOT_FOUND\",\n `Wallet '${name}' does not exist`,\n `Run 'probe wallet list' to see available wallets`,\n );\n }\n\n if (!isJsonMode() && !args.yes) {\n const shouldDelete = await confirm({\n message: `Are you sure you want to delete wallet \"${name}\"? This cannot be undone.`,\n });\n\n if (!shouldDelete) {\n info(\"Deletion cancelled\");\n process.exit(0);\n }\n }\n\n try {\n await deleteWallet(name);\n\n success({ deleted: name });\n\n if (!isJsonMode()) {\n successMessage(`Wallet \"${name}\" deleted successfully`);\n }\n } catch (err) {\n error(\"WALLET_DELETE_ERROR\", err instanceof Error ? err.message : \"Failed to delete wallet\");\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { resolveMnemonicInput, resolvePasswordInput } from \"~/utils/credentials.js\";\nimport { forceHelpRequested, printHelp } from \"~/utils/help.js\";\nimport { error, isJsonMode, setJsonMode, success, successMessage } from \"~/utils/output.js\";\nimport { loadUserConfig, saveUserConfig } from \"~/utils/user-config.js\";\nimport { importWallet, listWallets } from \"~/utils/wallet.js\";\n\nexport default defineCommand({\n meta: {\n name: \"import\",\n description: \"Import wallet from mnemonic phrase\",\n },\n args: {\n name: {\n type: \"positional\",\n description: \"Wallet identifier\",\n required: false,\n },\n mnemonic: {\n type: \"string\",\n description: \"Mnemonic phrase (space-separated)\",\n },\n \"mnemonic-file\": {\n type: \"string\",\n description: \"Read mnemonic from file\",\n },\n \"password-file\": {\n type: \"string\",\n description: \"Read password from file\",\n },\n \"set-default\": {\n type: \"boolean\",\n description: \"Set this wallet as the default\",\n default: false,\n },\n json: {\n type: \"boolean\",\n description: \"Output JSON only\",\n default: false,\n },\n },\n async run({ args }) {\n if (args.json) {\n setJsonMode(true);\n }\n\n const name = args.name;\n\n if (forceHelpRequested() || !name) {\n printHelp({\n command: \"probe wallet import\",\n description: \"Import an encrypted wallet from mnemonic\",\n usage: [\n \"probe wallet import <name> [options]\",\n \"probe wallet import agent-wallet --mnemonic-file ./mnemonic.txt\",\n ],\n options: [\n { name: \"--mnemonic\", detail: \"24-word mnemonic phrase\" },\n { name: \"--mnemonic-file\", detail: \"Read mnemonic from file\" },\n { name: \"--password-file\", detail: \"Read wallet password from file\" },\n { name: \"--set-default\", detail: \"Set imported wallet as default\" },\n { name: \"--json\", detail: \"JSON output for agents\" },\n ],\n notes: [\n \"Mnemonic source order: --mnemonic, --mnemonic-file, PROBE_WALLET_MNEMONIC, interactive prompt.\",\n ],\n });\n return;\n }\n\n if (!/^[a-zA-Z0-9_-]+$/.test(name)) {\n error(\"INVALID_NAME\", \"Wallet name must be alphanumeric with hyphens or underscores only\");\n }\n\n const mnemonicPhrase = await resolveMnemonicInput({\n mnemonic: args.mnemonic,\n mnemonicFile: args[\"mnemonic-file\"],\n jsonModeError:\n \"Mnemonic required via --mnemonic, --mnemonic-file, or PROBE_WALLET_MNEMONIC env\",\n });\n\n const walletPassword = await resolvePasswordInput({\n passwordFile: args[\"password-file\"],\n promptMessage: \"Enter password to encrypt wallet:\",\n jsonModeError:\n \"Password required via PROBE_WALLET_PASSWORD env, --password-file, or interactive prompt\",\n });\n\n try {\n const result = await importWallet(name, mnemonicPhrase, walletPassword);\n\n let setAsDefault = args[\"set-default\"];\n if (!setAsDefault) {\n const wallets = await listWallets();\n if (wallets.length === 1) {\n setAsDefault = true;\n }\n }\n\n if (setAsDefault) {\n const userConfig = await loadUserConfig();\n userConfig.defaultWallet = result.name;\n await saveUserConfig(userConfig);\n }\n\n success({\n name: result.name,\n address: result.address,\n default: setAsDefault,\n });\n\n if (!isJsonMode()) {\n successMessage(`Wallet \"${result.name}\" imported successfully`);\n console.log(`Address: ${result.address}`);\n if (setAsDefault) {\n console.log(`\\nSet as default wallet`);\n }\n }\n } catch (err) {\n error(\"WALLET_IMPORT_ERROR\", err instanceof Error ? err.message : \"Failed to import wallet\");\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { getConfig } from \"~/utils/config.js\";\nimport { forceHelpRequested, printHelp } from \"~/utils/help.js\";\nimport { error, info, isJsonMode, setJsonMode, success } from \"~/utils/output.js\";\nimport { listWallets } from \"~/utils/wallet.js\";\n\nexport default defineCommand({\n meta: {\n name: \"list\",\n description: \"List all stored wallets\",\n },\n args: {\n json: {\n type: \"boolean\",\n description: \"Output JSON only\",\n default: false,\n },\n },\n async run({ args }) {\n if (forceHelpRequested()) {\n printHelp({\n command: \"probe wallet list\",\n description: \"List all locally stored wallets\",\n usage: [\"probe wallet list [options]\", \"probe wallet list --json\"],\n options: [{ name: \"--json\", detail: \"JSON output for agents\" }],\n });\n return;\n }\n\n if (args.json) {\n setJsonMode(true);\n }\n\n try {\n const wallets = await listWallets();\n const config = await getConfig();\n\n const walletsOutput = wallets.map((w) => ({\n ...w,\n default: w.name === config.defaultWallet,\n }));\n\n success(walletsOutput);\n\n if (!isJsonMode()) {\n if (wallets.length === 0) {\n info(\"No wallets found\");\n } else {\n console.log(\"Wallets:\");\n for (const wallet of walletsOutput) {\n const date = wallet.createdAt\n ? new Date(wallet.createdAt).toLocaleDateString()\n : \"unknown\";\n const marker = wallet.default ? \"*\" : \" \";\n console.log(\n `${marker} ${wallet.name.padEnd(12)} ${wallet.address.slice(0, 10)}... created ${date}`,\n );\n }\n if (config.defaultWallet) {\n console.log(`\\n* = default wallet`);\n }\n }\n }\n } catch (err) {\n error(\"WALLET_LIST_ERROR\", err instanceof Error ? err.message : \"Failed to list wallets\");\n }\n },\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 meta: {\n name: \"show\",\n description: \"Show wallet address and public key\",\n },\n args: {\n name: {\n type: \"positional\",\n description: \"Wallet name\",\n required: false,\n },\n \"public-key\": {\n type: \"boolean\",\n description: \"Include public key in output\",\n default: false,\n },\n \"password-file\": {\n type: \"string\",\n description: \"Read password from file\",\n },\n json: {\n type: \"boolean\",\n description: \"Output JSON only\",\n default: false,\n },\n },\n async run({ args }) {\n if (args.json) {\n setJsonMode(true);\n }\n\n const name = args.name;\n\n if (forceHelpRequested() || !name) {\n printHelp({\n command: \"probe wallet show\",\n description: \"Show wallet address and optional public key\",\n usage: [\n \"probe wallet show <name> [options]\",\n \"probe wallet show my-wallet --public-key --password-file ./pass.txt\",\n ],\n options: [\n { name: \"--public-key\", detail: \"Include public key in output\" },\n {\n name: \"--password-file\",\n detail: \"Read password for public key extraction\",\n },\n { name: \"--json\", detail: \"JSON output for agents\" },\n ],\n });\n return;\n }\n\n const walletInfo = await getWalletInfo(name);\n if (!walletInfo) {\n error(\n \"WALLET_NOT_FOUND\",\n `Wallet '${name}' does not exist`,\n `Run 'probe wallet list' to see available wallets`,\n );\n }\n\n let walletPassword: string | undefined;\n\n if (args[\"password-file\"]) {\n try {\n walletPassword = await readFile(args[\"password-file\"], \"utf-8\");\n walletPassword = walletPassword.trim();\n } catch {\n error(\"FILE_READ_ERROR\", `Failed to read password file: ${args[\"password-file\"]}`);\n }\n }\n\n try {\n let publicKey: string | undefined;\n\n if (walletPassword) {\n const keyStore = await loadWallet(name, walletPassword);\n const keyPair = keyStore.getKeyPair(0);\n publicKey = keyPair.getPublicKey().toString(\"hex\");\n }\n\n const result: Record<string, string | undefined> = {\n name: walletInfo.name,\n address: walletInfo.address,\n createdAt: walletInfo.createdAt,\n };\n\n if (args[\"public-key\"] || publicKey) {\n result.publicKey = publicKey;\n }\n\n success(result);\n\n if (!isJsonMode()) {\n console.log(`Name: ${walletInfo.name}`);\n console.log(`Address: ${walletInfo.address}`);\n if (walletInfo.createdAt) {\n console.log(`Created: ${new Date(walletInfo.createdAt).toLocaleString()}`);\n }\n if (publicKey) {\n console.log(`Public Key: ${publicKey}`);\n }\n }\n } catch (err) {\n error(\"WALLET_LOAD_ERROR\", err instanceof Error ? err.message : \"Failed to load wallet\");\n }\n },\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([\"create\", \"import\", \"list\", \"show\", \"delete\", \"default\"]);\n\nexport default defineCommand({\n meta: {\n name: \"wallet\",\n description: \"Manage Zenon Network wallets\",\n },\n run() {\n const positionals = process.argv.slice(2).filter((arg) => !arg.startsWith(\"-\"));\n if (positionals.length > 1 && walletSubcommands.has(positionals[1])) {\n return;\n }\n\n printHelp({\n command: \"probe wallet\",\n description: \"Create, import, inspect, and manage wallets\",\n usage: [\n \"probe wallet <subcommand> [positionals] [options]\",\n \"probe wallet create my-wallet --set-default\",\n \"probe wallet import my-wallet --mnemonic-file ./mnemonic.txt\",\n ],\n actions: [\n { name: \"create <name>\", detail: \"Create a new encrypted wallet\" },\n { name: \"import <name>\", detail: \"Import wallet from mnemonic phrase\" },\n { name: \"list\", detail: \"List stored wallets\" },\n {\n name: \"show <name>\",\n detail: \"Show wallet address and optional public key\",\n },\n { name: \"delete <name>\", detail: \"Delete a wallet\" },\n { name: \"default <name>\", detail: \"Set default wallet\" },\n ],\n notes: [\"Use long-form flags only for predictable agent automation.\"],\n });\n },\n subCommands: {\n create,\n import: importCmd,\n list,\n show,\n delete: deleteCmd,\n default: defaultCmd,\n },\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 { failWithConnectionOrUnexpected } from \"~/utils/errors.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 meta: {\n name: \"whoami\",\n description: \"Show current authenticated agent profile\",\n },\n args: {\n wallet: { type: \"string\", description: \"Wallet name\" },\n json: { type: \"boolean\", description: \"Output JSON\", default: false },\n host: { type: \"string\", description: \"SpacetimeDB host\" },\n module: { type: \"string\", description: \"Module name\" },\n },\n async run({ args }) {\n if (args.json) setJsonMode(true);\n\n try {\n await withAuth({ host: args.host, module: args.module, wallet: args.wallet }, async (ctx) => {\n const myAgent = ctx\n .iter<Agent>(\"agents\")\n .find((a) => a.identity.toHexString() === ctx.identity?.toHexString());\n\n if (!myAgent) {\n error(\"NOT_REGISTERED\", \"Agent not registered. Run `probe agent register` first.\");\n }\n\n success(myAgent);\n\n if (!isJsonMode()) {\n console.log(\n toonList(\"agent\", [\n {\n id: myAgent.id,\n name: myAgent.name,\n role: AgentRole.display(myAgent.role),\n status: AgentStatus.display(myAgent.status),\n lastHeartbeat: formatTimestamp(myAgent.lastHeartbeat),\n currentTaskId: myAgent.currentTaskId ? myAgent.currentTaskId.toString() : \"\",\n capabilities: myAgent.capabilities.join(\",\"),\n identity: ctx.identity?.toHexString() || \"\",\n },\n ]),\n );\n }\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n failWithConnectionOrUnexpected(message);\n }\n },\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 next from \"./commands/next.js\";\nimport onboard from \"./commands/onboard.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 upgrade from \"./commands/upgrade.js\";\nimport wallet from \"./commands/wallet/index.js\";\nimport whoami from \"./commands/whoami.js\";\nimport { normalizeHelpArgv, printHelp, setForceHelpRequested } from \"./utils/help.js\";\nimport { isJsonMode } from \"./utils/output.js\";\n\nconst topLevelCommands = new Set([\n \"wallet\",\n \"auth\",\n \"sign\",\n \"token\",\n \"config\",\n \"nexus\",\n \"agent\",\n \"task\",\n \"message\",\n \"idea\",\n \"discover\",\n \"project\",\n \"query\",\n \"doctor\",\n \"whoami\",\n \"upgrade\",\n \"onboard\",\n \"next\",\n]);\n\nconst applyHelpNormalization = (): void => {\n const normalized = normalizeHelpArgv(process.argv.slice(2));\n setForceHelpRequested(normalized.forceHelp);\n process.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 meta: { name: \"probe\", version, description },\n args: {\n json: { type: \"boolean\", description: \"Output JSON only\", default: false },\n },\n run() {\n const firstPositional = process.argv.slice(2).find((arg) => !arg.startsWith(\"-\"));\n if (firstPositional && topLevelCommands.has(firstPositional)) {\n return;\n }\n\n printHelp({\n command: \"probe\",\n description,\n usage: [\n \"probe <command> [positionals] [options]\",\n 'probe idea propose --title \"Better task scoring\" --category planning',\n \"probe task claim 42 --wallet agent-wallet\",\n ],\n actions: [\n { name: \"wallet\", detail: \"Wallet lifecycle commands\" },\n { name: \"auth\", detail: \"Authenticate wallet and cache token\" },\n { name: \"token\", detail: \"Inspect or clear cached token\" },\n { name: \"sign\", detail: \"Sign text payloads\" },\n {\n name: \"nexus\",\n detail: \"Run persistent Nexus daemon (keepalive + event logs)\",\n },\n {\n name: \"agent, task, idea, discover, message, project\",\n detail: \"Nexus workspace commands\",\n },\n { name: \"query\", detail: \"Execute SQL queries against Nexus\" },\n { name: \"doctor\", detail: \"Run setup and connectivity diagnostics\" },\n { name: \"onboard\", detail: \"Idempotent agent setup for autonomous participation\" },\n { name: \"next\", detail: \"Deterministic router for one bounded action per wake\" },\n { name: \"upgrade\", detail: \"Upgrade Probe to the latest version\" },\n { name: \"config\", detail: \"Read/write CLI configuration\" },\n ],\n options: [{ name: \"--json\", detail: \"JSON output mode for agents\" }],\n notes: [\"Nexus commands connect to SpacetimeDB (the realtime database backing Nexus).\"],\n });\n },\n subCommands: {\n wallet,\n auth,\n sign,\n token,\n config,\n nexus: nexusDaemon,\n agent,\n task,\n message,\n idea,\n discover,\n project,\n query,\n doctor,\n onboard,\n next,\n upgrade,\n whoami,\n },\n});\n\n// Global error handler to suppress stack traces for expected errors\nconst isExpectedError = (err: unknown): boolean => {\n if (!(err instanceof Error)) return false;\n const message = err.message.toLowerCase();\n return (\n message.includes(\"connection failed\") ||\n message.includes(\"connection timeout\") ||\n message.includes(\"authentication required\") ||\n message.includes(\"unauthorized\") ||\n message.includes(\"wallet required\") ||\n message.includes(\"wallet not found\") ||\n message.includes(\"agent not registered\") ||\n message.includes(\"subscription error\")\n );\n};\n\nprocess.on(\"unhandledRejection\", (err: unknown) => {\n if (isExpectedError(err)) {\n // Error message already printed by the error() utility\n process.exit(1);\n }\n if (isJsonMode()) {\n console.error(\n JSON.stringify({\n success: false,\n error: {\n code: \"UNEXPECTED_ERROR\",\n message: err instanceof Error ? err.message : String(err),\n },\n }),\n );\n } else {\n console.error(err instanceof Error ? err.message : String(err));\n }\n process.exit(1);\n});\n\napplyHelpNormalization();\nrunMain(main);\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["jsonReplacer","note","spinner","clackSpinner","walletSubcommands","spinner","__t","AgentRole","AgentStatus","IdeaStatus","MessageType","ProjectStatus","TaskStatus","__t","__t","__t","__t","__t","__t","__t","__t","__t","__t","__t","__t","AgentRole","__t","__t","MessageType","__t","MessageType","AgentStatus","__t","__t","__t","__t","__t","ProjectStatus","__t","TaskStatus","__t","__t","__t","__t","__t","AgentRole","AgentStatus","__t","__t","__t","__t","__t","IdeaStatus","__t","AgentRole","__t","MessageType","__t","__t","MessageType","__t","ProjectStatus","__t","__t","TaskStatus","__t","__t","__schema","__table","AgentActionEventsRow","AgentActionsRow","AgentsRow","ChannelsRow","ConfigRow","DiscoveredTasksRow","EvaluationDimensionsRow","IdeasRow","IdentityRolesRow","MessagesRow","ProjectChannelsRow","ProjectMessagesRow","ProjectsRow","TaskDependenciesRow","TasksRow","VoiceAnnouncementsRow","VotesRow","__reducers","__reducerSchema","AddTaskDependencyReducer","ClaimTaskReducer","CreateProjectReducer","CreateTaskReducer","DiscoverTaskReducer","FailVoiceAnnouncementReducer","FinalizeVoiceAnnouncementReducer","HeartbeatReducer","IssueAgentActionReducer","MarkIdeaImplementedReducer","ProposeIdeaReducer","RegisterAgentReducer","ReviewDiscoveredTaskReducer","SeedUiDataReducer","SeedVoiceAnnouncementsReducer","SendMessageReducer","SendProjectMessageReducer","SetAgentStatusReducer","UpdateAgentActionReducer","UpdateAgentBioReducer","UpdateAgentCapabilitiesReducer","UpdateProjectStatusReducer","UpdateTaskStatusReducer","VoteIdeaReducer","__procedures","__procedureSchema","GenerateVoiceProcedure.params","GenerateVoiceProcedure.returnType","__makeQueryBuilder","reducers","__convertToAccessorMap","procedures","__SubscriptionBuilderImpl","DbConnectionBuilder","__DbConnectionBuilder","__DbConnectionImpl","commandExists","commandExists","commandExists","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/fail_voice_announcement_reducer.ts","../src/module_bindings/finalize_voice_announcement_reducer.ts","../src/module_bindings/heartbeat_reducer.ts","../src/module_bindings/issue_agent_action_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/seed_voice_announcements_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_action_reducer.ts","../src/module_bindings/update_agent_bio_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/generate_voice_procedure.ts","../src/module_bindings/agent_action_events_table.ts","../src/module_bindings/agent_actions_table.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/evaluation_dimensions_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/voice_announcements_table.ts","../src/module_bindings/votes_table.ts","../src/module_bindings/index.ts","../src/utils/context.ts","../src/utils/enums.ts","../src/utils/health.ts","../src/utils/toon.ts","../src/commands/doctor.ts","../src/utils/upgrade.ts","../src/utils/auto-update.ts","../src/utils/time.ts","../src/utils/next-router.ts","../src/utils/next-action-defs.ts","../src/commands/next.ts","../src/utils/scheduler-plans.ts","../src/utils/auth-flow.ts","../src/utils/skills-install.ts","../src/utils/daemon.ts","../src/utils/runtime-detection.ts","../src/utils/onboard/steps.ts","../src/commands/onboard.ts","../src/utils/errors.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/upgrade.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 issuer: string;\n walletDir: string;\n defaultWallet?: string;\n autoUpdate?: boolean | \"notify\";\n passwordMinLength: number;\n tokenCacheDir: string;\n requestTimeout: number;\n schedulerConfirmed?: boolean;\n spacetime: {\n host: string;\n module: string;\n };\n}\n\nexport const DEFAULT_CONFIG: NexusConfig = {\n issuer: \"https://api.zenon.red\",\n walletDir: \"~/.probe/wallets\",\n autoUpdate: \"notify\",\n passwordMinLength: 8,\n tokenCacheDir: \"~/.probe/tokens\",\n requestTimeout: 30000,\n spacetime: {\n host: \"wss://db.zenon.red\",\n module: \"nexus\",\n },\n};\n\nexport interface WalletInfo {\n name: string;\n address: string;\n publicKey?: string;\n createdAt?: string;\n}\n\nexport interface WalletCreationResult {\n name: string;\n address: string;\n publicKey: string;\n mnemonic: string;\n}\n\nexport interface ChallengeResponse {\n nonce: string;\n challenge: string;\n expiresAt: string;\n}\n\nexport interface TokenResponse {\n accessToken: string;\n idToken: string;\n expiresIn: number;\n}\n\nexport interface OutputResult<T> {\n success: boolean;\n data?: T;\n error?: { 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 try {\n await access(CONFIG_PATH);\n const content = await readFile(CONFIG_PATH, \"utf-8\");\n return JSON.parse(content) as Partial<NexusConfig>;\n } catch {\n return {};\n }\n}\n\nexport async function saveUserConfig(config: Partial<NexusConfig>): Promise<void> {\n await mkdir(CONFIG_DIR, { recursive: true });\n await writeFile(CONFIG_PATH, JSON.stringify(config, null, 2), {\n mode: 0o600,\n });\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 if (cachedConfig) {\n return cachedConfig;\n }\n\n const [c12Config, userConfig] = await Promise.all([\n loadConfig<NexusConfig>({\n name: \"probe\",\n defaults: DEFAULT_CONFIG,\n envName: \"PROBE\",\n }),\n loadUserConfig(),\n ]);\n\n cachedConfig = {\n ...DEFAULT_CONFIG,\n ...c12Config.config,\n ...userConfig,\n };\n\n cachedConfig.walletDir = expandHomeDir(cachedConfig.walletDir);\n cachedConfig.tokenCacheDir = expandHomeDir(cachedConfig.tokenCacheDir);\n\n return cachedConfig;\n}\n\nexport function clearConfigCache(): void {\n cachedConfig = null;\n}\n\nexport function expandHomeDir(path: string): string {\n if (path.startsWith(\"~/\")) {\n return join(homedir(), path.slice(2));\n }\n return path;\n}\n\nexport async function getWalletDir(): Promise<string> {\n const config = await getConfig();\n return config.walletDir;\n}\n\nexport async function getTokenCacheDir(): Promise<string> {\n const config = await getConfig();\n return config.tokenCacheDir;\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { spinner as clackSpinner, log, note as clackNote } from \"@clack/prompts\";\nimport { dim } from \"kolorist\";\nimport type { OutputResult } from \"~/types/index.js\";\n\nconst outputModeStorage = new AsyncLocalStorage<{ jsonMode: boolean }>();\nlet jsonModeFallback = false;\n\nconst jsonReplacer = (_key: string, value: unknown): unknown => {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n};\n\nconst printJson = (value: unknown, stderr = false): void => {\n const serialized = JSON.stringify(value, jsonReplacer, 2);\n if (stderr) {\n console.error(serialized);\n return;\n }\n console.log(serialized);\n};\n\nexport function setJsonMode(enabled: boolean) {\n jsonModeFallback = enabled;\n outputModeStorage.enterWith({ jsonMode: enabled });\n}\n\nexport function isJsonMode(): boolean {\n return outputModeStorage.getStore()?.jsonMode === true || jsonModeFallback;\n}\n\nexport function success<T>(data: T): void {\n if (isJsonMode()) {\n printJson({ success: true, data });\n }\n}\n\nexport function error(code: string, message: string, suggestion?: string, exitCode = 1): never {\n if (isJsonMode()) {\n const output: OutputResult<never> = {\n success: false,\n error: {\n code,\n message,\n ...(suggestion && { suggestion }),\n },\n };\n printJson(output, true);\n process.exit(exitCode);\n } else {\n log.error(message);\n if (suggestion) {\n console.error(`${dim(\"hint:\")} ${suggestion}`);\n }\n process.exit(exitCode);\n }\n}\n\nexport function info(message: string): void {\n if (!isJsonMode()) {\n log.info(message);\n }\n}\n\nexport function successMessage(message: string): void {\n if (!isJsonMode()) {\n log.success(message);\n }\n}\n\nexport function warning(message: string): void {\n if (!isJsonMode()) {\n log.warn(message);\n }\n}\n\nexport function note(message: string, title?: string): void {\n if (!isJsonMode()) {\n clackNote(message, title);\n }\n}\n\nexport function spinner(message: string) {\n if (isJsonMode()) {\n return {\n start: () => {},\n stop: () => {},\n succeed: () => {},\n fail: () => {},\n };\n }\n\n const clack = clackSpinner();\n\n const start = () => {\n clack.start(message);\n };\n\n const stop = () => {\n clack.stop();\n };\n\n const succeed = (msg?: string) => {\n clack.stop(msg || message);\n };\n\n const fail = (msg?: string) => {\n clack.stop(msg || message);\n };\n\n return {\n start,\n stop,\n succeed,\n fail,\n };\n}\n","import { readFile } from \"node:fs/promises\";\nimport { password, text } from \"@clack/prompts\";\nimport { error, isJsonMode } from \"./output.js\";\n\nconst readTrimmedFile = async (filePath: string, label: string): Promise<string> => {\n try {\n return (await readFile(filePath, \"utf-8\")).trim();\n } catch {\n error(\"FILE_READ_ERROR\", `Failed to read ${label} file: ${filePath}`);\n }\n};\n\nexport interface ResolvePasswordInput {\n passwordFile?: string;\n envVar?: string;\n promptMessage: string;\n jsonModeError: string;\n minLength?: number;\n confirmPromptMessage?: string;\n}\n\nexport const resolvePasswordInput = async (options: ResolvePasswordInput): Promise<string> => {\n if (options.passwordFile) {\n return readTrimmedFile(options.passwordFile, \"password\");\n }\n\n const envVar = options.envVar || \"PROBE_WALLET_PASSWORD\";\n const fromEnv = process.env[envVar];\n if (fromEnv) {\n return fromEnv;\n }\n\n if (isJsonMode() || !process.stdin.isTTY || !process.stdout.isTTY) {\n error(\"PASSWORD_REQUIRED\", options.jsonModeError);\n }\n\n const first = await password({\n message: options.promptMessage,\n validate: (value) => {\n if (!value) return;\n if (options.minLength && value.length < options.minLength) {\n return `Password must be at least ${options.minLength} characters`;\n }\n },\n });\n\n if (typeof first !== \"string\") {\n process.exit(130);\n }\n\n if (!options.confirmPromptMessage) {\n return first;\n }\n\n const second = await password({\n message: options.confirmPromptMessage,\n validate: (value) => (value === first ? undefined : \"Passwords do not match\"),\n });\n if (typeof second !== \"string\") {\n process.exit(130);\n }\n\n return first;\n};\n\nexport interface ResolveMnemonicInput {\n mnemonic?: string;\n mnemonicFile?: string;\n envVar?: string;\n jsonModeError: string;\n}\n\nexport const resolveMnemonicInput = async (options: ResolveMnemonicInput): Promise<string> => {\n if (options.mnemonic) {\n return options.mnemonic;\n }\n\n if (options.mnemonicFile) {\n return readTrimmedFile(options.mnemonicFile, \"mnemonic\");\n }\n\n const envVar = options.envVar || \"PROBE_WALLET_MNEMONIC\";\n const fromEnv = process.env[envVar];\n if (fromEnv) {\n return fromEnv;\n }\n\n if (isJsonMode() || !process.stdin.isTTY || !process.stdout.isTTY) {\n error(\"MNEMONIC_REQUIRED\", options.jsonModeError);\n }\n\n const input = await text({\n message: \"Enter mnemonic phrase:\",\n validate: (value) =>\n !value\n ? \"Mnemonic must be 24 words\"\n : value.trim().split(/\\s+/).length === 24\n ? undefined\n : \"Mnemonic must be 24 words\",\n });\n if (typeof input !== \"string\") {\n process.exit(130);\n }\n return input;\n};\n","import { blue, bold, cyan, dim, gray, green, white } from \"kolorist\";\n\ninterface HelpSectionItem {\n name: string;\n detail: string;\n}\n\ninterface HelpSpec {\n command: string;\n description: string;\n usage: string[];\n actions?: HelpSectionItem[];\n options?: HelpSectionItem[];\n examples?: string[];\n notes?: string[];\n}\n\nconst actionHelpCommands = new Set([\n \"agent\",\n \"task\",\n \"message\",\n \"idea\",\n \"discover\",\n \"project\",\n \"config\",\n]);\nconst directHelpCommands = new Set([\n \"wallet\",\n \"auth\",\n \"sign\",\n \"token\",\n \"nexus\",\n \"query\",\n \"doctor\",\n \"upgrade\",\n]);\nconst walletSubcommands = new Set([\"create\", \"import\", \"list\", \"show\", \"delete\", \"default\"]);\n\nlet forceHelpFlag = false;\n\nconst neonBadge = (text: string): string =>\n `\\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 = (items: HelpSectionItem[], nameColor: (value: string) => string): string => {\n const width = Math.max(...items.map((i) => i.name.length), 0);\n return items.map((i) => ` ${nameColor(i.name.padEnd(width))} ${i.detail}`).join(\"\\n\");\n};\n\nexport const printHelp = (spec: HelpSpec): void => {\n const notes = [...(spec.notes || [])];\n const hasHostModuleOption = (spec.options || []).some(\n (item) => item.name.includes(\"--host\") && item.name.includes(\"--module\"),\n );\n const hasHostModuleNote = notes.some(\n (note) => note.includes(\"--host\") && note.includes(\"--module\"),\n );\n if (hasHostModuleOption && !hasHostModuleNote) {\n notes.push(\n \"--host sets the SpacetimeDB server endpoint; --module sets the target module/database name (default: nexus).\",\n );\n }\n\n const lines: string[] = [];\n lines.push(`${bold(white(spec.command))} ${dim(\"•\")} ${gray(spec.description)}`);\n\n lines.push(\"\");\n lines.push(section(\"Usage\"));\n for (const entry of spec.usage) {\n lines.push(` ${white(entry)}`);\n }\n\n if (spec.actions && spec.actions.length > 0) {\n lines.push(\"\");\n lines.push(section(\"Actions\"));\n lines.push(renderItems(spec.actions, green));\n }\n\n if (spec.options && spec.options.length > 0) {\n lines.push(\"\");\n lines.push(section(\"Options\"));\n lines.push(renderItems(spec.options, blue));\n }\n\n if (spec.examples && spec.examples.length > 0) {\n lines.push(\"\");\n lines.push(section(\"Examples\"));\n for (const example of spec.examples) {\n lines.push(` ${cyan(example)}`);\n }\n }\n\n if (notes.length > 0) {\n lines.push(\"\");\n lines.push(section(\"Notes\"));\n for (const note of notes) {\n lines.push(` ${dim(\"-\")} ${note}`);\n }\n }\n\n console.log(lines.join(\"\\n\"));\n};\n\nexport const setForceHelpRequested = (enabled: boolean): void => {\n forceHelpFlag = enabled;\n};\n\nexport const forceHelpRequested = (): boolean => forceHelpFlag;\n\nexport const normalizeHelpArgv = (argv: string[]): { argv: string[]; forceHelp: boolean } => {\n const hasHelp = argv.includes(\"--help\") || argv.includes(\"-h\");\n if (!hasHelp) {\n return { argv, forceHelp: false };\n }\n\n if (argv.every((arg) => arg.startsWith(\"-\"))) {\n return { argv: [], forceHelp: true };\n }\n\n const command = argv.find((arg) => !arg.startsWith(\"-\"));\n if (!command) {\n return { argv, forceHelp: true };\n }\n\n if (actionHelpCommands.has(command)) {\n return { argv: [command], forceHelp: true };\n }\n\n if (!directHelpCommands.has(command)) {\n return { argv, forceHelp: true };\n }\n\n if (command === \"wallet\") {\n const positionals = argv.filter((arg) => !arg.startsWith(\"-\"));\n if (positionals.length > 1 && walletSubcommands.has(positionals[1])) {\n return { argv: [command, positionals[1]], forceHelp: true };\n }\n }\n\n return { 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 address: string,\n issuerOverride?: string,\n): Promise<ChallengeResponse> {\n const config = await getConfig();\n const issuer = issuerOverride || config.issuer;\n const url = `${issuer}/auth/challenge`;\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ address }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Challenge request failed: ${error}`);\n }\n\n const data = await response.json();\n return {\n nonce: data.nonce,\n challenge: data.challenge,\n expiresAt: data.expires_at,\n };\n}\n\nexport async function exchangeToken(\n address: string,\n publicKey: string,\n signature: string,\n nonce: string,\n issuerOverride?: string,\n): Promise<TokenResponse> {\n const config = await getConfig();\n const issuer = issuerOverride || config.issuer;\n const url = `${issuer}/auth/token`;\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n address,\n public_key: publicKey,\n signature,\n nonce,\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Token exchange failed: ${error}`);\n }\n\n const data = await response.json();\n return {\n accessToken: data.access_token,\n idToken: data.id_token,\n expiresIn: data.expires_in,\n };\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(wallet: string, token: string, expiresAt: string): Promise<void> {\n const cacheDir = await getTokenCacheDir();\n\n try {\n await mkdir(cacheDir, { recursive: true });\n } catch {}\n\n const cachePath = join(cacheDir, `${wallet}.jwt`);\n const data = {\n token,\n expiresAt,\n };\n\n await writeFile(cachePath, JSON.stringify(data), { mode: 0o600 });\n}\n\nexport async function getCachedToken(\n wallet: string,\n): Promise<{ token: string; expiresAt: string } | null> {\n const cacheDir = await getTokenCacheDir();\n const cachePath = join(cacheDir, `${wallet}.jwt`);\n\n try {\n await access(cachePath);\n const content = await readFile(cachePath, \"utf-8\");\n return JSON.parse(content);\n } catch {\n return null;\n }\n}\n\nexport async function clearCachedToken(wallet: string): Promise<void> {\n const cacheDir = await getTokenCacheDir();\n const cachePath = join(cacheDir, `${wallet}.jwt`);\n\n try {\n await access(cachePath);\n const { unlink } = await import(\"node:fs/promises\");\n await unlink(cachePath);\n } catch {}\n}\n","import { access, mkdir, readdir, readFile, unlink, writeFile } 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 const walletDir = await getWalletDir();\n try {\n await mkdir(walletDir, { recursive: true });\n } catch {}\n return walletDir;\n}\n\nasync function getWalletFilePath(name: string): Promise<string> {\n const walletDir = await ensureWalletDir();\n return join(walletDir, `${name}.json`);\n}\n\nexport async function createWallet(name: string, password: string): Promise<WalletCreationResult> {\n const exists = await walletExists(name);\n if (exists) {\n throw new Error(`Wallet '${name}' already exists`);\n }\n\n const keyStore = KeyStore.newRandom();\n const keyFile = KeyFile.setPassword(password);\n const encryptedData = await keyFile.encrypt(keyStore);\n\n const walletPath = await getWalletFilePath(name);\n await writeFile(walletPath, JSON.stringify(encryptedData, null, 2), \"utf-8\");\n\n const keyPair = keyStore.getKeyPair(0);\n const address = keyPair.getAddress();\n const publicKey = keyPair.getPublicKey();\n\n return {\n name,\n address: address.toString(),\n publicKey: publicKey.toString(\"hex\"),\n mnemonic: keyStore.mnemonic || \"\",\n };\n}\n\nexport async function importWallet(\n name: string,\n mnemonic: string,\n password: string,\n): Promise<WalletInfo> {\n const exists = await walletExists(name);\n if (exists) {\n throw new Error(`Wallet '${name}' already exists`);\n }\n\n const keyStore = KeyStore.fromMnemonic(mnemonic);\n const keyFile = KeyFile.setPassword(password);\n const encryptedData = await keyFile.encrypt(keyStore);\n\n const walletPath = await getWalletFilePath(name);\n await writeFile(walletPath, JSON.stringify(encryptedData, null, 2), \"utf-8\");\n\n const keyPair = keyStore.getKeyPair(0);\n const address = keyPair.getAddress();\n\n return {\n name,\n address: address.toString(),\n };\n}\n\nexport async function listWallets(): Promise<WalletInfo[]> {\n const walletDir = await getWalletDir();\n\n try {\n const files = await readdir(walletDir);\n const wallets: WalletInfo[] = [];\n\n for (const file of files) {\n if (file.endsWith(\".json\")) {\n const name = file.slice(0, -5);\n const info = await getWalletInfo(name);\n if (info) {\n wallets.push(info);\n }\n }\n }\n\n return wallets;\n } catch {\n return [];\n }\n}\n\nexport async function getWalletInfo(name: string): Promise<WalletInfo | null> {\n const walletPath = await getWalletFilePath(name);\n\n try {\n const content = await readFile(walletPath, \"utf-8\");\n const data = JSON.parse(content);\n const stats = await stat(walletPath);\n\n return {\n name,\n address: data.address || data.baseAddress,\n createdAt: data.timestamp\n ? new Date(data.timestamp * 1000).toISOString()\n : new Date(stats.mtime).toISOString(),\n };\n } catch {\n return null;\n }\n}\n\nexport async function loadWallet(name: string, password: string): Promise<KeyStore> {\n const walletPath = await getWalletFilePath(name);\n\n try {\n const content = await readFile(walletPath, \"utf-8\");\n const encryptedData = JSON.parse(content);\n\n const keyFile = KeyFile.setPassword(password);\n const keyStore = await keyFile.decrypt(encryptedData);\n\n return keyStore;\n } catch (err) {\n throw new Error(\n `Failed to load wallet: ${err instanceof Error ? err.message : \"Unknown error\"}`,\n );\n }\n}\n\nexport async function deleteWallet(name: string): Promise<void> {\n const walletPath = await getWalletFilePath(name);\n\n try {\n await unlink(walletPath);\n } catch (err) {\n throw new Error(\n `Failed to delete wallet: ${err instanceof Error ? err.message : \"Unknown error\"}`,\n );\n }\n}\n\nexport async function walletExists(name: string): Promise<boolean> {\n const walletPath = await getWalletFilePath(name);\n\n try {\n await access(walletPath);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function stat(path: string) {\n const { stat } = await import(\"node:fs/promises\");\n return 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 error,\n isJsonMode,\n setJsonMode,\n spinner,\n success,\n successMessage,\n} from \"~/utils/output.js\";\nimport { cacheToken, getCachedToken } from \"~/utils/token-cache.js\";\nimport { loadWallet } from \"~/utils/wallet.js\";\n\nexport default defineCommand({\n meta: {\n name: \"auth\",\n description: \"Complete OIDC authentication flow\",\n },\n args: {\n name: {\n type: \"positional\",\n description: \"Wallet name, or status action\",\n required: false,\n },\n wallet: {\n type: \"string\",\n description: \"Wallet name override (used with auth status)\",\n },\n \"expect-address\": {\n type: \"string\",\n description: \"Expected Zenon address safety check (z1...)\",\n },\n issuer: {\n type: \"string\",\n description: \"OIDC issuer URL override\",\n },\n \"password-file\": {\n type: \"string\",\n description: \"Read password from file\",\n },\n save: {\n type: \"boolean\",\n description: \"Save token to cache (default: true)\",\n default: true,\n },\n json: {\n type: \"boolean\",\n description: \"Output JSON only\",\n default: false,\n },\n },\n async run({ args }) {\n if (args.json) {\n setJsonMode(true);\n }\n\n const name = args.name;\n const requestedAddress = args[\"expect-address\"];\n\n if (!name) {\n printHelp({\n command: \"probe auth\",\n description: \"Complete OIDC authentication flow\",\n usage: [\n \"probe auth <wallet-name> [options]\",\n \"probe auth status [--wallet my-wallet]\",\n \"probe auth my-wallet --save\",\n \"probe auth my-wallet --expect-address z1q... --save\",\n ],\n options: [\n {\n name: \"--expect-address\",\n detail: \"Optional safety check against resolved wallet address\",\n },\n { name: \"--wallet\", detail: \"Wallet override for `auth status`\" },\n {\n name: \"--issuer\",\n detail: \"OIDC issuer URL (default from config: issuer)\",\n },\n { name: \"--password-file\", detail: \"Read wallet password from file\" },\n {\n name: \"--save\",\n detail: \"Save token in local cache (default: true)\",\n },\n { name: \"--json\", detail: \"JSON output for agents\" },\n ],\n notes: [\n \"Password source order: --password-file, PROBE_WALLET_PASSWORD, interactive prompt.\",\n \"Most users should omit --expect-address; it is for safety checks in external workflows.\",\n \"Use --issuer only when authenticating against a non-default OIDC server (for example local/dev environments).\",\n ],\n });\n return;\n }\n\n if (name === \"status\") {\n const config = await getConfig();\n const walletName = args.wallet || config.defaultWallet;\n if (!walletName) {\n error(\"WALLET_REQUIRED\", \"Wallet required. Use --wallet or set default wallet.\");\n }\n\n const cached = await getCachedToken(walletName);\n if (!cached) {\n success({\n wallet: walletName,\n authenticated: false,\n valid: false,\n reason: \"no_cached_token\",\n });\n if (!isJsonMode()) {\n console.log(`Wallet: ${walletName}`);\n console.log(\"Status: Not authenticated (no cached token)\");\n console.log(`Next: probe auth ${walletName} --save`);\n }\n return;\n }\n\n const expiresAt = new Date(cached.expiresAt);\n const expiresIn = Math.floor((expiresAt.getTime() - Date.now()) / 1000);\n const valid = Number.isFinite(expiresIn) && expiresIn > 0;\n success({\n wallet: walletName,\n authenticated: true,\n valid,\n expiresAt: cached.expiresAt,\n expiresIn: Math.max(0, expiresIn),\n });\n if (!isJsonMode()) {\n console.log(`Wallet: ${walletName}`);\n console.log(`Status: ${valid ? \"Authenticated\" : \"Token expired\"}`);\n console.log(`Expires: ${expiresAt.toUTCString()}`);\n }\n return;\n }\n\n const walletPassword = await resolvePasswordInput({\n passwordFile: args[\"password-file\"],\n promptMessage: \"Enter wallet password:\",\n jsonModeError:\n \"Password required via PROBE_WALLET_PASSWORD env, --password-file, or interactive prompt in a TTY session\",\n });\n\n let keyPair: KeyPair | undefined;\n let walletAddress: string;\n let address: string;\n try {\n const keyStore = await loadWallet(name, walletPassword);\n keyPair = keyStore.getKeyPair(0);\n const addr = keyPair.getAddress();\n walletAddress = addr.toString();\n\n if (requestedAddress && walletAddress !== requestedAddress) {\n error(\n \"ADDRESS_MISMATCH\",\n `Wallet address ${walletAddress} does not match provided address ${requestedAddress}`,\n );\n }\n\n address = requestedAddress || walletAddress;\n } catch (err) {\n error(\"WALLET_LOAD_ERROR\", err instanceof Error ? err.message : \"Failed to load wallet\");\n }\n\n try {\n const challengeSpinner = spinner(\"Requesting challenge from OIDC provider...\");\n challengeSpinner.start();\n\n const challenge = await requestChallenge(address, args.issuer);\n challengeSpinner.succeed();\n\n const signSpinner = spinner(\"Signing challenge...\");\n signSpinner.start();\n\n const signature = keyPair.sign(Buffer.from(challenge.challenge));\n const publicKey = keyPair.getPublicKey();\n signSpinner.succeed();\n\n const exchangeSpinner = spinner(\"Exchanging for token...\");\n exchangeSpinner.start();\n\n const tokenResponse = await exchangeToken(\n address,\n publicKey.toString(\"hex\"),\n signature.toString(\"hex\"),\n challenge.nonce,\n args.issuer,\n );\n exchangeSpinner.succeed();\n\n const expiresAt = new Date(Date.now() + tokenResponse.expiresIn * 1000).toISOString();\n\n if (args.save) {\n await cacheToken(name, tokenResponse.accessToken, expiresAt);\n }\n\n success({\n wallet: name,\n address,\n token: tokenResponse.accessToken,\n expiresAt,\n expiresIn: tokenResponse.expiresIn,\n });\n\n if (!isJsonMode()) {\n successMessage(\"Authentication successful\");\n if (args.save) {\n console.log(\"Token saved to wallet cache.\");\n }\n console.log(\n `Expires: ${new Date(expiresAt).toUTCString()} (${Math.floor(tokenResponse.expiresIn / 86400)} days)`,\n );\n }\n } catch (err) {\n error(\n \"AUTH_ERROR\",\n err instanceof Error ? err.message : \"Authentication failed\",\n undefined,\n 2,\n );\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { clearConfigCache, getConfig } from \"~/utils/config.js\";\nimport { printHelp } from \"~/utils/help.js\";\nimport { error, isJsonMode, setJsonMode, success, successMessage } from \"~/utils/output.js\";\nimport { loadUserConfig, saveUserConfig } from \"~/utils/user-config.js\";\n\nfunction getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n const parts = path.split(\".\");\n let current: unknown = obj;\n for (const part of parts) {\n if (current && typeof current === \"object\" && part in current) {\n current = (current as Record<string, unknown>)[part];\n } else {\n return undefined;\n }\n }\n return current;\n}\n\nfunction setNestedValue(obj: Record<string, unknown>, path: string, value: unknown): void {\n const parts = path.split(\".\");\n let current = obj;\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n if (!(part in current) || typeof current[part] !== \"object\") {\n current[part] = {};\n }\n current = current[part] as Record<string, unknown>;\n }\n current[parts[parts.length - 1]] = value;\n}\n\nexport default defineCommand({\n meta: {\n name: \"config\",\n description: \"Manage configuration settings\",\n },\n args: {\n action: {\n type: \"positional\",\n description: \"Action: get, set, list\",\n required: false,\n },\n key: {\n type: \"positional\",\n description: \"Configuration key\",\n required: false,\n },\n value: {\n type: \"positional\",\n description: \"Configuration value\",\n required: false,\n },\n json: {\n type: \"boolean\",\n description: \"Output JSON only\",\n default: false,\n },\n },\n async run({ args }) {\n if (args.json) {\n setJsonMode(true);\n }\n\n if (!args.action) {\n printHelp({\n command: \"probe config\",\n description: \"Read and write CLI configuration values\",\n usage: [\n \"probe config <action> [key] [value]\",\n \"probe config get spacetime.host\",\n \"probe config set defaultWallet agent-wallet\",\n ],\n actions: [\n { name: \"get <key>\", detail: \"Get one config value\" },\n { name: \"set <key> <value>\", detail: \"Set one config value\" },\n { name: \"list\", detail: \"List merged config and user overrides\" },\n ],\n notes: [\n \"Valid keys: issuer, walletDir, defaultWallet, autoUpdate, tokenCacheDir, requestTimeout, spacetime.host, spacetime.module.\",\n ],\n });\n return;\n }\n\n const action = args.action;\n const validKeys = [\n \"issuer\",\n \"walletDir\",\n \"defaultWallet\",\n \"autoUpdate\",\n \"tokenCacheDir\",\n \"requestTimeout\",\n \"spacetime.host\",\n \"spacetime.module\",\n ];\n\n try {\n switch (action) {\n case \"get\": {\n if (!args.key) {\n error(\"KEY_REQUIRED\", \"Configuration key required\");\n }\n\n if (!validKeys.includes(args.key)) {\n error(\n \"INVALID_KEY\",\n `Invalid configuration key: ${args.key}`,\n `Valid keys: ${validKeys.join(\", \")}`,\n );\n }\n\n const config = await getConfig();\n const value = getNestedValue(config as unknown as Record<string, unknown>, args.key);\n\n success({ [args.key]: value });\n\n if (!isJsonMode()) {\n console.log(`${args.key}: ${value}`);\n }\n break;\n }\n\n case \"set\": {\n if (!args.key || args.value === undefined) {\n error(\"ARGS_REQUIRED\", \"Configuration key and value required\");\n }\n\n if (!validKeys.includes(args.key)) {\n error(\n \"INVALID_KEY\",\n `Invalid configuration key: ${args.key}`,\n `Valid keys: ${validKeys.join(\", \")}`,\n );\n }\n\n let parsedValue: string | boolean | number = args.value;\n\n if (args.key === \"requestTimeout\") {\n parsedValue = parseInt(args.value, 10);\n }\n if (args.key === \"autoUpdate\") {\n const raw = String(args.value).toLowerCase();\n if (raw === \"true\") parsedValue = true;\n else if (raw === \"false\") parsedValue = false;\n else if (raw === \"notify\") parsedValue = \"notify\";\n else {\n error(\"INVALID_VALUE\", \"autoUpdate must be one of: true, false, notify\");\n }\n }\n\n const userConfig = await loadUserConfig();\n setNestedValue(userConfig as unknown as Record<string, unknown>, args.key, parsedValue);\n await saveUserConfig(userConfig);\n clearConfigCache();\n\n success({ [args.key]: parsedValue });\n\n if (!isJsonMode()) {\n successMessage(`Set ${args.key} = ${parsedValue}`);\n }\n break;\n }\n\n case \"list\": {\n const config = await getConfig();\n const userConfig = await loadUserConfig();\n\n success({\n ...config,\n userConfig,\n });\n\n if (!isJsonMode()) {\n console.log(\"Configuration:\");\n console.log(` issuer: ${config.issuer}`);\n console.log(` walletDir: ${config.walletDir}`);\n console.log(` defaultWallet: ${config.defaultWallet || \"(not set)\"}`);\n console.log(` autoUpdate: ${config.autoUpdate}`);\n console.log(` passwordMinLength: ${config.passwordMinLength}`);\n console.log(` tokenCacheDir: ${config.tokenCacheDir}`);\n console.log(` requestTimeout: ${config.requestTimeout}`);\n console.log(` spacetime.host: ${config.spacetime.host}`);\n console.log(` spacetime.module: ${config.spacetime.module}`);\n\n if (Object.keys(userConfig).length > 0) {\n console.log(\"\\nUser overrides:\");\n for (const [key, value] of Object.entries(userConfig)) {\n console.log(` ${key}: ${JSON.stringify(value)}`);\n }\n }\n }\n break;\n }\n\n default:\n error(\"INVALID_ACTION\", `Invalid action: ${action}`, \"Use: get, set, list\");\n }\n } catch (err) {\n error(\"CONFIG_ERROR\", err instanceof Error ? err.message : \"Configuration error\");\n }\n },\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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\n// The tagged union or sum type for the algebraic type `ActionEventType`.\nexport const ActionEventType = __t.enum(\"ActionEventType\", {\n Issued: __t.unit(),\n Completed: __t.unit(),\n Skipped: __t.unit(),\n Failed: __t.unit(),\n Expired: __t.unit(),\n});\nexport type ActionEventType = __Infer<typeof ActionEventType>;\n\n// The tagged union or sum type for the algebraic type `ActionKind`.\nexport const ActionKind = __t.enum(\"ActionKind\", {\n Repair: __t.unit(),\n Inbox: __t.unit(),\n Vote: __t.unit(),\n Propose: __t.unit(),\n ContinueTask: __t.unit(),\n ClaimTask: __t.unit(),\n ProjectSetup: __t.unit(),\n CreateTasks: __t.unit(),\n ValidateReviews: __t.unit(),\n ReviewDiscovery: __t.unit(),\n Idle: __t.unit(),\n});\nexport type ActionKind = __Infer<typeof ActionKind>;\n\n// The tagged union or sum type for the algebraic type `ActionStatus`.\nexport const ActionStatus = __t.enum(\"ActionStatus\", {\n Issued: __t.unit(),\n Completed: __t.unit(),\n Skipped: __t.unit(),\n Failed: __t.unit(),\n Expired: __t.unit(),\n});\nexport type ActionStatus = __Infer<typeof ActionStatus>;\n\nexport const Agent = __t.object(\"Agent\", {\n id: __t.string(),\n name: __t.string(),\n bio: __t.string(),\n get role() {\n return AgentRole;\n },\n capabilities: __t.array(__t.string()),\n get status() {\n return AgentStatus;\n },\n zenonAddress: __t.string(),\n identity: __t.identity(),\n lastHeartbeat: __t.timestamp(),\n currentTaskId: __t.option(__t.u64()),\n createdAt: __t.timestamp(),\n lastActiveAt: __t.timestamp(),\n});\nexport type Agent = __Infer<typeof Agent>;\n\nexport const AgentAction = __t.object(\"AgentAction\", {\n id: __t.u64(),\n agentId: __t.string(),\n get kind() {\n return ActionKind;\n },\n targetType: __t.option(__t.string()),\n targetId: __t.option(__t.string()),\n reasonCode: __t.string(),\n get status() {\n return ActionStatus;\n },\n createdAt: __t.timestamp(),\n updatedAt: __t.timestamp(),\n});\nexport type AgentAction = __Infer<typeof AgentAction>;\n\nexport const AgentActionEvent = __t.object(\"AgentActionEvent\", {\n id: __t.u64(),\n actionId: __t.u64(),\n agentId: __t.string(),\n get eventType() {\n return ActionEventType;\n },\n eventCode: __t.option(__t.string()),\n note: __t.option(__t.string()),\n createdAt: __t.timestamp(),\n});\nexport type AgentActionEvent = __Infer<typeof AgentActionEvent>;\n\n// The tagged union or sum type for the algebraic type `AgentRole`.\nexport const AgentRole = __t.enum(\"AgentRole\", {\n Zoe: __t.unit(),\n Admin: __t.unit(),\n Zeno: __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 Online: __t.unit(),\n Offline: __t.unit(),\n Working: __t.unit(),\n});\nexport type AgentStatus = __Infer<typeof AgentStatus>;\n\nexport const AgentVoiceCounter = __t.object(\"AgentVoiceCounter\", {\n agentId: __t.identity(),\n nextSeq: __t.u64(),\n});\nexport type AgentVoiceCounter = __Infer<typeof AgentVoiceCounter>;\n\n// The tagged union or sum type for the algebraic type `AnnouncementStatus`.\nexport const AnnouncementStatus = __t.enum(\"AnnouncementStatus\", {\n Pending: __t.unit(),\n Ready: __t.unit(),\n Failed: __t.unit(),\n});\nexport type AnnouncementStatus = __Infer<typeof AnnouncementStatus>;\n\nexport const Channel = __t.object(\"Channel\", {\n id: __t.u64(),\n name: __t.string(),\n createdBy: __t.string(),\n createdAt: __t.timestamp(),\n});\nexport type Channel = __Infer<typeof Channel>;\n\nexport const Config = __t.object(\"Config\", {\n key: __t.string(),\n value: __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 Blocks: __t.unit(),\n ParentChild: __t.unit(),\n});\nexport type DependencyType = __Infer<typeof DependencyType>;\n\nexport const DimensionScore = __t.object(\"DimensionScore\", {\n dimension: __t.string(),\n score: __t.u8(),\n});\nexport type DimensionScore = __Infer<typeof DimensionScore>;\n\nexport const DiscoveredTask = __t.object(\"DiscoveredTask\", {\n id: __t.u64(),\n discoveredBy: __t.string(),\n currentTaskId: __t.u64(),\n projectId: __t.u64(),\n title: __t.string(),\n description: __t.string(),\n priority: __t.u8(),\n taskType: __t.string(),\n severity: __t.string(),\n get status() {\n return DiscoveredTaskStatus;\n },\n createdTaskId: __t.option(__t.u64()),\n rejectionReason: __t.option(__t.string()),\n createdAt: __t.timestamp(),\n reviewedAt: __t.option(__t.timestamp()),\n reviewedBy: __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 PendingReview: __t.unit(),\n Approved: __t.unit(),\n Rejected: __t.unit(),\n EscalatedToIdea: __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 ApproveAsTask: __t.unit(),\n Reject: __t.unit(),\n EscalateToIdea: __t.unit(),\n});\nexport type DiscoveryDecision = __Infer<typeof DiscoveryDecision>;\n\nexport const EvaluationDimension = __t.object(\"EvaluationDimension\", {\n id: __t.u64(),\n name: __t.string(),\n label: __t.string(),\n weight: __t.f64(),\n minScore: __t.u8(),\n maxScore: __t.u8(),\n description: __t.string(),\n active: __t.bool(),\n sortOrder: __t.u16(),\n});\nexport type EvaluationDimension = __Infer<typeof EvaluationDimension>;\n\nexport const GenerateVoiceResult = __t.object(\"GenerateVoiceResult\", {\n id: __t.u64(),\n seq: __t.u64(),\n agentName: __t.string(),\n keyPrefix: __t.string(),\n});\nexport type GenerateVoiceResult = __Infer<typeof GenerateVoiceResult>;\n\nexport const Idea = __t.object(\"Idea\", {\n id: __t.u64(),\n title: __t.string(),\n description: __t.string(),\n category: __t.string(),\n get status() {\n return IdeaStatus;\n },\n activeAgentCount: __t.u32(),\n quorum: __t.u16(),\n approvalThreshold: __t.u16(),\n vetoThreshold: __t.u16(),\n upVotes: __t.u16(),\n downVotes: __t.u16(),\n vetoCount: __t.u16(),\n totalVotes: __t.u16(),\n createdBy: __t.string(),\n createdAt: __t.timestamp(),\n updatedAt: __t.timestamp(),\n computedScore: __t.f64(),\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 Voting: __t.unit(),\n ApprovedForProject: __t.unit(),\n Rejected: __t.unit(),\n Implemented: __t.unit(),\n});\nexport type IdeaStatus = __Infer<typeof IdeaStatus>;\n\nexport const IdentityRole = __t.object(\"IdentityRole\", {\n identity: __t.identity(),\n get role() {\n return AgentRole;\n },\n});\nexport type IdentityRole = __Infer<typeof IdentityRole>;\n\nexport const Message = __t.object(\"Message\", {\n id: __t.u64(),\n channelId: __t.u64(),\n senderId: __t.string(),\n content: __t.string(),\n get messageType() {\n return MessageType;\n },\n contextId: __t.option(__t.string()),\n createdAt: __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 User: __t.unit(),\n System: __t.unit(),\n Directive: __t.unit(),\n});\nexport type MessageType = __Infer<typeof MessageType>;\n\nexport const Project = __t.object(\"Project\", {\n id: __t.u64(),\n sourceIdeaId: __t.u64(),\n name: __t.string(),\n githubRepo: __t.string(),\n description: __t.string(),\n get status() {\n return ProjectStatus;\n },\n createdAt: __t.timestamp(),\n createdBy: __t.string(),\n});\nexport type Project = __Infer<typeof Project>;\n\nexport const ProjectChannel = __t.object(\"ProjectChannel\", {\n projectId: __t.u64(),\n createdAt: __t.timestamp(),\n});\nexport type ProjectChannel = __Infer<typeof ProjectChannel>;\n\nexport const ProjectMessage = __t.object(\"ProjectMessage\", {\n id: __t.u64(),\n projectId: __t.u64(),\n senderId: __t.string(),\n content: __t.string(),\n get messageType() {\n return MessageType;\n },\n contextId: __t.option(__t.string()),\n createdAt: __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 Active: __t.unit(),\n Paused: __t.unit(),\n});\nexport type ProjectStatus = __Infer<typeof ProjectStatus>;\n\nexport const Task = __t.object(\"Task\", {\n id: __t.u64(),\n projectId: __t.u64(),\n title: __t.string(),\n description: __t.string(),\n get status() {\n return TaskStatus;\n },\n assignedTo: __t.option(__t.string()),\n claimedAt: __t.option(__t.timestamp()),\n githubIssueUrl: __t.option(__t.string()),\n githubPrUrl: __t.option(__t.string()),\n priority: __t.u8(),\n sourceIdeaId: __t.option(__t.u64()),\n reviewCount: __t.u8(),\n get blockedFromStatus() {\n return __t.option(TaskStatus);\n },\n archivedReason: __t.option(__t.string()),\n statusChangedBy: __t.option(__t.identity()),\n statusChangedAt: __t.option(__t.timestamp()),\n createdAt: __t.timestamp(),\n updatedAt: __t.timestamp(),\n createdBy: __t.string(),\n});\nexport type Task = __Infer<typeof Task>;\n\nexport const TaskDependency = __t.object(\"TaskDependency\", {\n id: __t.u64(),\n taskId: __t.u64(),\n dependsOnId: __t.u64(),\n get dependencyType() {\n return DependencyType;\n },\n createdAt: __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 Open: __t.unit(),\n Claimed: __t.unit(),\n InProgress: __t.unit(),\n Review: __t.unit(),\n Completed: __t.unit(),\n Blocked: __t.unit(),\n Archived: __t.unit(),\n});\nexport type TaskStatus = __Infer<typeof TaskStatus>;\n\nexport const VoiceAllowedHost = __t.object(\"VoiceAllowedHost\", {\n host: __t.string(),\n});\nexport type VoiceAllowedHost = __Infer<typeof VoiceAllowedHost>;\n\nexport const VoiceAnnouncement = __t.object(\"VoiceAnnouncement\", {\n id: __t.u64(),\n agentId: __t.identity(),\n seq: __t.u64(),\n agentName: __t.string(),\n transcript: __t.string(),\n audioUrl: __t.string(),\n get status() {\n return AnnouncementStatus;\n },\n contextType: __t.option(__t.string()),\n contextId: __t.option(__t.u64()),\n finalizedAt: __t.option(__t.timestamp()),\n failedAt: __t.option(__t.timestamp()),\n errorMessage: __t.option(__t.string()),\n createdAt: __t.timestamp(),\n});\nexport type VoiceAnnouncement = __Infer<typeof VoiceAnnouncement>;\n\nexport const Vote = __t.object(\"Vote\", {\n id: __t.u64(),\n ideaId: __t.u64(),\n agentId: __t.string(),\n get voteType() {\n return VoteType;\n },\n get scores() {\n return __t.array(DimensionScore);\n },\n createdAt: __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 Up: __t.unit(),\n Down: __t.unit(),\n Veto: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nimport { DependencyType } from \"./types\";\n\nexport default {\n taskId: __t.u64(),\n dependsOnId: __t.u64(),\n get dependencyType() {\n return DependencyType;\n },\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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nexport default {\n taskId: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nexport default {\n sourceIdeaId: __t.u64(),\n name: __t.string(),\n githubRepo: __t.string(),\n description: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nexport default {\n projectId: __t.u64(),\n title: __t.string(),\n description: __t.string(),\n priority: __t.u8(),\n sourceIdeaId: __t.option(__t.u64()),\n githubIssueUrl: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nexport default {\n currentTaskId: __t.u64(),\n projectId: __t.u64(),\n title: __t.string(),\n description: __t.string(),\n priority: __t.u8(),\n taskType: __t.string(),\n severity: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nexport default {\n announcementId: __t.u64(),\n errorMessage: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nexport default {\n announcementId: __t.u64(),\n audioUrl: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nexport default {\n agentId: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nimport { ActionKind } from \"./types\";\n\nexport default {\n agentId: __t.string(),\n get kind() {\n return ActionKind;\n },\n targetType: __t.option(__t.string()),\n targetId: __t.option(__t.string()),\n reasonCode: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nexport default {\n ideaId: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nexport default {\n title: __t.string(),\n description: __t.string(),\n category: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nimport { AgentRole } from \"./types\";\n\nexport default {\n agentId: __t.string(),\n name: __t.string(),\n zenonAddress: __t.string(),\n get role() {\n return __t.option(AgentRole);\n },\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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nimport { DiscoveryDecision } from \"./types\";\n\nexport default {\n discoveryId: __t.u64(),\n get decision() {\n return DiscoveryDecision;\n },\n reason: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nimport { MessageType } from \"./types\";\n\nexport default {\n channelId: __t.u64(),\n content: __t.string(),\n get messageType() {\n return MessageType;\n },\n contextId: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nimport { MessageType } from \"./types\";\n\nexport default {\n projectId: __t.u64(),\n content: __t.string(),\n get messageType() {\n return MessageType;\n },\n contextId: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nimport { AgentStatus } from \"./types\";\n\nexport default {\n get status() {\n return AgentStatus;\n },\n taskId: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nimport { ActionEventType } from \"./types\";\n\nexport default {\n actionId: __t.u64(),\n get eventType() {\n return ActionEventType;\n },\n eventCode: __t.option(__t.string()),\n note: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nexport default {\n bio: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nexport default {\n capabilities: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nimport { ProjectStatus } from \"./types\";\n\nexport default {\n projectId: __t.u64(),\n get status() {\n return ProjectStatus;\n },\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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nimport { TaskStatus } from \"./types\";\n\nexport default {\n taskId: __t.u64(),\n get status() {\n return TaskStatus;\n },\n githubPrUrl: __t.option(__t.string()),\n archiveReason: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nimport { DimensionScore } from \"./types\";\n\nexport default {\n ideaId: __t.u64(),\n get scores() {\n return __t.array(DimensionScore);\n },\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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nimport { GenerateVoiceResult } from \"./types\";\n\nexport const params = {\n transcript: __t.string(),\n audioUrl: __t.option(__t.string()),\n contextType: __t.option(__t.string()),\n};\nexport const returnType = __t.result(GenerateVoiceResult, __t.string());\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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\nimport { ActionEventType } from \"./types\";\n\nexport default __t.row({\n id: __t.u64().primaryKey(),\n actionId: __t.u64().name(\"action_id\"),\n agentId: __t.string().name(\"agent_id\"),\n get eventType() {\n return ActionEventType.name(\"event_type\");\n },\n eventCode: __t.option(__t.string()).name(\"event_code\"),\n note: __t.option(__t.string()),\n createdAt: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\nimport { ActionKind, ActionStatus } from \"./types\";\n\nexport default __t.row({\n id: __t.u64().primaryKey(),\n agentId: __t.string().name(\"agent_id\"),\n get kind() {\n return ActionKind;\n },\n targetType: __t.option(__t.string()).name(\"target_type\"),\n targetId: __t.option(__t.string()).name(\"target_id\"),\n reasonCode: __t.string().name(\"reason_code\"),\n get status() {\n return ActionStatus;\n },\n createdAt: __t.timestamp().name(\"created_at\"),\n updatedAt: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\nimport { AgentRole, AgentStatus } from \"./types\";\n\nexport default __t.row({\n id: __t.string().primaryKey(),\n name: __t.string(),\n bio: __t.string(),\n get role() {\n return AgentRole;\n },\n capabilities: __t.array(__t.string()),\n get status() {\n return AgentStatus;\n },\n zenonAddress: __t.string().name(\"zenon_address\"),\n identity: __t.identity(),\n lastHeartbeat: __t.timestamp().name(\"last_heartbeat\"),\n currentTaskId: __t.option(__t.u64()).name(\"current_task_id\"),\n createdAt: __t.timestamp().name(\"created_at\"),\n lastActiveAt: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nexport default __t.row({\n id: __t.u64().primaryKey(),\n name: __t.string(),\n createdBy: __t.string().name(\"created_by\"),\n createdAt: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nexport default __t.row({\n key: __t.string().primaryKey(),\n value: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\nimport { DiscoveredTaskStatus } from \"./types\";\n\nexport default __t.row({\n id: __t.u64().primaryKey(),\n discoveredBy: __t.string().name(\"discovered_by\"),\n currentTaskId: __t.u64().name(\"current_task_id\"),\n projectId: __t.u64().name(\"project_id\"),\n title: __t.string(),\n description: __t.string(),\n priority: __t.u8(),\n taskType: __t.string().name(\"task_type\"),\n severity: __t.string(),\n get status() {\n return DiscoveredTaskStatus;\n },\n createdTaskId: __t.option(__t.u64()).name(\"created_task_id\"),\n rejectionReason: __t.option(__t.string()).name(\"rejection_reason\"),\n createdAt: __t.timestamp().name(\"created_at\"),\n reviewedAt: __t.option(__t.timestamp()).name(\"reviewed_at\"),\n reviewedBy: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nexport default __t.row({\n id: __t.u64().primaryKey(),\n name: __t.string(),\n label: __t.string(),\n weight: __t.f64(),\n minScore: __t.u8().name(\"min_score\"),\n maxScore: __t.u8().name(\"max_score\"),\n description: __t.string(),\n active: __t.bool(),\n sortOrder: __t.u16().name(\"sort_order\"),\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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\nimport { IdeaStatus } from \"./types\";\n\nexport default __t.row({\n id: __t.u64().primaryKey(),\n title: __t.string(),\n description: __t.string(),\n category: __t.string(),\n get status() {\n return IdeaStatus;\n },\n activeAgentCount: __t.u32().name(\"active_agent_count\"),\n quorum: __t.u16(),\n approvalThreshold: __t.u16().name(\"approval_threshold\"),\n vetoThreshold: __t.u16().name(\"veto_threshold\"),\n upVotes: __t.u16().name(\"up_votes\"),\n downVotes: __t.u16().name(\"down_votes\"),\n vetoCount: __t.u16().name(\"veto_count\"),\n totalVotes: __t.u16().name(\"total_votes\"),\n createdBy: __t.string().name(\"created_by\"),\n createdAt: __t.timestamp().name(\"created_at\"),\n updatedAt: __t.timestamp().name(\"updated_at\"),\n computedScore: __t.f64().name(\"computed_score\"),\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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\nimport { AgentRole } from \"./types\";\n\nexport default __t.row({\n identity: __t.identity().primaryKey(),\n get role() {\n return AgentRole;\n },\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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\nimport { MessageType } from \"./types\";\n\nexport default __t.row({\n id: __t.u64().primaryKey(),\n channelId: __t.u64().name(\"channel_id\"),\n senderId: __t.string().name(\"sender_id\"),\n content: __t.string(),\n get messageType() {\n return MessageType.name(\"message_type\");\n },\n contextId: __t.option(__t.string()).name(\"context_id\"),\n createdAt: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\n\nexport default __t.row({\n projectId: __t.u64().primaryKey().name(\"project_id\"),\n createdAt: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\nimport { MessageType } from \"./types\";\n\nexport default __t.row({\n id: __t.u64().primaryKey(),\n projectId: __t.u64().name(\"project_id\"),\n senderId: __t.string().name(\"sender_id\"),\n content: __t.string(),\n get messageType() {\n return MessageType.name(\"message_type\");\n },\n contextId: __t.option(__t.string()).name(\"context_id\"),\n createdAt: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\nimport { ProjectStatus } from \"./types\";\n\nexport default __t.row({\n id: __t.u64().primaryKey(),\n sourceIdeaId: __t.u64().name(\"source_idea_id\"),\n name: __t.string(),\n githubRepo: __t.string().name(\"github_repo\"),\n description: __t.string(),\n get status() {\n return ProjectStatus;\n },\n createdAt: __t.timestamp().name(\"created_at\"),\n createdBy: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\nimport { DependencyType } from \"./types\";\n\nexport default __t.row({\n id: __t.u64().primaryKey(),\n taskId: __t.u64().name(\"task_id\"),\n dependsOnId: __t.u64().name(\"depends_on_id\"),\n get dependencyType() {\n return DependencyType.name(\"dependency_type\");\n },\n createdAt: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\nimport { TaskStatus } from \"./types\";\n\nexport default __t.row({\n id: __t.u64().primaryKey(),\n projectId: __t.u64().name(\"project_id\"),\n title: __t.string(),\n description: __t.string(),\n get status() {\n return TaskStatus;\n },\n assignedTo: __t.option(__t.string()).name(\"assigned_to\"),\n claimedAt: __t.option(__t.timestamp()).name(\"claimed_at\"),\n githubIssueUrl: __t.option(__t.string()).name(\"github_issue_url\"),\n githubPrUrl: __t.option(__t.string()).name(\"github_pr_url\"),\n priority: __t.u8(),\n sourceIdeaId: __t.option(__t.u64()).name(\"source_idea_id\"),\n reviewCount: __t.u8().name(\"review_count\"),\n get blockedFromStatus() {\n return __t.option(TaskStatus).name(\"blocked_from_status\");\n },\n archivedReason: __t.option(__t.string()).name(\"archived_reason\"),\n statusChangedBy: __t.option(__t.identity()).name(\"status_changed_by\"),\n statusChangedAt: __t.option(__t.timestamp()).name(\"status_changed_at\"),\n createdAt: __t.timestamp().name(\"created_at\"),\n updatedAt: __t.timestamp().name(\"updated_at\"),\n createdBy: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\nimport { AnnouncementStatus } from \"./types\";\n\nexport default __t.row({\n id: __t.u64().primaryKey(),\n agentId: __t.identity().name(\"agent_id\"),\n seq: __t.u64(),\n agentName: __t.string().name(\"agent_name\"),\n transcript: __t.string(),\n audioUrl: __t.string().name(\"audio_url\"),\n get status() {\n return AnnouncementStatus;\n },\n contextType: __t.option(__t.string()).name(\"context_type\"),\n contextId: __t.option(__t.u64()).name(\"context_id\"),\n finalizedAt: __t.option(__t.timestamp()).name(\"finalized_at\"),\n failedAt: __t.option(__t.timestamp()).name(\"failed_at\"),\n errorMessage: __t.option(__t.string()).name(\"error_message\"),\n createdAt: __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 TypeBuilder as __TypeBuilder,\n t as __t,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type Infer as __Infer,\n} from \"spacetimedb\";\nimport { DimensionScore, VoteType } from \"./types\";\n\nexport default __t.row({\n id: __t.u64().primaryKey(),\n ideaId: __t.u64().name(\"idea_id\"),\n agentId: __t.string().name(\"agent_id\"),\n get voteType() {\n return VoteType.name(\"vote_type\");\n },\n get scores() {\n return __t.array(DimensionScore);\n },\n createdAt: __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.2.0 (commit eb11e2f5c41dce6979715ad407996270d61329f6).\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n DbConnectionBuilder as __DbConnectionBuilder,\n DbConnectionImpl as __DbConnectionImpl,\n SubscriptionBuilderImpl as __SubscriptionBuilderImpl,\n TypeBuilder as __TypeBuilder,\n Uuid as __Uuid,\n convertToAccessorMap as __convertToAccessorMap,\n makeQueryBuilder as __makeQueryBuilder,\n procedureSchema as __procedureSchema,\n procedures as __procedures,\n reducerSchema as __reducerSchema,\n reducers as __reducers,\n schema as __schema,\n t as __t,\n table as __table,\n type AlgebraicTypeType as __AlgebraicTypeType,\n type DbConnectionConfig as __DbConnectionConfig,\n type ErrorContextInterface as __ErrorContextInterface,\n type Event as __Event,\n type EventContextInterface as __EventContextInterface,\n type Infer as __Infer,\n type QueryBuilder as __QueryBuilder,\n type ReducerEventContextInterface as __ReducerEventContextInterface,\n type RemoteModule as __RemoteModule,\n type SubscriptionEventContextInterface as __SubscriptionEventContextInterface,\n type SubscriptionHandleImpl as __SubscriptionHandleImpl,\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 FailVoiceAnnouncementReducer from \"./fail_voice_announcement_reducer\";\nimport FinalizeVoiceAnnouncementReducer from \"./finalize_voice_announcement_reducer\";\nimport HeartbeatReducer from \"./heartbeat_reducer\";\nimport IssueAgentActionReducer from \"./issue_agent_action_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 SeedVoiceAnnouncementsReducer from \"./seed_voice_announcements_reducer\";\nimport SendMessageReducer from \"./send_message_reducer\";\nimport SendProjectMessageReducer from \"./send_project_message_reducer\";\nimport SetAgentStatusReducer from \"./set_agent_status_reducer\";\nimport UpdateAgentActionReducer from \"./update_agent_action_reducer\";\nimport UpdateAgentBioReducer from \"./update_agent_bio_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\nimport * as GenerateVoiceProcedure from \"./generate_voice_procedure\";\n\n// Import all table schema definitions\nimport AgentActionEventsRow from \"./agent_action_events_table\";\nimport AgentActionsRow from \"./agent_actions_table\";\nimport AgentsRow from \"./agents_table\";\nimport ChannelsRow from \"./channels_table\";\nimport ConfigRow from \"./config_table\";\nimport DiscoveredTasksRow from \"./discovered_tasks_table\";\nimport EvaluationDimensionsRow from \"./evaluation_dimensions_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 VoiceAnnouncementsRow from \"./voice_announcements_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 agent_action_events: __table(\n {\n name: \"agent_action_events\",\n indexes: [\n {\n accessor: \"by_action\",\n name: \"agent_action_events_action_id_created_at_idx_btree\",\n algorithm: \"btree\",\n columns: [\"actionId\", \"createdAt\"],\n },\n {\n accessor: \"id\",\n name: \"agent_action_events_id_idx_btree\",\n algorithm: \"btree\",\n columns: [\"id\"],\n },\n ],\n constraints: [{ name: \"agent_action_events_id_key\", constraint: \"unique\", columns: [\"id\"] }],\n event: true,\n },\n AgentActionEventsRow,\n ),\n agent_actions: __table(\n {\n name: \"agent_actions\",\n indexes: [\n {\n accessor: \"by_agent_created\",\n name: \"agent_actions_agent_id_created_at_idx_btree\",\n algorithm: \"btree\",\n columns: [\"agentId\", \"createdAt\"],\n },\n {\n accessor: \"by_agent_id\",\n name: \"agent_actions_agent_id_idx_btree\",\n algorithm: \"btree\",\n columns: [\"agentId\"],\n },\n { accessor: \"id\", name: \"agent_actions_id_idx_btree\", algorithm: \"btree\", columns: [\"id\"] },\n ],\n constraints: [{ name: \"agent_actions_id_key\", constraint: \"unique\", columns: [\"id\"] }],\n },\n AgentActionsRow,\n ),\n agents: __table(\n {\n name: \"agents\",\n indexes: [\n { accessor: \"id\", name: \"agents_id_idx_btree\", algorithm: \"btree\", columns: [\"id\"] },\n {\n accessor: \"identity\",\n name: \"agents_identity_idx_btree\",\n algorithm: \"btree\",\n columns: [\"identity\"],\n },\n ],\n constraints: [\n { name: \"agents_id_key\", constraint: \"unique\", columns: [\"id\"] },\n { name: \"agents_identity_key\", constraint: \"unique\", columns: [\"identity\"] },\n ],\n },\n AgentsRow,\n ),\n channels: __table(\n {\n name: \"channels\",\n indexes: [\n { accessor: \"id\", name: \"channels_id_idx_btree\", algorithm: \"btree\", columns: [\"id\"] },\n {\n accessor: \"by_name\",\n name: \"channels_name_idx_btree\",\n algorithm: \"btree\",\n columns: [\"name\"],\n },\n ],\n constraints: [{ name: \"channels_id_key\", constraint: \"unique\", columns: [\"id\"] }],\n },\n ChannelsRow,\n ),\n config: __table(\n {\n name: \"config\",\n indexes: [\n { accessor: \"key\", name: \"config_key_idx_btree\", algorithm: \"btree\", columns: [\"key\"] },\n ],\n constraints: [{ name: \"config_key_key\", constraint: \"unique\", columns: [\"key\"] }],\n },\n ConfigRow,\n ),\n discovered_tasks: __table(\n {\n name: \"discovered_tasks\",\n indexes: [\n {\n accessor: \"by_created_at\",\n name: \"discovered_tasks_created_at_idx_btree\",\n algorithm: \"btree\",\n columns: [\"createdAt\"],\n },\n {\n accessor: \"id\",\n name: \"discovered_tasks_id_idx_btree\",\n algorithm: \"btree\",\n columns: [\"id\"],\n },\n {\n accessor: \"by_priority\",\n name: \"discovered_tasks_priority_idx_btree\",\n algorithm: \"btree\",\n columns: [\"priority\"],\n },\n {\n accessor: \"by_status\",\n name: \"discovered_tasks_status_idx_btree\",\n algorithm: \"btree\",\n columns: [\"status\"],\n },\n ],\n constraints: [{ name: \"discovered_tasks_id_key\", constraint: \"unique\", columns: [\"id\"] }],\n },\n DiscoveredTasksRow,\n ),\n evaluation_dimensions: __table(\n {\n name: \"evaluation_dimensions\",\n indexes: [\n {\n accessor: \"by_active\",\n name: \"evaluation_dimensions_active_sort_order_idx_btree\",\n algorithm: \"btree\",\n columns: [\"active\", \"sortOrder\"],\n },\n {\n accessor: \"id\",\n name: \"evaluation_dimensions_id_idx_btree\",\n algorithm: \"btree\",\n columns: [\"id\"],\n },\n ],\n constraints: [\n { name: \"evaluation_dimensions_id_key\", constraint: \"unique\", columns: [\"id\"] },\n ],\n },\n EvaluationDimensionsRow,\n ),\n ideas: __table(\n {\n name: \"ideas\",\n indexes: [\n { accessor: \"id\", name: \"ideas_id_idx_btree\", algorithm: \"btree\", columns: [\"id\"] },\n {\n accessor: \"by_status\",\n name: \"ideas_status_idx_btree\",\n algorithm: \"btree\",\n columns: [\"status\"],\n },\n ],\n constraints: [{ name: \"ideas_id_key\", constraint: \"unique\", columns: [\"id\"] }],\n },\n IdeasRow,\n ),\n identity_roles: __table(\n {\n name: \"identity_roles\",\n indexes: [\n {\n accessor: \"identity\",\n name: \"identity_roles_identity_idx_btree\",\n algorithm: \"btree\",\n columns: [\"identity\"],\n },\n ],\n constraints: [\n { name: \"identity_roles_identity_key\", constraint: \"unique\", columns: [\"identity\"] },\n ],\n },\n IdentityRolesRow,\n ),\n messages: __table(\n {\n name: \"messages\",\n indexes: [\n {\n accessor: \"by_channel\",\n name: \"messages_channel_id_created_at_idx_btree\",\n algorithm: \"btree\",\n columns: [\"channelId\", \"createdAt\"],\n },\n { accessor: \"id\", name: \"messages_id_idx_btree\", algorithm: \"btree\", columns: [\"id\"] },\n ],\n constraints: [{ name: \"messages_id_key\", constraint: \"unique\", columns: [\"id\"] }],\n },\n MessagesRow,\n ),\n project_channels: __table(\n {\n name: \"project_channels\",\n indexes: [\n {\n accessor: \"project_id\",\n name: \"project_channels_project_id_idx_btree\",\n algorithm: \"btree\",\n columns: [\"projectId\"],\n },\n ],\n constraints: [\n { name: \"project_channels_project_id_key\", constraint: \"unique\", columns: [\"projectId\"] },\n ],\n },\n ProjectChannelsRow,\n ),\n project_messages: __table(\n {\n name: \"project_messages\",\n indexes: [\n {\n accessor: \"id\",\n name: \"project_messages_id_idx_btree\",\n algorithm: \"btree\",\n columns: [\"id\"],\n },\n {\n accessor: \"by_project\",\n name: \"project_messages_project_id_idx_btree\",\n algorithm: \"btree\",\n columns: [\"projectId\"],\n },\n ],\n constraints: [{ name: \"project_messages_id_key\", constraint: \"unique\", columns: [\"id\"] }],\n },\n ProjectMessagesRow,\n ),\n projects: __table(\n {\n name: \"projects\",\n indexes: [\n { accessor: \"id\", name: \"projects_id_idx_btree\", algorithm: \"btree\", columns: [\"id\"] },\n {\n accessor: \"by_source_idea_id\",\n name: \"projects_source_idea_id_idx_btree\",\n algorithm: \"btree\",\n columns: [\"sourceIdeaId\"],\n },\n ],\n constraints: [{ name: \"projects_id_key\", constraint: \"unique\", columns: [\"id\"] }],\n },\n ProjectsRow,\n ),\n task_dependencies: __table(\n {\n name: \"task_dependencies\",\n indexes: [\n {\n accessor: \"by_depends_on_id\",\n name: \"task_dependencies_depends_on_id_idx_btree\",\n algorithm: \"btree\",\n columns: [\"dependsOnId\"],\n },\n {\n accessor: \"id\",\n name: \"task_dependencies_id_idx_btree\",\n algorithm: \"btree\",\n columns: [\"id\"],\n },\n {\n accessor: \"by_task_id\",\n name: \"task_dependencies_task_id_idx_btree\",\n algorithm: \"btree\",\n columns: [\"taskId\"],\n },\n ],\n constraints: [{ name: \"task_dependencies_id_key\", constraint: \"unique\", columns: [\"id\"] }],\n },\n TaskDependenciesRow,\n ),\n tasks: __table(\n {\n name: \"tasks\",\n indexes: [\n {\n accessor: \"by_assigned_to\",\n name: \"tasks_assigned_to_idx_btree\",\n algorithm: \"btree\",\n columns: [\"assignedTo\"],\n },\n { accessor: \"id\", name: \"tasks_id_idx_btree\", algorithm: \"btree\", columns: [\"id\"] },\n {\n accessor: \"by_priority\",\n name: \"tasks_priority_idx_btree\",\n algorithm: \"btree\",\n columns: [\"priority\"],\n },\n {\n accessor: \"by_project_id\",\n name: \"tasks_project_id_idx_btree\",\n algorithm: \"btree\",\n columns: [\"projectId\"],\n },\n {\n accessor: \"by_status\",\n name: \"tasks_status_idx_btree\",\n algorithm: \"btree\",\n columns: [\"status\"],\n },\n ],\n constraints: [{ name: \"tasks_id_key\", constraint: \"unique\", columns: [\"id\"] }],\n },\n TasksRow,\n ),\n voice_announcements: __table(\n {\n name: \"voice_announcements\",\n indexes: [\n {\n accessor: \"by_agent\",\n name: \"voice_announcements_agent_id_created_at_idx_btree\",\n algorithm: \"btree\",\n columns: [\"agentId\", \"createdAt\"],\n },\n {\n accessor: \"id\",\n name: \"voice_announcements_id_idx_btree\",\n algorithm: \"btree\",\n columns: [\"id\"],\n },\n {\n accessor: \"by_status\",\n name: \"voice_announcements_status_created_at_idx_btree\",\n algorithm: \"btree\",\n columns: [\"status\", \"createdAt\"],\n },\n ],\n constraints: [{ name: \"voice_announcements_id_key\", constraint: \"unique\", columns: [\"id\"] }],\n },\n VoiceAnnouncementsRow,\n ),\n votes: __table(\n {\n name: \"votes\",\n indexes: [\n { accessor: \"id\", name: \"votes_id_idx_btree\", algorithm: \"btree\", columns: [\"id\"] },\n {\n accessor: \"by_idea_agent\",\n name: \"votes_idea_id_agent_id_idx_btree\",\n algorithm: \"btree\",\n columns: [\"ideaId\", \"agentId\"],\n },\n {\n accessor: \"by_idea\",\n name: \"votes_idea_id_idx_btree\",\n algorithm: \"btree\",\n columns: [\"ideaId\"],\n },\n ],\n constraints: [{ name: \"votes_id_key\", constraint: \"unique\", columns: [\"id\"] }],\n },\n VotesRow,\n ),\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 __reducerSchema(\"add_task_dependency\", AddTaskDependencyReducer),\n __reducerSchema(\"claim_task\", ClaimTaskReducer),\n __reducerSchema(\"create_project\", CreateProjectReducer),\n __reducerSchema(\"create_task\", CreateTaskReducer),\n __reducerSchema(\"discover_task\", DiscoverTaskReducer),\n __reducerSchema(\"fail_voice_announcement\", FailVoiceAnnouncementReducer),\n __reducerSchema(\"finalize_voice_announcement\", FinalizeVoiceAnnouncementReducer),\n __reducerSchema(\"heartbeat\", HeartbeatReducer),\n __reducerSchema(\"issue_agent_action\", IssueAgentActionReducer),\n __reducerSchema(\"mark_idea_implemented\", MarkIdeaImplementedReducer),\n __reducerSchema(\"propose_idea\", ProposeIdeaReducer),\n __reducerSchema(\"register_agent\", RegisterAgentReducer),\n __reducerSchema(\"review_discovered_task\", ReviewDiscoveredTaskReducer),\n __reducerSchema(\"seed_ui_data\", SeedUiDataReducer),\n __reducerSchema(\"seed_voice_announcements\", SeedVoiceAnnouncementsReducer),\n __reducerSchema(\"send_message\", SendMessageReducer),\n __reducerSchema(\"send_project_message\", SendProjectMessageReducer),\n __reducerSchema(\"set_agent_status\", SetAgentStatusReducer),\n __reducerSchema(\"update_agent_action\", UpdateAgentActionReducer),\n __reducerSchema(\"update_agent_bio\", UpdateAgentBioReducer),\n __reducerSchema(\"update_agent_capabilities\", UpdateAgentCapabilitiesReducer),\n __reducerSchema(\"update_project_status\", UpdateProjectStatusReducer),\n __reducerSchema(\"update_task_status\", UpdateTaskStatusReducer),\n __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 __procedureSchema(\n \"generate_voice\",\n GenerateVoiceProcedure.params,\n GenerateVoiceProcedure.returnType,\n ),\n);\n\n/** The remote SpacetimeDB module schema, both runtime and type information. */\nconst REMOTE_MODULE = {\n versionInfo: {\n cliVersion: \"2.2.0\" as const,\n },\n tables: tablesSchema.schemaType.tables,\n reducers: reducersSchema.reducersType.reducers,\n ...proceduresSchema,\n} satisfies __RemoteModule<\n typeof tablesSchema.schemaType,\n typeof reducersSchema.reducersType,\n typeof 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> = __makeQueryBuilder(\n tablesSchema.schemaType,\n);\n\n/** The reducers available in this remote SpacetimeDB module. */\nexport const reducers = __convertToAccessorMap(reducersSchema.reducersType.reducers);\n\n/** The procedures available in this remote SpacetimeDB module. */\nexport const procedures = __convertToAccessorMap(proceduresSchema.procedures);\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<typeof REMOTE_MODULE>;\n/** The context type returned in callbacks for subscription events. */\nexport type SubscriptionEventContext = __SubscriptionEventContextInterface<typeof REMOTE_MODULE>;\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<typeof REMOTE_MODULE> {}\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 /** Creates a new {@link DbConnectionBuilder} to configure and connect to the remote SpacetimeDB instance. */\n static builder = (): DbConnectionBuilder => {\n return new DbConnectionBuilder(\n REMOTE_MODULE,\n (config: __DbConnectionConfig<typeof REMOTE_MODULE>) => new DbConnection(config),\n );\n };\n\n /** Creates a new {@link SubscriptionBuilder} to configure a subscription to the remote SpacetimeDB instance. */\n override subscriptionBuilder = (): SubscriptionBuilder => {\n return new SubscriptionBuilder(this);\n };\n}\n","import type { Identity } from \"spacetimedb\";\nimport { DbConnection, type ErrorContext, type tables } from \"~/module_bindings/index.js\";\n\nexport type {\n Agent,\n Channel,\n Config,\n DiscoveredTask,\n EvaluationDimension,\n Idea,\n IdentityRole,\n Message,\n Project,\n ProjectChannel,\n ProjectMessage,\n Task,\n TaskDependency,\n Vote,\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 host?: string;\n module?: string;\n wallet?: string;\n token?: string;\n subscribe?: boolean;\n onDisconnect?: (...args: unknown[]) => void;\n}\n\nexport interface AuthInfo {\n wallet: string;\n token: string;\n identity: Identity;\n}\n\nexport class CommandContext implements AsyncDisposable {\n readonly conn: DbConnection;\n readonly identity?: Identity;\n readonly token?: string;\n readonly auth?: AuthInfo;\n readonly config: Awaited<ReturnType<typeof getConfig>>;\n\n private disposed = false;\n\n private constructor(\n conn: DbConnection,\n config: Awaited<ReturnType<typeof getConfig>>,\n identity?: Identity,\n token?: string,\n auth?: AuthInfo,\n ) {\n this.conn = conn;\n this.config = config;\n this.identity = identity;\n this.token = token;\n this.auth = auth;\n }\n\n get db() {\n return this.conn.db;\n }\n\n iter<T>(tableName: TableName): T[] {\n const db = this.db as Record<string, { iter?: () => IterableIterator<T> }>;\n const table = db[tableName];\n if (table?.iter) {\n return Array.from(table.iter());\n }\n return [];\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n if (!this.disposed) {\n this.disposed = true;\n this.conn.disconnect();\n }\n }\n\n static async create(options: CommandContextOptions = {}): Promise<CommandContext> {\n const config = await getConfig();\n const host = options.host || config.spacetime.host;\n const moduleName = options.module || config.spacetime.module;\n const walletName = options.wallet || config.defaultWallet;\n\n let token = options.token;\n let auth: AuthInfo | undefined;\n\n if (!token && walletName) {\n const cached = await getCachedToken(walletName);\n if (cached) {\n token = cached.token;\n auth = {\n wallet: walletName,\n token: cached.token,\n identity: undefined as unknown as Identity,\n };\n }\n }\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error(\"Connection timeout\"));\n }, config.requestTimeout);\n\n const originalConsoleLog = console.log;\n const originalConsoleError = console.error;\n const suppressSdkConnectLog = (...logArgs: unknown[]): void => {\n const shouldSuppress = logArgs.some(\n (arg) => typeof arg === \"string\" && arg.includes(\"Connecting to SpacetimeDB WS...\"),\n );\n if (!shouldSuppress) {\n originalConsoleLog(...(logArgs as Parameters<typeof console.log>));\n }\n };\n // Suppress SDK error spam during connection - errors are properly thrown and handled by callers\n const suppressSdkError = (..._logArgs: unknown[]): void => {\n // Errors are handled by onConnectError and rejected properly\n if (process.env.PROBE_DEBUG) {\n originalConsoleError(\"[probe:debug]\", ..._logArgs);\n }\n };\n\n console.log = suppressSdkConnectLog as typeof console.log;\n console.error = suppressSdkError as typeof console.error;\n\n try {\n DbConnection.builder()\n .withUri(host)\n .withDatabaseName(moduleName)\n .withToken(token || undefined)\n .onConnect((conn: DbConnection, identity: Identity, authToken: string) => {\n clearTimeout(timeout);\n\n if (auth) {\n auth.identity = identity;\n }\n\n const shouldSubscribe = options.subscribe !== false;\n\n if (shouldSubscribe) {\n conn\n .subscriptionBuilder()\n .onApplied(() => {\n resolve(new CommandContext(conn, config, identity, authToken, auth));\n })\n .onError((ctx: ErrorContext) => {\n reject(new Error(`Subscription error: ${ctx.event?.message || \"Unknown error\"}`));\n })\n .subscribe([\n \"SELECT * FROM agents\",\n \"SELECT * FROM agent_actions\",\n \"SELECT * FROM tasks\",\n \"SELECT * FROM ideas\",\n \"SELECT * FROM messages\",\n \"SELECT * FROM channels\",\n \"SELECT * FROM projects\",\n \"SELECT * FROM votes\",\n \"SELECT * FROM evaluation_dimensions\",\n \"SELECT * FROM discovered_tasks\",\n \"SELECT * FROM task_dependencies\",\n \"SELECT * FROM identity_roles\",\n \"SELECT * FROM config\",\n \"SELECT * FROM project_channels\",\n \"SELECT * FROM project_messages\",\n ]);\n } else {\n resolve(new CommandContext(conn, config, identity, authToken, auth));\n }\n })\n .onDisconnect((...disconnectArgs: unknown[]) => {\n options.onDisconnect?.(...disconnectArgs);\n })\n .onConnectError((_ctx: ErrorContext, err: Error) => {\n clearTimeout(timeout);\n const message = err.message.toLowerCase();\n if (message.includes(\"unauthorized\") || message.includes(\"401\")) {\n reject(new Error(\"Authentication required. Run `probe auth <wallet> --save` first.\"));\n } else {\n reject(new Error(`Connection failed: ${err.message}`));\n }\n })\n\n .build();\n } finally {\n console.log = originalConsoleLog;\n console.error = originalConsoleError;\n }\n });\n }\n}\n\nexport async function requireAuth(options: CommandContextOptions): Promise<CommandContext> {\n const config = await getConfig();\n const walletName = options.wallet || config.defaultWallet;\n\n if (!walletName) {\n error(\"WALLET_REQUIRED\", \"Wallet required. Use --wallet or set default wallet.\");\n }\n\n const wallet = await getWalletInfo(walletName);\n if (!wallet) {\n error(\"WALLET_NOT_FOUND\", `Wallet not found: ${walletName}`);\n }\n\n const cached = await getCachedToken(walletName);\n if (!cached) {\n error(\"AUTH_REQUIRED\", \"No cached token. Run `probe auth <wallet> --save` first.\");\n }\n\n return CommandContext.create({\n ...options,\n wallet: walletName,\n token: cached.token,\n });\n}\n\nexport async function withContext<T>(\n options: CommandContextOptions,\n handler: (ctx: CommandContext) => Promise<T>,\n): Promise<T> {\n await using ctx = await CommandContext.create(options);\n return await handler(ctx);\n}\n\nexport async function withAuth<T>(\n options: CommandContextOptions,\n handler: (ctx: CommandContext) => Promise<T>,\n): Promise<T> {\n await using ctx = await requireAuth(options);\n return await handler(ctx);\n}\n\nexport async function callReducer(\n ctx: CommandContext,\n reducerName: string,\n args: Record<string, unknown>,\n): Promise<void> {\n const reducers = ctx.conn.reducers as unknown as Record<\n string,\n (args: Record<string, unknown>) => Promise<void>\n >;\n const accessorName = reducerName.replace(/_([a-z])/g, (_, c) => c.toUpperCase());\n const reducer = reducers[accessorName];\n if (typeof reducer !== \"function\") {\n throw new Error(`Reducer not found: ${reducerName}`);\n }\n\n const timeoutMs = Math.max(1000, ctx.config.requestTimeout);\n let timer: ReturnType<typeof setTimeout>;\n await Promise.race([\n reducer(args).finally(() => clearTimeout(timer)),\n new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(`Reducer timed out after ${timeoutMs}ms: ${reducerName}`)),\n timeoutMs,\n );\n }),\n ]);\n}\n\nexport async function callProcedure<T = unknown>(\n ctx: CommandContext,\n procedureName: string,\n args: Record<string, unknown>,\n): Promise<T> {\n const procedures = ctx.conn.procedures as unknown as Record<\n string,\n (args: Record<string, unknown>) => Promise<unknown>\n >;\n const accessorName = procedureName.replace(/_([a-z])/g, (_, c) => c.toUpperCase());\n const proc = procedures[accessorName];\n if (typeof proc !== \"function\") {\n throw new Error(`Procedure not found: ${procedureName}`);\n }\n return (await proc(args)) as T;\n}\n","import type {\n AgentRole as AgentRoleType,\n AgentStatus as AgentStatusType,\n IdeaStatus as IdeaStatusType,\n MessageType as MessageTypeType,\n ProjectStatus as ProjectStatusType,\n TaskStatus as TaskStatusType,\n} from \"~/module_bindings/types.js\";\n\nexport const TaskStatus = {\n values: [\"Open\", \"Claimed\", \"InProgress\", \"Review\", \"Completed\", \"Blocked\", \"Archived\"] as const,\n\n is: {\n open: (s: TaskStatusType) => s.tag === \"Open\",\n claimed: (s: TaskStatusType) => s.tag === \"Claimed\",\n inProgress: (s: TaskStatusType) => s.tag === \"InProgress\",\n review: (s: TaskStatusType) => s.tag === \"Review\",\n completed: (s: TaskStatusType) => s.tag === \"Completed\",\n blocked: (s: TaskStatusType) => s.tag === \"Blocked\",\n archived: (s: TaskStatusType) => s.tag === \"Archived\",\n active: (s: TaskStatusType) => [\"Open\", \"Claimed\", \"InProgress\", \"Review\"].includes(s.tag),\n terminal: (s: TaskStatusType) => [\"Completed\", \"Blocked\", \"Archived\"].includes(s.tag),\n },\n\n fromString(s: string): TaskStatusType {\n const map: Record<string, TaskStatusType> = {\n open: { tag: \"Open\" },\n claimed: { tag: \"Claimed\" },\n in_progress: { tag: \"InProgress\" },\n inprogress: { tag: \"InProgress\" },\n review: { tag: \"Review\" },\n completed: { tag: \"Completed\" },\n merged: { tag: \"Completed\" },\n blocked: { tag: \"Blocked\" },\n archived: { tag: \"Archived\" },\n };\n return map[s.toLowerCase().replace(/[_\\s]/g, \"\")] ?? { tag: \"Open\" };\n },\n\n matches(status: TaskStatusType, filter: string): boolean {\n const f = filter.toLowerCase().replace(/[_\\s]/g, \"\");\n if (f === \"merged\") return status.tag === \"Completed\";\n return status.tag.toLowerCase() === f;\n },\n\n display(status: TaskStatusType): string {\n const map: Record<string, string> = { InProgress: \"IN PROGRESS\" };\n return map[status.tag] ?? status.tag.toUpperCase();\n },\n} as const;\n\nexport const IdeaStatus = {\n values: [\"Voting\", \"ApprovedForProject\", \"Rejected\", \"Implemented\"] as const,\n\n is: {\n voting: (s: IdeaStatusType) => s.tag === \"Voting\",\n approved: (s: IdeaStatusType) => s.tag === \"ApprovedForProject\",\n rejected: (s: IdeaStatusType) => s.tag === \"Rejected\",\n implemented: (s: IdeaStatusType) => s.tag === \"Implemented\",\n active: (s: IdeaStatusType) => s.tag === \"Voting\",\n terminal: (s: IdeaStatusType) =>\n [\"ApprovedForProject\", \"Rejected\", \"Implemented\"].includes(s.tag),\n },\n\n fromString(s: string): IdeaStatusType {\n const map: Record<string, IdeaStatusType> = {\n voting: { tag: \"Voting\" },\n approved: { tag: \"ApprovedForProject\" },\n approved_for_project: { tag: \"ApprovedForProject\" },\n rejected: { tag: \"Rejected\" },\n implemented: { tag: \"Implemented\" },\n };\n return map[s.toLowerCase().replace(/[_\\s]/g, \"\")] ?? { tag: \"Voting\" };\n },\n\n matches(status: IdeaStatusType, filter: string): boolean {\n const f = filter.toLowerCase().replace(/[_\\s]/g, \"\");\n if (f === \"approved\") return status.tag === \"ApprovedForProject\";\n return status.tag.toLowerCase() === f;\n },\n\n display(status: IdeaStatusType): string {\n if (status.tag === \"ApprovedForProject\") return \"Approved\";\n return status.tag;\n },\n} as const;\n\nexport const AgentRole = {\n values: [\"Zoe\", \"Admin\", \"Zeno\"] as const,\n\n is: {\n zoe: (r: AgentRoleType) => r.tag === \"Zoe\",\n admin: (r: AgentRoleType) => r.tag === \"Admin\",\n zeno: (r: AgentRoleType) => r.tag === \"Zeno\",\n privileged: (r: AgentRoleType) => [\"Zoe\", \"Admin\"].includes(r.tag),\n },\n\n fromString(s: string): AgentRoleType {\n const map: Record<string, AgentRoleType> = {\n zoe: { tag: \"Zoe\" },\n admin: { tag: \"Admin\" },\n zeno: { tag: \"Zeno\" },\n };\n return map[s.toLowerCase()] ?? { tag: \"Zeno\" };\n },\n\n display(r: AgentRoleType): string {\n return r.tag.toLowerCase();\n },\n} as const;\n\nexport const AgentStatus = {\n values: [\"Online\", \"Offline\", \"Working\"] as const,\n\n is: {\n online: (s: AgentStatusType) => s.tag === \"Online\",\n offline: (s: AgentStatusType) => s.tag === \"Offline\",\n working: (s: AgentStatusType) => s.tag === \"Working\",\n available: (s: AgentStatusType) => s.tag === \"Online\" || s.tag === \"Working\",\n },\n\n fromString(s: string): AgentStatusType {\n const map: Record<string, AgentStatusType> = {\n online: { tag: \"Online\" },\n offline: { tag: \"Offline\" },\n working: { tag: \"Working\" },\n busy: { tag: \"Working\" },\n };\n return map[s.toLowerCase()] ?? { tag: \"Offline\" };\n },\n\n display(s: AgentStatusType): string {\n return s.tag;\n },\n} as const;\n\nexport const MessageType = {\n values: [\"User\", \"System\", \"Directive\"] as const,\n\n is: {\n user: (t: MessageTypeType) => t.tag === \"User\",\n system: (t: MessageTypeType) => t.tag === \"System\",\n directive: (t: MessageTypeType) => t.tag === \"Directive\",\n },\n\n fromString(s: string): MessageTypeType {\n const map: Record<string, MessageTypeType> = {\n user: { tag: \"User\" },\n text: { tag: \"User\" },\n system: { tag: \"System\" },\n directive: { tag: \"Directive\" },\n };\n return map[s.toLowerCase()] ?? { tag: \"User\" };\n },\n\n display(t: MessageTypeType): string {\n return t.tag.toLowerCase();\n },\n} as const;\n\nexport const ProjectStatus = {\n values: [\"Active\", \"Paused\"] as const,\n\n is: {\n active: (s: ProjectStatusType) => s.tag === \"Active\",\n paused: (s: ProjectStatusType) => s.tag === \"Paused\",\n },\n\n fromString(s: string): ProjectStatusType {\n const normalized = s.toLowerCase().replace(/[_\\s]/g, \"\");\n const map: Record<string, ProjectStatusType> = {\n active: { tag: \"Active\" },\n paused: { tag: \"Paused\" },\n };\n return map[normalized] ?? { tag: \"Active\" };\n },\n\n matches(status: ProjectStatusType, filter: string): boolean {\n const normalized = filter.toLowerCase().replace(/[_\\s]/g, \"\");\n return status.tag.toLowerCase() === normalized;\n },\n\n display(status: ProjectStatusType): string {\n return status.tag.toLowerCase();\n },\n} as const;\n","import { getConfig } from \"~/utils/config.js\";\nimport { CommandContext, type Agent } from \"~/utils/context.js\";\nimport { AgentRole } from \"~/utils/enums.js\";\nimport { getCachedToken } from \"~/utils/token-cache.js\";\nimport { getWalletInfo } from \"~/utils/wallet.js\";\n\nexport type HealthStatus = \"pass\" | \"warn\" | \"fail\" | \"manual_required\";\n\nexport interface HealthCheck {\n check: string;\n status: HealthStatus;\n detail: string;\n}\n\nexport interface HealthResult {\n ok: boolean;\n checks: HealthCheck[];\n counts: {\n pass: number;\n warn: number;\n fail: number;\n manual_required: number;\n };\n walletName?: string;\n walletAddress?: string;\n tokenValid?: boolean;\n tokenExpiresAt?: string;\n identity?: string;\n agent?: Agent | null;\n}\n\nexport async function runHealthChecks(options: {\n wallet?: string;\n host?: string;\n module?: string;\n includeAgent?: boolean;\n}): Promise<HealthResult> {\n const checks: HealthCheck[] = [];\n const addCheck = (check: string, status: HealthStatus, detail: string) => {\n checks.push({ check, status, detail });\n };\n\n let config: Awaited<ReturnType<typeof getConfig>> | null = null;\n try {\n config = await getConfig();\n addCheck(\"config\", \"pass\", \"Loaded Probe configuration\");\n } catch (err) {\n addCheck(\"config\", \"fail\", err instanceof Error ? err.message : \"Failed to load configuration\");\n }\n\n const walletName = options.wallet || config?.defaultWallet;\n if (!walletName) {\n addCheck(\"wallet.selected\", \"fail\", \"No wallet selected (set --wallet or defaultWallet)\");\n } else {\n addCheck(\"wallet.selected\", \"pass\", `Using wallet '${walletName}'`);\n }\n\n let hasWallet = false;\n let walletAddress: string | undefined;\n if (walletName) {\n const wallet = await getWalletInfo(walletName);\n if (wallet) {\n hasWallet = true;\n walletAddress = wallet.address;\n addCheck(\"wallet.exists\", \"pass\", `Address ${wallet.address}`);\n } else {\n addCheck(\"wallet.exists\", \"fail\", `Wallet '${walletName}' not found`);\n }\n }\n\n let token: string | null = null;\n let tokenValid = false;\n let tokenExpiresAt: string | undefined;\n if (walletName && hasWallet) {\n const cached = await getCachedToken(walletName);\n if (!cached) {\n addCheck(\"auth.token\", \"fail\", \"No cached token (run probe auth)\");\n } else {\n token = cached.token;\n const expires = new Date(cached.expiresAt);\n if (Number.isNaN(expires.getTime())) {\n addCheck(\"auth.token\", \"warn\", \"Token exists but expiry is invalid\");\n } else if (expires.getTime() <= Date.now()) {\n addCheck(\"auth.token\", \"fail\", `Token expired at ${expires.toISOString()}`);\n } else {\n tokenValid = true;\n tokenExpiresAt = cached.expiresAt;\n addCheck(\"auth.token\", \"pass\", `Token valid until ${expires.toISOString()}`);\n }\n }\n }\n\n let identity: string | undefined;\n let agent: Agent | null = null;\n if (config && token) {\n const host = options.host || config.spacetime.host;\n const moduleName = options.module || config.spacetime.module;\n addCheck(\"nexus.target\", \"pass\", `${host} / ${moduleName}`);\n\n if (tokenValid) {\n try {\n await using ctx = await CommandContext.create({\n host,\n module: moduleName,\n wallet: walletName,\n token,\n subscribe: options.includeAgent ?? false,\n });\n identity = ctx.identity?.toHexString() || \"unknown\";\n addCheck(\"nexus.connect\", \"pass\", `Connected as ${identity}`);\n\n if (options.includeAgent && ctx.identity) {\n agent =\n ctx\n .iter<Agent>(\"agents\")\n .find((a) => a.identity.toHexString() === ctx.identity?.toHexString()) || null;\n if (agent) {\n addCheck(\n \"registration\",\n \"pass\",\n `Agent ${agent.id} registered as ${AgentRole.display(agent.role)}`,\n );\n } else {\n addCheck(\"registration\", \"fail\", \"Agent not registered\");\n }\n }\n } catch (err) {\n addCheck(\"nexus.connect\", \"fail\", err instanceof Error ? err.message : \"Connection failed\");\n }\n } else {\n addCheck(\"nexus.connect\", \"warn\", \"Skipped connection check (no valid token)\");\n }\n }\n\n const counts = checks.reduce(\n (acc, item) => {\n if (item.status === \"pass\") acc.pass += 1;\n else if (item.status === \"warn\") acc.warn += 1;\n else if (item.status === \"fail\") acc.fail += 1;\n else acc.manual_required += 1;\n return acc;\n },\n { pass: 0, warn: 0, fail: 0, manual_required: 0 },\n );\n\n const criticalFail = checks.some(\n (c) =>\n c.status === \"fail\" &&\n [\"wallet.selected\", \"wallet.exists\", \"auth.token\", \"nexus.connect\"].includes(c.check),\n );\n\n return {\n ok: !criticalFail,\n checks,\n counts,\n walletName,\n walletAddress,\n tokenValid,\n tokenExpiresAt,\n identity,\n agent,\n };\n}\n","import { encode } from \"@toon-format/toon\";\n\nexport function formatToon(data: Record<string, unknown>): string {\n return encode(data);\n}\n\nexport function formatToonRecord<T extends object>(\n key: string,\n items: T[],\n fields?: (keyof T)[],\n): string {\n const displayFields = fields || (Object.keys(items[0] || {}) as (keyof T)[]);\n const rows = items.map((item) => {\n const row: Record<string, unknown> = {};\n for (const field of displayFields) {\n row[String(field)] = item[field];\n }\n return row;\n });\n return encode({ [key]: rows });\n}\n\nexport function toonList<T extends object>(key: string, items: T[], columns?: string[]): string {\n if (items.length === 0) {\n return encode({ [key]: [] });\n }\n\n const cols = columns || Object.keys(items[0] as Record<string, unknown>);\n const rows = items.map((item) => {\n const row: Record<string, unknown> = {};\n for (const col of cols) {\n row[col] = (item as Record<string, unknown>)[col];\n }\n return row;\n });\n return encode({ [key]: rows });\n}\n","import { defineCommand } from \"citty\";\nimport { forceHelpRequested, printHelp } from \"~/utils/help.js\";\nimport { isJsonMode, setJsonMode, success } from \"~/utils/output.js\";\nimport { runHealthChecks } from \"~/utils/health.js\";\nimport { toonList } from \"~/utils/toon.js\";\n\nexport default defineCommand({\n meta: {\n name: \"doctor\",\n description: \"Run environment and connectivity diagnostics\",\n },\n args: {\n wallet: {\n type: \"string\",\n description: \"Wallet name override for auth checks\",\n },\n host: {\n type: \"string\",\n description: \"SpacetimeDB host override\",\n },\n module: {\n type: \"string\",\n description: \"SpacetimeDB module override\",\n },\n json: {\n type: \"boolean\",\n description: \"Output JSON only\",\n default: false,\n },\n },\n async run({ args }) {\n if (args.json) {\n setJsonMode(true);\n }\n\n if (forceHelpRequested()) {\n printHelp({\n command: \"probe doctor\",\n description: \"Validate Probe config, auth, and Nexus connectivity\",\n usage: [\n \"probe doctor\",\n \"probe doctor --wallet my-wallet --host ws://127.0.0.1:3000 --module nexus\",\n ],\n options: [\n { name: \"--wallet\", detail: \"Wallet override for auth checks\" },\n { name: \"--host, --module\", detail: \"SpacetimeDB overrides\" },\n { name: \"--json\", detail: \"JSON output mode\" },\n ],\n });\n return;\n }\n\n const result = await runHealthChecks({\n wallet: args.wallet,\n host: args.host,\n module: args.module,\n includeAgent: false,\n });\n\n const { ok, counts, checks } = result;\n success({ ok, counts, checks });\n\n if (!isJsonMode()) {\n console.log(toonList(\"doctor_checks\", checks));\n console.log(toonList(\"doctor_summary\", [{ ok, ...counts }]));\n }\n },\n});\n","import { execSync } from \"node:child_process\";\nimport { createHash } from \"node:crypto\";\nimport { createWriteStream, existsSync, readFileSync, renameSync, unlinkSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { arch, platform } from \"node:os\";\nimport { dirname, resolve } from \"node:path\";\nimport { Readable } from \"node:stream\";\nimport { finished } from \"node:stream/promises\";\n\nexport type InstallMethod = \"npm\" | \"binary\" | \"unknown\";\nexport type InstallMethodArg = \"auto\" | \"npm\" | \"binary\";\n\nconst PACKAGE = \"@zenon-red/probe\";\nconst REPO = \"zenon-red/probe\";\nconst NPM_REGISTRY = \"https://registry.npmjs.org\";\nconst GITHUB_API = \"https://api.github.com\";\nconst REQUEST_TIMEOUT = 30_000;\n\nconst require = createRequire(import.meta.url);\n\nexport function normalizeVersion(input: string): string {\n const trimmed = input.trim();\n if (trimmed.startsWith(`${PACKAGE}@`)) {\n return trimmed.slice(`${PACKAGE}@`.length);\n }\n if (trimmed.startsWith(\"refs/tags/\")) {\n return normalizeVersion(trimmed.slice(\"refs/tags/\".length));\n }\n return trimmed.replace(/^v/, \"\");\n}\n\nexport function getCurrentVersion(): string {\n const candidates = [\"../../package.json\", \"../package.json\", \"../../../package.json\"];\n try {\n for (const candidate of candidates) {\n try {\n const version = require(candidate).version as string;\n if (version) return version;\n } catch {\n // try next candidate\n }\n }\n if (process.env.npm_package_version) {\n return process.env.npm_package_version;\n }\n } catch {\n // fallthrough\n }\n return \"0.0.0\";\n}\n\nexport function detectMethod(explicit?: InstallMethodArg): InstallMethod {\n if (explicit && explicit !== \"auto\") return explicit;\n\n const execPath = process.execPath;\n const argv1 = process.argv[1] || \"\";\n let resolvedProbePath = \"\";\n\n try {\n resolvedProbePath = execSync(\"command -v probe\", {\n timeout: 5_000,\n encoding: \"utf8\",\n }).trim();\n } catch {\n // ignore lookup failures\n }\n\n // Standalone binary heuristics\n if (\n execPath.includes(\".probe\") ||\n execPath.includes(\"probe-linux\") ||\n execPath.includes(\"probe-darwin\") ||\n execPath.includes(\"probe-windows\") ||\n argv1.includes(\".probe\") ||\n resolvedProbePath.includes(\".probe\") ||\n resolvedProbePath.includes(\"probe-linux\") ||\n resolvedProbePath.includes(\"probe-darwin\") ||\n resolvedProbePath.includes(\"probe-windows\")\n ) {\n return \"binary\";\n }\n\n // npm global install heuristic\n if (argv1.includes(\"node_modules\") || resolvedProbePath.includes(\"node_modules\")) return \"npm\";\n\n // fnm-managed global shim heuristic (common on VPS/dev shells)\n // e.g. /run/user/<uid>/fnm_multishells/<id>/bin/probe\n if (resolvedProbePath.includes(\"/fnm_multishells/\") && resolvedProbePath.endsWith(\"/probe\")) {\n return \"npm\";\n }\n\n // Try npm list (only if npm exists)\n try {\n const out = execSync(\"npm list -g @zenon-red/probe --depth=0 2>/dev/null\", {\n timeout: 10_000,\n encoding: \"utf8\",\n });\n if (out.includes(\"@zenon-red/probe\")) return \"npm\";\n } catch {\n // npm not found or not installed globally\n }\n\n return \"unknown\";\n}\n\nexport async function fetchLatestNpmVersion(): Promise<string> {\n const url = `${NPM_REGISTRY}/${PACKAGE}/latest`;\n const res = await fetch(url, {\n signal: AbortSignal.timeout(REQUEST_TIMEOUT),\n });\n if (!res.ok) throw new Error(`npm registry returned ${res.status}`);\n const data = (await res.json()) as { version?: string };\n if (!data.version) throw new Error(\"No version field in npm response\");\n return normalizeVersion(data.version);\n}\n\nexport interface GitHubRelease {\n tag_name: string;\n assets: Array<{ name: string; browser_download_url: string }>;\n}\n\nasync function fetchGitHubRelease(path: string): Promise<GitHubRelease> {\n const url = `${GITHUB_API}/repos/${REPO}/releases/${path}`;\n const res = await fetch(url, {\n headers: { Accept: \"application/vnd.github+json\" },\n signal: AbortSignal.timeout(REQUEST_TIMEOUT),\n });\n if (!res.ok) throw new Error(`GitHub API returned ${res.status}`);\n return (await res.json()) as GitHubRelease;\n}\n\nexport async function fetchLatestGitHubRelease(): Promise<{\n version: string;\n release: GitHubRelease;\n}> {\n const release = await fetchGitHubRelease(\"latest\");\n const version = normalizeVersion(release.tag_name);\n return { version, release };\n}\n\nexport async function fetchGitHubReleaseByVersion(version: string): Promise<GitHubRelease> {\n const normalized = normalizeVersion(version);\n try {\n return await fetchGitHubRelease(`tags/v${normalized}`);\n } catch (err) {\n const message = err instanceof Error ? err.message : \"\";\n if (!message.includes(\"404\")) {\n throw err;\n }\n const packageTag = encodeURIComponent(`${PACKAGE}@${normalized}`);\n return await fetchGitHubRelease(`tags/${packageTag}`);\n }\n}\n\nexport function resolveBinaryAssetName(): string {\n const p = platform();\n const a = arch();\n\n const platformMap: Record<string, string> = {\n linux: \"linux\",\n darwin: \"darwin\",\n windows: \"windows\",\n };\n const archMap: Record<string, string> = {\n x64: \"x64\",\n arm64: \"arm64\",\n };\n\n const plat = platformMap[p];\n const cpuArch = archMap[a];\n if (!plat || !cpuArch) {\n throw new Error(`Unsupported platform: ${p}/${cpuArch}`);\n }\n\n const ext = (platform() as string) === \"windows\" ? \".exe\" : \"\";\n return `probe-${plat}-${cpuArch}${ext}`;\n}\n\nexport function getBinaryDir(): string {\n return dirname(process.execPath);\n}\n\nexport async function downloadFile(url: string, dest: string): Promise<void> {\n const res = await fetch(url, {\n signal: AbortSignal.timeout(REQUEST_TIMEOUT * 2),\n redirect: \"follow\",\n });\n if (!res.ok) throw new Error(`Download failed: ${res.status} ${res.statusText}`);\n if (!res.body) throw new Error(\"Empty response body\");\n\n const nodeStream = Readable.fromWeb(\n res.body as unknown as import(\"node:stream/web\").ReadableStream,\n );\n const ws = createWriteStream(dest, { mode: 0o755 });\n await finished(nodeStream.pipe(ws));\n}\n\nexport function verifyChecksum(filePath: string, checksums: string): boolean {\n const fileName = filePath.split(\"/\").pop() || filePath.split(\"\\\\\").pop() || \"\";\n const lines = checksums.split(\"\\n\");\n let expected = \"\";\n for (const line of lines) {\n const [hash, name] = line.trim().split(/\\s+/);\n if (name === fileName) {\n expected = hash;\n break;\n }\n }\n if (!expected) return false;\n\n const data = readFileSync(filePath);\n const actual = createHash(\"sha256\").update(data).digest(\"hex\");\n return actual === expected;\n}\n\nexport async function upgradeViaNpm(target: string): Promise<void> {\n const version = normalizeVersion(target);\n execSync(`npm install -g ${PACKAGE}@${version}`, {\n stdio: \"inherit\",\n timeout: 120_000,\n });\n}\n\nexport async function upgradeViaBinary(release: GitHubRelease, _target: string): Promise<void> {\n const assetName = resolveBinaryAssetName();\n const asset = release.assets.find((a) => a.name === assetName);\n if (!asset) throw new Error(`Asset not found for ${assetName}`);\n\n const checksumAsset = release.assets.find((a) => a.name === \"SHA256SUMS.txt\");\n if (!checksumAsset) throw new Error(\"SHA256SUMS.txt not found in release\");\n\n const binDir = getBinaryDir();\n const targetPath = resolve(binDir, (platform() as string) === \"windows\" ? \"probe.exe\" : \"probe\");\n const tmpPath = `${targetPath}.tmp`;\n const backupPath = `${targetPath}.bak`;\n\n // Download binary + checksum\n await downloadFile(asset.browser_download_url, tmpPath);\n\n const checksumRes = await fetch(checksumAsset.browser_download_url, {\n signal: AbortSignal.timeout(REQUEST_TIMEOUT),\n });\n if (!checksumRes.ok) throw new Error(\"Failed to download SHA256SUMS.txt\");\n const checksums = await checksumRes.text();\n\n // Verify checksum\n if (!verifyChecksum(tmpPath, checksums)) {\n unlinkSync(tmpPath);\n throw new Error(\"CHECKSUM_MISMATCH\");\n }\n\n // Atomic replace with rollback\n try {\n if (existsSync(targetPath)) {\n renameSync(targetPath, backupPath);\n }\n renameSync(tmpPath, targetPath);\n // Post-upgrade smoke test\n execSync(`\"${targetPath}\" --version`, {\n timeout: 10_000,\n encoding: \"utf8\",\n });\n // Cleanup backup on success\n if (existsSync(backupPath)) {\n try {\n unlinkSync(backupPath);\n } catch {\n // non-fatal\n }\n }\n } catch (err) {\n // Rollback\n if (existsSync(backupPath)) {\n try {\n renameSync(backupPath, targetPath);\n } catch {\n throw new Error(\n `ROLLBACK_FAILED: Upgrade failed and rollback also failed. Backup at: ${backupPath}`,\n );\n }\n }\n if (existsSync(tmpPath)) {\n try {\n unlinkSync(tmpPath);\n } catch {\n // non-fatal\n }\n }\n throw err;\n }\n}\n","import { log } from \"@clack/prompts\";\nimport { getConfig } from \"~/utils/config.js\";\nimport { isJsonMode } from \"~/utils/output.js\";\nimport {\n type InstallMethod,\n detectMethod,\n fetchLatestGitHubRelease,\n fetchLatestNpmVersion,\n getCurrentVersion,\n upgradeViaBinary,\n upgradeViaNpm,\n} from \"~/utils/upgrade.js\";\n\nlet lastNotifiedVersion = \"\";\n\nfunction compareSemver(a: string, b: string): number {\n const parse = (v: string) =>\n v\n .replace(/^v/, \"\")\n .split(\".\")\n .map((part) => Number.parseInt(part, 10) || 0);\n const av = parse(a);\n const bv = parse(b);\n const maxLen = Math.max(av.length, bv.length);\n for (let i = 0; i < maxLen; i++) {\n const ai = av[i] || 0;\n const bi = bv[i] || 0;\n if (ai > bi) return 1;\n if (ai < bi) return -1;\n }\n return 0;\n}\n\nasync function getLatestVersionByMethod(method: InstallMethod): Promise<string> {\n if (method === \"binary\") {\n const gh = await fetchLatestGitHubRelease();\n return gh.version;\n }\n return fetchLatestNpmVersion();\n}\n\nasync function performAutoUpgrade(method: InstallMethod, targetVersion: string): Promise<void> {\n if (method === \"npm\") {\n await upgradeViaNpm(targetVersion);\n return;\n }\n if (method === \"binary\") {\n const gh = await fetchLatestGitHubRelease();\n await upgradeViaBinary(gh.release, targetVersion);\n }\n}\n\nexport async function checkAutoUpdate(): Promise<void> {\n const config = await getConfig();\n const autoUpdate = config.autoUpdate ?? \"notify\";\n if (autoUpdate === false) return;\n\n const method = detectMethod();\n if (method === \"unknown\") return;\n\n let latest = \"\";\n try {\n latest = await getLatestVersionByMethod(method);\n } catch {\n return;\n }\n\n const current = getCurrentVersion();\n const hasUpdate = compareSemver(latest, current) > 0;\n\n if (!hasUpdate) {\n lastNotifiedVersion = \"\";\n return;\n }\n\n if (autoUpdate === \"notify\") {\n if (lastNotifiedVersion !== latest && !isJsonMode()) {\n log.warn(`Update available: probe ${current} -> ${latest}. Run \\`probe upgrade\\` to update.`);\n lastNotifiedVersion = latest;\n }\n return;\n }\n\n try {\n await performAutoUpgrade(method, latest);\n if (!isJsonMode()) {\n log.success(`Probe auto-updated to ${latest}`);\n }\n lastNotifiedVersion = \"\";\n } catch {\n if (!isJsonMode()) {\n log.warn(`Probe auto-update failed; run \\`probe upgrade\\` manually.`);\n }\n }\n}\n\nexport function checkAutoUpdateInBackground(): void {\n void checkAutoUpdate();\n}\n","type MicrosTimestamp = { microsSinceUnixEpoch: bigint | number | string };\n\nexport const toMicros = (value: unknown): bigint => {\n if (!value || typeof value !== \"object\" || !(\"microsSinceUnixEpoch\" in value)) {\n return 0n;\n }\n const micros = (value as MicrosTimestamp).microsSinceUnixEpoch;\n return typeof micros === \"bigint\" ? micros : BigInt(micros);\n};\n\nexport const formatTimestamp = (value: unknown, fallback = \"\"): string => {\n const micros = toMicros(value);\n if (micros <= 0n) {\n return fallback || String(value ?? \"\");\n }\n return new Date(Number(micros / 1000n)).toISOString().replace(\"T\", \" \");\n};\n\nexport const formatIsoTimestamp = (value: unknown, fallback = \"\"): string => {\n const micros = toMicros(value);\n if (micros <= 0n) {\n return fallback || new Date().toISOString();\n }\n return new Date(Number(micros / 1000n)).toISOString();\n};\n","import {\n CommandContext,\n type Channel,\n type Agent,\n type Idea,\n type Message,\n type Task,\n} from \"~/utils/context.js\";\nimport { AgentRole, IdeaStatus, TaskStatus } from \"~/utils/enums.js\";\nimport { toMicros } from \"~/utils/time.js\";\n\nexport const REASON_CODES = {\n REPAIR_WALLET: \"REPAIR_WALLET\",\n REPAIR_AUTH: \"REPAIR_AUTH\",\n REPAIR_REGISTRATION: \"REPAIR_REGISTRATION\",\n REPAIR_NEXUS: \"REPAIR_NEXUS\",\n REPAIR_EMPTY_SUBSCRIPTION: \"REPAIR_EMPTY_SUBSCRIPTION\",\n READ_DIRECTIVE: \"READ_DIRECTIVE\",\n INBOX_MESSAGES: \"INBOX_MESSAGES\",\n INBOX_FRESHNESS_UNAVAILABLE: \"INBOX_FRESHNESS_UNAVAILABLE\",\n OLDEST_UNVOTED_IDEA: \"OLDEST_UNVOTED_IDEA\",\n PROPOSAL_SCOUT_DUE: \"PROPOSAL_SCOUT_DUE\",\n CONTINUE_TASK: \"CONTINUE_TASK\",\n CLAIM_TASK: \"CLAIM_TASK\",\n PROJECT_SETUP: \"PROJECT_SETUP\",\n CREATE_TASKS: \"CREATE_TASKS\",\n VALIDATE_REVIEWS: \"VALIDATE_REVIEWS\",\n REVIEW_DISCOVERY: \"REVIEW_DISCOVERY\",\n IDLE: \"IDLE\",\n} as const;\n\nexport const SKILLS: Record<string, string> = {\n repair: \"zr-doctor\",\n read_directive: \"zr-inbox\",\n inbox: \"zr-inbox\",\n vote: \"zr-vote\",\n propose: \"zr-propose\",\n continue_task: \"zr-execute\",\n claim_task: \"zr-claim\",\n project_setup: \"zr-project-setup\",\n create_tasks: \"zr-create-tasks\",\n validate_reviews: \"zr-validate\",\n review_discovery: \"zr-review-discoveries\",\n idle: \"\",\n};\n\nexport interface NextAction {\n kind: string;\n target?: { type: string; id: string };\n reason_code: string;\n skill?: string;\n}\n\nexport function chooseNext(ctx: CommandContext, agent: Agent): NextAction {\n // 0. General directive changed: force next action to read directive\n const channels = ctx.iter<Channel>(\"channels\");\n const generalChannel = channels.find((c) => c.name === \"general\");\n if (generalChannel) {\n const directives = ctx\n .iter<Message>(\"messages\")\n .filter((m) => m.channelId === generalChannel.id && m.messageType.tag === \"Directive\")\n .sort((a, b) => {\n const aMicros = toMicros(a.createdAt);\n const bMicros = toMicros(b.createdAt);\n return aMicros < bMicros ? 1 : aMicros > bMicros ? -1 : 0;\n });\n const latestDirective = directives[0];\n if (latestDirective) {\n const priorDirectiveReads = ctx\n .iter<{\n agentId: string;\n kind: { tag: string };\n targetType: string | null;\n targetId: string | null;\n reasonCode: string;\n }>(\"agent_actions\")\n .filter(\n (a) =>\n a.agentId === agent.id &&\n a.kind.tag === \"Inbox\" &&\n a.reasonCode === REASON_CODES.READ_DIRECTIVE &&\n a.targetType === \"directive\" &&\n a.targetId === latestDirective.id.toString(),\n );\n if (priorDirectiveReads.length === 0) {\n return {\n kind: \"inbox\",\n target: { type: \"directive\", id: latestDirective.id.toString() },\n reason_code: REASON_CODES.READ_DIRECTIVE,\n skill: SKILLS.read_directive,\n };\n }\n }\n }\n\n // 1. Inbox\n const messages = ctx.iter<Message>(\"messages\");\n const personalChannel = channels.find((c) => c.name === agent.id);\n if (personalChannel) {\n const cutoff =\n (agent.lastHeartbeat ? toMicros(agent.lastHeartbeat) - BigInt(3600 * 1_000_000) : 0n) || 0n;\n const recent = messages\n .filter((m) => m.channelId === personalChannel.id && toMicros(m.createdAt) > cutoff)\n .slice(0, 3);\n if (recent.length > 0) {\n return {\n kind: \"inbox\",\n target: { type: \"message\", id: recent[0].id.toString() },\n reason_code: REASON_CODES.INBOX_MESSAGES,\n skill: SKILLS.inbox,\n };\n }\n }\n\n // 2. Zeno routing\n if (AgentRole.is.zeno(agent.role)) {\n // Vote\n const votes = ctx.iter<{ ideaId: bigint; agentId: string }>(\"votes\");\n const votedIdeaIds = new Set(votes.filter((v) => v.agentId === agent.id).map((v) => v.ideaId));\n const pendingIdeas = ctx\n .iter<Idea>(\"ideas\")\n .filter((i) => IdeaStatus.is.voting(i.status) && !votedIdeaIds.has(i.id))\n .sort((a, b) => {\n const aMicros = toMicros(a.createdAt);\n const bMicros = toMicros(b.createdAt);\n return aMicros < bMicros ? -1 : aMicros > bMicros ? 1 : 0;\n });\n if (pendingIdeas.length > 0) {\n return {\n kind: \"vote\",\n target: { type: \"idea\", id: pendingIdeas[0].id.toString() },\n reason_code: REASON_CODES.OLDEST_UNVOTED_IDEA,\n skill: SKILLS.vote,\n };\n }\n\n // Propose\n const pendingCount = ctx\n .iter<Idea>(\"ideas\")\n .filter((i) => IdeaStatus.is.voting(i.status)).length;\n if (pendingCount < 3) {\n return {\n kind: \"propose\",\n reason_code: REASON_CODES.PROPOSAL_SCOUT_DUE,\n skill: SKILLS.propose,\n };\n }\n\n // Continue task\n const tasks = ctx.iter<Task>(\"tasks\");\n const owned = tasks.find(\n (t) =>\n t.assignedTo === agent.id &&\n (TaskStatus.is.claimed(t.status) || TaskStatus.is.inProgress(t.status)),\n );\n if (owned) {\n return {\n kind: \"continue_task\",\n target: { type: \"task\", id: owned.id.toString() },\n reason_code: REASON_CODES.CONTINUE_TASK,\n skill: SKILLS.continue_task,\n };\n }\n\n // Claim task\n const ready = tasks\n .filter((t) => TaskStatus.is.open(t.status))\n .sort((a, b) => a.priority - b.priority);\n if (ready.length > 0) {\n return {\n kind: \"claim_task\",\n target: { type: \"task\", id: ready[0].id.toString() },\n reason_code: REASON_CODES.CLAIM_TASK,\n skill: SKILLS.claim_task,\n };\n }\n }\n\n // 3. Zoe routing\n if (AgentRole.is.zoe(agent.role)) {\n // Approved ideas without project\n const approvedIdeas = ctx\n .iter<Idea>(\"ideas\")\n .filter((i) => IdeaStatus.is.approved(i.status))\n .sort((a, b) => {\n const aMicros = toMicros(a.createdAt);\n const bMicros = toMicros(b.createdAt);\n return aMicros < bMicros ? -1 : aMicros > bMicros ? 1 : 0;\n });\n const projects = ctx.iter<{ sourceIdeaId: bigint }>(\"projects\");\n const projectIdeaIds = new Set(projects.map((p) => p.sourceIdeaId));\n const needProject = approvedIdeas.find((i) => !projectIdeaIds.has(i.id));\n if (needProject) {\n return {\n kind: \"project_setup\",\n target: { type: \"idea\", id: needProject.id.toString() },\n reason_code: REASON_CODES.PROJECT_SETUP,\n skill: SKILLS.project_setup,\n };\n }\n\n // Projects ready for task breakdown\n const activeProjects = ctx\n .iter<{ id: bigint; status: { tag: string }; sourceIdeaId: bigint }>(\"projects\")\n .filter((p) => p.status.tag === \"Active\");\n for (const project of activeProjects) {\n const taskCount = ctx.iter<Task>(\"tasks\").filter((t) => t.projectId === project.id).length;\n if (taskCount === 0) {\n return {\n kind: \"create_tasks\",\n target: { type: \"project\", id: project.id.toString() },\n reason_code: REASON_CODES.CREATE_TASKS,\n skill: SKILLS.create_tasks,\n };\n }\n }\n\n // Validate reviews\n const reviewTasks = ctx\n .iter<Task>(\"tasks\")\n .filter((t) => TaskStatus.is.review(t.status) && t.reviewCount > 0)\n .slice(0, 3);\n if (reviewTasks.length > 0) {\n return {\n kind: \"validate_reviews\",\n target: { type: \"task\", id: reviewTasks[0].id.toString() },\n reason_code: REASON_CODES.VALIDATE_REVIEWS,\n skill: SKILLS.validate_reviews,\n };\n }\n\n // Review discovery\n const discoveries = ctx\n .iter<{\n id: bigint;\n status: { tag: string };\n }>(\"discovered_tasks\")\n .filter((d) => d.status.tag === \"PendingReview\")\n .sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0));\n if (discoveries.length > 0) {\n return {\n kind: \"review_discovery\",\n target: {\n type: \"discovered_task\",\n id: discoveries[0].id.toString(),\n },\n reason_code: REASON_CODES.REVIEW_DISCOVERY,\n skill: SKILLS.review_discovery,\n };\n }\n }\n\n // 4. Idle\n return {\n kind: \"idle\",\n reason_code: REASON_CODES.IDLE,\n skill: SKILLS.idle,\n };\n}\n","import type { NextAction } from \"~/utils/next-router.js\";\n\nexport interface NextActionDef {\n taskInstruction: string;\n maxActions: number;\n}\n\nexport const NEXT_ACTION_DEFS: Record<string, NextActionDef> = {\n repair: {\n taskInstruction:\n \"Run probe doctor and resolve the reported blocker before continuing. For more information, load and fully read the zr-doctor skill.\",\n maxActions: 1,\n },\n inbox: {\n taskInstruction: \"Load and fully read the zr-inbox skill before processing the inbox target.\",\n maxActions: 1,\n },\n vote: {\n taskInstruction:\n \"Load and fully read the zr-vote skill before submitting a decision for the target idea.\",\n maxActions: 1,\n },\n propose: {\n taskInstruction:\n \"Load and fully read the zr-propose skill before submitting a concrete proposal.\",\n maxActions: 1,\n },\n claim_task: {\n taskInstruction:\n \"Load and fully read the zr-claim skill before claiming one suitable open task.\",\n maxActions: 1,\n },\n continue_task: {\n taskInstruction:\n \"Load and fully read the zr-execute skill before continuing work on the target task.\",\n maxActions: 1,\n },\n project_setup: {\n taskInstruction:\n \"Load and fully read the zr-project-setup skill before creating one project scaffold for the target idea.\",\n maxActions: 1,\n },\n create_tasks: {\n taskInstruction:\n \"Load and fully read the zr-create-tasks skill before creating a bounded task set for the target project.\",\n maxActions: 1,\n },\n validate_reviews: {\n taskInstruction:\n \"Load and fully read the zr-validate skill before reviewing the target completed task.\",\n maxActions: 1,\n },\n review_discovery: {\n taskInstruction:\n \"Load and fully read the zr-review-discoveries skill before addressing the target discovered task.\",\n maxActions: 1,\n },\n idle: {\n taskInstruction: \"No pending work. End this wake cleanly.\",\n maxActions: 1,\n },\n};\n\nconst DEFAULT_ACTION_DEF: NextActionDef = {\n taskInstruction: \"Complete the targeted action using the attached skill and context.\",\n maxActions: 1,\n};\n\nexport function getNextActionDef(kind: string): NextActionDef {\n return NEXT_ACTION_DEFS[kind] ?? DEFAULT_ACTION_DEF;\n}\n\nexport function buildContextCommands(action: NextAction, agentId: string): string[] {\n const target = action.target;\n if (!target) return [];\n\n if (target.type === \"idea\") {\n return [`probe idea get ${target.id}`, \"probe idea dimensions\"];\n }\n if (target.type === \"task\") {\n return [`probe task get ${target.id}`];\n }\n if (target.type === \"message\") {\n return [`probe message list ${agentId} --limit 10`];\n }\n if (target.type === \"directive\") {\n return [\"probe message directives general --limit 1\"];\n }\n if (target.type === \"project\") {\n return [`probe project get ${target.id}`];\n }\n if (target.type === \"discovered_task\") {\n return [`probe discover get ${target.id}`];\n }\n\n return [];\n}\n","import { defineCommand } from \"citty\";\nimport { checkAutoUpdateInBackground } from \"~/utils/auto-update.js\";\nimport { callReducer, type Agent, withAuth } from \"~/utils/context.js\";\nimport { forceHelpRequested, printHelp } from \"~/utils/help.js\";\nimport { isJsonMode, setJsonMode, success } from \"~/utils/output.js\";\nimport { runHealthChecks, type HealthCheck } from \"~/utils/health.js\";\nimport { chooseNext, REASON_CODES, type NextAction } from \"~/utils/next-router.js\";\nimport { buildContextCommands, getNextActionDef } from \"~/utils/next-action-defs.js\";\nimport { toonList } from \"~/utils/toon.js\";\n\ninterface NextResult {\n action: NextAction;\n contextCommands: string[];\n completion: { taskInstruction: string; maxActions: number };\n health: HealthCheck[];\n persisted: boolean;\n}\n\nconst KIND_TAGS: Record<string, string> = {\n repair: \"Repair\",\n inbox: \"Inbox\",\n vote: \"Vote\",\n propose: \"Propose\",\n continue_task: \"ContinueTask\",\n claim_task: \"ClaimTask\",\n project_setup: \"ProjectSetup\",\n create_tasks: \"CreateTasks\",\n validate_reviews: \"ValidateReviews\",\n review_discovery: \"ReviewDiscovery\",\n idle: \"Idle\",\n};\n\nexport default defineCommand({\n meta: {\n name: \"next\",\n description: \"Deterministic router returning one bounded next action\",\n },\n args: {\n wallet: { type: \"string\", description: \"Wallet name\" },\n host: { type: \"string\", description: \"SpacetimeDB host\" },\n module: { type: \"string\", description: \"Module name\" },\n json: {\n type: \"boolean\",\n description: \"Output JSON only\",\n default: false,\n },\n },\n async run({ args }) {\n if (args.json) setJsonMode(true);\n\n if (forceHelpRequested()) {\n printHelp({\n command: \"probe next\",\n description: \"Return one bounded next action for a scheduled wake\",\n usage: [\"probe next\", \"probe next --json\", \"probe next --wallet my-wallet\"],\n options: [\n { name: \"--wallet\", detail: \"Wallet override\" },\n { name: \"--host, --module\", detail: \"SpacetimeDB overrides\" },\n { name: \"--json\", detail: \"JSON output\" },\n ],\n });\n return;\n }\n\n // 1. Health check\n const health = await runHealthChecks({\n wallet: args.wallet,\n host: args.host,\n module: args.module,\n includeAgent: true,\n });\n\n // If critical health failures, return repair\n if (!health.ok || !health.agent) {\n const reason = !health.walletName\n ? REASON_CODES.REPAIR_WALLET\n : !health.tokenValid\n ? REASON_CODES.REPAIR_AUTH\n : !health.agent\n ? REASON_CODES.REPAIR_REGISTRATION\n : REASON_CODES.REPAIR_NEXUS;\n return emit({\n action: {\n kind: \"repair\",\n reason_code: reason,\n skill: \"zr-doctor\",\n },\n contextCommands: [\"probe doctor\"],\n completion: {\n ...getNextActionDef(\"repair\"),\n },\n health: health.checks,\n persisted: false,\n });\n }\n\n const agent = health.agent;\n const walletName = health.walletName!;\n\n // 2. Connect and heartbeat\n await withAuth({ wallet: walletName, host: args.host, module: args.module }, async (ctx) => {\n // Heartbeat\n try {\n await callReducer(ctx, \"heartbeat\", { agentId: agent.id });\n } catch {\n // non-fatal\n }\n\n // Stale-state guard\n const agents = ctx.iter<Agent>(\"agents\");\n if (agents.length === 0) {\n return emit({\n action: {\n kind: \"repair\",\n reason_code: REASON_CODES.REPAIR_EMPTY_SUBSCRIPTION,\n skill: \"zr-doctor\",\n },\n contextCommands: [\"probe doctor\"],\n completion: {\n ...getNextActionDef(\"repair\"),\n },\n health: health.checks,\n persisted: false,\n });\n }\n\n const action = chooseNext(ctx, agent);\n\n let persisted = false;\n\n // Persist action if not idle/repair\n if (action.kind !== \"idle\" && action.kind !== \"repair\") {\n try {\n const reducerKind = KIND_TAGS[action.kind];\n if (!reducerKind) {\n throw new Error(`Unsupported action kind for reducer: ${action.kind}`);\n }\n await callReducer(ctx, \"issue_agent_action\", {\n agentId: agent.id,\n kind: { tag: reducerKind },\n targetType: action.target?.type,\n targetId: action.target?.id,\n reasonCode: action.reason_code,\n });\n persisted = true;\n } catch {\n // non-fatal\n }\n }\n\n const contextCommands = buildContextCommands(action, agent.id);\n\n const actionDef = getNextActionDef(action.kind);\n\n emit({\n action: {\n kind: action.kind,\n target: action.target,\n reason_code: action.reason_code,\n skill: action.skill,\n },\n contextCommands,\n completion: {\n taskInstruction: actionDef.taskInstruction,\n maxActions: actionDef.maxActions,\n },\n health: health.checks,\n persisted,\n });\n });\n\n checkAutoUpdateInBackground();\n\n function emit(result: NextResult) {\n if (isJsonMode()) {\n const record: Record<string, string> = {};\n for (const c of result.health) {\n record[c.check] = c.status;\n }\n success({ ...result, health: record });\n return;\n }\n\n success(result);\n const targetType = result.action.target?.type || \"\";\n const targetId = result.action.target?.id || \"\";\n\n console.log(\n toonList(\"next_action\", [\n {\n kind: result.action.kind,\n reason_code: result.action.reason_code,\n skill: result.action.skill || \"\",\n target_type: targetType,\n target_id: targetId,\n max_actions: result.completion.maxActions,\n task_instruction: result.completion.taskInstruction,\n },\n ]),\n );\n\n if (result.contextCommands.length > 0) {\n console.log(\n toonList(\n \"context_commands\",\n result.contextCommands.map((cmd) => ({ command: cmd })),\n ),\n );\n }\n }\n },\n});\n","import { execSync } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport interface ScheduleInput {\n agentId: string;\n role: string;\n intervalMinutes: number;\n prompt: string;\n}\n\nfunction commandExists(cmd: string): boolean {\n try {\n execSync(`command -v ${cmd}`, { stdio: \"ignore\", timeout: 5000 });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction detectAgentFrameworks(): {\n hermes: boolean;\n openclaw: boolean;\n opencode: boolean;\n} {\n return {\n hermes:\n !!process.env.HERMES_HOME ||\n commandExists(\"hermes\") ||\n existsSync(join(homedir(), \".hermes\")),\n openclaw:\n !!process.env.OPENCLAW_HOME ||\n commandExists(\"openclaw\") ||\n existsSync(join(homedir(), \".openclaw\")),\n opencode: commandExists(\"opencode\") || existsSync(join(homedir(), \".opencode\")),\n };\n}\n\nexport function buildAgenticRuntimePlan(input: ScheduleInput): string {\n const wakeCommand = \"Load and internalize the skill zr-nexus-primer. Execute probe next.\";\n const frameworks = detectAgentFrameworks();\n\n const installedFrameworks = Object.entries(frameworks)\n .filter(([, v]) => v)\n .map(([k]) => k);\n\n const lines: string[] = [\n \"No agentic runtime with built-in scheduling detected.\",\n \"\",\n \"probe next returns a structured action plan, but an AI agent must read the output,\",\n \"load the recommended skill, reason about the context, and execute the routed action.\",\n \"A raw cron job piping `probe next` to a log is not sufficient.\",\n \"\",\n \"## What you need\",\n \"\",\n \"Any AI agent framework with shell access can participate if it can be scheduled to:\",\n \"\",\n \" 1. Wake on a fixed interval (e.g. every 30 minutes)\",\n \" 2. Run `probe next [--json]` via its shell tool\",\n \" 3. Read and parse the output (action kind, target, skill, context commands)\",\n \" 4. Run the listed context commands to gather state\",\n \" 5. Load the listed skill and reason about next steps\",\n \" 6. Complete exactly one bounded action\",\n \" 7. End the wake cleanly\",\n \"\",\n ];\n\n if (installedFrameworks.length > 0) {\n lines.push(`Detected agent frameworks: ${installedFrameworks.join(\", \")}.`);\n lines.push(\"See the framework-specific examples below for how to wire them up.\");\n } else {\n lines.push(\"No known agent frameworks detected on this system.\");\n }\n lines.push(\"\");\n\n lines.push(\"## Framework-specific setup\");\n lines.push(\"\");\n\n if (frameworks.hermes) {\n lines.push(\"### Hermes Agent\");\n lines.push(\"\");\n lines.push(\"Hermes has native cron scheduling for agent turns:\");\n lines.push(\"\");\n lines.push(\n ` hermes cron create \"*/${input.intervalMinutes} * * * *\" \"${wakeCommand}\" --name \"ZENON ${input.agentId} wake\"`,\n );\n lines.push(\"\");\n }\n\n if (frameworks.openclaw) {\n lines.push(\"### OpenClaw\");\n lines.push(\"\");\n lines.push(\"OpenClaw has built-in cron scheduling with isolated sessions (fresh context):\");\n lines.push(\"\");\n lines.push(\" openclaw cron add \\\\\");\n lines.push(` --name \"ZENON ${input.agentId} wake\" \\\\`);\n lines.push(` --cron \"*/${input.intervalMinutes} * * * *\" \\\\`);\n lines.push(` --message \"${wakeCommand}\"`);\n lines.push(\"\");\n lines.push(\n \"Avoid HEARTBEAT.md for this workflow — it reuses the prior session's context window.\",\n );\n lines.push(\n \"Cron jobs run with a clean context, which is required for deterministic `probe next` routing.\",\n );\n lines.push(\"\");\n }\n\n if (frameworks.opencode) {\n lines.push(\"### OpenCode\");\n lines.push(\"\");\n lines.push(\n \"OpenCode does not have built-in cron scheduling, but you can trigger it externally:\",\n );\n lines.push(\"\");\n lines.push(\" # From a cron job or external scheduler\");\n lines.push(\n ` opencode run \"Run \\`probe next\\` and follow the instructions exactly. Load the listed skill. Complete the routed action.\"`,\n );\n lines.push(\"\");\n lines.push(\n \"Or use your host scheduler (crontab, systemd timer, etc.) to run the above command every 30 minutes.\",\n );\n lines.push(\"\");\n }\n\n lines.push(\"## Bring your own agent\");\n lines.push(\"\");\n lines.push(\"If your agent framework is not listed, the integration pattern is the same:\");\n lines.push(\"\");\n lines.push(\" 1. Set up a recurring trigger (cron, systemd timer, launchd, CI schedule, etc.)\");\n lines.push(\" 2. Each trigger should invoke your agent with a prompt that runs `probe next`\");\n lines.push(\" 3. The agent must read the output, load the skill, and complete one action\");\n lines.push(\"\");\n lines.push(\"## After configuring\");\n lines.push(\"\");\n lines.push(\"Once your agentic runtime is active and can run `probe next` on schedule:\");\n lines.push(\"\");\n lines.push(\" 1. Confirm scheduling in your probe config:\");\n lines.push(` echo '{\"schedulerConfirmed\":true}' > ~/.probe/config.json`);\n lines.push(\" 2. Rerun `probe onboard` to confirm and send the onboarding announcement.\");\n lines.push(\"\");\n lines.push(`Each wake cycle should run \\`probe next\\`, load the skill listed in the output,`);\n lines.push(\"and complete exactly one bounded action.\");\n\n return lines.join(\"\\n\");\n}\n","import { Buffer } from \"node:buffer\";\n\nimport { requestChallenge, exchangeToken } from \"~/utils/oidc.js\";\nimport { cacheToken } from \"~/utils/token-cache.js\";\nimport { loadWallet } from \"~/utils/wallet.js\";\n\nexport async function authenticateWallet(\n walletName: string,\n password: string,\n issuerOverride?: string,\n): Promise<{\n token: string;\n expiresAt: string;\n address: string;\n}> {\n const keyStore = await loadWallet(walletName, password);\n const keyPair = keyStore.getKeyPair(0);\n const address = keyPair.getAddress().toString();\n const publicKey = keyPair.getPublicKey();\n\n const challenge = await requestChallenge(address, issuerOverride);\n const signature = keyPair.sign(Buffer.from(challenge.challenge));\n\n const tokenResponse = await exchangeToken(\n address,\n publicKey.toString(\"hex\"),\n signature.toString(\"hex\"),\n challenge.nonce,\n issuerOverride,\n );\n\n const expiresAt = new Date(Date.now() + tokenResponse.expiresIn * 1000).toISOString();\n\n await cacheToken(walletName, tokenResponse.accessToken, expiresAt);\n\n return {\n token: tokenResponse.accessToken,\n expiresAt,\n address,\n };\n}\n","import { execSync } from \"node:child_process\";\n\nexport interface SkillsResult {\n installed: boolean;\n detail: string;\n recovery?: string;\n}\n\nexport async function installSkills(): Promise<SkillsResult> {\n if (!commandExists(\"npx\")) {\n return {\n installed: false,\n detail: \"npx not found in PATH\",\n recovery: \"Install Node.js/npm to enable skills installation\",\n };\n }\n try {\n execSync(\"npx skills list -g\", { stdio: \"ignore\", timeout: 30000 });\n } catch {\n return {\n installed: false,\n detail: \"skills CLI not available\",\n recovery: \"Run: npm install -g @zenon-red/skills-cli\",\n };\n }\n try {\n execSync(\"npx skills add zenon-red/skills --skill='*' -y -g\", {\n stdio: \"ignore\",\n timeout: 120000,\n });\n return {\n installed: true,\n detail: \"Installed zenon-red/skills globally\",\n };\n } catch {\n return {\n installed: false,\n detail: \"skills add command failed\",\n recovery: \"Run manually: npx skills add zenon-red/skills --skill='*' -y -g\",\n };\n }\n}\n\nexport async function verifySkills(): Promise<SkillsResult> {\n if (!commandExists(\"npx\")) {\n return {\n installed: false,\n detail: \"npx not found in PATH\",\n };\n }\n try {\n execSync(\"npx skills list -g\", { stdio: \"ignore\", timeout: 30000 });\n return {\n installed: true,\n detail: \"skills CLI available\",\n };\n } catch {\n return {\n installed: false,\n detail: \"skills CLI not available or empty\",\n recovery: \"Run: npx skills add zenon-red/skills --skill='*' -y -g\",\n };\n }\n}\n\nfunction commandExists(cmd: string): boolean {\n try {\n execSync(`command -v ${cmd}`, { stdio: \"ignore\", timeout: 5000 });\n return true;\n } catch {\n return false;\n }\n}\n","import { execSync } from \"node:child_process\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport interface DaemonAdapter {\n id: string;\n displayName: string;\n detectAvailable(): Promise<boolean>;\n install(config: DaemonConfig): Promise<DaemonResult>;\n verify(): Promise<DaemonVerifyResult>;\n}\n\nexport interface DaemonConfig {\n wallet: string;\n host?: string;\n module?: string;\n}\n\nexport interface DaemonResult {\n success: boolean;\n detail: string;\n}\n\nexport interface DaemonVerifyResult {\n active: boolean;\n detail: string;\n}\n\nfunction commandExists(cmd: string): boolean {\n try {\n execSync(`command -v ${cmd}`, { stdio: \"ignore\", timeout: 5000 });\n return true;\n } catch {\n return false;\n }\n}\n\nconst systemdAdapter: DaemonAdapter = {\n id: \"systemd\",\n displayName: \"systemd user service\",\n async detectAvailable() {\n return commandExists(\"systemctl\");\n },\n async install(config) {\n const home = homedir();\n const serviceDir = join(home, \".config\", \"systemd\", \"user\");\n const servicePath = join(serviceDir, \"probe-nexus.service\");\n const probePath = execSync(\"command -v probe\", {\n encoding: \"utf-8\",\n timeout: 5000,\n }).trim();\n const hostLine = config.host ? `Environment=PROBE_SPACETIME_HOST=${config.host}` : \"\";\n const moduleLine = config.module ? `Environment=PROBE_SPACETIME_MODULE=${config.module}` : \"\";\n const service = `[Unit]\nDescription=Probe Nexus daemon\nAfter=network-online.target\n\n[Service]\nType=simple\nExecStart=${probePath} nexus --wallet ${config.wallet}\nRestart=always\nRestartSec=3\n${hostLine}\n${moduleLine}\n\n[Install]\nWantedBy=default.target\n`;\n await mkdir(serviceDir, { recursive: true });\n await writeFile(servicePath, service, { mode: 0o644 });\n try {\n execSync(\"systemctl --user daemon-reload\", {\n stdio: \"ignore\",\n timeout: 10000,\n });\n execSync(\"systemctl --user enable probe-nexus\", {\n stdio: \"ignore\",\n timeout: 10000,\n });\n execSync(\"systemctl --user start probe-nexus\", {\n stdio: \"ignore\",\n timeout: 10000,\n });\n } catch {\n return {\n success: false,\n detail: \"Service file written but systemctl failed\",\n };\n }\n return {\n success: true,\n detail: \"systemd user service installed and started\",\n };\n },\n async verify() {\n try {\n execSync(\"systemctl --user is-active probe-nexus\", {\n stdio: \"ignore\",\n timeout: 5000,\n });\n return { active: true, detail: \"systemd user service active\" };\n } catch {\n return {\n active: false,\n detail: \"systemd user service not active\",\n };\n }\n },\n};\n\nconst launchdAdapter: DaemonAdapter = {\n id: \"launchd\",\n displayName: \"launchd (macOS)\",\n async detectAvailable() {\n return process.platform === \"darwin\" && commandExists(\"launchctl\");\n },\n async install(config) {\n const home = homedir();\n const plistDir = join(home, \"Library\", \"LaunchAgents\");\n const plistPath = join(plistDir, \"com.zenon.probe-nexus.plist\");\n const probePath = execSync(\"command -v probe\", {\n encoding: \"utf-8\",\n timeout: 5000,\n }).trim();\n const envLines: string[] = [];\n if (config.host) {\n envLines.push(\"<key>PROBE_SPACETIME_HOST</key>\", `<string>${config.host}</string>`);\n }\n if (config.module) {\n envLines.push(\"<key>PROBE_SPACETIME_MODULE</key>\", `<string>${config.module}</string>`);\n }\n const envBlock = envLines.length\n ? `<key>EnvironmentVariables</key>\\n\\t<dict>\\n\\t\\t${envLines.join(\"\\n\\t\\t\")}\\n\\t</dict>`\n : \"\";\n const plist = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>Label</key>\n\t<string>com.zenon.probe-nexus</string>\n\t<key>ProgramArguments</key>\n\t<array>\n\t\t<string>${probePath}</string>\n\t\t<string>nexus</string>\n\t\t<string>--wallet</string>\n\t\t<string>${config.wallet}</string>\n\t</array>\n\t<key>RunAtLoad</key>\n\t<true/>\n\t<key>KeepAlive</key>\n\t<true/>\n\t<key>StandardOutPath</key>\n\t<string>${home}/Library/Logs/probe-nexus.log</string>\n\t<key>StandardErrorPath</key>\n\t<string>${home}/Library/Logs/probe-nexus.log</string>\n\t${envBlock}\n</dict>\n</plist>`;\n await mkdir(plistDir, { recursive: true });\n await writeFile(plistPath, plist, { mode: 0o644 });\n try {\n execSync(\"launchctl bootstrap gui/$(id -u) \" + plistPath, {\n stdio: \"ignore\",\n timeout: 10000,\n });\n execSync(\"launchctl enable gui/$(id -u)/com.zenon.probe-nexus\", {\n stdio: \"ignore\",\n timeout: 10000,\n });\n execSync(\"launchctl kickstart -k gui/$(id -u)/com.zenon.probe-nexus\", {\n stdio: \"ignore\",\n timeout: 10000,\n });\n } catch {\n return {\n success: false,\n detail: \"Plist written but launchctl failed\",\n };\n }\n return {\n success: true,\n detail: \"launchd agent installed and started\",\n };\n },\n async verify() {\n try {\n execSync(\"launchctl print gui/$(id -u)/com.zenon.probe-nexus\", {\n stdio: \"ignore\",\n timeout: 5000,\n });\n return { active: true, detail: \"launchd agent active\" };\n } catch {\n return { active: false, detail: \"launchd agent not active\" };\n }\n },\n};\n\nconst tmuxAdapter: DaemonAdapter = {\n id: \"tmux\",\n displayName: \"tmux session\",\n async detectAvailable() {\n return commandExists(\"tmux\");\n },\n async install(config) {\n try {\n execSync(\n `tmux has-session -t nexus 2>/dev/null || tmux new-session -d -s nexus \"probe nexus --wallet ${config.wallet}\"`,\n { stdio: \"ignore\", timeout: 10000 },\n );\n return {\n success: true,\n detail: \"tmux session 'nexus' created\",\n };\n } catch {\n return {\n success: false,\n detail: \"tmux session creation failed\",\n };\n }\n },\n async verify() {\n try {\n execSync(\"tmux has-session -t nexus\", {\n stdio: \"ignore\",\n timeout: 5000,\n });\n return { active: true, detail: \"tmux session 'nexus' exists\" };\n } catch {\n return { active: false, detail: \"tmux session 'nexus' not found\" };\n }\n },\n};\n\nconst dockerAdapter: DaemonAdapter = {\n id: \"docker\",\n displayName: \"Docker container\",\n async detectAvailable() {\n return commandExists(\"docker\");\n },\n async install(_config) {\n return {\n success: false,\n detail: \"Docker daemon not implemented in MVP; use manual setup\",\n };\n },\n async verify() {\n try {\n const names = execSync('docker ps --filter \"name=probe-nexus\" --format \"{{.Names}}\"', {\n encoding: \"utf-8\",\n timeout: 10000,\n }).trim();\n if (!names.split(\"\\n\").includes(\"probe-nexus\")) {\n return {\n active: false,\n detail: \"Docker container probe-nexus not found\",\n };\n }\n return { active: true, detail: \"Docker container probe-nexus running\" };\n } catch {\n return {\n active: false,\n detail: \"Docker container probe-nexus not found\",\n };\n }\n },\n};\n\nconst statelessAdapter: DaemonAdapter = {\n id: \"stateless\",\n displayName: \"Stateless\",\n async detectAvailable() {\n return true;\n },\n async install() {\n return {\n success: true,\n detail: \"Stateless mode selected (no persistent daemon)\",\n };\n },\n async verify() {\n return {\n active: false,\n detail: \"Stateless mode (no persistent daemon)\",\n };\n },\n};\n\nexport const daemonAdapters: DaemonAdapter[] = [\n systemdAdapter,\n launchdAdapter,\n tmuxAdapter,\n dockerAdapter,\n statelessAdapter,\n];\n\nexport async function detectDaemon(): Promise<DaemonAdapter> {\n for (const adapter of daemonAdapters) {\n if (adapter.id === \"stateless\") continue;\n if (await adapter.detectAvailable()) {\n return adapter;\n }\n }\n return statelessAdapter;\n}\n","import { execFileSync, execSync } from \"node:child_process\";\nimport { access } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { loadUserConfig } from \"~/utils/user-config.js\";\n\nexport interface ScheduleInput {\n agentId: string;\n role: string;\n intervalMinutes: number;\n prompt: string;\n}\n\nexport interface ScheduleResult {\n success: boolean;\n mode: \"managed\" | \"file\" | \"manual\";\n detail: string;\n}\n\nexport interface ScheduleVerifyResult {\n configured: boolean;\n detail: string;\n}\n\nexport interface SchedulerAdapter {\n supported: boolean;\n mode: \"managed\" | \"file\" | \"manual\";\n configure(input: ScheduleInput): Promise<ScheduleResult>;\n verify(): Promise<ScheduleVerifyResult>;\n}\n\nexport interface RuntimeAdapter {\n id: string;\n displayName: string;\n detectCurrent(): Promise<boolean>;\n detectInstalled(): Promise<boolean>;\n scheduler: SchedulerAdapter;\n}\n\nasync function pathExists(p: string): Promise<boolean> {\n try {\n await access(p);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction commandExists(cmd: string): boolean {\n try {\n execSync(`command -v ${cmd}`, { stdio: \"ignore\", timeout: 5000 });\n return true;\n } catch {\n return false;\n }\n}\n\nconst hermesScheduler: SchedulerAdapter = {\n supported: true,\n mode: \"managed\",\n async configure(input) {\n if (!commandExists(\"hermes\")) {\n return {\n success: false,\n mode: \"manual\",\n detail: \"hermes CLI not found in PATH\",\n };\n }\n try {\n const cronExpr = `*/${input.intervalMinutes} * * * *`;\n const message =\n \"Load and internalize the skill zr-nexus-primer. Execute probe next and follow its instructions exactly.\";\n execFileSync(\n \"hermes\",\n [\"cron\", \"create\", cronExpr, message, \"--name\", `ZENON ${input.agentId} wake`],\n {\n stdio: \"ignore\",\n timeout: 15000,\n },\n );\n return {\n success: true,\n mode: \"managed\",\n detail: `Created hermes cron job for ${input.agentId}`,\n };\n } catch {\n return {\n success: false,\n mode: \"manual\",\n detail: \"hermes cron create failed\",\n };\n }\n },\n async verify() {\n if (!commandExists(\"hermes\")) {\n return { configured: false, detail: \"hermes CLI not found\" };\n }\n try {\n execSync(\"hermes cron list\", { stdio: \"ignore\", timeout: 10000 });\n return { configured: true, detail: \"hermes cron list succeeded\" };\n } catch {\n return { configured: false, detail: \"hermes cron list failed\" };\n }\n },\n};\n\nconst openclawScheduler: SchedulerAdapter = {\n supported: true,\n mode: \"managed\",\n async configure(input) {\n if (!commandExists(\"openclaw\")) {\n return {\n success: false,\n mode: \"manual\",\n detail: \"openclaw CLI not found in PATH\",\n };\n }\n try {\n const cronExpr = `*/${input.intervalMinutes} * * * *`;\n const message =\n \"Load and internalize the skill zr-nexus-primer. Execute probe next and follow its instructions exactly.\";\n execFileSync(\n \"openclaw\",\n [\n \"cron\",\n \"add\",\n \"--name\",\n `ZENON ${input.agentId} wake`,\n \"--cron\",\n cronExpr,\n \"--message\",\n message,\n ],\n { stdio: \"ignore\", timeout: 15000 },\n );\n return {\n success: true,\n mode: \"managed\",\n detail: `Created openclaw cron job for ${input.agentId}`,\n };\n } catch {\n return {\n success: false,\n mode: \"manual\",\n detail: \"openclaw cron add failed\",\n };\n }\n },\n async verify() {\n if (!commandExists(\"openclaw\")) {\n return { configured: false, detail: \"openclaw CLI not found\" };\n }\n try {\n execSync(\"openclaw cron list\", { stdio: \"ignore\", timeout: 10000 });\n return { configured: true, detail: \"openclaw cron list succeeded\" };\n } catch {\n return { configured: false, detail: \"openclaw cron list failed\" };\n }\n },\n};\n\nconst universalScheduler: SchedulerAdapter = {\n supported: false,\n mode: \"manual\",\n async configure(_input) {\n const config = await loadUserConfig();\n if (config.schedulerConfirmed) {\n return {\n success: true,\n mode: \"manual\",\n detail: \"Scheduler manually confirmed (config.json)\",\n };\n }\n return {\n success: false,\n mode: \"manual\",\n detail: \"Universal runtime — agentic scheduler setup required\",\n };\n },\n async verify() {\n const config = await loadUserConfig();\n if (config.schedulerConfirmed) {\n return {\n configured: true,\n detail: \"Scheduler manually confirmed (config.json)\",\n };\n }\n return {\n configured: false,\n detail: \"Universal runtime — agentic scheduler setup required\",\n };\n },\n};\n\nexport const runtimeAdapters: RuntimeAdapter[] = [\n {\n id: \"hermes\",\n displayName: \"Hermes Agent\",\n async detectCurrent() {\n return !!process.env.HERMES_HOME || process.argv.some((a) => a.includes(\"hermes\"));\n },\n async detectInstalled() {\n return (await pathExists(join(homedir(), \".hermes\"))) || commandExists(\"hermes\");\n },\n scheduler: hermesScheduler,\n },\n {\n id: \"openclaw\",\n displayName: \"OpenClaw\",\n async detectCurrent() {\n return !!process.env.OPENCLAW_HOME || process.argv.some((a) => a.includes(\"openclaw\"));\n },\n async detectInstalled() {\n return (await pathExists(join(homedir(), \".openclaw\"))) || commandExists(\"openclaw\");\n },\n scheduler: openclawScheduler,\n },\n {\n id: \"universal\",\n displayName: \"Universal\",\n async detectCurrent() {\n return true; // fallback\n },\n async detectInstalled() {\n return true; // always available\n },\n scheduler: universalScheduler,\n },\n];\n\nexport async function detectRuntime(): Promise<RuntimeAdapter> {\n for (const adapter of runtimeAdapters) {\n if (await adapter.detectCurrent()) {\n return adapter;\n }\n }\n for (const adapter of runtimeAdapters) {\n if (await adapter.detectInstalled()) {\n return adapter;\n }\n }\n return runtimeAdapters[runtimeAdapters.length - 1]; // universal\n}\n","import { execSync } from \"node:child_process\";\nimport { access, mkdir, readFile, unlink, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { callReducer, type Agent, withAuth } from \"~/utils/context.js\";\nimport { AgentRole } from \"~/utils/enums.js\";\nimport { createWallet, getWalletInfo, walletExists } from \"~/utils/wallet.js\";\nimport { authenticateWallet } from \"~/utils/auth-flow.js\";\nimport { installSkills } from \"~/utils/skills-install.js\";\nimport { daemonAdapters, detectDaemon, type DaemonAdapter } from \"~/utils/daemon.js\";\nimport { detectRuntime, runtimeAdapters } from \"~/utils/runtime-detection.js\";\nimport { runHealthChecks } from \"~/utils/health.js\";\nimport { loadUserConfig, saveUserConfig } from \"~/utils/user-config.js\";\nimport type { OnboardStep } from \"./types.js\";\n\nexport interface OnboardState {\n args: {\n name: string;\n \"agent-id\"?: string;\n role: string;\n wallet?: string;\n host?: string;\n module?: string;\n \"password-file\"?: string;\n capabilities?: string;\n bio?: string;\n daemon: string;\n scheduler: string;\n \"dry-run\": boolean;\n json: boolean;\n };\n agentId: string;\n role: string;\n walletName: string;\n walletAddress: string;\n passwordFile: string;\n token: string;\n walletCreated: boolean;\n mnemonic: string;\n steps: OnboardStep[];\n}\n\nexport function addStep(\n state: OnboardState,\n step: string,\n status: OnboardStep[\"status\"],\n detail: string,\n): void {\n const existing = state.steps.findIndex((s) => s.step === step);\n if (existing !== -1) {\n state.steps[existing] = { step, status, detail };\n } else {\n state.steps.push({ step, status, detail });\n }\n}\n\nexport async function verifyHome(state: OnboardState): Promise<boolean> {\n const probeHome = join(homedir(), \".probe\");\n try {\n await mkdir(probeHome, { recursive: true });\n const testFile = join(probeHome, \".write_test\");\n await writeFile(testFile, \"\", { mode: 0o600 });\n await access(testFile);\n await unlink(testFile);\n addStep(state, \"home\", \"pass\", `${probeHome} is writable`);\n return true;\n } catch {\n addStep(state, \"home\", \"fail\", `${probeHome} is not writable`);\n return false;\n }\n}\n\nexport function randomPassword(): string {\n const chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*\";\n let pass = \"\";\n for (let i = 0; i < 32; i++) {\n pass += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n return pass;\n}\n\nexport async function resolveIdentity(state: OnboardState): Promise<boolean> {\n let agentId = state.args[\"agent-id\"];\n let role = state.args.role || \"auto\";\n let ghAvailable = false;\n try {\n execSync(\"gh auth status\", { stdio: \"ignore\", timeout: 10000 });\n ghAvailable = true;\n addStep(state, \"github\", \"pass\", \"gh CLI authenticated\");\n } catch {\n addStep(state, \"github\", \"warn\", \"gh CLI not available or not authenticated\");\n }\n\n if (!agentId && ghAvailable) {\n try {\n agentId = execSync(\"gh api user --jq .login\", {\n encoding: \"utf-8\",\n timeout: 10000,\n }).trim();\n addStep(state, \"agent_id\", \"pass\", `Resolved GitHub username: ${agentId}`);\n } catch {\n addStep(state, \"agent_id\", \"fail\", \"Could not resolve GitHub username\");\n }\n }\n\n if (!agentId) {\n addStep(\n state,\n \"agent_id\",\n \"fail\",\n \"GitHub CLI not available or not authenticated. Run gh auth login, or pass --agent-id <username> --role zeno explicitly.\",\n );\n return false;\n }\n\n if (role === \"auto\") {\n let isMember = false;\n if (ghAvailable) {\n try {\n const orgs = execSync(\"gh org list\", {\n encoding: \"utf-8\",\n timeout: 10000,\n });\n isMember = orgs.includes(\"zenon-red\");\n } catch {\n // ignore\n }\n }\n role = isMember ? \"zoe\" : \"zeno\";\n addStep(\n state,\n \"role\",\n \"pass\",\n `Auto-detected role: ${role} (${isMember ? \"zenon-red org member\" : \"not a member\"})`,\n );\n } else {\n addStep(state, \"role\", \"pass\", `Explicit role: ${role}`);\n }\n\n state.agentId = agentId;\n state.role = role;\n state.walletName = state.args.wallet || agentId;\n state.passwordFile =\n state.args[\"password-file\"] || join(homedir(), \".probe\", \"wallets\", `${state.walletName}.pass`);\n return true;\n}\n\nexport async function createWalletStep(state: OnboardState): Promise<void> {\n if (await walletExists(state.walletName)) {\n const info = await getWalletInfo(state.walletName);\n state.walletAddress = info?.address || \"\";\n addStep(state, \"wallet\", \"pass\", `Wallet ${state.walletName} exists`);\n } else {\n if (state.args[\"dry-run\"]) {\n addStep(state, \"wallet\", \"skip\", \"Would create wallet (dry-run)\");\n } else {\n const password = randomPassword();\n await mkdir(join(homedir(), \".probe\", \"wallets\"), { recursive: true });\n await writeFile(state.passwordFile, password, { mode: 0o600 });\n const result = await createWallet(state.walletName, password);\n state.walletAddress = result.address;\n state.mnemonic = result.mnemonic;\n state.walletCreated = true;\n addStep(state, \"wallet\", \"pass\", `Created wallet ${state.walletName} at ${result.address}`);\n }\n }\n}\n\nexport async function verifyPasswordFile(state: OnboardState): Promise<void> {\n try {\n await access(state.passwordFile);\n addStep(state, \"password_file\", \"pass\", state.passwordFile);\n } catch {\n addStep(state, \"password_file\", \"skip\", \"Not provided\");\n }\n}\n\nexport async function setDefaultWallet(state: OnboardState): Promise<void> {\n const userConfig = await loadUserConfig();\n if (userConfig.defaultWallet === state.walletName) {\n addStep(state, \"default_wallet\", \"pass\", `${state.walletName} already default`);\n } else if (state.args[\"dry-run\"]) {\n addStep(state, \"default_wallet\", \"skip\", `Would set ${state.walletName} as default`);\n } else {\n userConfig.defaultWallet = state.walletName;\n await saveUserConfig(userConfig);\n addStep(state, \"default_wallet\", \"pass\", `Set ${state.walletName} as default`);\n }\n}\n\nexport async function authenticateStep(state: OnboardState): Promise<boolean> {\n if (state.args[\"dry-run\"]) {\n addStep(state, \"auth\", \"skip\", \"Would authenticate (dry-run)\");\n return true;\n }\n try {\n const pass = (await readFile(state.passwordFile, \"utf-8\")).trim();\n const authResult = await authenticateWallet(state.walletName, pass);\n state.token = authResult.token;\n addStep(state, \"auth\", \"pass\", \"Token cached\");\n return true;\n } catch (err) {\n addStep(state, \"auth\", \"fail\", err instanceof Error ? err.message : \"Authentication failed\");\n return false;\n }\n}\n\nexport function formatDisplayName(name: string, role: string): string {\n if (role === \"zeno\" && !name.startsWith(\"Zeno of \")) {\n return `Zeno of ${name}`;\n }\n return name;\n}\n\nexport async function registerAgentStep(state: OnboardState): Promise<boolean> {\n if (state.args[\"dry-run\"]) {\n addStep(state, \"registration\", \"skip\", \"Would register agent (dry-run)\");\n return true;\n }\n try {\n await withAuth(\n {\n wallet: state.walletName,\n token: state.token,\n host: state.args.host,\n module: state.args.module,\n },\n async (ctx) => {\n const existing = ctx\n .iter<Agent>(\"agents\")\n .find((a) => a.identity.toHexString() === ctx.identity?.toHexString());\n if (existing) {\n addStep(state, \"registration\", \"pass\", `Agent ${existing.id} already registered`);\n return;\n }\n await callReducer(ctx, \"registerAgent\", {\n agentId: state.agentId,\n name: formatDisplayName(state.args.name, state.role),\n role: AgentRole.fromString(state.role),\n zenonAddress: state.walletAddress,\n });\n await new Promise((r) => setTimeout(r, 500));\n const registered = ctx.iter<Agent>(\"agents\").find((a) => a.id === state.agentId);\n if (!registered) {\n if (state.role === \"zoe\" || state.role === \"admin\") {\n addStep(\n state,\n \"registration\",\n \"fail\",\n \"Only whitelisted identities can register as zoe or admin\",\n );\n } else {\n addStep(state, \"registration\", \"fail\", \"Registration failed\");\n }\n } else {\n addStep(\n state,\n \"registration\",\n \"pass\",\n `Agent ${state.agentId} registered as ${state.role}`,\n );\n }\n },\n );\n return !state.steps.some((s) => s.step === \"registration\" && s.status === \"fail\");\n } catch (err) {\n addStep(\n state,\n \"registration\",\n \"fail\",\n err instanceof Error ? err.message : \"Registration failed\",\n );\n return false;\n }\n}\n\nexport async function setBioStep(state: OnboardState): Promise<void> {\n if (!state.args.bio) {\n addStep(state, \"bio\", \"skip\", \"Not provided\");\n return;\n }\n if (state.args[\"dry-run\"]) {\n addStep(state, \"bio\", \"skip\", \"Would set bio (dry-run)\");\n return;\n }\n try {\n await withAuth(\n {\n wallet: state.walletName,\n token: state.token,\n host: state.args.host,\n module: state.args.module,\n },\n async (ctx) => {\n await callReducer(ctx, \"updateAgentBio\", { bio: state.args.bio });\n },\n );\n addStep(state, \"bio\", \"pass\", \"Bio set\");\n } catch {\n addStep(state, \"bio\", \"warn\", \"Failed to set bio\");\n }\n}\n\nexport async function setCapabilitiesStep(state: OnboardState): Promise<void> {\n if (!state.args.capabilities) {\n addStep(state, \"capabilities\", \"skip\", \"Not provided\");\n return;\n }\n if (state.args[\"dry-run\"]) {\n addStep(state, \"capabilities\", \"skip\", \"Would set capabilities (dry-run)\");\n return;\n }\n try {\n const caps = [\n ...new Set(\n state.args.capabilities\n .split(\",\")\n .map((c) => c.trim().toLowerCase())\n .filter(Boolean),\n ),\n ];\n await withAuth(\n {\n wallet: state.walletName,\n token: state.token,\n host: state.args.host,\n module: state.args.module,\n },\n async (ctx) => {\n await callReducer(ctx, \"updateAgentCapabilities\", {\n capabilities: caps,\n });\n },\n );\n addStep(state, \"capabilities\", \"pass\", `Capabilities: ${caps.join(\", \")}`);\n } catch {\n addStep(state, \"capabilities\", \"warn\", \"Failed to set capabilities\");\n }\n}\n\nexport async function createWorkspace(state: OnboardState): Promise<void> {\n const workspaceDir = join(homedir(), \"zr-workspace\");\n const zrmdPath = join(workspaceDir, \"ZR.md\");\n try {\n await access(zrmdPath);\n addStep(state, \"workspace\", \"pass\", `${zrmdPath} exists`);\n } catch {\n if (state.args[\"dry-run\"]) {\n addStep(state, \"workspace\", \"skip\", `Would create ${zrmdPath}`);\n } else {\n await mkdir(workspaceDir, { recursive: true });\n const content = `# ZR\n\n## Identity\n- Agent: ${state.agentId}\n- Role: ${state.role}\n- Wallet: ${state.walletName}\n- Password: stored at ${state.passwordFile}\n\n## On Wake\n\n## Recent Activity\n`;\n await writeFile(zrmdPath, content);\n addStep(state, \"workspace\", \"pass\", `Created ${zrmdPath}`);\n }\n }\n}\n\nexport async function installSkillsStep(state: OnboardState): Promise<void> {\n if (state.args[\"dry-run\"]) {\n addStep(state, \"skills\", \"skip\", \"Would install skills (dry-run)\");\n return;\n }\n const skillsResult = await installSkills();\n addStep(state, \"skills\", skillsResult.installed ? \"pass\" : \"warn\", skillsResult.detail);\n}\n\nexport async function configureDaemon(state: OnboardState): Promise<void> {\n let daemonAdapter: DaemonAdapter;\n if (state.args.daemon && state.args.daemon !== \"auto\") {\n daemonAdapter =\n daemonAdapters.find((a) => a.id === state.args.daemon) ||\n daemonAdapters[daemonAdapters.length - 1];\n } else {\n daemonAdapter = await detectDaemon();\n }\n\n if (state.args[\"dry-run\"]) {\n addStep(\n state,\n \"daemon\",\n \"skip\",\n `Would configure ${daemonAdapter.displayName} daemon (dry-run)`,\n );\n return;\n }\n\n if (daemonAdapter.id === \"stateless\") {\n addStep(state, \"daemon\", \"pass\", \"Stateless mode configured\");\n } else {\n const result = await daemonAdapter.install({\n wallet: state.walletName,\n host: state.args.host,\n module: state.args.module,\n });\n addStep(state, \"daemon\", result.success ? \"pass\" : \"warn\", result.detail);\n }\n}\n\nexport async function configureScheduler(state: OnboardState): Promise<void> {\n let runtime = await detectRuntime();\n const schedulerArg = state.args.scheduler;\n\n if (schedulerArg === \"manual\") {\n runtime = runtimeAdapters.find((r) => r.id === \"universal\") ?? runtime;\n } else if (schedulerArg === \"managed\") {\n if (runtime.id === \"universal\") {\n addStep(\n state,\n \"scheduler\",\n \"manual_required\",\n \"No managed runtime detected (hermes/openclaw)\",\n );\n return;\n }\n }\n\n if (state.args[\"dry-run\"]) {\n addStep(\n state,\n \"scheduler\",\n \"skip\",\n `Would configure ${runtime.displayName} scheduler (dry-run)`,\n );\n return;\n }\n const scheduleResult = await runtime.scheduler.configure({\n agentId: state.agentId,\n role: state.role,\n intervalMinutes: 30,\n prompt: `Run probe next and follow its instructions exactly.`,\n });\n addStep(\n state,\n \"scheduler\",\n scheduleResult.success ? \"pass\" : scheduleResult.mode === \"manual\" ? \"manual_required\" : \"warn\",\n scheduleResult.detail,\n );\n}\n\nexport async function sendAnnouncement(state: OnboardState): Promise<void> {\n const schedulerStep = state.steps.find((s) => s.step === \"scheduler\");\n const schedulerOk = schedulerStep?.status === \"pass\";\n const explicitManual = state.args.scheduler === \"manual\";\n if (state.args[\"dry-run\"]) {\n addStep(state, \"announcement\", \"skip\", \"Would send general announcement (dry-run)\");\n return;\n }\n if (!schedulerOk && !explicitManual) {\n addStep(state, \"announcement\", \"skip\", \"Skipped until scheduler is confirmed\");\n return;\n }\n try {\n await withAuth(\n {\n wallet: state.walletName,\n token: state.token,\n host: state.args.host,\n module: state.args.module,\n },\n async (ctx) => {\n const channels = ctx.iter<{ id: bigint; name: string }>(\"channels\");\n const general = channels.find((c) => c.name === \"general\");\n if (!general) return;\n await callReducer(ctx, \"sendMessage\", {\n channelId: general.id,\n content: `Hi! I'm ${state.args.name}, ready to contribute.`,\n messageType: { tag: \"User\" },\n contextId: `onboard:${state.agentId}`,\n });\n },\n );\n addStep(state, \"announcement\", \"pass\", \"One-time general announcement sent\");\n } catch {\n addStep(state, \"announcement\", \"warn\", \"Failed to send announcement\");\n }\n}\n\nexport async function runVerification(state: OnboardState): Promise<void> {\n const health = await runHealthChecks({\n wallet: state.walletName,\n host: state.args.host,\n module: state.args.module,\n includeAgent: true,\n });\n addStep(\n state,\n \"doctor\",\n health.ok ? \"pass\" : \"warn\",\n `wallet/auth/nexus ${health.ok ? \"ok\" : \"issues detected\"}`,\n );\n}\n","import { defineCommand } from \"citty\";\nimport { log } from \"@clack/prompts\";\nimport { forceHelpRequested, printHelp } from \"~/utils/help.js\";\nimport { error, info, isJsonMode, note, setJsonMode, success, warning } from \"~/utils/output.js\";\nimport { buildAgenticRuntimePlan } from \"~/utils/scheduler-plans.js\";\nimport type { OnboardStep } from \"~/utils/onboard/types.js\";\nimport {\n authenticateStep,\n configureDaemon,\n configureScheduler,\n createWalletStep,\n createWorkspace,\n installSkillsStep,\n registerAgentStep,\n resolveIdentity,\n runVerification,\n sendAnnouncement,\n setBioStep,\n setCapabilitiesStep,\n setDefaultWallet,\n verifyHome,\n verifyPasswordFile,\n} from \"~/utils/onboard/steps.js\";\n\nexport default defineCommand({\n meta: {\n name: \"onboard\",\n description: \"Idempotent agent setup for wallet, auth, registration, and scheduled wakes\",\n },\n args: {\n name: {\n type: \"string\",\n description: \"Agent display name (required)\",\n required: false,\n },\n \"agent-id\": {\n type: \"string\",\n description: \"GitHub username / agent ID override\",\n },\n role: {\n type: \"string\",\n description: \"Role: auto, zeno, zoe, admin\",\n default: \"auto\",\n },\n wallet: {\n type: \"string\",\n description: \"Wallet name override\",\n },\n host: {\n type: \"string\",\n description: \"SpacetimeDB host override\",\n },\n module: {\n type: \"string\",\n description: \"SpacetimeDB module override\",\n },\n \"password-file\": {\n type: \"string\",\n description: \"Path to wallet password file\",\n },\n capabilities: {\n type: \"string\",\n description: \"Comma-separated capabilities\",\n },\n bio: {\n type: \"string\",\n description: \"Agent bio\",\n },\n daemon: {\n type: \"string\",\n description: \"Daemon: auto, systemd, tmux, docker, stateless\",\n default: \"auto\",\n },\n scheduler: {\n type: \"string\",\n description: \"Scheduler: auto, managed, manual\",\n default: \"auto\",\n },\n \"dry-run\": {\n type: \"boolean\",\n description: \"Print plan without side effects\",\n default: false,\n },\n json: {\n type: \"boolean\",\n description: \"Output JSON only\",\n default: false,\n },\n },\n async run({ args }) {\n if (args.json) setJsonMode(true);\n\n const allowedSchedulers = new Set([\"auto\", \"managed\", \"manual\"]);\n if (!allowedSchedulers.has(String(args.scheduler))) {\n error(\n \"INVALID_SCHEDULER\",\n `Invalid --scheduler value: ${args.scheduler}`,\n \"Use one of: auto, managed, manual\",\n );\n }\n\n if (forceHelpRequested() || !args.name) {\n printHelp({\n command: \"probe onboard\",\n description: \"Complete required local and Nexus setup for autonomous participation\",\n usage: [\n 'probe onboard --name \"Alpha Centauri\"',\n 'probe onboard --name \"Alpha Centauri\" --role zeno --dry-run',\n ],\n options: [\n { name: \"--name\", detail: \"Required display name\" },\n { name: \"--agent-id\", detail: \"GitHub username override\" },\n { name: \"--role\", detail: \"auto | zeno | zoe | admin (default: auto)\" },\n { name: \"--wallet\", detail: \"Wallet name\" },\n { name: \"--host, --module\", detail: \"SpacetimeDB overrides\" },\n { name: \"--password-file\", detail: \"Path to password file\" },\n { name: \"--capabilities\", detail: \"Comma-separated list\" },\n { name: \"--bio\", detail: \"Agent bio text\" },\n { name: \"--daemon\", detail: \"auto | systemd | tmux | docker | stateless\" },\n { name: \"--scheduler\", detail: \"auto | managed | manual\" },\n { name: \"--dry-run\", detail: \"Plan only, no side effects\" },\n { name: \"--json\", detail: \"JSON output\" },\n ],\n });\n if (!args.name) {\n error(\n \"NAME_REQUIRED\",\n \"--name is required. Example: probe onboard --name 'Alpha Centauri'\",\n );\n }\n return;\n }\n\n const steps: OnboardStep[] = [];\n const state = {\n args: args as unknown as Parameters<typeof resolveIdentity>[0][\"args\"],\n agentId: \"\",\n role: \"\",\n walletName: \"\",\n walletAddress: \"\",\n passwordFile: \"\",\n token: \"\",\n walletCreated: false,\n mnemonic: \"\",\n steps,\n };\n\n // 1. Verify writable home\n if (!(await verifyHome(state))) {\n finish(state);\n return;\n }\n\n // 2-3. GitHub CLI + identity + role\n if (!(await resolveIdentity(state))) {\n finish(state);\n return;\n }\n\n // 4. Wallet\n await createWalletStep(state);\n\n // 5. Password file\n await verifyPasswordFile(state);\n\n // 6. Default wallet\n await setDefaultWallet(state);\n\n // 7. Auth\n if (!(await authenticateStep(state))) {\n finish(state);\n return;\n }\n\n // 8. Registration\n if (!(await registerAgentStep(state))) {\n finish(state);\n return;\n }\n\n // 9. Bio\n await setBioStep(state);\n\n // 10. Capabilities\n await setCapabilitiesStep(state);\n\n // 11. ZR.md\n await createWorkspace(state);\n\n // 12. Skills\n await installSkillsStep(state);\n\n // 13. Daemon\n await configureDaemon(state);\n\n // 14. Scheduler\n await configureScheduler(state);\n\n // 15. Announcement\n await sendAnnouncement(state);\n\n // 16. Verification\n await runVerification(state);\n\n finish(state);\n\n function finish(s: typeof state) {\n const hasFail = s.steps.some((st) => st.status === \"fail\");\n const hasManualRequired = s.steps.some((st) => st.status === \"manual_required\");\n const ok = !hasFail && !hasManualRequired;\n const passCount = s.steps.filter((st) => st.status === \"pass\").length;\n const warnCount = s.steps.filter((st) => st.status === \"warn\").length;\n const failCount = s.steps.filter((st) => st.status === \"fail\").length;\n\n const summary = {\n ok,\n agentId: s.agentId,\n name: args.name,\n role: s.role,\n wallet: s.walletName,\n next: ok\n ? \"Run probe next on scheduled wakes\"\n : hasManualRequired\n ? \"Complete manual-required steps and rerun probe onboard\"\n : \"Fix failed steps and rerun probe onboard\",\n };\n success(summary);\n\n if (!isJsonMode()) {\n const lines = [\n `Agent: ${s.agentId}`,\n `Name: ${args.name}`,\n `Role: ${s.role}`,\n `Wallet: ${s.walletName}`,\n `Steps: ${passCount} passed, ${failCount} failed, ${warnCount} warnings`,\n ];\n note(lines.join(\"\\n\"), ok ? \"Onboard Complete\" : \"Onboard Incomplete\");\n\n const failedSteps = s.steps.filter((st) => st.status === \"fail\");\n if (failedSteps.length > 0) {\n for (const step of failedSteps) {\n log.error(`${step.step}: ${step.detail}`);\n }\n }\n\n if (s.mnemonic) {\n warning(\"Save this mnemonic securely — it will not be shown again\");\n info(s.mnemonic);\n }\n\n const schedulerStep = s.steps.find(\n (st) => st.step === \"scheduler\" && st.status === \"manual_required\",\n );\n if (schedulerStep) {\n warning(\"Scheduler setup required — autonomous participation blocked\");\n note(\n buildAgenticRuntimePlan({\n agentId: s.agentId,\n role: s.role,\n intervalMinutes: 30,\n prompt: \"Run probe next and follow its instructions exactly.\",\n }),\n \"Agentic Runtime Setup\",\n );\n }\n }\n }\n },\n});\n","import { error } from \"~/utils/output.js\";\n\nconst CONNECTION_ERROR_MARKERS = [\n \"connection\",\n \"subscription error\",\n \"authentication required\",\n \"unauthorized\",\n \"401\",\n \"econnrefused\",\n \"etimedout\",\n \"enotfound\",\n \"timeout\",\n];\n\nexport const isConnectionLikeError = (message: string): boolean => {\n const lowered = message.toLowerCase();\n return CONNECTION_ERROR_MARKERS.some((marker) => lowered.includes(marker));\n};\n\nexport const failWithConnectionOrUnexpected = (message: string): never => {\n if (isConnectionLikeError(message)) {\n error(\"CONNECTION_ERROR\", message);\n }\n error(\"UNEXPECTED_ERROR\", message);\n};\n","import { getConfig } from \"~/utils/config.js\";\nimport {\n type Agent,\n CommandContext,\n callReducer,\n callProcedure,\n withAuth,\n} from \"~/utils/context.js\";\nimport { AgentRole, AgentStatus } from \"~/utils/enums.js\";\nimport { failWithConnectionOrUnexpected } from \"~/utils/errors.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\";\nimport type { GenerateVoiceResult } from \"~/module_bindings/types.js\";\n\nconst MAX_VOICE_TRANSCRIPT_LENGTH = 500;\nconst DEFAULT_VOICE_CONTEXT_TYPE = \"status_update\";\n\nexport interface AgentCommandArgs {\n action?: string;\n agentId?: string;\n name?: string;\n role?: string;\n address?: string;\n wallet?: string;\n task?: string;\n limit?: string;\n capabilities?: string;\n set?: string;\n agent?: string;\n clear?: boolean;\n audioUrl?: string;\n contextType?: string;\n host?: string;\n module?: string;\n}\n\nconst normalizeCapabilities = (value?: string): string[] => {\n if (!value) return [];\n return [\n ...new Set(\n value\n .split(\",\")\n .map((item) => item.trim().toLowerCase())\n .filter(Boolean),\n ),\n ];\n};\n\nexport const currentAgentForIdentity = (ctx: CommandContext): Agent | undefined => {\n return ctx\n .iter<Agent>(\"agents\")\n .find((a) => a.identity.toHexString() === ctx.identity?.toHexString());\n};\n\nconst renderAgent = (agent: Agent, identity?: string) => ({\n id: agent.id,\n name: agent.name,\n role: AgentRole.display(agent.role),\n status: AgentStatus.display(agent.status),\n lastHeartbeat: formatTimestamp(agent.lastHeartbeat),\n currentTaskId: agent.currentTaskId ? agent.currentTaskId.toString() : \"\",\n capabilities: agent.capabilities.join(\",\"),\n identity: identity || \"\",\n});\n\nconst renderAgentBio = (agent: Agent) => ({\n agentId: agent.id,\n name: agent.name,\n bio: agent.bio,\n});\n\nexport const runAgentAction = async (args: AgentCommandArgs): Promise<void> => {\n const action = args.action;\n if (!action) {\n error(\"ACTION_REQUIRED\", \"Agent action required\");\n }\n\n try {\n switch (action) {\n case \"register\": {\n const agentId = args.agentId;\n const name = args.name;\n const role = args.role || \"zeno\";\n\n if (!agentId || !name) error(\"ARGS_REQUIRED\", \"Agent ID and name required\");\n\n const config = await getConfig();\n const walletName = args.wallet || config.defaultWallet;\n if (!args.address && !walletName)\n error(\"WALLET_REQUIRED\", \"--address or --wallet required (or set default wallet)\");\n\n let address = args.address;\n const capabilities = normalizeCapabilities(args.capabilities);\n if (!address && walletName) {\n const wallet = await getWalletInfo(walletName);\n if (!wallet) error(\"WALLET_NOT_FOUND\", `Wallet not found: ${walletName}`);\n address = wallet.address;\n }\n\n try {\n await withAuth(\n { host: args.host, module: args.module, wallet: walletName },\n async (ctx) => {\n await callReducer(ctx, \"registerAgent\", {\n agentId,\n name,\n role: AgentRole.fromString(role),\n zenonAddress: address as string,\n });\n\n if (capabilities.length > 0) {\n await callReducer(ctx, \"updateAgentCapabilities\", {\n capabilities,\n });\n }\n\n await new Promise((r) => setTimeout(r, 500));\n const registered = ctx.iter<Agent>(\"agents\").find((a) => a.id === agentId);\n if (!registered) {\n if (role === \"zoe\" || role === \"admin\") {\n error(\"UNAUTHORIZED\", \"Only whitelisted identities can register as zoe or admin\");\n }\n error(\"REGISTRATION_FAILED\", \"Registration failed\");\n }\n },\n );\n success({\n registered: true,\n agentId,\n name,\n role,\n address,\n capabilities,\n });\n if (!isJsonMode()) {\n console.log(\n toonList(\"agent_registered\", [\n {\n agentId,\n name,\n role,\n address,\n capabilities: capabilities.join(\",\"),\n },\n ]),\n );\n }\n } catch (err) {\n error(\"REDUCER_FAILED\", err instanceof Error ? err.message : \"Unknown error\");\n }\n break;\n }\n\n case \"status\": {\n if (args.agentId || args.task || args.capabilities) {\n error(\n \"INVALID_USAGE\",\n \"Use `probe agent set-status <online|offline|working|busy>` to update status. `probe agent status` only shows current status.\",\n );\n }\n\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n const myAgent = currentAgentForIdentity(ctx);\n if (!myAgent)\n error(\"NOT_REGISTERED\", \"Agent not registered. Run `probe agent register` first.\");\n\n success(myAgent);\n if (!isJsonMode()) {\n console.log(toonList(\"agent\", [renderAgent(myAgent, ctx.identity?.toHexString())]));\n }\n },\n );\n break;\n }\n\n case \"set-status\": {\n const nextStatus = args.agentId;\n if (!nextStatus) {\n error(\"STATUS_REQUIRED\", \"Status required. Use: online, offline, working, busy\");\n }\n if (args.capabilities) {\n error(\n \"INVALID_USAGE\",\n \"Use `probe agent capabilities --set <list>` to update capabilities.\",\n );\n }\n\n const normalized = nextStatus.toLowerCase();\n const allowed = new Set([\"online\", \"offline\", \"working\", \"busy\"]);\n if (!allowed.has(normalized)) {\n error(\n \"INVALID_STATUS\",\n `Invalid status: ${nextStatus}. Use: online, offline, working, busy`,\n );\n }\n\n const mapped = AgentStatus.fromString(normalized);\n const isWorking = AgentStatus.is.working(mapped);\n if (isWorking && !args.task) {\n error(\"TASK_REQUIRED\", \"--task is required when setting status to working\");\n }\n if (!isWorking && args.task) {\n error(\"TASK_NOT_ALLOWED\", \"--task is only allowed when setting status to working\");\n }\n\n try {\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n await callReducer(ctx, \"setAgentStatus\", {\n status: mapped,\n taskId: isWorking ? BigInt(args.task as string) : undefined,\n });\n },\n );\n\n success({\n updated: true,\n status: normalized,\n taskId: args.task || null,\n });\n if (!isJsonMode()) {\n console.log(\n toonList(\"agent_status_updated\", [\n {\n status: normalized,\n taskId: args.task || \"\",\n },\n ]),\n );\n }\n } catch (err) {\n error(\"REDUCER_FAILED\", err instanceof Error ? err.message : \"Unknown error\");\n }\n break;\n }\n\n case \"capabilities\": {\n if (!args.set) error(\"CAPABILITIES_REQUIRED\", \"--set is required\");\n\n const capabilities = normalizeCapabilities(args.set);\n try {\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n await callReducer(ctx, \"updateAgentCapabilities\", {\n capabilities,\n });\n const myAgent = currentAgentForIdentity(ctx);\n success({ updated: true, agentId: myAgent?.id, capabilities });\n if (!isJsonMode()) {\n console.log(\n toonList(\"agent_capabilities_updated\", [\n {\n agentId: myAgent?.id || \"\",\n capabilities: capabilities.join(\",\"),\n },\n ]),\n );\n }\n },\n );\n } catch (err) {\n error(\"REDUCER_FAILED\", err instanceof Error ? err.message : \"Unknown error\");\n }\n break;\n }\n\n case \"me\": {\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n const myAgent = currentAgentForIdentity(ctx);\n if (!myAgent)\n error(\"NOT_REGISTERED\", \"Agent not registered. Run `probe agent register` first.\");\n\n success(myAgent);\n if (!isJsonMode()) {\n console.log(toonList(\"agent\", [renderAgent(myAgent, ctx.identity?.toHexString())]));\n }\n },\n );\n break;\n }\n\n case \"bio\": {\n const bioFromPositional = args.agentId?.trim();\n const hasSet = typeof args.set === \"string\";\n const hasClear = Boolean(args.clear);\n const hasPositionalBio = Boolean(bioFromPositional);\n const targetAgentId = args.agent?.trim();\n\n if (hasSet && hasClear) {\n error(\"INVALID_USAGE\", \"Use either --set or --clear, not both.\");\n }\n if (hasSet && hasPositionalBio) {\n error(\n \"INVALID_USAGE\",\n \"Provide bio text either as positional argument or --set, not both.\",\n );\n }\n if (targetAgentId && (hasSet || hasClear || hasPositionalBio)) {\n error(\n \"INVALID_USAGE\",\n \"--agent is read-only. Do not combine with --set, --clear, or positional bio text.\",\n );\n }\n\n const isWrite = hasSet || hasClear || hasPositionalBio;\n\n if (isWrite) {\n const bio = hasClear ? \"\" : (hasSet ? args.set : bioFromPositional) || \"\";\n try {\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n await callReducer(ctx, \"updateAgentBio\", { bio });\n const myAgent = currentAgentForIdentity(ctx);\n success({\n updated: true,\n agentId: myAgent?.id,\n bio,\n });\n if (!isJsonMode()) {\n console.log(toonList(\"agent_bio_updated\", [{ agentId: myAgent?.id || \"\", bio }]));\n }\n },\n );\n } catch (err) {\n error(\"REDUCER_FAILED\", err instanceof Error ? err.message : \"Unknown error\");\n }\n break;\n }\n\n if (targetAgentId) {\n await using ctx = await CommandContext.create({\n host: args.host,\n module: args.module,\n });\n const agent = ctx.iter<Agent>(\"agents\").find((a) => a.id === targetAgentId);\n if (!agent) {\n error(\"AGENT_NOT_FOUND\", `Agent not found: ${targetAgentId}`);\n }\n success(renderAgentBio(agent));\n if (!isJsonMode()) {\n console.log(toonList(\"agent_bio\", [renderAgentBio(agent)]));\n }\n break;\n }\n\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n const myAgent = currentAgentForIdentity(ctx);\n if (!myAgent)\n error(\"NOT_REGISTERED\", \"Agent not registered. Run `probe agent register` first.\");\n\n success(renderAgentBio(myAgent));\n if (!isJsonMode()) {\n console.log(toonList(\"agent_bio\", [renderAgentBio(myAgent)]));\n }\n },\n );\n break;\n }\n\n case \"heartbeat\": {\n try {\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n const myAgent = currentAgentForIdentity(ctx);\n if (!myAgent) error(\"NOT_REGISTERED\", \"Agent not registered\");\n\n await callReducer(ctx, \"heartbeat\", {\n agentId: myAgent.id,\n });\n success({ heartbeat: true });\n if (!isJsonMode()) {\n console.log(\n toonList(\"agent_heartbeat\", [\n {\n agentId: myAgent.id,\n status: AgentStatus.display(myAgent.status),\n },\n ]),\n );\n }\n },\n );\n } catch (err) {\n error(\"REDUCER_FAILED\", err instanceof Error ? err.message : \"Unknown error\");\n }\n break;\n }\n\n case \"list\": {\n await using ctx = await CommandContext.create({\n host: args.host,\n module: args.module,\n });\n const limit = args.limit ? parseInt(args.limit, 10) : undefined;\n if (limit !== undefined && (!Number.isFinite(limit) || limit <= 0)) {\n error(\"INVALID_LIMIT\", \"--limit must be a positive integer\");\n }\n\n let onlineAgents = ctx\n .iter<Agent>(\"agents\")\n .filter((a) => !AgentStatus.is.offline(a.status));\n onlineAgents = onlineAgents.sort((a, b) => {\n const aMicros = toMicros(a.lastHeartbeat || a.createdAt || a.lastActiveAt);\n const bMicros = toMicros(b.lastHeartbeat || b.createdAt || b.lastActiveAt);\n if (aMicros !== bMicros) return bMicros > aMicros ? 1 : -1;\n return b.id.localeCompare(a.id);\n });\n if (limit !== undefined) onlineAgents = onlineAgents.slice(0, limit);\n\n success({ agents: onlineAgents, count: onlineAgents.length });\n if (!isJsonMode()) {\n console.log(\n toonList(\n \"agents\",\n onlineAgents.map((a) => ({\n id: a.id,\n name: a.name,\n role: AgentRole.display(a.role),\n status: AgentStatus.display(a.status),\n last_heartbeat: formatTimestamp(a.lastHeartbeat),\n capabilities: a.capabilities.join(\",\"),\n })),\n ),\n );\n }\n break;\n }\n\n case \"identity\": {\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n const identityHex = ctx.identity?.toHexString();\n success({ identity: identityHex, wallet: args.wallet });\n if (!isJsonMode()) {\n console.log(\n toonList(\"identity\", [\n {\n identity: identityHex || \"\",\n wallet: args.wallet || \"\",\n },\n ]),\n );\n }\n },\n );\n break;\n }\n\n case \"voice\": {\n const transcript = args.agentId?.trim();\n if (!transcript) {\n error(\n \"TRANSCRIPT_REQUIRED\",\n \"Transcript required. Provide as first positional argument.\",\n );\n }\n if (transcript.length > MAX_VOICE_TRANSCRIPT_LENGTH) {\n error(\n \"TRANSCRIPT_TOO_LONG\",\n `Transcript exceeds ${MAX_VOICE_TRANSCRIPT_LENGTH} characters.`,\n );\n }\n if (!args.audioUrl) {\n error(\"AUDIO_URL_REQUIRED\", \"--audioUrl is required for voice announcements.\");\n }\n\n try {\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n const contextType = args.contextType || DEFAULT_VOICE_CONTEXT_TYPE;\n const result = await callProcedure<GenerateVoiceResult>(ctx, \"generate_voice\", {\n transcript,\n audioUrl: args.audioUrl,\n contextType,\n });\n\n const data = {\n ok: true,\n announcementId: result.id,\n seq: result.seq,\n agentName: result.agentName,\n keyPrefix: result.keyPrefix,\n audioUrl: args.audioUrl,\n contextType,\n };\n\n success(data);\n if (!isJsonMode()) {\n console.log(\n toonList(\"voice_announcement\", [\n {\n id: result.id,\n seq: result.seq,\n agentName: result.agentName,\n keyPrefix: result.keyPrefix,\n audioUrl: args.audioUrl || \"\",\n },\n ]),\n );\n }\n },\n );\n } catch (err) {\n error(\"PROCEDURE_FAILED\", err instanceof Error ? err.message : \"Unknown error\");\n }\n break;\n }\n\n default:\n error(\n \"INVALID_ACTION\",\n `Invalid action: ${action}`,\n \"Use: register, status, set-status, capabilities, bio, me, heartbeat, list, identity, voice\",\n );\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n failWithConnectionOrUnexpected(message);\n }\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 meta: { name: \"agent\", description: \"Agent management\" },\n args: {\n action: {\n type: \"positional\",\n description:\n \"Action: register, status, set-status, capabilities, bio, me, heartbeat, list, identity, voice\",\n required: false,\n },\n agentId: {\n type: \"positional\",\n description: \"Action-dependent value (agent ID, status, bio text, or transcript)\",\n required: false,\n },\n name: { type: \"positional\", description: \"Display name\", required: false },\n role: {\n type: \"positional\",\n description: \"Role: zoe, admin, zeno\",\n required: false,\n },\n address: { type: \"string\", description: \"Zenon address\" },\n wallet: { type: \"string\", description: \"Wallet name\" },\n task: { type: \"string\", description: \"Current task ID\" },\n limit: { type: \"string\", description: \"Limit agents returned for list\" },\n capabilities: {\n type: \"string\",\n description: \"Comma-separated capability list\",\n },\n set: {\n type: \"string\",\n description: \"Set capabilities for capabilities action or bio text for bio action\",\n },\n agent: { type: \"string\", description: \"Agent ID for bio action lookup\" },\n clear: { type: \"boolean\", description: \"Clear bio for bio action\" },\n json: { type: \"boolean\", description: \"Output JSON\", default: false },\n audioUrl: { type: \"string\", description: \"Audio URL for voice announcements\" },\n contextType: { type: \"string\", description: \"Context type for voice (default: status_update)\" },\n host: { type: \"string\", description: \"SpacetimeDB host\" },\n module: { type: \"string\", description: \"Module name\" },\n },\n async run({ args }) {\n if (args.json) setJsonMode(true);\n\n if (!args.action) {\n printHelp({\n command: \"probe agent\",\n description: \"Agent lifecycle and identity commands\",\n usage: [\n \"probe agent <action> [options]\",\n 'probe agent register agent-1 \"Builder\" zeno --wallet my-wallet',\n \"probe agent set-status working --task 42\",\n 'probe agent capabilities --set \"gh,coding,review\"',\n 'probe agent bio \"Build systems and task orchestration\"',\n \"probe agent heartbeat\",\n 'probe agent voice \"Hello from Zoe\" --audioUrl https://audio.zenon.red/voice/zoe/123.mp3',\n ],\n actions: [\n {\n name: \"register <agentId> <name> [role]\",\n detail: \"Register a new agent identity\",\n },\n { name: \"status\", detail: \"Show current agent status\" },\n {\n name: \"set-status <online|offline|working|busy>\",\n detail: \"Update current agent status\",\n },\n {\n name: \"capabilities --set <list>\",\n detail: \"Set capabilities for authenticated agent\",\n },\n {\n name: \"bio [--set <text>|--clear|--agent <id>]\",\n detail: \"View or update agent bio\",\n },\n { name: \"me\", detail: \"Show current authenticated agent profile\" },\n { name: \"heartbeat\", detail: \"Send heartbeat only\" },\n { name: \"list\", detail: \"List online agents\" },\n { name: \"identity\", detail: \"Show current authenticated identity\" },\n {\n name: \"voice <transcript> --audioUrl <url>\",\n detail: \"Submit a voice announcement (BYO audio URL)\",\n },\n ],\n options: [\n { name: \"--wallet\", detail: \"Wallet to use for authenticated calls\" },\n { name: \"--address\", detail: \"Zenon address for register\" },\n { name: \"--task\", detail: \"Task ID required with status working\" },\n { name: \"--limit\", detail: \"Max agents returned for list\" },\n {\n name: \"--capabilities\",\n detail: \"Comma-separated capabilities for register/status\",\n },\n {\n name: \"--set\",\n detail: \"Set value for capabilities or bio action\",\n },\n { name: \"--agent\", detail: \"Agent ID for bio action lookup\" },\n {\n name: \"--clear\",\n detail: \"Clear bio for authenticated agent\",\n },\n {\n name: \"--audioUrl\",\n detail: \"Audio URL for voice announcements (required)\",\n },\n {\n name: \"--contextType\",\n detail: \"Context type for voice (default: status_update)\",\n },\n {\n name: \"--host, --module\",\n detail: \"Nexus SpacetimeDB target overrides\",\n },\n ],\n notes: [\n \"Valid register roles: zeno (default), zoe, admin. Non-whitelisted identities cannot register as zoe/admin.\",\n \"Use `probe task list` to discover task IDs before `probe agent set-status working --task <id>`.\",\n \"`probe agent status` shows current status; `probe agent set-status <online|offline|working|busy>` updates status.\",\n ],\n });\n return;\n }\n\n await runAgentAction(args as AgentCommandArgs);\n },\n});\n","import { defineCommand } from \"citty\";\nimport { CommandContext, callReducer, type DiscoveredTask, withAuth } from \"~/utils/context.js\";\nimport { failWithConnectionOrUnexpected } from \"~/utils/errors.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 const value = input.toLowerCase();\n if (value === \"approve\") return { tag: \"ApproveAsTask\" };\n if (value === \"reject\") return { tag: \"Reject\" };\n if (value === \"escalate_to_idea\") return { tag: \"EscalateToIdea\" };\n return null;\n};\n\nconst discoveryStatusTag = (status: unknown): string => {\n if (status && typeof status === \"object\" && \"tag\" in status) {\n return String((status as { tag: string }).tag);\n }\n return String(status);\n};\n\nconst discoveryStatusDisplay = (status: unknown): string => {\n const tag = discoveryStatusTag(status);\n const map: Record<string, string> = {\n PendingReview: \"pending_review\",\n Approved: \"approved\",\n Rejected: \"rejected\",\n EscalatedToIdea: \"escalated_to_idea\",\n };\n return map[tag] ?? tag;\n};\n\nexport default defineCommand({\n meta: { name: \"discover\", description: \"Discovered task management\" },\n args: {\n action: {\n type: \"positional\",\n description: \"Action: report, review, list, get\",\n required: false,\n },\n id: {\n type: \"positional\",\n description: \"Discovered task ID\",\n required: false,\n },\n decision: {\n type: \"positional\",\n description: \"Decision: approve, reject, escalate_to_idea\",\n required: false,\n },\n task: { type: \"string\", description: \"Current task ID\" },\n project: { type: \"string\", description: \"Project ID\" },\n title: { type: \"string\", description: \"Task title\" },\n type: {\n type: \"string\",\n description: \"Task type: bug, improvement, feature\",\n },\n severity: {\n type: \"string\",\n description: \"Severity: low, medium, high, critical\",\n },\n status: { type: \"string\", description: \"Filter by status\" },\n limit: { type: \"string\", description: \"Limit discovered tasks returned\" },\n description: { type: \"string\", description: \"Description\" },\n reason: { type: \"string\", description: \"Rejection reason\" },\n wallet: { type: \"string\", description: \"Wallet name\" },\n json: { type: \"boolean\", description: \"Output JSON\", default: false },\n host: { type: \"string\", description: \"SpacetimeDB host\" },\n module: { type: \"string\", description: \"Module name\" },\n },\n async run({ args }) {\n if (args.json) setJsonMode(true);\n\n if (!args.action) {\n printHelp({\n command: \"probe discover\",\n description: \"Discovered task reporting and review\",\n usage: [\n \"probe discover <action> [options]\",\n 'probe discover report --task 12 --project 1 --title \"Fix parse\"',\n \"probe discover review 9 approve\",\n ],\n actions: [\n {\n name: \"report\",\n detail: \"Report a discovered task from current work\",\n },\n {\n name: \"review <id> <approve|reject|escalate_to_idea>\",\n detail: \"Approve, reject, or escalate discovery\",\n },\n { name: \"list\", detail: \"List discovered tasks\" },\n { name: \"get <id>\", detail: \"Show one discovered task\" },\n ],\n options: [\n { name: \"--task, --project, --title\", detail: \"Required for report\" },\n { name: \"--type\", detail: \"Task type: bug, improvement, feature\" },\n {\n name: \"--severity\",\n detail: \"Severity: low, medium, high, critical\",\n },\n { name: \"--reason\", detail: \"Reason for rejection/escalation\" },\n { name: \"--limit\", detail: \"Max discovered tasks returned for list\" },\n { name: \"--wallet\", detail: \"Wallet to use for authenticated calls\" },\n {\n name: \"--host, --module\",\n detail: \"Nexus SpacetimeDB target overrides\",\n },\n ],\n notes: [\n \"Find current task IDs with `probe task list` and project IDs with `probe project list`.\",\n ],\n });\n return;\n }\n\n const action = args.action;\n\n try {\n switch (action) {\n case \"report\": {\n if (!args.task || !args.project || !args.title) {\n error(\"ARGS_REQUIRED\", \"--task, --project, and --title required\");\n }\n\n try {\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n await callReducer(ctx, \"discoverTask\", {\n currentTaskId: BigInt(args.task!),\n projectId: BigInt(args.project!),\n title: args.title,\n description: args.description || \"\",\n priority: 5,\n taskType: args.type || \"improvement\",\n severity: args.severity || \"medium\",\n });\n },\n );\n success({ reported: true, title: args.title });\n if (!isJsonMode()) {\n console.log(\n toonList(\"discovery_reported\", [\n {\n title: args.title,\n taskId: args.task,\n projectId: args.project,\n },\n ]),\n );\n }\n } catch (err) {\n error(\"REDUCER_FAILED\", err instanceof Error ? err.message : \"Unknown error\");\n }\n break;\n }\n\n case \"review\": {\n const discId = args.id;\n const decisionInput = args.decision;\n if (!discId || !decisionInput) error(\"ARGS_REQUIRED\", \"ID and decision required\");\n\n const decision = decisionInput.toLowerCase();\n\n const validDecisions = [\"approve\", \"reject\", \"escalate_to_idea\"];\n if (!validDecisions.includes(decision)) {\n error(\n \"INVALID_DECISION\",\n `Invalid decision: ${decisionInput}. Use: ${validDecisions.join(\", \")}`,\n );\n }\n\n const decisionValue = toDiscoveryDecision(decision);\n if (!decisionValue) {\n error(\n \"INVALID_DECISION\",\n `Invalid decision: ${decisionInput}. Use: ${validDecisions.join(\", \")}`,\n );\n }\n\n try {\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n await callReducer(ctx, \"reviewDiscoveredTask\", {\n discoveryId: BigInt(discId),\n decision: decisionValue,\n reason: args.reason || undefined,\n });\n },\n );\n success({ reviewed: true, id: discId, decision });\n if (!isJsonMode()) {\n console.log(\n toonList(\"discovery_reviewed\", [\n {\n id: discId,\n decision,\n reason: args.reason || \"\",\n },\n ]),\n );\n }\n } catch (err) {\n error(\"REDUCER_FAILED\", err instanceof Error ? err.message : \"Unknown error\");\n }\n break;\n }\n\n case \"list\": {\n await using ctx = await CommandContext.create({\n host: args.host,\n module: args.module,\n });\n let discovered = ctx.iter<DiscoveredTask>(\"discovered_tasks\");\n const limit = args.limit ? parseInt(args.limit, 10) : undefined;\n\n if (limit !== undefined && (!Number.isFinite(limit) || limit <= 0)) {\n error(\"INVALID_LIMIT\", \"--limit must be a positive integer\");\n }\n\n if (args.status) {\n const filter = args.status.toLowerCase().replace(/[_\\s]/g, \"\");\n discovered = discovered.filter(\n (d) => discoveryStatusDisplay(d.status).replace(/[_\\s]/g, \"\") === filter,\n );\n }\n discovered = discovered.sort((a, b) => {\n const aMicros = toMicros(a.createdAt);\n const bMicros = toMicros(b.createdAt);\n if (aMicros !== bMicros) return bMicros > aMicros ? 1 : -1;\n if (a.id === b.id) return 0;\n return b.id > a.id ? 1 : -1;\n });\n if (limit !== undefined) discovered = discovered.slice(0, limit);\n\n success({ discoveredTasks: discovered, count: discovered.length });\n if (!isJsonMode()) {\n console.log(\n toonList(\n \"discovered_tasks\",\n discovered.map((d) => ({\n id: d.id.toString(),\n title: d.title,\n taskType: d.taskType,\n severity: d.severity,\n status: discoveryStatusDisplay(d.status),\n projectId: d.projectId,\n })),\n ),\n );\n }\n break;\n }\n\n case \"get\": {\n const discoveryId = args.id;\n if (!discoveryId) error(\"DISCOVERY_ID_REQUIRED\", \"Discovery ID required\");\n\n await using ctx = await CommandContext.create({\n host: args.host,\n module: args.module,\n });\n const discovery = ctx\n .iter<DiscoveredTask>(\"discovered_tasks\")\n .find((d) => d.id.toString() === discoveryId);\n if (!discovery) error(\"DISCOVERY_NOT_FOUND\", `Discovery not found: ${discoveryId}`);\n\n success(discovery);\n if (!isJsonMode()) {\n console.log(\n toonList(\"discovered_task\", [\n {\n id: discovery.id.toString(),\n title: discovery.title,\n status: discoveryStatusDisplay(discovery.status),\n taskType: discovery.taskType,\n severity: discovery.severity,\n priority: discovery.priority,\n projectId: discovery.projectId.toString(),\n currentTaskId: discovery.currentTaskId.toString(),\n description: discovery.description,\n reviewedBy: discovery.reviewedBy || \"\",\n reviewedAt: discovery.reviewedAt ? formatTimestamp(discovery.reviewedAt) : \"\",\n rejectionReason: discovery.rejectionReason || \"\",\n createdTaskId: discovery.createdTaskId ? discovery.createdTaskId.toString() : \"\",\n },\n ]),\n );\n }\n break;\n }\n\n default:\n error(\"INVALID_ACTION\", `Invalid action: ${action}`, \"Use: report, review, list, get\");\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n failWithConnectionOrUnexpected(message);\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport {\n CommandContext,\n callReducer,\n type EvaluationDimension,\n type Idea,\n type Vote,\n withAuth,\n} from \"~/utils/context.js\";\nimport { IdeaStatus } from \"~/utils/enums.js\";\nimport { currentAgentForIdentity } from \"~/commands/nexus/agent-handlers.js\";\nimport { printHelp } from \"~/utils/help.js\";\nimport { failWithConnectionOrUnexpected } from \"~/utils/errors.js\";\nimport { error, isJsonMode, setJsonMode, success } from \"~/utils/output.js\";\nimport { toMicros } from \"~/utils/time.js\";\nimport { toonList } from \"~/utils/toon.js\";\n\nconst SCORE_FLAGS = [\n [\"ecosystem-impact\", \"ecosystem_impact\"],\n [\"implementation-readiness\", \"implementation_readiness\"],\n [\"dependency-independence\", \"dependency_independence\"],\n [\"documentation-leverage\", \"documentation_leverage\"],\n [\"maintenance-sustainability\", \"maintenance_sustainability\"],\n [\"agent-capability-fit\", \"agent_capability_fit\"],\n [\"execution-clarity\", \"execution_clarity\"],\n] as const;\n\ntype DimensionScoreInput = { dimension: string; score: number };\n\nconst sortIdeasNewest = (ideas: Idea[]): Idea[] => {\n return ideas.sort((a, b) => {\n const aMicros = toMicros(a.createdAt);\n const bMicros = toMicros(b.createdAt);\n if (aMicros !== bMicros) return bMicros > aMicros ? 1 : -1;\n if (a.id === b.id) return 0;\n return b.id > a.id ? 1 : -1;\n });\n};\n\nconst renderIdeaList = (ideas: Idea[]) => {\n return ideas.map((i) => ({\n id: i.id.toString(),\n title: i.title,\n category: i.category,\n status: IdeaStatus.display(i.status),\n votes: `${i.totalVotes}/${i.quorum}`,\n up: i.upVotes,\n veto: i.vetoCount,\n }));\n};\n\nfunction normalizeScore(rawScore: unknown, label: string): number {\n const score = Number(rawScore);\n if (!Number.isInteger(score)) {\n error(\"INVALID_SCORES\", `Score for '${label}' must be an integer`);\n }\n return score;\n}\n\nfunction validateDimensionScores(\n scores: DimensionScoreInput[],\n dimensions: EvaluationDimension[],\n): void {\n const activeDimensions = dimensions\n .filter((d) => d.active)\n .sort((a, b) => a.sortOrder - b.sortOrder);\n const scoreMap = new Map(scores.map((s) => [s.dimension, s.score]));\n\n for (const dim of activeDimensions) {\n if (!scoreMap.has(dim.name)) {\n error(\"MISSING_DIMENSION\", `Missing score for dimension: ${dim.label || dim.name}`);\n }\n const score = scoreMap.get(dim.name)!;\n if (score < dim.minScore || score > dim.maxScore) {\n error(\n \"INVALID_SCORE\",\n `Score for '${dim.name}' must be between ${dim.minScore} and ${dim.maxScore}`,\n );\n }\n }\n\n const activeNames = new Set(activeDimensions.map((d) => d.name));\n for (const score of scores) {\n if (!activeNames.has(score.dimension)) {\n error(\"UNKNOWN_DIMENSION\", `Unknown dimension: ${score.dimension}`);\n }\n }\n}\n\nfunction addScore(\n scores: Map<string, DimensionScoreInput>,\n dimension: string,\n rawScore: unknown,\n): void {\n const normalizedDimension = dimension.trim().replaceAll(\"-\", \"_\");\n if (!normalizedDimension) {\n error(\"INVALID_SCORES\", \"Dimension names cannot be empty\");\n }\n if (scores.has(normalizedDimension)) {\n error(\"INVALID_SCORES\", `Dimension '${normalizedDimension}' was provided more than once`);\n }\n scores.set(normalizedDimension, {\n dimension: normalizedDimension,\n score: normalizeScore(rawScore, normalizedDimension),\n });\n}\n\nfunction parseScorePairs(rawValue: unknown): Array<[string, string]> {\n if (rawValue === undefined) return [];\n const values = Array.isArray(rawValue) ? rawValue : [rawValue];\n return values.flatMap((value) =>\n String(value)\n .split(\",\")\n .map((part) => part.trim())\n .filter(Boolean)\n .map((part) => {\n const separator = part.indexOf(\"=\");\n if (separator <= 0 || separator === part.length - 1) {\n error(\"INVALID_SCORES\", \"--score entries must use dimension=value syntax\");\n }\n return [part.slice(0, separator), part.slice(separator + 1)] as [string, string];\n }),\n );\n}\n\nfunction buildDimensionScores(args: Record<string, unknown>): DimensionScoreInput[] {\n const scores = new Map<string, DimensionScoreInput>();\n\n for (const [flag, dimension] of SCORE_FLAGS) {\n if (args[flag] !== undefined) {\n addScore(scores, dimension, args[flag]);\n }\n }\n\n for (const [dimension, rawScore] of parseScorePairs(args.score)) {\n addScore(scores, dimension, rawScore);\n }\n\n if (scores.size === 0) {\n error(\"ARGS_REQUIRED\", \"Provide dimension scores with score flags or --score dimension=value\");\n }\n\n return [...scores.values()];\n}\n\nexport default defineCommand({\n meta: { name: \"idea\", description: \"Idea management\" },\n args: {\n action: {\n type: \"positional\",\n description: \"Action: list, pending, propose, vote, get, dimensions\",\n required: false,\n },\n id: { type: \"positional\", description: \"Idea ID\", required: false },\n title: { type: \"string\", description: \"Idea title\" },\n category: { type: \"string\", description: \"Category\" },\n description: { type: \"string\", description: \"Description\" },\n status: { type: \"string\", description: \"Filter by status\" },\n limit: { type: \"string\", description: \"Limit ideas returned\" },\n \"ecosystem-impact\": { type: \"string\", description: \"Ecosystem Impact score\" },\n \"implementation-readiness\": {\n type: \"string\",\n description: \"Implementation Readiness score\",\n },\n \"dependency-independence\": {\n type: \"string\",\n description: \"Dependency Independence score\",\n },\n \"documentation-leverage\": {\n type: \"string\",\n description: \"Documentation Leverage score\",\n },\n \"maintenance-sustainability\": {\n type: \"string\",\n description: \"Maintenance Sustainability score\",\n },\n \"agent-capability-fit\": {\n type: \"string\",\n description: \"Agent Capability Fit score\",\n },\n \"execution-clarity\": { type: \"string\", description: \"Execution Clarity score\" },\n score: {\n type: \"string\",\n description: \"Additional dimension score as name=value; repeatable\",\n multiple: true,\n },\n wallet: { type: \"string\", description: \"Wallet name\" },\n json: { type: \"boolean\", description: \"Output JSON\", default: false },\n host: { type: \"string\", description: \"SpacetimeDB host\" },\n module: { type: \"string\", description: \"Module name\" },\n },\n async run({ args }) {\n if (args.json) setJsonMode(true);\n\n if (!args.action) {\n printHelp({\n command: \"probe idea\",\n description: \"Idea discovery, review, and voting\",\n usage: [\n \"probe idea <action> [options]\",\n \"probe idea list --status voting\",\n \"probe idea dimensions\",\n \"probe idea vote 42 --ecosystem-impact 8 --execution-clarity 9 --implementation-readiness 7\",\n ],\n actions: [\n { name: \"list\", detail: \"List ideas with optional filters\" },\n { name: \"pending\", detail: \"List voting ideas you have not voted on\" },\n { name: \"get <id>\", detail: \"Show one idea\" },\n { name: \"dimensions\", detail: \"List active evaluation dimensions\" },\n { name: \"propose\", detail: \"Propose a new idea\" },\n { name: \"vote <id>\", detail: \"Vote on an idea with dimension scores\" },\n ],\n options: [\n { name: \"--title\", detail: \"Idea title for propose\" },\n { name: \"--description\", detail: \"Idea description for propose\" },\n { name: \"--category\", detail: \"Idea category for propose/list\" },\n { name: \"--ecosystem-impact\", detail: \"Ecosystem impact score\" },\n {\n name: \"--implementation-readiness\",\n detail: \"Implementation readiness score\",\n },\n {\n name: \"--dependency-independence\",\n detail: \"Dependency independence score\",\n },\n {\n name: \"--documentation-leverage\",\n detail: \"Documentation leverage score\",\n },\n {\n name: \"--maintenance-sustainability\",\n detail: \"Maintenance sustainability score\",\n },\n {\n name: \"--agent-capability-fit\",\n detail: \"Agent capability fit score\",\n },\n { name: \"--execution-clarity\", detail: \"Execution clarity score\" },\n { name: \"--score\", detail: \"Additional dimension score as name=value; repeatable\" },\n { name: \"--status\", detail: \"Status filter for list\" },\n { name: \"--limit\", detail: \"Max ideas returned for list/pending\" },\n { name: \"--wallet\", detail: \"Wallet to use for authenticated calls\" },\n {\n name: \"--host, --module\",\n detail: \"Nexus SpacetimeDB target overrides\",\n },\n ],\n notes: [\n \"Find idea IDs with `probe idea list` before using get/vote.\",\n \"Use `probe idea dimensions` to list active score dimensions.\",\n \"All active dimensions are required. Use explicit flags for default dimensions and repeatable --score name=value for custom dimensions.\",\n \"If a missing-dimension error names a dimension without a dedicated flag, use --score and consider updating Probe.\",\n ],\n });\n return;\n }\n\n const action = args.action;\n\n try {\n switch (action) {\n case \"list\": {\n await using ctx = await CommandContext.create({\n host: args.host,\n module: args.module,\n });\n let ideas = ctx.iter<Idea>(\"ideas\");\n const limit = args.limit ? parseInt(args.limit, 10) : undefined;\n\n if (limit !== undefined && (!Number.isFinite(limit) || limit <= 0)) {\n error(\"INVALID_LIMIT\", \"--limit must be a positive integer\");\n }\n\n if (args.status) ideas = ideas.filter((i) => IdeaStatus.matches(i.status, args.status!));\n if (args.category) ideas = ideas.filter((i) => i.category === args.category);\n ideas = sortIdeasNewest(ideas);\n if (limit !== undefined) ideas = ideas.slice(0, limit);\n\n success({ ideas, count: ideas.length });\n if (!isJsonMode()) {\n console.log(toonList(\"ideas\", renderIdeaList(ideas)));\n }\n break;\n }\n\n case \"pending\": {\n const limit = args.limit ? parseInt(args.limit, 10) : undefined;\n\n if (limit !== undefined && (!Number.isFinite(limit) || limit <= 0)) {\n error(\"INVALID_LIMIT\", \"--limit must be a positive integer\");\n }\n\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n const myAgent = currentAgentForIdentity(ctx);\n if (!myAgent) {\n error(\"NOT_REGISTERED\", \"Agent not registered. Run `probe agent register` first.\");\n }\n\n const votedIdeaIds = new Set(\n ctx\n .iter<Vote>(\"votes\")\n .filter((v) => v.agentId === myAgent.id)\n .map((v) => v.ideaId),\n );\n\n let ideas = ctx\n .iter<Idea>(\"ideas\")\n .filter((i) => IdeaStatus.is.voting(i.status))\n .filter((i) => !votedIdeaIds.has(i.id));\n\n ideas = sortIdeasNewest(ideas);\n\n if (limit !== undefined) ideas = ideas.slice(0, limit);\n\n success({ ideas, count: ideas.length });\n if (!isJsonMode()) {\n console.log(toonList(\"ideas\", renderIdeaList(ideas)));\n }\n },\n );\n break;\n }\n\n case \"get\": {\n const ideaId = args.id;\n if (!ideaId) error(\"IDEA_ID_REQUIRED\", \"Idea ID required\");\n\n await using ctx = await CommandContext.create({\n host: args.host,\n module: args.module,\n });\n const idea = ctx.iter<Idea>(\"ideas\").find((i) => i.id.toString() === ideaId);\n if (!idea) error(\"IDEA_NOT_FOUND\", `Idea not found: ${ideaId}`);\n\n success(idea);\n if (!isJsonMode()) {\n console.log(\n toonList(\"idea\", [\n {\n id: idea.id.toString(),\n title: idea.title,\n category: idea.category,\n status: IdeaStatus.display(idea.status),\n totalVotes: idea.totalVotes,\n quorum: idea.quorum,\n upVotes: idea.upVotes,\n downVotes: idea.downVotes,\n vetoCount: idea.vetoCount,\n approvalThreshold: idea.approvalThreshold,\n vetoThreshold: idea.vetoThreshold,\n computedScore: idea.computedScore,\n description: idea.description,\n },\n ]),\n );\n }\n break;\n }\n\n case \"dimensions\": {\n await using ctx = await CommandContext.create({\n host: args.host,\n module: args.module,\n });\n const dimensions = ctx\n .iter<EvaluationDimension>(\"evaluation_dimensions\")\n .filter((dimension) => dimension.active)\n .sort((a, b) => a.sortOrder - b.sortOrder);\n\n success({ dimensions, count: dimensions.length });\n if (!isJsonMode()) {\n console.log(\n toonList(\n \"evaluation_dimensions\",\n dimensions.map((dimension) => ({\n name: dimension.name,\n label: dimension.label,\n weight: dimension.weight,\n range: `${dimension.minScore}-${dimension.maxScore}`,\n description: dimension.description,\n })),\n ),\n );\n }\n break;\n }\n\n case \"propose\": {\n const title = String(args.title || \"\").trim();\n if (!title) error(\"ARGS_REQUIRED\", \"Title required\");\n const description = String(args.description || \"\").trim();\n if (!description) {\n error(\"DESCRIPTION_REQUIRED\", \"Description required and cannot be empty\");\n }\n const category = String(args.category || \"general\");\n let published: Idea | undefined;\n\n try {\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n const myAgent = currentAgentForIdentity(ctx);\n await callReducer(ctx, \"proposeIdea\", {\n title,\n description,\n category,\n });\n\n published = sortIdeasNewest(ctx.iter<Idea>(\"ideas\")).find(\n (idea) =>\n idea.title === title &&\n idea.category === category &&\n idea.description === description &&\n (!myAgent || idea.createdBy === myAgent.id),\n );\n },\n );\n success({\n proposed: true,\n idea: published\n ? {\n id: published.id.toString(),\n title: published.title,\n category: published.category,\n descriptionLength: published.description.length,\n }\n : {\n title,\n category,\n descriptionLength: description.length,\n },\n });\n if (!isJsonMode()) {\n console.log(\n toonList(\"idea_proposed\", [\n {\n id: published?.id.toString() || \"\",\n title,\n category,\n descriptionLength: published\n ? published.description.length\n : description.length,\n },\n ]),\n );\n }\n } catch (err) {\n error(\"REDUCER_FAILED\", err instanceof Error ? err.message : \"Unknown error\");\n }\n break;\n }\n\n case \"vote\": {\n const ideaId = args.id;\n if (!ideaId) error(\"ARGS_REQUIRED\", \"Idea ID required\");\n const dimensionScores = buildDimensionScores(args);\n\n try {\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n const activeDimensions = ctx.iter<EvaluationDimension>(\"evaluation_dimensions\");\n validateDimensionScores(dimensionScores, activeDimensions);\n\n await callReducer(ctx, \"voteIdea\", {\n ideaId: BigInt(ideaId),\n scores: dimensionScores,\n });\n },\n );\n success({ voted: true, ideaId, scores: dimensionScores });\n if (!isJsonMode()) {\n console.log(\n toonList(\"idea_voted\", [\n {\n ideaId,\n scores: JSON.stringify(dimensionScores),\n },\n ]),\n );\n }\n } catch (err) {\n error(\"REDUCER_FAILED\", err instanceof Error ? err.message : \"Unknown error\");\n }\n break;\n }\n\n default:\n error(\n \"INVALID_ACTION\",\n `Invalid action: ${action}`,\n \"Use: list, pending, propose, vote, get, dimensions\",\n );\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n failWithConnectionOrUnexpected(message);\n }\n },\n});\n","import type { MessageType as MessageTypeTag } from \"~/module_bindings/types.js\";\nimport {\n type Channel,\n CommandContext,\n callReducer,\n type Message,\n type Project,\n type ProjectMessage,\n withAuth,\n} from \"~/utils/context.js\";\nimport { MessageType } from \"~/utils/enums.js\";\nimport { failWithConnectionOrUnexpected } from \"~/utils/errors.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 action?: string;\n target?: string;\n content?: string;\n type?: string;\n context?: string;\n limit?: string;\n wallet?: string;\n host?: string;\n module?: string;\n raw?: boolean;\n}\n\nconst MAX_MESSAGE_CONTENT_LENGTH = 4000;\n\ntype ContentViolation =\n | { type: \"length\"; length: number; max: number }\n | { type: \"control\"; sequence: string; position: number };\n\nfunction escapeForDisplay(input: string): string {\n let out = \"\";\n for (const char of input) {\n const code = char.charCodeAt(0);\n if (code === 0x1b) {\n out += \"\\\\x1b\";\n } else if (code === 0x7f) {\n out += \"\\\\x7f\";\n } else if (code < 0x20) {\n out += `\\\\x${code.toString(16).padStart(2, \"0\")}`;\n } else {\n out += char;\n }\n }\n return out;\n}\n\nfunction findControlSequence(content: string): { sequence: string; position: number } | null {\n const patterns = [\n /\\x1B\\[[0-?]*[ -/]*[@-~]/g, // CSI\n /\\x1B\\][^\\x07\\x1B]*(?:\\x07|\\x1B\\\\)/g, // OSC\n /\\x1B[@-_]/g, // single-char ESC\n /[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]/g, // control chars except \\t, \\n, \\r\n ];\n\n let earliest: { sequence: string; position: number } | null = null;\n for (const pattern of patterns) {\n pattern.lastIndex = 0;\n const match = pattern.exec(content);\n if (!match || match.index === undefined) continue;\n const hit = { sequence: match[0], position: match.index + 1 };\n if (!earliest || hit.position < earliest.position) {\n earliest = hit;\n }\n }\n\n return earliest;\n}\n\nfunction validateMessageContent(content: string, raw: boolean): ContentViolation | null {\n if (content.length > MAX_MESSAGE_CONTENT_LENGTH) {\n return {\n type: \"length\",\n length: content.length,\n max: MAX_MESSAGE_CONTENT_LENGTH,\n };\n }\n\n if (raw) {\n return null;\n }\n\n const control = findControlSequence(content);\n if (!control) return null;\n return {\n type: \"control\",\n sequence: escapeForDisplay(control.sequence),\n position: control.position,\n };\n}\n\nfunction validateOrFail(content: string, raw: boolean): void {\n const violation = validateMessageContent(content, raw);\n if (!violation) return;\n if (violation.type === \"length\") {\n error(\n \"MESSAGE_CONTENT_TOO_LONG\",\n `Message content length ${violation.length} exceeds max ${violation.max} characters.`,\n \"Send a concise plain-text summary or split the content into multiple messages.\",\n );\n }\n error(\n \"MESSAGE_CONTENT_INVALID\",\n `ANSI escape sequence ${violation.sequence} at position ${violation.position}.`,\n \"Send a plain-text summary, not raw command output. Use --raw if intentional.\",\n );\n}\n\nconst isNumeric = (str: string): boolean => /^\\d+$/.test(str);\nconst matchesContext = (message: Message | ProjectMessage, context?: string): boolean => {\n if (!context) return true;\n const normalized = context.trim();\n if (!normalized) return true;\n return message.id.toString() === normalized || (message.contextId || \"\") === normalized;\n};\n\nconst isUserMessage = (messageType: MessageTypeTag): boolean => MessageType.is.user(messageType);\nconst isDirectiveMessage = (messageType: MessageTypeTag): boolean =>\n MessageType.is.directive(messageType);\n\nexport const runMessageAction = async (args: MessageCommandArgs): Promise<void> => {\n const action = args.action;\n if (!action) {\n error(\"ACTION_REQUIRED\", \"Message action required\");\n }\n\n try {\n switch (action) {\n case \"list\": {\n const targetInput = args.target;\n const limit = parseInt(args.limit || \"20\", 10);\n if (!Number.isFinite(limit) || limit <= 0) {\n error(\"INVALID_LIMIT\", \"--limit must be a positive integer\");\n }\n\n await using ctx = await CommandContext.create({\n host: args.host,\n module: args.module,\n });\n const channels = ctx.iter<Channel>(\"channels\");\n const projects = ctx.iter<Project>(\"projects\");\n\n let messages: (Message | ProjectMessage)[] = [];\n let targetLabel = \"all\";\n\n if (targetInput) {\n if (isNumeric(targetInput)) {\n const projectId = BigInt(targetInput);\n const projectMessages = ctx.iter<ProjectMessage>(\"project_messages\");\n const project = projects.find((p) => p.id === projectId);\n\n messages = projectMessages\n .filter((m) => m.projectId === projectId && isUserMessage(m.messageType))\n .map((m) => ({ ...m, _type: \"project\" as const }));\n targetLabel = project ? `project:${project.name}` : `project:${projectId}`;\n } else {\n const channel = channels.find(\n (c) => c.name === targetInput || c.id.toString() === targetInput,\n );\n if (channel) {\n const channelMessages = ctx.iter<Message>(\"messages\");\n messages = channelMessages\n .filter((m) => m.channelId === channel.id && isUserMessage(m.messageType))\n .map((m) => ({ ...m, _type: \"channel\" as const }));\n targetLabel = `#${channel.name}`;\n }\n }\n } else {\n const channelMessages = ctx.iter<Message>(\"messages\");\n const projectMessages = ctx.iter<ProjectMessage>(\"project_messages\");\n\n messages = [\n ...channelMessages\n .filter((m) => isUserMessage(m.messageType))\n .map((m) => ({ ...m, _type: \"channel\" as const })),\n ...projectMessages\n .filter((m) => isUserMessage(m.messageType))\n .map((m) => ({ ...m, _type: \"project\" as const })),\n ];\n }\n\n messages = messages.filter((m) => matchesContext(m, args.context));\n\n messages.sort((a, b) => {\n const aTime = toMicros(a.createdAt);\n const bTime = toMicros(b.createdAt);\n if (aTime < bTime) return 1;\n if (aTime > bTime) return -1;\n return 0;\n });\n\n messages = messages.slice(0, limit);\n\n const channelMap = new Map(channels.map((c) => [c.id.toString(), c.name]));\n const projectMap = new Map(projects.map((p) => [p.id.toString(), p.name]));\n\n success({ messages, count: messages.length, target: targetLabel });\n if (!isJsonMode()) {\n console.log(\n toonList(\n \"messages\",\n messages.map((m) => {\n const isProject = \"_type\" in m && m._type === \"project\";\n const location = isProject\n ? `project:${projectMap.get((m as ProjectMessage).projectId.toString()) || (m as ProjectMessage).projectId}`\n : `#${channelMap.get((m as Message).channelId.toString()) || (m as Message).channelId}`;\n\n return {\n id: m.id.toString(),\n location,\n senderId: m.senderId,\n content: m.content,\n messageType: MessageType.display(m.messageType),\n contextId: m.contextId || null,\n createdAt: formatTimestamp(m.createdAt),\n };\n }),\n ),\n );\n }\n break;\n }\n\n case \"directives\": {\n const targetInput = args.target;\n const limit = parseInt(args.limit || \"20\", 10);\n if (!Number.isFinite(limit) || limit <= 0) {\n error(\"INVALID_LIMIT\", \"--limit must be a positive integer\");\n }\n\n await using ctx = await CommandContext.create({\n host: args.host,\n module: args.module,\n });\n const channels = ctx.iter<Channel>(\"channels\");\n const projects = ctx.iter<Project>(\"projects\");\n\n let messages: (Message | ProjectMessage)[] = [];\n let targetLabel = \"all\";\n\n if (targetInput) {\n if (isNumeric(targetInput)) {\n const projectId = BigInt(targetInput);\n const projectMessages = ctx.iter<ProjectMessage>(\"project_messages\");\n const project = projects.find((p) => p.id === projectId);\n\n messages = projectMessages\n .filter((m) => m.projectId === projectId && isDirectiveMessage(m.messageType))\n .map((m) => ({ ...m, _type: \"project\" as const }));\n targetLabel = project ? `project:${project.name}` : `project:${projectId}`;\n } else {\n const channel = channels.find(\n (c) => c.name === targetInput || c.id.toString() === targetInput,\n );\n if (channel) {\n const channelMessages = ctx.iter<Message>(\"messages\");\n messages = channelMessages\n .filter((m) => m.channelId === channel.id && isDirectiveMessage(m.messageType))\n .map((m) => ({ ...m, _type: \"channel\" as const }));\n targetLabel = `#${channel.name}`;\n }\n }\n } else {\n const channelMessages = ctx.iter<Message>(\"messages\");\n const projectMessages = ctx.iter<ProjectMessage>(\"project_messages\");\n\n messages = [\n ...channelMessages\n .filter((m) => isDirectiveMessage(m.messageType))\n .map((m) => ({ ...m, _type: \"channel\" as const })),\n ...projectMessages\n .filter((m) => isDirectiveMessage(m.messageType))\n .map((m) => ({ ...m, _type: \"project\" as const })),\n ];\n }\n\n messages = messages.filter((m) => matchesContext(m, args.context));\n\n messages.sort((a, b) => {\n const aTime = toMicros(a.createdAt);\n const bTime = toMicros(b.createdAt);\n if (aTime < bTime) return 1;\n if (aTime > bTime) return -1;\n return 0;\n });\n\n messages = messages.slice(0, limit);\n\n const channelMap = new Map(channels.map((c) => [c.id.toString(), c.name]));\n const projectMap = new Map(projects.map((p) => [p.id.toString(), p.name]));\n\n success({ messages, count: messages.length, target: targetLabel });\n if (!isJsonMode()) {\n console.log(\n toonList(\n \"directives\",\n messages.map((m) => {\n const isProject = \"_type\" in m && m._type === \"project\";\n const location = isProject\n ? `project:${projectMap.get((m as ProjectMessage).projectId.toString()) || (m as ProjectMessage).projectId}`\n : `#${channelMap.get((m as Message).channelId.toString()) || (m as Message).channelId}`;\n\n return {\n id: m.id.toString(),\n location,\n senderId: m.senderId,\n content: m.content,\n messageType: MessageType.display(m.messageType),\n contextId: m.contextId || null,\n createdAt: formatTimestamp(m.createdAt),\n };\n }),\n ),\n );\n }\n break;\n }\n\n case \"directive\": {\n const targetInput = args.target;\n const content = args.content;\n if (!targetInput || !content) {\n error(\n \"ARGS_REQUIRED\",\n \"Target and directive content required. Usage: probe message directive <target> <content>\",\n );\n }\n\n validateOrFail(content, !!args.raw);\n\n try {\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n if (isNumeric(targetInput)) {\n const projectId = BigInt(targetInput);\n const projects = ctx.iter<Project>(\"projects\");\n const projectChannels = ctx.iter<{ projectId: bigint }>(\"project_channels\");\n\n const project = projects.find((p) => p.id === projectId);\n if (!project) {\n error(\"PROJECT_NOT_FOUND\", `Project '${targetInput}' not found`);\n }\n\n const projectChannel = projectChannels.find((pc) => pc.projectId === projectId);\n if (!projectChannel) {\n error(\n \"PROJECT_CHANNEL_NOT_FOUND\",\n `Project channel for '${targetInput}' not found`,\n );\n }\n\n await callReducer(ctx, \"sendProjectMessage\", {\n projectId,\n content,\n messageType: MessageType.fromString(\"directive\"),\n contextId: args.context,\n });\n\n success({\n sent: true,\n projectId: projectId.toString(),\n projectName: project.name,\n messageType: \"directive\",\n });\n if (!isJsonMode()) {\n console.log(\n toonList(\"directive_sent\", [\n {\n target: `project:${project.name}`,\n contextId: args.context || null,\n },\n ]),\n );\n }\n } else {\n const channels = ctx.iter<Channel>(\"channels\");\n const channel = channels.find(\n (c) => c.name === targetInput || c.id.toString() === targetInput,\n );\n if (!channel) {\n error(\n \"CHANNEL_NOT_FOUND\",\n `Channel '${targetInput}' not found. Available: ${channels.map((c) => c.name).join(\", \")}`,\n );\n }\n\n await callReducer(ctx, \"sendMessage\", {\n channelId: channel.id,\n content,\n messageType: MessageType.fromString(\"directive\"),\n contextId: args.context,\n });\n\n success({\n sent: true,\n channelId: channel.id.toString(),\n channelName: channel.name,\n messageType: \"directive\",\n });\n if (!isJsonMode()) {\n console.log(\n toonList(\"directive_sent\", [\n {\n target: `#${channel.name}`,\n contextId: args.context || null,\n },\n ]),\n );\n }\n }\n },\n );\n } catch (err) {\n error(\"REDUCER_FAILED\", err instanceof Error ? err.message : \"Unknown error\");\n }\n break;\n }\n\n case \"send\": {\n const targetInput = args.target;\n const content = args.content;\n if (!targetInput || !content) {\n error(\n \"ARGS_REQUIRED\",\n \"Target and message content required. Usage: probe message send <target> <content>\",\n );\n }\n\n validateOrFail(content, !!args.raw);\n\n if ((args.type || \"user\").toLowerCase() === \"directive\") {\n error(\n \"INVALID_TYPE\",\n \"'directive' is not allowed with 'message send'. Use: probe message directive <target> <content>\",\n );\n }\n\n try {\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n if (isNumeric(targetInput)) {\n const projectId = BigInt(targetInput);\n const projects = ctx.iter<Project>(\"projects\");\n const projectChannels = ctx.iter<{ projectId: bigint }>(\"project_channels\");\n\n const project = projects.find((p) => p.id === projectId);\n if (!project) {\n error(\"PROJECT_NOT_FOUND\", `Project '${targetInput}' not found`);\n }\n\n const projectChannel = projectChannels.find((pc) => pc.projectId === projectId);\n if (!projectChannel) {\n error(\n \"PROJECT_CHANNEL_NOT_FOUND\",\n `Project channel for '${targetInput}' not found`,\n );\n }\n\n await callReducer(ctx, \"sendProjectMessage\", {\n projectId,\n content,\n messageType: MessageType.fromString(args.type || \"user\"),\n contextId: args.context,\n });\n\n success({\n sent: true,\n projectId: projectId.toString(),\n projectName: project.name,\n });\n if (!isJsonMode()) {\n console.log(\n toonList(\"message_sent\", [\n {\n target: `project:${project.name}`,\n messageType: args.type || \"user\",\n contextId: args.context || null,\n },\n ]),\n );\n }\n } else {\n const channels = ctx.iter<Channel>(\"channels\");\n const channel = channels.find(\n (c) => c.name === targetInput || c.id.toString() === targetInput,\n );\n if (!channel) {\n error(\n \"CHANNEL_NOT_FOUND\",\n `Channel '${targetInput}' not found. Available: ${channels.map((c) => c.name).join(\", \")}`,\n );\n }\n\n await callReducer(ctx, \"sendMessage\", {\n channelId: channel.id,\n content,\n messageType: MessageType.fromString(args.type || \"user\"),\n contextId: args.context,\n });\n\n success({\n sent: true,\n channelId: channel.id.toString(),\n channelName: channel.name,\n });\n if (!isJsonMode()) {\n console.log(\n toonList(\"message_sent\", [\n {\n target: `#${channel.name}`,\n messageType: args.type || \"user\",\n contextId: args.context || null,\n },\n ]),\n );\n }\n }\n },\n );\n } catch (err) {\n error(\"REDUCER_FAILED\", err instanceof Error ? err.message : \"Unknown error\");\n }\n break;\n }\n\n case \"channels\": {\n await using ctx = await CommandContext.create({\n host: args.host,\n module: args.module,\n });\n const channels = ctx.iter<Channel>(\"channels\");\n const projects = ctx.iter<Project>(\"projects\");\n const projectChannels = ctx.iter<{ projectId: bigint }>(\"project_channels\");\n\n const projectChannelSet = new Set(projectChannels.map((pc) => pc.projectId.toString()));\n const projectsWithChannels = projects.filter((p) => projectChannelSet.has(p.id.toString()));\n\n success({\n channels,\n projects: projectsWithChannels,\n channelCount: channels.length,\n projectCount: projectsWithChannels.length,\n });\n if (!isJsonMode()) {\n console.log(\n toonList(\n \"channels\",\n channels.map((c) => ({\n id: c.id.toString(),\n name: c.name,\n createdBy: c.createdBy,\n })),\n ),\n );\n console.log(\n toonList(\n \"projects\",\n projectsWithChannels.map((p) => ({\n id: p.id.toString(),\n name: p.name,\n repo: p.githubRepo,\n })),\n ),\n );\n }\n break;\n }\n\n default:\n error(\n \"INVALID_ACTION\",\n `Invalid action: ${action}`,\n \"Use: list, send, directive, directives, channels\",\n );\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n failWithConnectionOrUnexpected(message);\n }\n};\n","import { defineCommand } from \"citty\";\nimport { printHelp } from \"~/utils/help.js\";\nimport { setJsonMode } from \"~/utils/output.js\";\nimport { type MessageCommandArgs, runMessageAction } from \"./message-handlers.js\";\n\nexport default defineCommand({\n meta: { name: \"message\", description: \"Message management\" },\n args: {\n action: {\n type: \"positional\",\n description: \"Action: list, send, directive, directives, channels\",\n required: false,\n },\n target: {\n type: \"positional\",\n description: \"Channel name, project ID, or message content\",\n required: false,\n },\n content: {\n type: \"positional\",\n description: \"Message content (if target is channel/project)\",\n required: false,\n },\n type: {\n type: \"string\",\n description: \"Message type: user, system\",\n default: \"user\",\n },\n context: {\n type: \"string\",\n description: \"Thread context ID (message ID or entity ref like task:42)\",\n },\n limit: { type: \"string\", description: \"Limit messages\", default: \"20\" },\n wallet: { type: \"string\", description: \"Wallet name\" },\n raw: {\n type: \"boolean\",\n description: \"Allow raw control/ANSI sequences in content\",\n default: false,\n },\n json: { type: \"boolean\", description: \"Output JSON\", default: false },\n host: { type: \"string\", description: \"SpacetimeDB host\" },\n module: { type: \"string\", description: \"Module name\" },\n },\n async run({ args }) {\n if (args.json) setJsonMode(true);\n\n if (!args.action) {\n printHelp({\n command: \"probe message\",\n description: \"Channel and project messaging commands\",\n usage: [\n \"probe message <action> [target] [content] [options]\",\n \"probe message list --limit 50\",\n 'probe message send general \"hello team\"',\n 'probe message directive zoe \"Focus on project stability\" --context project:1',\n ],\n actions: [\n {\n name: \"list [target]\",\n detail: \"List user messages (all, channel, or project)\",\n },\n {\n name: \"directives [target]\",\n detail: \"List directive messages (all, channel, or project)\",\n },\n {\n name: \"send <target> <content>\",\n detail: \"Send to target channel/project\",\n },\n {\n name: \"directive <target> <content>\",\n detail: \"Send directive to target channel/project\",\n },\n { name: \"channels\", detail: \"List channels and project channels\" },\n ],\n options: [\n {\n name: \"--type\",\n detail: \"Message type: user, system (default: user)\",\n },\n {\n name: \"--context\",\n detail: \"Optional thread context ID (message ID or entity ref)\",\n },\n {\n name: \"--limit\",\n detail: \"Max messages returned for list (default: 20)\",\n },\n {\n name: \"--raw\",\n detail: \"Allow raw control/ANSI content in send/directive payloads\",\n },\n { name: \"--wallet\", detail: \"Wallet to use for send\" },\n {\n name: \"--host, --module\",\n detail: \"Nexus SpacetimeDB target overrides\",\n },\n ],\n examples: [\n \"probe message send general hello\",\n 'probe message directive zoe \"Pause new work\" --context project:1',\n \"probe message directives zoe --limit 1\",\n 'probe message send zoe \"hello there\"',\n 'probe message send zoe \"reviewed\" --context 123',\n 'probe message send 1 \"project update\"',\n \"probe message list zoe --limit 10\",\n ],\n notes: [\n \"Quotes are only required when target/content contains spaces.\",\n \"send/directive reject terminal control sequences by default; use --raw only when intentional.\",\n \"Use `probe message channels` to discover available channel names and project IDs.\",\n ],\n });\n return;\n }\n\n await runMessageAction(args as MessageCommandArgs);\n },\n});\n","import { defineCommand } from \"citty\";\nimport { CommandContext, callReducer, type Project, withAuth } from \"~/utils/context.js\";\nimport { ProjectStatus } from \"~/utils/enums.js\";\nimport { failWithConnectionOrUnexpected } from \"~/utils/errors.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 meta: { name: \"project\", description: \"Project commands\" },\n args: {\n action: {\n type: \"positional\",\n description: \"Action: list, get, create, status, set-status\",\n required: false,\n },\n id: { type: \"positional\", description: \"Project ID\", required: false },\n value: {\n type: \"positional\",\n description: \"Status value for set-status: active|paused\",\n required: false,\n },\n status: { type: \"string\", description: \"Filter by status\" },\n limit: { type: \"string\", description: \"Limit projects returned\" },\n name: { type: \"string\", description: \"Project name\" },\n description: { type: \"string\", description: \"Project description\" },\n \"github-repo\": { type: \"string\", description: \"GitHub repository URL\" },\n \"source-idea\": { type: \"string\", description: \"Source idea ID\" },\n wallet: { type: \"string\", description: \"Wallet name\" },\n json: { type: \"boolean\", description: \"Output JSON\", default: false },\n host: { type: \"string\", description: \"SpacetimeDB host\" },\n module: { type: \"string\", description: \"Module name\" },\n },\n async run({ args }) {\n if (args.json) setJsonMode(true);\n\n if (!args.action) {\n printHelp({\n command: \"probe project\",\n description: \"Project listing and lookup commands\",\n usage: [\n \"probe project <action> [options]\",\n \"probe project list --status active\",\n \"probe project get 1\",\n \"probe project status 1\",\n \"probe project set-status 1 paused --wallet admin-wallet\",\n ],\n actions: [\n { name: \"list\", detail: \"List projects with optional status filter\" },\n { name: \"get <id>\", detail: \"Show one project by ID\" },\n { name: \"create\", detail: \"Create a new project\" },\n { name: \"status <id>\", detail: \"Show only project status\" },\n {\n name: \"set-status <id> <active|paused>\",\n detail: \"Update project status (admin/zoe)\",\n },\n ],\n options: [\n { name: \"--status\", detail: \"Status filter for list: active|paused\" },\n { name: \"--limit\", detail: \"Max projects returned for list\" },\n { name: \"--name\", detail: \"Project name (create)\" },\n { name: \"--description\", detail: \"Project description (create)\" },\n { name: \"--github-repo\", detail: \"GitHub repository URL (create)\" },\n { name: \"--source-idea\", detail: \"Source idea ID (create)\" },\n { name: \"--wallet\", detail: \"Wallet to use for authenticated calls\" },\n {\n name: \"--host, --module\",\n detail: \"Nexus SpacetimeDB target overrides\",\n },\n ],\n notes: [\n \"Only admin/zoe identities can call set-status.\",\n \"Find idea IDs with `probe idea list` before using --source-idea.\",\n \"Find project IDs with `probe project list` before using get/create follow-up commands.\",\n ],\n });\n return;\n }\n\n const action = args.action;\n\n try {\n switch (action) {\n case \"list\": {\n await using ctx = await CommandContext.create({\n host: args.host,\n module: args.module,\n });\n let projects = ctx.iter<Project>(\"projects\");\n const limit = args.limit ? parseInt(args.limit, 10) : undefined;\n\n if (limit !== undefined && (!Number.isFinite(limit) || limit <= 0)) {\n error(\"INVALID_LIMIT\", \"--limit must be a positive integer\");\n }\n\n if (args.status)\n projects = projects.filter((p) =>\n ProjectStatus.matches(p.status, args.status as string),\n );\n projects = projects.sort((a, b) => {\n const aMicros = toMicros(a.createdAt);\n const bMicros = toMicros(b.createdAt);\n if (aMicros !== bMicros) return bMicros > aMicros ? 1 : -1;\n if (a.id === b.id) return 0;\n return b.id > a.id ? 1 : -1;\n });\n if (limit !== undefined) projects = projects.slice(0, limit);\n\n success({ projects, count: projects.length });\n if (!isJsonMode()) {\n console.log(\n toonList(\n \"projects\",\n projects.map((p) => ({\n id: p.id,\n name: p.name,\n status: ProjectStatus.display(p.status),\n githubRepo: p.githubRepo,\n })),\n ),\n );\n }\n break;\n }\n\n case \"get\": {\n const projectId = args.id;\n if (!projectId) error(\"PROJECT_ID_REQUIRED\", \"Project ID required\");\n\n await using ctx = await CommandContext.create({\n host: args.host,\n module: args.module,\n });\n const project = ctx.iter<Project>(\"projects\").find((p) => p.id.toString() === projectId);\n if (!project) error(\"PROJECT_NOT_FOUND\", `Project not found: ${projectId}`);\n\n success(project);\n if (!isJsonMode()) {\n console.log(\n toonList(\"project\", [\n {\n id: project.id.toString(),\n name: project.name,\n status: ProjectStatus.display(project.status),\n githubRepo: project.githubRepo,\n description: project.description,\n },\n ]),\n );\n }\n break;\n }\n\n case \"status\": {\n const projectId = args.id;\n if (!projectId) error(\"PROJECT_ID_REQUIRED\", \"Project ID required\");\n\n await using ctx = await CommandContext.create({\n host: args.host,\n module: args.module,\n });\n const project = ctx.iter<Project>(\"projects\").find((p) => p.id.toString() === projectId);\n if (!project) error(\"PROJECT_NOT_FOUND\", `Project not found: ${projectId}`);\n\n const status = ProjectStatus.display(project.status);\n success({ projectId, status });\n if (!isJsonMode()) {\n console.log(\n toonList(\"project_status\", [\n {\n id: project.id.toString(),\n name: project.name,\n status,\n },\n ]),\n );\n }\n break;\n }\n\n case \"create\": {\n if (!args.name || !args[\"github-repo\"] || !args[\"source-idea\"]) {\n error(\"ARGS_REQUIRED\", \"--name, --github-repo, and --source-idea required\");\n }\n\n try {\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n await callReducer(ctx, \"createProject\", {\n sourceIdeaId: BigInt(args[\"source-idea\"] as string),\n name: args.name,\n githubRepo: args[\"github-repo\"],\n description: args.description || \"\",\n });\n },\n );\n success({\n created: true,\n name: args.name,\n githubRepo: args[\"github-repo\"],\n sourceIdeaId: args[\"source-idea\"],\n });\n if (!isJsonMode()) {\n console.log(\n toonList(\"project_created\", [\n {\n name: args.name,\n githubRepo: args[\"github-repo\"],\n sourceIdeaId: args[\"source-idea\"],\n },\n ]),\n );\n }\n } catch (err) {\n error(\"REDUCER_FAILED\", err instanceof Error ? err.message : \"Unknown error\");\n }\n break;\n }\n\n case \"set-status\": {\n const projectId = args.id;\n const nextStatus = args.value;\n if (!projectId || !nextStatus) {\n error(\n \"ARGS_REQUIRED\",\n \"Project ID and status required. Use: probe project set-status <id> <active|paused>\",\n );\n }\n\n const normalized = nextStatus.toLowerCase().replace(/[_\\s]/g, \"\");\n if (![\"active\", \"paused\"].includes(normalized)) {\n error(\"INVALID_STATUS\", `Invalid status: ${nextStatus}. Use: active, paused`);\n }\n\n try {\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n await callReducer(ctx, \"updateProjectStatus\", {\n projectId: BigInt(projectId),\n status: ProjectStatus.fromString(nextStatus),\n });\n },\n );\n\n success({ updated: true, projectId, status: normalized });\n if (!isJsonMode()) {\n console.log(\n toonList(\"project_status_updated\", [\n {\n projectId,\n status: normalized,\n },\n ]),\n );\n }\n } catch (err) {\n error(\"REDUCER_FAILED\", err instanceof Error ? err.message : \"Unknown error\");\n }\n break;\n }\n\n default:\n error(\n \"INVALID_ACTION\",\n `Invalid action: ${action}`,\n \"Use: list, get, create, status, set-status\",\n );\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n failWithConnectionOrUnexpected(message);\n }\n },\n});\n","import {\n CommandContext,\n callReducer,\n type Project,\n type Task,\n type TaskDependency,\n withAuth,\n} from \"~/utils/context.js\";\nimport { failWithConnectionOrUnexpected } from \"~/utils/errors.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 action?: string;\n id?: string;\n status?: string;\n project?: string;\n title?: string;\n description?: string;\n priority?: string;\n assigned?: boolean;\n wallet?: string;\n \"github-pr-url\"?: string;\n \"github-issue-url\"?: string;\n \"add-dep\"?: string;\n list?: boolean;\n timeout?: string;\n limit?: string;\n host?: string;\n module?: string;\n}\n\nconst normalizeGitHubRepoUrl = (githubRepo: string): string | undefined => {\n const value = githubRepo.trim().replace(/\\.git$/i, \"\");\n if (!value) return undefined;\n\n if (/^[\\w.-]+\\/[\\w.-]+$/.test(value)) {\n return `https://github.com/${value}`;\n }\n\n const sshMatch = value.match(/^git@github\\.com:([\\w.-]+\\/[\\w.-]+)$/i);\n if (sshMatch) {\n return `https://github.com/${sshMatch[1]}`;\n }\n\n if (value.startsWith(\"http://\") || value.startsWith(\"https://\")) {\n try {\n const parsed = new URL(value);\n if (parsed.hostname !== \"github.com\") return undefined;\n const parts = parsed.pathname.split(\"/\").filter(Boolean);\n if (parts.length < 2) return undefined;\n return `https://github.com/${parts[0]}/${parts[1]}`;\n } catch {\n return undefined;\n }\n }\n\n return undefined;\n};\n\nexport const runTaskAction = async (args: TaskCommandArgs): Promise<void> => {\n const action = args.action;\n if (!action) {\n error(\"ACTION_REQUIRED\", \"Task action required\");\n }\n\n try {\n switch (action) {\n case \"list\": {\n await using ctx = await CommandContext.create({\n host: args.host,\n module: args.module,\n });\n let tasks = ctx.iter<Task>(\"tasks\");\n const statusFilter = args.status;\n const limit = args.limit ? parseInt(args.limit, 10) : undefined;\n\n if (limit !== undefined && (!Number.isFinite(limit) || limit <= 0)) {\n error(\"INVALID_LIMIT\", \"--limit must be a positive integer\");\n }\n\n if (statusFilter) tasks = tasks.filter((t) => TaskStatus.matches(t.status, statusFilter));\n if (args.project) tasks = tasks.filter((t) => t.projectId.toString() === args.project);\n if (args.assigned) tasks = tasks.filter((t) => t.assignedTo);\n tasks = tasks.sort((a, b) => {\n const aMicros = toMicros(a.createdAt);\n const bMicros = toMicros(b.createdAt);\n if (aMicros !== bMicros) return bMicros > aMicros ? 1 : -1;\n if (a.id === b.id) return 0;\n return b.id > a.id ? 1 : -1;\n });\n if (limit !== undefined) tasks = tasks.slice(0, limit);\n\n success({ tasks, count: tasks.length });\n if (!isJsonMode()) {\n console.log(\n toonList(\n \"tasks\",\n tasks.map((t) => ({\n id: t.id.toString(),\n title: t.title,\n status: TaskStatus.display(t.status),\n priority: t.priority,\n assignedTo: t.assignedTo || \"\",\n projectId: t.projectId,\n })),\n ),\n );\n }\n break;\n }\n\n case \"ready\": {\n await using ctx = await CommandContext.create({\n host: args.host,\n module: args.module,\n });\n const tasks = ctx.iter<Task>(\"tasks\");\n const deps = ctx.iter<TaskDependency>(\"task_dependencies\");\n const taskById = new Map(tasks.map((t) => [t.id.toString(), t]));\n const limit = args.limit ? parseInt(args.limit, 10) : undefined;\n\n if (limit !== undefined && (!Number.isFinite(limit) || limit <= 0)) {\n error(\"INVALID_LIMIT\", \"--limit must be a positive integer\");\n }\n\n const ready = tasks\n .filter((t) => TaskStatus.is.open(t.status))\n .filter((t) => {\n const incomingDeps = deps.filter((dep) => dep.taskId === t.id);\n const hasOpenBlocker = incomingDeps.some((dep) => {\n const depTag =\n typeof dep.dependencyType === \"string\"\n ? dep.dependencyType\n : dep.dependencyType.tag;\n if (\n depTag !== \"Blocks\" &&\n depTag !== \"ParentChild\" &&\n depTag !== \"blocks\" &&\n depTag !== \"parent-child\"\n )\n return false;\n const blocker = taskById.get(dep.dependsOnId.toString());\n if (!blocker) return false;\n return !TaskStatus.is.completed(blocker.status);\n });\n return !hasOpenBlocker;\n })\n .filter((t) => !args.project || t.projectId.toString() === args.project)\n .filter((t) => !args.assigned || Boolean(t.assignedTo))\n .sort((a, b) => {\n if (a.priority !== b.priority) return a.priority - b.priority;\n const aMicros = toMicros(a.createdAt);\n const bMicros = toMicros(b.createdAt);\n if (aMicros < bMicros) return -1;\n if (aMicros > bMicros) return 1;\n return 0;\n });\n\n const readyTasks = (limit !== undefined ? ready.slice(0, limit) : ready).map((t) => ({\n id: t.id.toString(),\n title: t.title,\n status: t.status.tag.toLowerCase(),\n priority: t.priority,\n assignedTo: t.assignedTo || \"\",\n projectId: t.projectId.toString(),\n blockedBy: [] as string[],\n }));\n\n success({ tasks: readyTasks, count: readyTasks.length });\n if (!isJsonMode()) {\n console.log(\n toonList(\n \"tasks\",\n readyTasks.map((t) => ({\n id: t.id,\n title: t.title,\n status: t.status,\n priority: t.priority,\n assignedTo: t.assignedTo,\n projectId: t.projectId,\n })),\n ),\n );\n }\n break;\n }\n\n case \"get\": {\n const taskId = args.id;\n if (!taskId) error(\"TASK_ID_REQUIRED\", \"Task ID required\");\n\n await using ctx = await CommandContext.create({\n host: args.host,\n module: args.module,\n });\n const task = ctx.iter<Task>(\"tasks\").find((t) => t.id.toString() === taskId);\n if (!task) error(\"TASK_NOT_FOUND\", `Task not found: ${taskId}`);\n\n success(task);\n if (!isJsonMode()) {\n console.log(\n toonList(\"task\", [\n {\n id: task.id.toString(),\n title: task.title,\n status: TaskStatus.display(task.status),\n priority: task.priority,\n assignedTo: task.assignedTo || \"\",\n projectId: task.projectId.toString(),\n githubIssueUrl: task.githubIssueUrl || \"\",\n githubPrUrl: task.githubPrUrl || \"\",\n description: task.description,\n },\n ]),\n );\n }\n break;\n }\n\n case \"create\": {\n if (!args.project || !args.title) error(\"ARGS_REQUIRED\", \"--project and --title required\");\n\n const priority = parseInt(args.priority || \"5\", 10);\n if (priority < 1 || priority > 10) error(\"INVALID_PRIORITY\", \"Priority must be 1-10\");\n\n try {\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n await callReducer(ctx, \"createTask\", {\n projectId: BigInt(args.project as string),\n title: args.title,\n description: args.description || \"\",\n priority,\n sourceIdeaId: undefined,\n githubIssueUrl: args[\"github-issue-url\"],\n });\n },\n );\n success({\n created: true,\n projectId: args.project,\n title: args.title,\n issue: args[\"github-issue-url\"],\n });\n if (!isJsonMode()) {\n console.log(\n toonList(\"task_created\", [\n {\n projectId: args.project,\n title: args.title,\n githubIssueUrl: args[\"github-issue-url\"] || \"\",\n },\n ]),\n );\n }\n } catch (err) {\n error(\"REDUCER_FAILED\", err instanceof Error ? err.message : \"Unknown error\");\n }\n break;\n }\n\n case \"claim\": {\n const taskId = args.id;\n if (!taskId) error(\"TASK_ID_REQUIRED\", \"Task ID required\");\n\n try {\n let repositoryUrl: string | undefined;\n let contributingUrl: string | undefined;\n\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n await callReducer(ctx, \"claimTask\", { taskId: BigInt(taskId) });\n\n const task = ctx.iter<Task>(\"tasks\").find((t) => t.id.toString() === taskId);\n const project = task\n ? ctx.iter<Project>(\"projects\").find((p) => p.id === task.projectId)\n : undefined;\n\n if (project?.githubRepo) {\n repositoryUrl = normalizeGitHubRepoUrl(project.githubRepo);\n if (repositoryUrl) {\n contributingUrl = `${repositoryUrl}/blob/main/CONTRIBUTING.md`;\n }\n }\n },\n );\n success({\n claimed: true,\n taskId,\n repositoryUrl,\n contributingUrl,\n nextSteps: [\n repositoryUrl\n ? `Fork the target repository: ${repositoryUrl}`\n : \"Fork the target repository to your GitHub account using gh cli\",\n contributingUrl\n ? `Read CONTRIBUTING.md before starting: ${contributingUrl}`\n : \"Read CONTRIBUTING.md in the target repository before starting\",\n \"Verify behavior independently by tracing relevant code flow and runtime path before implementing changes.\",\n ],\n });\n\n if (!isJsonMode()) {\n console.log(\n toonList(\"task_claimed\", [\n {\n taskId,\n repositoryUrl: repositoryUrl || \"\",\n contributingUrl: contributingUrl || \"\",\n },\n ]),\n );\n console.log(\"\");\n console.log(\"Next steps:\");\n if (repositoryUrl) {\n console.log(`1. Fork the target repository: ${repositoryUrl}`);\n } else {\n console.log(\"1. Fork the target repository to your GitHub account\");\n }\n if (contributingUrl) {\n console.log(`2. Read CONTRIBUTING.md before starting: ${contributingUrl}`);\n } else {\n console.log(\"2. Read CONTRIBUTING.md in the target repository before starting\");\n }\n console.log(\n \"3. Verify behavior independently by tracing relevant code flow and runtime path before implementing changes.\",\n );\n }\n } catch (err) {\n error(\"REDUCER_FAILED\", err instanceof Error ? err.message : \"Unknown error\");\n }\n break;\n }\n\n case \"update\": {\n const taskId = args.id;\n if (!taskId) error(\"TASK_ID_REQUIRED\", \"Task ID required\");\n if (!args.status && !args[\"github-pr-url\"])\n error(\"UPDATE_REQUIRED\", \"--status or --github-pr-url required\");\n\n try {\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n await callReducer(ctx, \"updateTaskStatus\", {\n taskId: BigInt(taskId),\n status: args.status ? TaskStatus.fromString(args.status) : (undefined as never),\n githubPrUrl: args[\"github-pr-url\"],\n archiveReason: undefined,\n });\n },\n );\n success({\n updated: true,\n taskId,\n status: args.status,\n pr: args[\"github-pr-url\"],\n });\n if (!isJsonMode()) {\n console.log(\n toonList(\"task_updated\", [\n {\n taskId,\n status: args.status || \"\",\n githubPrUrl: args[\"github-pr-url\"] || \"\",\n },\n ]),\n );\n }\n } catch (err) {\n error(\"REDUCER_FAILED\", err instanceof Error ? err.message : \"Unknown error\");\n }\n break;\n }\n\n case \"review\": {\n const taskId = args.id;\n if (!taskId) error(\"TASK_ID_REQUIRED\", \"Task ID required\");\n\n try {\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n await callReducer(ctx, \"updateTaskStatus\", {\n taskId: BigInt(taskId),\n status: { tag: \"Review\" },\n githubPrUrl: args[\"github-pr-url\"],\n archiveReason: undefined,\n });\n },\n );\n success({\n reviewed: true,\n taskId,\n status: \"review\",\n pr: args[\"github-pr-url\"],\n });\n if (!isJsonMode()) {\n console.log(\n toonList(\"task_review\", [\n {\n taskId,\n status: \"review\",\n githubPrUrl: args[\"github-pr-url\"] || \"\",\n },\n ]),\n );\n }\n } catch (err) {\n error(\"REDUCER_FAILED\", err instanceof Error ? err.message : \"Unknown error\");\n }\n break;\n }\n\n case \"deps\": {\n const taskId = args.id;\n if (!taskId) error(\"TASK_ID_REQUIRED\", \"Task ID required\");\n const taskIdBigInt = BigInt(taskId);\n\n if (args[\"add-dep\"]) {\n try {\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n await callReducer(ctx, \"addTaskDependency\", {\n taskId: taskIdBigInt,\n dependsOnId: BigInt(args[\"add-dep\"] as string),\n dependencyType: { tag: \"Blocks\" },\n });\n },\n );\n success({ added: true, taskId, dependsOn: args[\"add-dep\"] });\n if (!isJsonMode()) {\n console.log(\n toonList(\"dependency_added\", [\n {\n taskId,\n dependsOnId: args[\"add-dep\"],\n dependencyType: \"blocks\",\n },\n ]),\n );\n }\n } catch (err) {\n error(\"REDUCER_FAILED\", err instanceof Error ? err.message : \"Unknown error\");\n }\n } else if (args.list) {\n await using ctx = await CommandContext.create({\n host: args.host,\n module: args.module,\n });\n const deps = ctx.iter<TaskDependency>(\"task_dependencies\");\n const taskDeps = deps.filter(\n (d) => d.taskId === taskIdBigInt || d.dependsOnId === taskIdBigInt,\n );\n\n success({ dependencies: taskDeps });\n if (!isJsonMode()) {\n console.log(\n toonList(\n \"task_dependencies\",\n taskDeps.map((dep) => ({\n id: dep.id.toString(),\n taskId: dep.taskId.toString(),\n dependsOnId: dep.dependsOnId.toString(),\n dependencyType: dep.dependencyType,\n })),\n ),\n );\n }\n } else {\n error(\n \"DEPS_ACTION_REQUIRED\",\n \"Use --add-dep <taskId> to add a dependency or --list to view dependencies\",\n \"Examples: probe task deps 42 --list | probe task deps 42 --add-dep 17\",\n );\n }\n break;\n }\n\n case \"watch\": {\n const timeout = Math.min(parseInt(args.timeout || \"60\", 10), 300);\n\n await withAuth(\n { host: args.host, module: args.module, wallet: args.wallet },\n async (ctx) => {\n if (!isJsonMode()) {\n console.log(\n toonList(\"task_watch\", [\n {\n timeoutSeconds: timeout,\n statusFilter: args.status || \"\",\n },\n ]),\n );\n }\n\n const waitForStop = new Promise<void>((resolve) => {\n const timer = setTimeout(() => {\n process.off(\"SIGINT\", onSignal);\n process.off(\"SIGTERM\", onSignal);\n resolve();\n }, timeout * 1000);\n\n const onSignal = () => {\n clearTimeout(timer);\n process.off(\"SIGINT\", onSignal);\n process.off(\"SIGTERM\", onSignal);\n resolve();\n };\n\n process.on(\"SIGINT\", onSignal);\n process.on(\"SIGTERM\", onSignal);\n });\n\n ctx.db.tasks.onInsert((_ctx, task) => {\n if (!args.status || TaskStatus.matches(task.status, args.status)) {\n console.log(\n toonList(\"tasks\", [\n {\n id: task.id.toString(),\n title: task.title,\n change_type: \"created\",\n },\n ]),\n );\n }\n });\n\n ctx.db.tasks.onUpdate((_ctx, _old, newTask) => {\n if (!args.status || TaskStatus.matches(newTask.status, args.status)) {\n console.log(\n toonList(\"tasks\", [\n {\n id: newTask.id.toString(),\n title: newTask.title,\n change_type: \"updated\",\n },\n ]),\n );\n }\n });\n\n await waitForStop;\n },\n );\n break;\n }\n\n default:\n error(\n \"INVALID_ACTION\",\n `Invalid action: ${action}`,\n \"Use: list, ready, get, create, claim, update, review, deps, watch\",\n );\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n failWithConnectionOrUnexpected(message);\n }\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 meta: { name: \"task\", description: \"Task management\" },\n args: {\n action: {\n type: \"positional\",\n description: \"Action: list, ready, get, create, claim, update, review, deps, watch\",\n required: false,\n },\n id: { type: \"positional\", description: \"Task ID\", required: false },\n status: { type: \"string\", description: \"Status filter or new status\" },\n project: { type: \"string\", description: \"Project ID\" },\n title: { type: \"string\", description: \"Task title\" },\n description: { type: \"string\", description: \"Task description\" },\n priority: { type: \"string\", description: \"Priority 1-10\" },\n assigned: {\n type: \"boolean\",\n description: \"Show only assigned tasks\",\n default: false,\n },\n wallet: { type: \"string\", description: \"Wallet name\" },\n \"github-pr-url\": { type: \"string\", description: \"GitHub PR URL\" },\n \"github-issue-url\": { type: \"string\", description: \"GitHub issue URL\" },\n \"add-dep\": { type: \"string\", description: \"Add dependency task ID\" },\n list: { type: \"boolean\", description: \"List dependencies\", default: false },\n timeout: { type: \"string\", description: \"Watch timeout (seconds)\" },\n limit: { type: \"string\", description: \"Limit rows for list/ready\" },\n json: { type: \"boolean\", description: \"Output JSON\", default: false },\n host: { type: \"string\", description: \"SpacetimeDB host\" },\n module: { type: \"string\", description: \"Module name\" },\n },\n async run({ args }) {\n if (args.json) setJsonMode(true);\n\n if (!args.action) {\n printHelp({\n command: \"probe task\",\n description: \"Task management commands\",\n usage: [\n \"probe task <action> [options]\",\n \"probe task list --project 1 --status open\",\n 'probe task create --project 1 --title \"Fix bug\" --priority 5',\n ],\n actions: [\n { name: \"list\", detail: \"List tasks with optional filters\" },\n { name: \"ready\", detail: \"List immediately claimable open tasks\" },\n { name: \"get <id>\", detail: \"Show one task\" },\n { name: \"create\", detail: \"Create a new task\" },\n { name: \"claim <id>\", detail: \"Claim a task for your identity\" },\n { name: \"update <id>\", detail: \"Update status and optional PR URL\" },\n { name: \"review <id>\", detail: \"Mark a task as ready for review\" },\n { name: \"deps <id>\", detail: \"List or add task dependencies\" },\n { name: \"watch\", detail: \"Watch task changes in real time\" },\n ],\n options: [\n { name: \"--project\", detail: \"Project ID\" },\n { name: \"--title\", detail: \"Task title (create)\" },\n { name: \"--description\", detail: \"Task description\" },\n { name: \"--priority\", detail: \"Priority from 1 to 10 (default: 5)\" },\n { name: \"--status\", detail: \"Filter or new status\" },\n { name: \"--limit\", detail: \"Limit rows for list/ready\" },\n {\n name: \"--github-pr-url\",\n detail: \"GitHub PR URL for update/review\",\n },\n { name: \"--github-issue-url\", detail: \"GitHub issue URL for create\" },\n { name: \"--wallet\", detail: \"Wallet to use for authenticated calls\" },\n {\n name: \"--host, --module\",\n detail: \"Nexus SpacetimeDB target overrides\",\n },\n ],\n notes: [\n \"Use full long-form flags only; short aliases are intentionally disabled.\",\n \"Find project IDs with `probe project list`; find task IDs with `probe task list`.\",\n ],\n });\n return;\n }\n\n await runTaskAction(args as TaskCommandArgs);\n },\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 { key: \"agents\", name: \"agents\" },\n { key: \"tasks\", name: \"tasks\" },\n { key: \"ideas\", name: \"ideas\" },\n { key: \"messages\", name: \"messages\" },\n { key: \"channels\", name: \"channels\" },\n { key: \"projects\", name: \"projects\" },\n { key: \"votes\", name: \"votes\" },\n { key: \"discovered_tasks\", name: \"discovered_tasks\" },\n { key: \"task_dependencies\", name: \"task_dependencies\" },\n { key: \"identity_roles\", name: \"identity_roles\" },\n { key: \"config\", name: \"config\" },\n { key: \"project_channels\", name: \"project_channels\" },\n { key: \"project_messages\", name: \"project_messages\" },\n] as const;\n\ntype DaemonEvent = {\n type: string;\n source: \"nexus\";\n at: string;\n [key: string]: unknown;\n};\n\ntype SessionEnd = {\n reason: \"disconnected\" | \"heartbeat_failed\" | \"stop\";\n details?: unknown;\n};\n\ntype LogLevel = \"critical\" | \"info\" | \"debug\";\n\ntype ObservableTable = {\n onInsert?: (cb: (_ctx: unknown, row: unknown) => void) => void;\n onUpdate?: (cb: (_ctx: unknown, oldRow: unknown, newRow: unknown) => void) => void;\n onDelete?: (cb: (_ctx: unknown, row: unknown) => void) => void;\n};\n\nconst CRITICAL_EVENTS = new Set([\n \"connected\",\n \"ready\",\n \"disconnected\",\n \"reconnecting\",\n \"reconnected\",\n \"subscription_applied\",\n \"subscription_error\",\n \"auth_failed\",\n \"heartbeat_failed\",\n \"heartbeat_recovered\",\n \"shutdown\",\n]);\n\nconst jsonReplacer = (_key: string, value: unknown): unknown => {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n};\n\nconst nowIso = (): string => new Date().toISOString();\n\nconst sleep = (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms));\n\nconst withJitter = (baseMs: number): number => {\n const jitter = Math.floor(Math.random() * (HEARTBEAT_JITTER_MS * 2 + 1) - HEARTBEAT_JITTER_MS);\n return Math.max(1_000, baseMs + jitter);\n};\n\nconst backoffMs = (attempt: number): number => {\n const base = Math.min(RECONNECT_MAX_MS, RECONNECT_BASE_MS * 2 ** Math.max(0, attempt - 1));\n return withJitter(base);\n};\n\nconst normalizeError = (err: unknown): string => {\n if (err instanceof Error) {\n return err.message;\n }\n return String(err);\n};\n\nconst sanitizeValue = (value: unknown): unknown => {\n if (value instanceof Error) {\n return { name: value.name, message: value.message };\n }\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\" ||\n value === null\n ) {\n return value;\n }\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n try {\n return JSON.parse(JSON.stringify(value, jsonReplacer));\n } catch {\n return String(value);\n }\n};\n\nconst resolveLogLevel = (value: unknown): LogLevel => {\n if (value === \"critical\" || value === \"info\" || value === \"debug\") {\n return value;\n }\n return \"critical\";\n};\n\nconst shouldEmit = (eventType: string, level: LogLevel): boolean => {\n if (level === \"debug\") {\n return true;\n }\n if (CRITICAL_EVENTS.has(eventType)) {\n return true;\n }\n if (level === \"info\" && eventType.startsWith(\"heartbeat_\")) {\n return true;\n }\n return false;\n};\n\nconst resolveLogStream = async (pathValue?: string): Promise<WriteStream | null> => {\n if (!pathValue) {\n return null;\n }\n const absolutePath = resolve(pathValue);\n await mkdir(dirname(absolutePath), { recursive: true });\n return createWriteStream(absolutePath, { flags: \"a\" });\n};\n\nconst connectErrorLooksAuthRelated = (message: string): boolean => {\n const lowered = message.toLowerCase();\n return (\n lowered.includes(\"authentication required\") ||\n lowered.includes(\"unauthorized\") ||\n lowered.includes(\"401\")\n );\n};\n\nexport const nexusDaemonArgs = {\n wallet: {\n type: \"string\",\n description: \"Wallet name for authenticated connection\",\n },\n host: {\n type: \"string\",\n description: \"SpacetimeDB host override\",\n },\n module: {\n type: \"string\",\n description: \"SpacetimeDB module override\",\n },\n sender: {\n type: \"string\",\n description: \"Optional sender filter (debug table events only)\",\n },\n \"log-file\": {\n type: \"string\",\n description: \"Optional path to append JSONL daemon events\",\n },\n \"log-level\": {\n type: \"string\",\n description: \"critical, info, or debug\",\n default: \"critical\",\n },\n pretty: {\n type: \"boolean\",\n description: \"Human-readable lifecycle logs to stderr\",\n default: false,\n },\n json: {\n type: \"boolean\",\n description: \"Reserved for CLI consistency\",\n default: false,\n },\n} as const;\n\nexport async function runNexusDaemon(args: Record<string, unknown>): Promise<void> {\n const logLevel = resolveLogLevel(args[\"log-level\"]);\n const pretty = !!args.pretty;\n const prettyLogger = pretty\n ? createConsola({\n stdout: process.stderr,\n stderr: process.stderr,\n })\n : null;\n\n let logStream: WriteStream | null = null;\n try {\n logStream = await resolveLogStream(args[\"log-file\"] as string | undefined);\n } catch (err) {\n const message = normalizeError(err);\n const fallback = JSON.stringify({\n source: \"nexus\",\n at: nowIso(),\n type: \"log_file_error\",\n message,\n });\n console.log(fallback);\n return;\n }\n\n const writeEvent = (event: DaemonEvent): void => {\n const line = JSON.stringify(event, jsonReplacer);\n console.log(line);\n if (logStream) {\n logStream.write(`${line}\\n`);\n }\n };\n\n const emit = (event: { type: string; [key: string]: unknown }): void => {\n if (!shouldEmit(event.type, logLevel)) {\n return;\n }\n\n const fullEvent: DaemonEvent = {\n source: \"nexus\",\n at: nowIso(),\n ...event,\n };\n\n writeEvent(fullEvent);\n\n if (!prettyLogger) {\n return;\n }\n\n const type = String(event.type);\n if (type === \"connected\") {\n prettyLogger.info(\"Connected to Nexus\");\n } else if (type === \"reconnected\") {\n prettyLogger.success(\"Reconnected to Nexus\");\n } else if (type === \"disconnected\") {\n prettyLogger.warn(\"Disconnected from Nexus\");\n } else if (type === \"reconnecting\") {\n prettyLogger.info(\"Reconnecting to Nexus\");\n } else if (type === \"auth_failed\") {\n prettyLogger.error(\"Authentication failed\");\n } else if (type === \"heartbeat_failed\") {\n prettyLogger.warn(\"Heartbeat failed repeatedly\");\n } else if (type === \"shutdown\") {\n prettyLogger.info(\"Nexus daemon shutting down\");\n }\n };\n\n let stopping = false;\n let stopSignal: \"SIGINT\" | \"SIGTERM\" | null = null;\n\n const stopWaiter = new Promise<void>((resolve) => {\n const onSigint = () => {\n if (stopping) {\n return;\n }\n stopping = true;\n stopSignal = \"SIGINT\";\n resolve();\n };\n const onSigterm = () => {\n if (stopping) {\n return;\n }\n stopping = true;\n stopSignal = \"SIGTERM\";\n resolve();\n };\n process.on(\"SIGINT\", onSigint);\n process.on(\"SIGTERM\", onSigterm);\n });\n\n let reconnectAttempt = 0;\n let downtimeStartedAt: number | null = null;\n let hasConnectedOnce = false;\n\n while (!stopping) {\n let sessionEnd: SessionEnd | null = null;\n\n try {\n await withAuth(\n {\n host: args.host as string | undefined,\n module: args.module as string | undefined,\n wallet: args.wallet as string | undefined,\n onDisconnect: (...disconnectArgs: unknown[]) => {\n if (!sessionEnd) {\n sessionEnd = {\n reason: \"disconnected\",\n details: disconnectArgs.map(sanitizeValue),\n };\n }\n },\n },\n async (ctx) => {\n const effectiveWallet = ctx.auth?.wallet || args.wallet || null;\n const currentAgent = ctx\n .iter<Agent>(\"agents\")\n .find((a) => a.identity.toHexString() === ctx.identity?.toHexString());\n\n if (!hasConnectedOnce) {\n emit({\n type: \"connected\",\n identity: ctx.identity?.toHexString(),\n wallet: effectiveWallet,\n host: args.host || ctx.config.spacetime.host,\n module: args.module || ctx.config.spacetime.module,\n });\n } else {\n emit({\n type: \"reconnected\",\n attempts: reconnectAttempt,\n downtime_ms: downtimeStartedAt ? Date.now() - downtimeStartedAt : null,\n identity: ctx.identity?.toHexString(),\n });\n }\n\n hasConnectedOnce = true;\n reconnectAttempt = 0;\n downtimeStartedAt = null;\n\n emit({ type: \"subscription_applied\" });\n emit({\n type: \"ready\",\n identity: ctx.identity?.toHexString(),\n wallet: effectiveWallet,\n log_file: args[\"log-file\"] || null,\n log_level: logLevel,\n auto_heartbeat: !!currentAgent,\n });\n\n if (logLevel === \"debug\") {\n for (const tableSpec of OBSERVED_TABLES) {\n const table = ctx.db[tableSpec.key] as ObservableTable;\n table.onInsert?.((_eventCtx, row) => {\n if (\n args.sender &&\n (tableSpec.name === \"messages\" || tableSpec.name === \"project_messages\")\n ) {\n const senderId = (row as { senderId?: unknown }).senderId;\n if (senderId !== args.sender) {\n return;\n }\n }\n emit({\n type: \"table_insert\",\n table: tableSpec.name,\n row: sanitizeValue(row),\n });\n });\n\n table.onUpdate?.((_eventCtx, oldRow, newRow) => {\n if (\n args.sender &&\n (tableSpec.name === \"messages\" || tableSpec.name === \"project_messages\")\n ) {\n const senderId = (newRow as { senderId?: unknown }).senderId;\n if (senderId !== args.sender) {\n return;\n }\n }\n emit({\n type: \"table_update\",\n table: tableSpec.name,\n old_row: sanitizeValue(oldRow),\n new_row: sanitizeValue(newRow),\n });\n });\n\n table.onDelete?.((_eventCtx, row) => {\n if (\n args.sender &&\n (tableSpec.name === \"messages\" || tableSpec.name === \"project_messages\")\n ) {\n const senderId = (row as { senderId?: unknown }).senderId;\n if (senderId !== args.sender) {\n return;\n }\n }\n emit({\n type: \"table_delete\",\n table: tableSpec.name,\n row: sanitizeValue(row),\n });\n });\n }\n }\n\n let heartbeatTimer: ReturnType<typeof setTimeout> | null = null;\n let heartbeatInFlight = false;\n let consecutiveHeartbeatFailures = 0;\n\n const scheduleHeartbeat = () => {\n if (stopping || !currentAgent) {\n return;\n }\n\n heartbeatTimer = setTimeout(async () => {\n if (!currentAgent || heartbeatInFlight || stopping) {\n scheduleHeartbeat();\n return;\n }\n\n heartbeatInFlight = true;\n try {\n await callReducer(ctx, \"heartbeat\", {\n agentId: currentAgent.id,\n });\n if (consecutiveHeartbeatFailures > 0) {\n emit({\n type: \"heartbeat_recovered\",\n failed_count_before_recovery: consecutiveHeartbeatFailures,\n });\n }\n consecutiveHeartbeatFailures = 0;\n } catch (err) {\n consecutiveHeartbeatFailures += 1;\n if (consecutiveHeartbeatFailures >= HEARTBEAT_FAILURE_THRESHOLD && !sessionEnd) {\n sessionEnd = {\n reason: \"heartbeat_failed\",\n details: {\n consecutive_failures: consecutiveHeartbeatFailures,\n message: normalizeError(err),\n },\n };\n emit({\n type: \"heartbeat_failed\",\n consecutive_failures: consecutiveHeartbeatFailures,\n message: normalizeError(err),\n });\n }\n } finally {\n heartbeatInFlight = false;\n scheduleHeartbeat();\n }\n }, withJitter(HEARTBEAT_INTERVAL_MS));\n };\n\n if (currentAgent) {\n scheduleHeartbeat();\n }\n\n while (!stopping && !sessionEnd) {\n await Promise.race([stopWaiter, sleep(200)]);\n }\n\n if (heartbeatTimer) {\n clearTimeout(heartbeatTimer);\n }\n },\n );\n } catch (err) {\n const message = normalizeError(err);\n if (connectErrorLooksAuthRelated(message)) {\n emit({ type: \"auth_failed\", message });\n break;\n }\n\n emit({ type: \"subscription_error\", message });\n sessionEnd = {\n reason: \"disconnected\",\n details: { message },\n };\n }\n\n if (stopping) {\n break;\n }\n\n const reason = sessionEnd?.reason || \"disconnected\";\n emit({\n type: \"disconnected\",\n reason,\n details: sanitizeValue(sessionEnd?.details || null),\n });\n\n if (downtimeStartedAt === null) {\n downtimeStartedAt = Date.now();\n }\n\n reconnectAttempt += 1;\n const waitMs = backoffMs(reconnectAttempt);\n emit({\n type: \"reconnecting\",\n attempt: reconnectAttempt,\n backoff_ms: waitMs,\n });\n\n await Promise.race([stopWaiter, sleep(waitMs)]);\n }\n\n emit({ type: \"shutdown\", signal: stopSignal || \"unknown\" });\n\n if (logStream) {\n logStream.end();\n }\n}\n\nexport default defineCommand({\n meta: {\n name: \"nexus\",\n description: \"Persistent Nexus daemon (keepalive + critical telemetry)\",\n },\n args: nexusDaemonArgs,\n async run({ args }) {\n if (forceHelpRequested()) {\n printHelp({\n command: \"probe nexus\",\n description: \"Run persistent Nexus keepalive + critical event logger\",\n usage: [\n \"probe nexus [options]\",\n \"probe nexus --wallet agent-wallet\",\n \"probe nexus --wallet agent-wallet --log-file ./logs/nexus-events.jsonl\",\n \"probe nexus --log-level debug --sender zoe-1\",\n \"probe nexus --pretty\",\n ],\n options: [\n {\n name: \"--wallet\",\n detail: \"Wallet for authenticated persistent connection\",\n },\n {\n name: \"--host, --module\",\n detail: \"Nexus SpacetimeDB target overrides\",\n },\n { name: \"--log-level\", detail: \"critical (default), info, or debug\" },\n {\n name: \"--sender\",\n detail: \"Sender filter for debug message events only\",\n },\n {\n name: \"--log-file\",\n detail: \"Optional JSONL file path for daemon events\",\n },\n {\n name: \"--pretty\",\n detail: \"Human-readable lifecycle logs to stderr\",\n },\n ],\n notes: [\n \"stdout is always structured JSONL for machine parsing.\",\n \"Default mode logs critical connection lifecycle and heartbeat health events only.\",\n \"Use --log-level debug to emit full table insert/update/delete payloads.\",\n ],\n });\n return;\n }\n\n await runNexusDaemon(args as Record<string, unknown>);\n },\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 ActionEventType: (value) => {\n if (!Array.isArray(value)) return value;\n const variants = ['Issued', 'Completed', 'Skipped', 'Failed', 'Expired'];\n return variants[value[0]] ?? `variant_${value[0]}`;\n },\n ActionKind: (value) => {\n if (!Array.isArray(value)) return value;\n const variants = ['Repair', 'Inbox', 'Vote', 'Propose', 'ContinueTask', 'ClaimTask', 'ProjectSetup', 'CreateTasks', 'ValidateReviews', 'ReviewDiscovery', 'Idle'];\n return variants[value[0]] ?? `variant_${value[0]}`;\n },\n ActionStatus: (value) => {\n if (!Array.isArray(value)) return value;\n const variants = ['Issued', 'Completed', 'Skipped', 'Failed', 'Expired'];\n return variants[value[0]] ?? `variant_${value[0]}`;\n },\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 AnnouncementStatus: (value) => {\n if (!Array.isArray(value)) return value;\n const variants = ['Pending', 'Ready', 'Failed'];\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 agent_action_events: {\n 'event_code': optionDecoder(),\n 'note': optionDecoder(),\n 'created_at': timestampDecoder,\n },\n agent_actions: {\n 'target_type': optionDecoder(),\n 'target_id': optionDecoder(),\n 'created_at': timestampDecoder,\n 'updated_at': timestampDecoder,\n 'kind': enumDecoders.ActionKind,\n 'status': enumDecoders.ActionStatus,\n },\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 voice_announcements: {\n 'context_type': optionDecoder(),\n 'context_id': optionDecoder(),\n 'finalized_at': optionDecoder(timestampDecoder),\n 'failed_at': optionDecoder(timestampDecoder),\n 'error_message': optionDecoder(),\n 'created_at': timestampDecoder,\n 'status': enumDecoders.AnnouncementStatus,\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 name: string;\n type: string;\n}\n\nexport interface SqlSchema {\n columns: SqlColumn[];\n}\n\nexport interface SqlStatementResult {\n schema: SqlSchema | unknown;\n rows: unknown[];\n}\n\nexport interface SqlRowObject {\n [key: string]: unknown;\n}\n\nexport interface SqlSchemaElement {\n name: { some?: string } | string;\n algebraic_type?: unknown;\n type?: string;\n}\n\nexport interface SqlSchemaAlt {\n elements?: SqlSchemaElement[];\n}\n\nconst extractColumnName = (element: SqlSchemaElement): string | undefined => {\n if (typeof element.name === \"string\") {\n return element.name;\n }\n if (element.name && typeof element.name === \"object\" && \"some\" in element.name) {\n return element.name.some;\n }\n return undefined;\n};\n\nexport interface SqlRequestOptions {\n host: string;\n moduleName: string;\n token: string;\n sql: string;\n timeoutMs: number;\n}\n\nexport interface SqlRequestSuccess {\n results: SqlStatementResult[];\n durationMs: number;\n}\n\nexport class SqlRequestError extends Error {\n readonly status: number;\n readonly responseBody: string;\n\n constructor(status: number, responseBody: string, message?: string) {\n super(message || `SQL request failed with status ${status}`);\n this.name = \"SqlRequestError\";\n this.status = status;\n this.responseBody = responseBody;\n }\n}\n\nexport const normalizeSqlHttpBase = (host: string): string => {\n const url = new URL(host);\n if (url.protocol === \"ws:\") {\n url.protocol = \"http:\";\n } else if (url.protocol === \"wss:\") {\n url.protocol = \"https:\";\n } else if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n throw new Error(`Unsupported host protocol: ${url.protocol}`);\n }\n return url.toString();\n};\n\nexport const buildSqlEndpoint = (host: string, moduleName: string): string => {\n const base = normalizeSqlHttpBase(host);\n const url = new URL(base);\n const basePath = url.pathname.replace(/\\/$/, \"\");\n url.pathname = `${basePath}/v1/database/${encodeURIComponent(moduleName)}/sql`;\n return url.toString();\n};\n\nconst parseResults = (payload: unknown): SqlStatementResult[] => {\n if (!Array.isArray(payload)) {\n throw new Error(\"Invalid SQL response: expected array of statement results\");\n }\n return payload.map((statement) => {\n const record = statement as { schema?: unknown; rows?: unknown };\n const rows = Array.isArray(record.rows) ? record.rows : [];\n return {\n schema: record.schema,\n rows,\n };\n });\n};\n\nexport const executeSqlRequest = async (options: SqlRequestOptions): Promise<SqlRequestSuccess> => {\n const endpoint = buildSqlEndpoint(options.host, options.moduleName);\n const controller = new AbortController();\n const timeoutHandle = setTimeout(() => controller.abort(), options.timeoutMs);\n const started = Date.now();\n\n try {\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${options.token}`,\n \"Content-Type\": \"text/plain\",\n Accept: \"application/json\",\n },\n body: options.sql,\n signal: controller.signal,\n });\n\n const responseText = await response.text();\n if (!response.ok) {\n throw new SqlRequestError(response.status, responseText);\n }\n\n let parsed: unknown;\n try {\n parsed = responseText ? JSON.parse(responseText) : [];\n } catch {\n throw new Error(\"Invalid SQL response: expected JSON payload\");\n }\n\n return {\n results: parseResults(parsed),\n durationMs: Date.now() - started,\n };\n } finally {\n clearTimeout(timeoutHandle);\n }\n};\n\n// Extract column names from schema for use in responses\nexport const extractColumnNames = (result: SqlStatementResult): string[] => {\n const schema = result.schema as SqlSchema | SqlSchemaAlt | undefined;\n\n if (schema && \"elements\" in schema && Array.isArray(schema.elements)) {\n return schema.elements\n .map(extractColumnName)\n .filter((name): name is string => name !== undefined);\n } else if (schema && \"columns\" in schema && Array.isArray(schema.columns)) {\n return schema.columns.map((col) => col.name);\n }\n\n return [];\n};\n\n// Parse SQL error to provide helpful suggestions\nexport const parseSqlError = (responseBody: string): { message: string; suggestion?: string } => {\n // Try to parse as JSON first, fallback to plain text\n let errorMsg: string;\n try {\n const parsed = JSON.parse(responseBody);\n errorMsg = parsed.error || responseBody;\n } catch {\n errorMsg = responseBody;\n }\n\n // Common SpacetimeDB SQL errors with suggestions\n if (errorMsg.includes(\"ORDER BY\")) {\n return {\n message: errorMsg,\n suggestion:\n \"SpacetimeDB SQL does not support ORDER BY. Remove it or filter/sort results locally.\",\n };\n }\n if (errorMsg.includes(\"IS NULL\") || errorMsg.includes(\"IS NOT NULL\")) {\n return {\n message: errorMsg,\n suggestion: 'Use \"column = NULL\" or \"column != NULL\" instead of IS NULL / IS NOT NULL.',\n };\n }\n if (errorMsg.includes(\"JOIN\")) {\n return {\n message: errorMsg,\n suggestion:\n \"SpacetimeDB has limited JOIN support. Try querying single tables or use multiple queries.\",\n };\n }\n if (errorMsg.includes(\"no such table\")) {\n return {\n message: errorMsg,\n suggestion: \"Check the table name. Common tables: tasks, projects, agents, ideas, messages.\",\n };\n }\n if (errorMsg.includes(\"no such column\")) {\n return {\n message: errorMsg,\n suggestion: \"Check the column name. Use SELECT * to see all available columns.\",\n };\n }\n\n return { 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 executeSqlRequest,\n extractColumnNames,\n parseSqlError,\n SqlRequestError,\n type 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 if (err instanceof SqlRequestError) {\n if (err.status === 401) {\n error(\"AUTH_REQUIRED\", \"Authentication required. Run `probe auth <wallet> --save` first.\");\n }\n const { message, suggestion } = parseSqlError(err.responseBody);\n // Error parsed with potential suggestion\n if (err.status === 400) {\n error(\"SQL_INVALID\", message, suggestion);\n }\n error(\"SQL_FAILED\", message, suggestion);\n }\n\n if (err instanceof Error && err.name === \"AbortError\") {\n error(\"SQL_UNAVAILABLE\", `SQL request timed out after ${timeoutMs}ms`);\n }\n\n error(\"SQL_UNAVAILABLE\", err instanceof Error ? err.message : \"SQL request failed\");\n};\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\nconst buildMeta = (results: SqlStatementResult[], durationMs: number) => ({\n duration_ms: durationMs,\n query_count: results.length,\n row_count_total: results.reduce((sum, item) => sum + item.rows.length, 0),\n});\n\n// Build flat response structure for JSON mode\ninterface QueryResult {\n columns: string[];\n rows: Record<string, unknown>[];\n}\n\nconst buildFlatResponse = (\n results: SqlStatementResult[],\n shouldDecode: boolean,\n tableName?: string,\n): Record<string, QueryResult> => {\n const response: Record<string, QueryResult> = {};\n\n for (let index = 0; index < results.length; index += 1) {\n const statement = results[index];\n const columns = extractColumnNames(statement);\n const decoders = shouldDecode && tableName ? TABLE_DECODERS[tableName] : undefined;\n\n const rowObjects = (statement.rows as unknown[][]).map((row) => {\n const obj: Record<string, unknown> = {};\n for (let i = 0; i < columns.length; i++) {\n const colName = columns[i];\n const value = row[i];\n const decoder = decoders?.[colName];\n obj[colName] = decoder ? decoder(value) : value;\n }\n return obj;\n });\n\n response[`query_${index + 1}`] = { columns, rows: rowObjects };\n }\n\n if (results.length === 0) {\n response.query_1 = { columns: [], rows: [] };\n }\n\n return response;\n};\n\nconst formatStatementsToToon = (\n results: SqlStatementResult[],\n metaEnabled: boolean,\n durationMs: number,\n shouldDecode: boolean,\n tableName?: string,\n): string => {\n const payload: Record<string, unknown> = {};\n const decoders = shouldDecode && tableName ? TABLE_DECODERS[tableName] : undefined;\n\n for (let index = 0; index < results.length; index += 1) {\n const statement = results[index];\n const columns = extractColumnNames(statement);\n\n const rowObjects = (statement.rows as unknown[][]).map((row) => {\n const obj: Record<string, unknown> = {};\n for (let i = 0; i < columns.length; i++) {\n const colName = columns[i];\n const value = row[i];\n const decoder = decoders?.[colName];\n obj[colName] = decoder ? decoder(value) : value;\n }\n return obj;\n });\n\n payload[`query_${index + 1}`] = rowObjects;\n }\n\n if (results.length === 0) {\n payload.query_1 = [];\n }\n\n if (metaEnabled) {\n const meta = buildMeta(results, durationMs);\n payload.meta = [meta];\n }\n\n return formatToon(payload);\n};\n\nexport default defineCommand({\n meta: {\n name: \"query\",\n description: \"Run SQL read queries against Nexus\",\n },\n args: {\n sql: {\n type: \"positional\",\n description: \"SQL query string\",\n required: false,\n },\n file: {\n type: \"string\",\n description: \"Read SQL from file path\",\n },\n wallet: {\n type: \"string\",\n description: \"Wallet name override\",\n },\n host: {\n type: \"string\",\n description: \"SpacetimeDB host override\",\n },\n module: {\n type: \"string\",\n description: \"SpacetimeDB module override\",\n },\n timeout: {\n type: \"string\",\n description: \"Request timeout in milliseconds\",\n },\n meta: {\n type: \"boolean\",\n description: \"Include metadata in output\",\n default: false,\n },\n json: {\n type: \"boolean\",\n description: \"Output JSON only\",\n default: false,\n },\n tables: {\n type: \"boolean\",\n description: \"List all available tables\",\n default: false,\n },\n decode: {\n type: \"boolean\",\n description: \"Decode algebraic types to human-readable values\",\n default: true,\n },\n raw: {\n type: \"boolean\",\n description: \"Output raw algebraic type arrays (no decoding)\",\n default: false,\n },\n },\n async run({ args }) {\n if (args.json) {\n setJsonMode(true);\n }\n\n const hasSql = args.sql || args.file;\n\n // Handle --tables flag\n if (args.tables) {\n if (isJsonMode()) {\n success({ tables: KNOWN_TABLES });\n } else {\n console.log(formatToon({ tables: KNOWN_TABLES }));\n }\n return;\n }\n\n // Validate arguments\n if (!hasSql) {\n printHelp({\n command: \"probe query\",\n description: \"Execute SQL against the configured Nexus SpacetimeDB module\",\n usage: [\n 'probe query \"SELECT * FROM tasks LIMIT 5\"',\n \"probe query --file ./query.sql --meta\",\n \"probe query --tables\",\n ],\n options: [\n { name: \"--file\", detail: \"Read SQL from file\" },\n {\n name: \"--wallet\",\n detail: \"Wallet override (defaults to config defaultWallet)\",\n },\n {\n name: \"--host, --module\",\n detail: \"Nexus SpacetimeDB target overrides\",\n },\n {\n name: \"--timeout\",\n detail: `Request timeout in ms (default: ${DEFAULT_TIMEOUT_MS})`,\n },\n { name: \"--meta\", detail: \"Include metadata in output\" },\n { name: \"--json\", detail: \"JSON output mode with keyed objects\" },\n { name: \"--tables\", detail: \"List all available tables\" },\n {\n name: \"--decode\",\n detail: \"Decode algebraic types (default: true)\",\n },\n {\n name: \"--raw\",\n detail: \"Output raw algebraic arrays (no decoding)\",\n },\n ],\n notes: [\n \"This command is read-only and intended for SQL queries against Nexus tables.\",\n 'JSON mode returns keyed objects: {\"query_1\": {\"columns\": [...], \"rows\": [{\"id\": 1, ...}]}}',\n \"Use --raw to see raw SpacetimeDB algebraic type arrays.\",\n ],\n });\n return;\n }\n\n const timeoutMs = args.timeout ? Number.parseInt(args.timeout, 10) : DEFAULT_TIMEOUT_MS;\n if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n error(\"INVALID_TIMEOUT\", `Invalid timeout: ${args.timeout}`);\n }\n\n const config = await getConfig();\n const walletName = args.wallet || config.defaultWallet;\n if (!walletName) {\n error(\"WALLET_REQUIRED\", \"Wallet required. Use --wallet or set default wallet.\");\n }\n\n const wallet = await getWalletInfo(walletName);\n if (!wallet) {\n error(\"WALLET_NOT_FOUND\", `Wallet not found: ${walletName}`);\n }\n\n const cached = await getCachedToken(walletName);\n if (!cached) {\n error(\"AUTH_REQUIRED\", \"No cached token. Run `probe auth <wallet> --save` first.\");\n }\n\n const host = args.host || config.spacetime.host;\n const moduleName = args.module || config.spacetime.module;\n const sql = args.file ? await readFile(args.file, \"utf-8\") : (args.sql ?? \"\");\n if (!sql.trim()) {\n error(\"SQL_REQUIRED\", \"SQL query is empty\");\n }\n\n // Determine if we should decode algebraic types\n const shouldDecode = args.raw ? false : (args.decode ?? true);\n const tableName = inferTableName(sql);\n\n try {\n const { results, durationMs } = await executeSqlRequest({\n host,\n moduleName,\n token: cached.token,\n sql,\n timeoutMs,\n });\n\n if (isJsonMode()) {\n const flatResponse = buildFlatResponse(results, shouldDecode, tableName);\n if (args.meta) {\n success({ ...flatResponse, meta: buildMeta(results, durationMs) });\n } else {\n success(flatResponse);\n }\n return;\n }\n\n console.log(\n formatStatementsToToon(results, Boolean(args.meta), durationMs, shouldDecode, tableName),\n );\n } catch (err) {\n handleQueryError(err, timeoutMs);\n }\n },\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 { error, isJsonMode, setJsonMode, success, successMessage } from \"~/utils/output.js\";\nimport { loadWallet } from \"~/utils/wallet.js\";\n\nexport default defineCommand({\n meta: {\n name: \"sign\",\n description: \"Sign a message using wallet private key\",\n },\n args: {\n name: {\n type: \"positional\",\n description: \"Wallet name\",\n required: false,\n },\n message: {\n type: \"positional\",\n description: \"Message to sign\",\n required: false,\n },\n \"message-file\": {\n type: \"string\",\n description: \"Read message from file\",\n },\n \"password-file\": {\n type: \"string\",\n description: \"Read password from file\",\n },\n json: {\n type: \"boolean\",\n description: \"Output JSON only\",\n default: false,\n },\n },\n async run({ args }) {\n if (args.json) {\n setJsonMode(true);\n }\n\n const name = args.name;\n\n if (!name) {\n printHelp({\n command: \"probe sign\",\n description: \"Sign arbitrary text using wallet private key\",\n usage: [\n \"probe sign <wallet-name> <message> [options]\",\n \"probe sign <wallet-name> --message-file ./payload.txt [options]\",\n ],\n options: [\n { name: \"--message-file\", detail: \"Read message content from file\" },\n { name: \"--password-file\", detail: \"Read wallet password from file\" },\n { name: \"--json\", detail: \"JSON output for agents\" },\n ],\n });\n return;\n }\n\n let message: string;\n\n if (args[\"message-file\"]) {\n try {\n message = await readFile(args[\"message-file\"], \"utf-8\");\n } catch {\n error(\"FILE_READ_ERROR\", `Failed to read message file: ${args[\"message-file\"]}`);\n }\n } else if (args.message) {\n message = args.message;\n } else {\n error(\"MESSAGE_REQUIRED\", \"Message or message-file required\");\n }\n\n const walletPassword = await resolvePasswordInput({\n passwordFile: args[\"password-file\"],\n promptMessage: \"Enter wallet password:\",\n jsonModeError: \"Password file required in JSON mode or provide PROBE_WALLET_PASSWORD\",\n });\n\n try {\n const keyStore = await loadWallet(name, walletPassword);\n const keyPair = keyStore.getKeyPair(0);\n\n const signature = keyPair.sign(Buffer.from(message));\n const publicKey = keyPair.getPublicKey();\n const address = keyPair.getAddress();\n\n success({\n wallet: name,\n message,\n signature: signature.toString(\"hex\"),\n publicKey: publicKey.toString(\"hex\"),\n address: address.toString(),\n });\n\n if (!isJsonMode()) {\n successMessage(\"Message signed successfully\");\n console.log(`Signature: ${signature.toString(\"hex\")}`);\n }\n } catch (err) {\n error(\"SIGN_ERROR\", err instanceof Error ? err.message : \"Failed to sign message\");\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { printHelp } from \"~/utils/help.js\";\nimport { error, info, isJsonMode, setJsonMode, success } from \"~/utils/output.js\";\nimport { clearCachedToken, getCachedToken } from \"~/utils/token-cache.js\";\n\nexport default defineCommand({\n meta: {\n name: \"token\",\n description: \"Show cached JWT token for wallet\",\n },\n args: {\n name: {\n type: \"positional\",\n description: \"Wallet name\",\n required: false,\n },\n clear: {\n type: \"boolean\",\n description: \"Clear cached token now (next auth call gets a new token)\",\n default: false,\n },\n json: {\n type: \"boolean\",\n description: \"Output JSON only\",\n default: false,\n },\n },\n async run({ args }) {\n if (args.json) {\n setJsonMode(true);\n }\n\n const name = args.name;\n\n if (!name) {\n printHelp({\n command: \"probe token\",\n description: \"Inspect or clear cached authentication token\",\n usage: [\"probe token <wallet-name> [options]\", \"probe token <wallet-name> --clear\"],\n options: [\n { name: \"--clear\", detail: \"Clear cached token now (recommended)\" },\n { name: \"--json\", detail: \"JSON output for agents\" },\n ],\n });\n return;\n }\n\n if (args.clear) {\n await clearCachedToken(name);\n\n success({ cleared: name });\n\n if (!isJsonMode()) {\n info(`Token cache cleared for \"${name}\". Run 'probe auth' to get a new token.`);\n }\n return;\n }\n\n try {\n const cached = await getCachedToken(name);\n\n if (!cached) {\n error(\n \"TOKEN_NOT_FOUND\",\n `No cached token for wallet '${name}'`,\n `Run 'probe auth ${name} --save' to authenticate`,\n );\n }\n\n const expiresAt = new Date(cached.expiresAt);\n const now = new Date();\n const expiresIn = Math.floor((expiresAt.getTime() - now.getTime()) / 1000);\n const valid = expiresIn > 0;\n\n success({\n wallet: name,\n token: cached.token,\n expiresAt: cached.expiresAt,\n expiresIn: Math.max(0, expiresIn),\n valid,\n });\n\n if (!isJsonMode()) {\n console.log(`Wallet: ${name}`);\n console.log(`Token: ${cached.token.slice(0, 50)}...`);\n console.log(`Expires: ${expiresAt.toUTCString()}`);\n console.log(`Status: ${valid ? \"Valid\" : \"Expired\"}`);\n\n if (!valid) {\n info(\"Token has expired. Run with --clear to remove it and re-authenticate.\");\n }\n }\n } catch (err) {\n error(\"TOKEN_ERROR\", err instanceof Error ? err.message : \"Failed to read token\");\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { confirm } from \"@clack/prompts\";\nimport { printHelp } from \"~/utils/help.js\";\nimport { error, info, isJsonMode, setJsonMode, success } from \"~/utils/output.js\";\nimport { toonList } from \"~/utils/toon.js\";\nimport {\n type InstallMethod,\n type InstallMethodArg,\n detectMethod,\n fetchGitHubReleaseByVersion,\n fetchLatestGitHubRelease,\n fetchLatestNpmVersion,\n getCurrentVersion,\n normalizeVersion,\n upgradeViaBinary,\n upgradeViaNpm,\n} from \"~/utils/upgrade.js\";\n\nconst VALID_METHODS = new Set<InstallMethodArg>([\"auto\", \"npm\", \"binary\"]);\n\nconst printUpgradeResult = (data: {\n method: InstallMethod;\n currentVersion: string;\n targetVersion: string;\n latestVersion: string;\n updateAvailable: boolean;\n updated: boolean;\n checkOnly: boolean;\n}): void => {\n success(data);\n if (isJsonMode()) {\n return;\n }\n\n console.log(\n toonList(\"upgrade_result\", [\n {\n method: data.method,\n currentVersion: data.currentVersion,\n targetVersion: data.targetVersion,\n latestVersion: data.latestVersion,\n updated: data.updated,\n checkOnly: data.checkOnly,\n },\n ]),\n );\n};\n\nexport default defineCommand({\n meta: {\n name: \"upgrade\",\n description: \"Upgrade Probe to the latest or a specific version\",\n },\n args: {\n target: {\n type: \"positional\",\n description: \"Version to upgrade to (e.g. 1.2.0 or v1.2.0)\",\n required: false,\n },\n check: {\n type: \"boolean\",\n description: \"Check for updates without upgrading\",\n default: false,\n },\n method: {\n type: \"string\",\n description: \"Installation method: auto, npm, binary\",\n },\n yes: {\n type: \"boolean\",\n description: \"Skip confirmation prompts\",\n default: false,\n },\n json: {\n type: \"boolean\",\n description: \"Output JSON only\",\n default: false,\n },\n },\n async run({ args }) {\n if (args.json) setJsonMode(true);\n\n if (args.target === \"--help\" || args.target === \"-h\") {\n printHelp({\n command: \"probe upgrade\",\n description: \"Upgrade Probe to the latest or a specific version\",\n usage: [\n \"probe upgrade\",\n \"probe upgrade --check\",\n \"probe upgrade 1.2.0\",\n \"probe upgrade --method npm\",\n \"probe upgrade --method binary --yes\",\n \"probe upgrade --json --check\",\n ],\n options: [\n {\n name: \"--check\",\n detail: \"Check for updates without upgrading\",\n },\n { name: \"--method\", detail: \"Force install method: auto, npm, binary\" },\n { name: \"--yes\", detail: \"Skip confirmation prompts\" },\n { name: \"--json\", detail: \"JSON output\" },\n ],\n });\n return;\n }\n\n const methodArg = args.method as InstallMethodArg | undefined;\n if (methodArg && !VALID_METHODS.has(methodArg)) {\n error(\n \"INVALID_METHOD\",\n `Invalid --method value: ${args.method}`,\n \"Use: --method auto | npm | binary\",\n );\n }\n\n const currentVersion = getCurrentVersion();\n const method = detectMethod(methodArg);\n\n // Resolve target version\n let targetVersion: string | undefined;\n let latestVersion: string | undefined;\n let targetRelease: Awaited<ReturnType<typeof fetchGitHubReleaseByVersion>> | undefined;\n\n try {\n if (args.target) {\n targetVersion = normalizeVersion(args.target);\n if (method === \"binary\") {\n targetRelease = await fetchGitHubReleaseByVersion(targetVersion);\n }\n } else if (method === \"npm\") {\n latestVersion = await fetchLatestNpmVersion();\n targetVersion = latestVersion;\n } else {\n const gh = await fetchLatestGitHubRelease();\n latestVersion = gh.version;\n targetVersion = gh.version;\n targetRelease = gh.release;\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to check latest version\";\n if (!args.target && method === \"binary\" && message.includes(\"GitHub API returned 404\")) {\n error(\n \"NO_RELEASES_PUBLISHED\",\n \"No GitHub releases are published yet for binary upgrades.\",\n \"Use: npm install -g @zenon-red/probe (or your package manager) until the first release is published.\",\n );\n }\n error(\"VERSION_LOOKUP_FAILED\", message);\n }\n\n if (!targetVersion) {\n error(\"VERSION_LOOKUP_FAILED\", \"Could not determine target version.\");\n }\n\n const updateAvailable = targetVersion !== currentVersion;\n\n // Check-only mode\n if (args.check) {\n printUpgradeResult({\n method,\n currentVersion,\n targetVersion: targetVersion,\n latestVersion: latestVersion || targetVersion,\n updateAvailable,\n updated: false,\n checkOnly: true,\n });\n return;\n }\n\n if (method === \"unknown\") {\n error(\n \"METHOD_UNKNOWN\",\n \"Could not detect installation method for in-place upgrade.\",\n \"Use --method npm|binary explicitly, or run your package manager upgrade command (e.g. `bun add -g @zenon-red/probe`).\",\n );\n }\n\n if (!updateAvailable) {\n printUpgradeResult({\n method,\n currentVersion,\n targetVersion: targetVersion,\n latestVersion: latestVersion || targetVersion,\n updateAvailable: false,\n updated: false,\n checkOnly: false,\n });\n return;\n }\n\n if (!isJsonMode() && !args.yes) {\n const shouldUpgrade = await confirm({\n message: `Upgrade Probe from ${currentVersion} to ${targetVersion}?`,\n });\n if (!shouldUpgrade) {\n info(\"Upgrade cancelled\");\n process.exit(0);\n }\n }\n\n // Perform upgrade\n try {\n if (method === \"npm\") {\n await upgradeViaNpm(targetVersion);\n } else {\n const release = targetRelease || (await fetchGitHubReleaseByVersion(targetVersion));\n await upgradeViaBinary(release, targetVersion);\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Upgrade failed\";\n const code = message.includes(\"CHECKSUM_MISMATCH\")\n ? \"CHECKSUM_MISMATCH\"\n : message.includes(\"ROLLBACK_FAILED\")\n ? \"ROLLBACK_FAILED\"\n : message.includes(\"PERMISSION\") || message.includes(\"EACCES\")\n ? \"PERMISSION_DENIED\"\n : \"UPGRADE_FAILED\";\n error(code, message);\n }\n\n printUpgradeResult({\n method,\n currentVersion,\n targetVersion: targetVersion,\n latestVersion: latestVersion || targetVersion,\n updateAvailable: true,\n updated: true,\n checkOnly: false,\n });\n },\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 error,\n isJsonMode,\n setJsonMode,\n success,\n successMessage,\n warning,\n} from \"~/utils/output.js\";\nimport { loadUserConfig, saveUserConfig } from \"~/utils/user-config.js\";\nimport { createWallet as createWalletUtil, listWallets } from \"~/utils/wallet.js\";\n\nexport default defineCommand({\n meta: {\n name: \"create\",\n description: \"Create a new wallet with randomly generated mnemonic\",\n },\n args: {\n name: {\n type: \"positional\",\n description: \"Wallet identifier\",\n required: false,\n },\n \"password-file\": {\n type: \"string\",\n description: \"Read password from file\",\n },\n \"set-default\": {\n type: \"boolean\",\n description: \"Set this wallet as the default\",\n default: false,\n },\n json: {\n type: \"boolean\",\n description: \"Output JSON only\",\n default: false,\n },\n },\n async run({ args }) {\n if (args.json) {\n setJsonMode(true);\n }\n\n const name = args.name;\n\n if (forceHelpRequested() || !name) {\n printHelp({\n command: \"probe wallet create\",\n description: \"Create a new encrypted wallet\",\n usage: [\n \"probe wallet create <name> [options]\",\n \"probe wallet create agent-wallet --set-default\",\n ],\n options: [\n { name: \"--password-file\", detail: \"Read wallet password from file\" },\n { name: \"--set-default\", detail: \"Set created wallet as default\" },\n { name: \"--json\", detail: \"JSON output for agents\" },\n ],\n notes: [\n \"Password source order: --password-file, PROBE_WALLET_PASSWORD, interactive prompt.\",\n ],\n });\n return;\n }\n\n if (!/^[a-zA-Z0-9_-]+$/.test(name)) {\n error(\"INVALID_NAME\", \"Wallet name must be alphanumeric with hyphens or underscores only\");\n }\n\n const config = await getConfig();\n const walletPassword = await resolvePasswordInput({\n passwordFile: args[\"password-file\"],\n promptMessage: \"Enter password to encrypt wallet:\",\n confirmPromptMessage: \"Confirm password:\",\n minLength: config.passwordMinLength,\n jsonModeError:\n \"Password required via PROBE_WALLET_PASSWORD env, --password-file, or interactive prompt\",\n });\n\n try {\n const result = await createWalletUtil(name, walletPassword);\n\n let setAsDefault = args[\"set-default\"];\n if (!setAsDefault) {\n const wallets = await listWallets();\n if (wallets.length === 1) {\n setAsDefault = true;\n }\n }\n\n if (setAsDefault) {\n const userConfig = await loadUserConfig();\n userConfig.defaultWallet = result.name;\n await saveUserConfig(userConfig);\n }\n\n success({\n name: result.name,\n address: result.address,\n publicKey: result.publicKey,\n mnemonic: result.mnemonic,\n default: setAsDefault,\n });\n\n if (!isJsonMode()) {\n successMessage(`Wallet \"${result.name}\" created successfully`);\n console.log(`Address: ${result.address}`);\n console.log(`\\nMnemonic: ${result.mnemonic}`);\n warning(\"Save this mnemonic securely - it cannot be recovered!\");\n if (setAsDefault) {\n console.log(`\\nSet as default wallet`);\n }\n }\n } catch (err) {\n error(\"WALLET_CREATE_ERROR\", err instanceof Error ? err.message : \"Failed to create wallet\");\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { forceHelpRequested, printHelp } from \"~/utils/help.js\";\nimport { error, isJsonMode, setJsonMode, success, successMessage } from \"~/utils/output.js\";\nimport { loadUserConfig, saveUserConfig } from \"~/utils/user-config.js\";\nimport { walletExists } from \"~/utils/wallet.js\";\n\nexport default defineCommand({\n meta: {\n name: \"default\",\n description: \"Set the default wallet\",\n },\n args: {\n name: {\n type: \"positional\",\n description: \"Wallet name to set as default\",\n required: false,\n },\n json: {\n type: \"boolean\",\n description: \"Output JSON only\",\n default: false,\n },\n },\n async run({ args }) {\n if (args.json) {\n setJsonMode(true);\n }\n\n const name = args.name;\n\n if (forceHelpRequested() || !name) {\n printHelp({\n command: \"probe wallet default\",\n description: \"Set the default wallet used by commands\",\n usage: [\"probe wallet default <name> [options]\", \"probe wallet default agent-wallet\"],\n options: [{ name: \"--json\", detail: \"JSON output for agents\" }],\n });\n return;\n }\n\n const exists = await walletExists(name);\n if (!exists) {\n error(\"WALLET_NOT_FOUND\", `Wallet '${name}' does not exist`);\n }\n\n const userConfig = await loadUserConfig();\n userConfig.defaultWallet = name;\n await saveUserConfig(userConfig);\n\n success({ defaultWallet: name });\n\n if (!isJsonMode()) {\n successMessage(`Default wallet set to '${name}'`);\n }\n },\n});\n","import { confirm } from \"@clack/prompts\";\nimport { defineCommand } from \"citty\";\nimport { forceHelpRequested, printHelp } from \"~/utils/help.js\";\nimport { error, info, isJsonMode, setJsonMode, success, successMessage } from \"~/utils/output.js\";\nimport { deleteWallet, walletExists } from \"~/utils/wallet.js\";\n\nexport default defineCommand({\n meta: {\n name: \"delete\",\n description: \"Delete a wallet\",\n },\n args: {\n name: {\n type: \"positional\",\n description: \"Wallet name\",\n required: false,\n },\n yes: {\n type: \"boolean\",\n description: \"Skip confirmation prompt\",\n default: false,\n },\n json: {\n type: \"boolean\",\n description: \"Output JSON only\",\n default: false,\n },\n },\n async run({ args }) {\n if (args.json) {\n setJsonMode(true);\n }\n\n const name = args.name;\n\n if (forceHelpRequested() || !name) {\n printHelp({\n command: \"probe wallet delete\",\n description: \"Delete a wallet from local storage\",\n usage: [\"probe wallet delete <name> [options]\", \"probe wallet delete old-wallet --yes\"],\n options: [\n { name: \"--yes\", detail: \"Skip interactive confirmation prompt\" },\n { name: \"--json\", detail: \"JSON output for agents\" },\n ],\n });\n return;\n }\n\n const exists = await walletExists(name);\n if (!exists) {\n error(\n \"WALLET_NOT_FOUND\",\n `Wallet '${name}' does not exist`,\n `Run 'probe wallet list' to see available wallets`,\n );\n }\n\n if (!isJsonMode() && !args.yes) {\n const shouldDelete = await confirm({\n message: `Are you sure you want to delete wallet \"${name}\"? This cannot be undone.`,\n });\n\n if (!shouldDelete) {\n info(\"Deletion cancelled\");\n process.exit(0);\n }\n }\n\n try {\n await deleteWallet(name);\n\n success({ deleted: name });\n\n if (!isJsonMode()) {\n successMessage(`Wallet \"${name}\" deleted successfully`);\n }\n } catch (err) {\n error(\"WALLET_DELETE_ERROR\", err instanceof Error ? err.message : \"Failed to delete wallet\");\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { resolveMnemonicInput, resolvePasswordInput } from \"~/utils/credentials.js\";\nimport { forceHelpRequested, printHelp } from \"~/utils/help.js\";\nimport { error, isJsonMode, setJsonMode, success, successMessage } from \"~/utils/output.js\";\nimport { loadUserConfig, saveUserConfig } from \"~/utils/user-config.js\";\nimport { importWallet, listWallets } from \"~/utils/wallet.js\";\n\nexport default defineCommand({\n meta: {\n name: \"import\",\n description: \"Import wallet from mnemonic phrase\",\n },\n args: {\n name: {\n type: \"positional\",\n description: \"Wallet identifier\",\n required: false,\n },\n mnemonic: {\n type: \"string\",\n description: \"Mnemonic phrase (space-separated)\",\n },\n \"mnemonic-file\": {\n type: \"string\",\n description: \"Read mnemonic from file\",\n },\n \"password-file\": {\n type: \"string\",\n description: \"Read password from file\",\n },\n \"set-default\": {\n type: \"boolean\",\n description: \"Set this wallet as the default\",\n default: false,\n },\n json: {\n type: \"boolean\",\n description: \"Output JSON only\",\n default: false,\n },\n },\n async run({ args }) {\n if (args.json) {\n setJsonMode(true);\n }\n\n const name = args.name;\n\n if (forceHelpRequested() || !name) {\n printHelp({\n command: \"probe wallet import\",\n description: \"Import an encrypted wallet from mnemonic\",\n usage: [\n \"probe wallet import <name> [options]\",\n \"probe wallet import agent-wallet --mnemonic-file ./mnemonic.txt\",\n ],\n options: [\n { name: \"--mnemonic\", detail: \"24-word mnemonic phrase\" },\n { name: \"--mnemonic-file\", detail: \"Read mnemonic from file\" },\n { name: \"--password-file\", detail: \"Read wallet password from file\" },\n { name: \"--set-default\", detail: \"Set imported wallet as default\" },\n { name: \"--json\", detail: \"JSON output for agents\" },\n ],\n notes: [\n \"Mnemonic source order: --mnemonic, --mnemonic-file, PROBE_WALLET_MNEMONIC, interactive prompt.\",\n ],\n });\n return;\n }\n\n if (!/^[a-zA-Z0-9_-]+$/.test(name)) {\n error(\"INVALID_NAME\", \"Wallet name must be alphanumeric with hyphens or underscores only\");\n }\n\n const mnemonicPhrase = await resolveMnemonicInput({\n mnemonic: args.mnemonic,\n mnemonicFile: args[\"mnemonic-file\"],\n jsonModeError:\n \"Mnemonic required via --mnemonic, --mnemonic-file, or PROBE_WALLET_MNEMONIC env\",\n });\n\n const walletPassword = await resolvePasswordInput({\n passwordFile: args[\"password-file\"],\n promptMessage: \"Enter password to encrypt wallet:\",\n jsonModeError:\n \"Password required via PROBE_WALLET_PASSWORD env, --password-file, or interactive prompt\",\n });\n\n try {\n const result = await importWallet(name, mnemonicPhrase, walletPassword);\n\n let setAsDefault = args[\"set-default\"];\n if (!setAsDefault) {\n const wallets = await listWallets();\n if (wallets.length === 1) {\n setAsDefault = true;\n }\n }\n\n if (setAsDefault) {\n const userConfig = await loadUserConfig();\n userConfig.defaultWallet = result.name;\n await saveUserConfig(userConfig);\n }\n\n success({\n name: result.name,\n address: result.address,\n default: setAsDefault,\n });\n\n if (!isJsonMode()) {\n successMessage(`Wallet \"${result.name}\" imported successfully`);\n console.log(`Address: ${result.address}`);\n if (setAsDefault) {\n console.log(`\\nSet as default wallet`);\n }\n }\n } catch (err) {\n error(\"WALLET_IMPORT_ERROR\", err instanceof Error ? err.message : \"Failed to import wallet\");\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport { getConfig } from \"~/utils/config.js\";\nimport { forceHelpRequested, printHelp } from \"~/utils/help.js\";\nimport { error, info, isJsonMode, setJsonMode, success } from \"~/utils/output.js\";\nimport { listWallets } from \"~/utils/wallet.js\";\n\nexport default defineCommand({\n meta: {\n name: \"list\",\n description: \"List all stored wallets\",\n },\n args: {\n json: {\n type: \"boolean\",\n description: \"Output JSON only\",\n default: false,\n },\n },\n async run({ args }) {\n if (forceHelpRequested()) {\n printHelp({\n command: \"probe wallet list\",\n description: \"List all locally stored wallets\",\n usage: [\"probe wallet list [options]\", \"probe wallet list --json\"],\n options: [{ name: \"--json\", detail: \"JSON output for agents\" }],\n });\n return;\n }\n\n if (args.json) {\n setJsonMode(true);\n }\n\n try {\n const wallets = await listWallets();\n const config = await getConfig();\n\n const walletsOutput = wallets.map((w) => ({\n ...w,\n default: w.name === config.defaultWallet,\n }));\n\n success(walletsOutput);\n\n if (!isJsonMode()) {\n if (wallets.length === 0) {\n info(\"No wallets found\");\n } else {\n console.log(\"Wallets:\");\n for (const wallet of walletsOutput) {\n const date = wallet.createdAt\n ? new Date(wallet.createdAt).toLocaleDateString()\n : \"unknown\";\n const marker = wallet.default ? \"*\" : \" \";\n console.log(\n `${marker} ${wallet.name.padEnd(12)} ${wallet.address.slice(0, 10)}... created ${date}`,\n );\n }\n if (config.defaultWallet) {\n console.log(`\\n* = default wallet`);\n }\n }\n }\n } catch (err) {\n error(\"WALLET_LIST_ERROR\", err instanceof Error ? err.message : \"Failed to list wallets\");\n }\n },\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 meta: {\n name: \"show\",\n description: \"Show wallet address and public key\",\n },\n args: {\n name: {\n type: \"positional\",\n description: \"Wallet name\",\n required: false,\n },\n \"public-key\": {\n type: \"boolean\",\n description: \"Include public key in output\",\n default: false,\n },\n \"password-file\": {\n type: \"string\",\n description: \"Read password from file\",\n },\n json: {\n type: \"boolean\",\n description: \"Output JSON only\",\n default: false,\n },\n },\n async run({ args }) {\n if (args.json) {\n setJsonMode(true);\n }\n\n const name = args.name;\n\n if (forceHelpRequested() || !name) {\n printHelp({\n command: \"probe wallet show\",\n description: \"Show wallet address and optional public key\",\n usage: [\n \"probe wallet show <name> [options]\",\n \"probe wallet show my-wallet --public-key --password-file ./pass.txt\",\n ],\n options: [\n { name: \"--public-key\", detail: \"Include public key in output\" },\n {\n name: \"--password-file\",\n detail: \"Read password for public key extraction\",\n },\n { name: \"--json\", detail: \"JSON output for agents\" },\n ],\n });\n return;\n }\n\n const walletInfo = await getWalletInfo(name);\n if (!walletInfo) {\n error(\n \"WALLET_NOT_FOUND\",\n `Wallet '${name}' does not exist`,\n `Run 'probe wallet list' to see available wallets`,\n );\n }\n\n let walletPassword: string | undefined;\n\n if (args[\"password-file\"]) {\n try {\n walletPassword = await readFile(args[\"password-file\"], \"utf-8\");\n walletPassword = walletPassword.trim();\n } catch {\n error(\"FILE_READ_ERROR\", `Failed to read password file: ${args[\"password-file\"]}`);\n }\n }\n\n try {\n let publicKey: string | undefined;\n\n if (walletPassword) {\n const keyStore = await loadWallet(name, walletPassword);\n const keyPair = keyStore.getKeyPair(0);\n publicKey = keyPair.getPublicKey().toString(\"hex\");\n }\n\n const result: Record<string, string | undefined> = {\n name: walletInfo.name,\n address: walletInfo.address,\n createdAt: walletInfo.createdAt,\n };\n\n if (args[\"public-key\"] || publicKey) {\n result.publicKey = publicKey;\n }\n\n success(result);\n\n if (!isJsonMode()) {\n console.log(`Name: ${walletInfo.name}`);\n console.log(`Address: ${walletInfo.address}`);\n if (walletInfo.createdAt) {\n console.log(`Created: ${new Date(walletInfo.createdAt).toLocaleString()}`);\n }\n if (publicKey) {\n console.log(`Public Key: ${publicKey}`);\n }\n }\n } catch (err) {\n error(\"WALLET_LOAD_ERROR\", err instanceof Error ? err.message : \"Failed to load wallet\");\n }\n },\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([\"create\", \"import\", \"list\", \"show\", \"delete\", \"default\"]);\n\nexport default defineCommand({\n meta: {\n name: \"wallet\",\n description: \"Manage Zenon Network wallets\",\n },\n run() {\n const positionals = process.argv.slice(2).filter((arg) => !arg.startsWith(\"-\"));\n if (positionals.length > 1 && walletSubcommands.has(positionals[1])) {\n return;\n }\n\n printHelp({\n command: \"probe wallet\",\n description: \"Create, import, inspect, and manage wallets\",\n usage: [\n \"probe wallet <subcommand> [positionals] [options]\",\n \"probe wallet create my-wallet --set-default\",\n \"probe wallet import my-wallet --mnemonic-file ./mnemonic.txt\",\n ],\n actions: [\n { name: \"create <name>\", detail: \"Create a new encrypted wallet\" },\n { name: \"import <name>\", detail: \"Import wallet from mnemonic phrase\" },\n { name: \"list\", detail: \"List stored wallets\" },\n {\n name: \"show <name>\",\n detail: \"Show wallet address and optional public key\",\n },\n { name: \"delete <name>\", detail: \"Delete a wallet\" },\n { name: \"default <name>\", detail: \"Set default wallet\" },\n ],\n notes: [\"Use long-form flags only for predictable agent automation.\"],\n });\n },\n subCommands: {\n create,\n import: importCmd,\n list,\n show,\n delete: deleteCmd,\n default: defaultCmd,\n },\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 { failWithConnectionOrUnexpected } from \"~/utils/errors.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 meta: {\n name: \"whoami\",\n description: \"Show current authenticated agent profile\",\n },\n args: {\n wallet: { type: \"string\", description: \"Wallet name\" },\n json: { type: \"boolean\", description: \"Output JSON\", default: false },\n host: { type: \"string\", description: \"SpacetimeDB host\" },\n module: { type: \"string\", description: \"Module name\" },\n },\n async run({ args }) {\n if (args.json) setJsonMode(true);\n\n try {\n await withAuth({ host: args.host, module: args.module, wallet: args.wallet }, async (ctx) => {\n const myAgent = ctx\n .iter<Agent>(\"agents\")\n .find((a) => a.identity.toHexString() === ctx.identity?.toHexString());\n\n if (!myAgent) {\n error(\"NOT_REGISTERED\", \"Agent not registered. Run `probe agent register` first.\");\n }\n\n success(myAgent);\n\n if (!isJsonMode()) {\n console.log(\n toonList(\"agent\", [\n {\n id: myAgent.id,\n name: myAgent.name,\n role: AgentRole.display(myAgent.role),\n status: AgentStatus.display(myAgent.status),\n lastHeartbeat: formatTimestamp(myAgent.lastHeartbeat),\n currentTaskId: myAgent.currentTaskId ? myAgent.currentTaskId.toString() : \"\",\n capabilities: myAgent.capabilities.join(\",\"),\n identity: ctx.identity?.toHexString() || \"\",\n },\n ]),\n );\n }\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n failWithConnectionOrUnexpected(message);\n }\n },\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 next from \"./commands/next.js\";\nimport onboard from \"./commands/onboard.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 upgrade from \"./commands/upgrade.js\";\nimport wallet from \"./commands/wallet/index.js\";\nimport whoami from \"./commands/whoami.js\";\nimport { normalizeHelpArgv, printHelp, setForceHelpRequested } from \"./utils/help.js\";\nimport { isJsonMode } from \"./utils/output.js\";\n\nconst topLevelCommands = new Set([\n \"wallet\",\n \"auth\",\n \"sign\",\n \"token\",\n \"config\",\n \"nexus\",\n \"agent\",\n \"task\",\n \"message\",\n \"idea\",\n \"discover\",\n \"project\",\n \"query\",\n \"doctor\",\n \"whoami\",\n \"upgrade\",\n \"onboard\",\n \"next\",\n]);\n\nconst applyHelpNormalization = (): void => {\n const normalized = normalizeHelpArgv(process.argv.slice(2));\n setForceHelpRequested(normalized.forceHelp);\n process.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 meta: { name: \"probe\", version, description },\n args: {\n json: { type: \"boolean\", description: \"Output JSON only\", default: false },\n },\n run() {\n const firstPositional = process.argv.slice(2).find((arg) => !arg.startsWith(\"-\"));\n if (firstPositional && topLevelCommands.has(firstPositional)) {\n return;\n }\n\n printHelp({\n command: \"probe\",\n description,\n usage: [\n \"probe <command> [positionals] [options]\",\n 'probe idea propose --title \"Better task scoring\" --category planning',\n \"probe task claim 42 --wallet agent-wallet\",\n ],\n actions: [\n { name: \"wallet\", detail: \"Wallet lifecycle commands\" },\n { name: \"auth\", detail: \"Authenticate wallet and cache token\" },\n { name: \"token\", detail: \"Inspect or clear cached token\" },\n { name: \"sign\", detail: \"Sign text payloads\" },\n {\n name: \"nexus\",\n detail: \"Run persistent Nexus daemon (keepalive + event logs)\",\n },\n {\n name: \"agent, task, idea, discover, message, project\",\n detail: \"Nexus workspace commands\",\n },\n { name: \"query\", detail: \"Execute SQL queries against Nexus\" },\n { name: \"doctor\", detail: \"Run setup and connectivity diagnostics\" },\n { name: \"onboard\", detail: \"Idempotent agent setup for autonomous participation\" },\n { name: \"next\", detail: \"Deterministic router for one bounded action per wake\" },\n { name: \"upgrade\", detail: \"Upgrade Probe to the latest version\" },\n { name: \"config\", detail: \"Read/write CLI configuration\" },\n ],\n options: [{ name: \"--json\", detail: \"JSON output mode for agents\" }],\n notes: [\"Nexus commands connect to SpacetimeDB (the realtime database backing Nexus).\"],\n });\n },\n subCommands: {\n wallet,\n auth,\n sign,\n token,\n config,\n nexus: nexusDaemon,\n agent,\n task,\n message,\n idea,\n discover,\n project,\n query,\n doctor,\n onboard,\n next,\n upgrade,\n whoami,\n },\n});\n\n// Global error handler to suppress stack traces for expected errors\nconst isExpectedError = (err: unknown): boolean => {\n if (!(err instanceof Error)) return false;\n const message = err.message.toLowerCase();\n return (\n message.includes(\"connection failed\") ||\n message.includes(\"connection timeout\") ||\n message.includes(\"authentication required\") ||\n message.includes(\"unauthorized\") ||\n message.includes(\"wallet required\") ||\n message.includes(\"wallet not found\") ||\n message.includes(\"agent not registered\") ||\n message.includes(\"subscription error\")\n );\n};\n\nprocess.on(\"unhandledRejection\", (err: unknown) => {\n if (isExpectedError(err)) {\n // Error message already printed by the error() utility\n process.exit(1);\n }\n if (isJsonMode()) {\n console.error(\n JSON.stringify({\n success: false,\n error: {\n code: \"UNEXPECTED_ERROR\",\n message: err instanceof Error ? err.message : String(err),\n },\n }),\n );\n } else {\n console.error(err instanceof Error ? err.message : String(err));\n }\n process.exit(1);\n});\n\napplyHelpNormalization();\nrunMain(main);\n"],"mappings":"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"}