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)