File size: 3,807 Bytes
7d8aa82 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | // Run once to register all slash commands with Discord:
// npx ts-node src/register.ts
const STRING = 3
const NUMBER = 10
const SUB_COMMAND = 1
const AGENT_CHOICES = [
{ name: 'RELAY β your plain-English guide', value: 'bridge' },
{ name: 'AXIOM β finance & money pools', value: 'finance' },
{ name: 'VAULT β treasury & approvals', value: 'treasury' },
{ name: 'NEXUS β deals & CRM pipeline', value: 'crm' },
{ name: 'FORGE β vendors & procurement', value: 'procurement' },
{ name: 'HERALD β event infrastructure', value: 'bifrost' },
{ name: 'TENSOR β anomaly detection & ML', value: 'ml' },
{ name: 'SENTINEL β risk & compliance', value: 'risk' },
{ name: 'LEDGE β audit & permanent record', value: 'auditor' },
{ name: 'ATLAS β system ops & tier gating', value: 'operator' },
{ name: 'QUILL β content & narrative engine', value: 'scriptwriter' },
]
const COMMANDS = [
{
name: 'ask',
description: 'Ask any of the 11 SnapKitty agents a question from Discord',
options: [
{ name: 'agent', description: 'Which agent to route to', type: STRING, required: true, choices: AGENT_CHOICES },
{ name: 'message', description: 'Your question', type: STRING, required: true },
],
},
{
name: 'pool',
description: 'Money pool management β create, fund, and track capital pools',
options: [
{ name: 'create', description: 'Create a new money pool', type: SUB_COMMAND,
options: [
{ name: 'name', description: 'Pool name', type: STRING, required: true },
{ name: 'purpose', description: 'What it is for', type: STRING, required: false },
{ name: 'goal', description: 'Target USD amount', type: NUMBER, required: false },
] },
{ name: 'list', description: 'List all active pools', type: SUB_COMMAND },
{ name: 'fund', description: 'Add funds to a pool', type: SUB_COMMAND,
options: [
{ name: 'name', description: 'Pool name', type: STRING, required: true },
{ name: 'amount', description: 'Amount to add', type: NUMBER, required: true },
] },
{ name: 'close', description: 'Close a pool', type: SUB_COMMAND,
options: [{ name: 'name', description: 'Pool name', type: STRING, required: true }] },
],
},
{ name: 'tier', description: 'Current fundability tier status and blockers' },
{ name: 'agents', description: 'Plain-English directory of all 11 SnapKitty agents' },
{ name: 'status', description: 'System health β Bifrost, database, infrastructure' },
{ name: 'seal', description: 'Last decision seal β event type, risk, timestamp' },
{ name: 'audit', description: 'Audit trail β last 5 Bifrost events with risk scores' },
{ name: 'merkle', description: 'Merkle root and WORM chain entry count' },
]
async function register() {
const { DISCORD_BOT_TOKEN, DISCORD_APP_ID } = process.env
if (!DISCORD_BOT_TOKEN || !DISCORD_APP_ID) {
console.error('Missing DISCORD_BOT_TOKEN or DISCORD_APP_ID in environment')
process.exit(1)
}
const url = `https://discord.com/api/v10/applications/${DISCORD_APP_ID}/commands`
const res = await fetch(url, {
method: 'PUT',
headers: { Authorization: `Bot ${DISCORD_BOT_TOKEN}`, 'Content-Type': 'application/json' },
body: JSON.stringify(COMMANDS),
})
const data = await res.json() as any[]
if (!res.ok) { console.error('Discord error:', data); process.exit(1) }
console.log(`Registered ${data.length} commands:`)
data.forEach((c: any) => console.log(` /${c.name}`))
}
register().catch(console.error)
|