snapkitty
developer-tools
kotlin
SNAPKITTYWEST commited on
Commit
7d8aa82
Β·
verified Β·
1 Parent(s): 1f29119

push from SNAPKITTYWEST/myapplication

Browse files
.env.example ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Discord β€” from discord.com/developers/applications β†’ your app
2
+ DISCORD_PUBLIC_KEY=your_public_key_here
3
+ DISCORD_APP_ID=your_app_id_here
4
+ DISCORD_BOT_TOKEN=your_bot_token_here
5
+
6
+ # Database β€” Neon PostgreSQL connection string
7
+ DATABASE_URL=postgresql://user:password@host/dbname?sslmode=require
8
+
9
+ # SnapKitty War Room β€” for /ask command routing
10
+ SNAPKITTY_API_URL=https://collectivekitty.com
11
+
12
+ # Server
13
+ PORT=3001
.gitignore ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ node_modules/
2
+ dist/
3
+ .env
4
+ *.env.local
LICENSE ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ SOVEREIGN SOURCE LICENSE v1.0
2
+ Copyright (c) 2026 Ahmad Ali Parr -- Bel Esprit D'Accord Trust
3
+ SnapKitty Collective -- All Sovereign Rights Reserved
4
+
5
+ WORM SEALED -- Evidence or Silence
6
+
7
+ GRANT OF RIGHTS
8
+
9
+ Permission is hereby granted, free of charge, to any person
10
+ obtaining a copy of this software and associated documentation
11
+ files (the "Work"), to use, study, copy, and modify the Work
12
+ for personal, educational, and non-commercial purposes, subject
13
+ to the following conditions:
14
+
15
+ 1. ATTRIBUTION
16
+ All copies, modifications, or derivative works must carry
17
+ the following notice, visibly and without alteration:
18
+
19
+ "Built on Sovereign Source -- Bel Esprit D'Accord Trust
20
+ (c) 2026 Ahmad Ali Parr -- snapkittywest.github.io"
21
+
22
+ 2. NON-COMMERCIAL USE
23
+ Commercial use of this Work -- including but not limited to
24
+ use in products, services, training datasets, or AI model
25
+ training -- requires express written permission from
26
+ Bel Esprit D'Accord Trust.
27
+
28
+ 3. TRAINING DATA RESTRICTION
29
+ This Work and its contents may NOT be used to train, fine-tune,
30
+ evaluate, or benchmark any machine learning model, large language
31
+ model, or AI system without express written permission from
32
+ Bel Esprit D'Accord Trust. This restriction applies regardless
33
+ of whether the use is commercial or non-commercial.
34
+
35
+ 4. SHARE-ALIKE
36
+ Any derivative work distributed publicly must be released
37
+ under this same Sovereign Source License v1.0 or later,
38
+ with full attribution chain preserved.
39
+
40
+ 5. WORM INTEGRITY
41
+ Any redistribution must preserve all WORM chain seals,
42
+ cryptographic hashes, and audit trail entries present in
43
+ the original Work.
44
+
45
+ 6. NO INSTITUTIONAL CAPTURE
46
+ No government agency, corporation, non-profit organization,
47
+ or institutional body may claim ownership, exclusive licensing,
48
+ or derivative rights over this Work without express written
49
+ trust agreement with Bel Esprit D'Accord Trust.
50
+
51
+ DISCLAIMER
52
+
53
+ THIS WORK IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
54
+ EXPRESS OR IMPLIED.
55
+
56
+ Bel Esprit D'Accord Trust
57
+ SnapKitty Collective
58
+ snapkittywest.github.io
59
+ Evidence or Silence -- 2026
README.md ADDED
@@ -0,0 +1,166 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div align="center">
2
+
3
+ ```
4
+ β–² β–²
5
+ β–β–“β–“β–“β–“β–“β–Œ
6
+ β–β–“β–“β–“β–“β–“β–“β–Œ
7
+ β–€β–“β–“β–“β–“β–€
8
+ ```
9
+
10
+ # SNAPKITTY BOT
11
+
12
+ ### The SnapKitty fortress in your Discord server.
13
+
14
+ [![License: BUSL-1.1](https://img.shields.io/badge/License-BUSL--1.1-blue.svg?style=flat-square)](../LICENSE)
15
+ [![Discord](https://img.shields.io/badge/Discord-11%20agents-5865F2?style=flat-square&logo=discord)](https://discord.gg/dugymT3rj)
16
+ [![Node.js](https://img.shields.io/badge/Node.js-TypeScript-black?style=flat-square&logo=typescript)](https://www.typescriptlang.org)
17
+ [![Prisma](https://img.shields.io/badge/Prisma-Neon-2D3748?style=flat-square&logo=prisma)](https://prisma.io)
18
+ [![War Room](https://img.shields.io/badge/War%20Room-live-brightgreen?style=flat-square)](https://collectivekitty.com)
19
+
20
+ **[collectivekitty.com](https://collectivekitty.com) Β· [DEVFLOW-FINANCE](https://github.com/SNAPKITTYWEST/DEVFLOW-FINANCE) Β· [Invite Bot](https://discord.gg/dugymT3rj)**
21
+
22
+ </div>
23
+
24
+ ---
25
+
26
+ ## What This Is
27
+
28
+ SnapKitty Bot brings all 11 sovereign agents into Discord. Ask any agent a question, manage money pools, check your fundability tier, read the live Bifrost audit trail β€” all from slash commands.
29
+
30
+ This is a **standalone Express server** that receives Discord interactions via webhook. It connects to the same Neon PostgreSQL database as the main SnapKitty OS and routes `/ask` queries through the Ollama-powered reasoning engine at `collectivekitty.com`.
31
+
32
+ ---
33
+
34
+ ## Commands
35
+
36
+ | Command | What it does |
37
+ |---------|-------------|
38
+ | `/ask [agent] [message]` | Route any question to any of the 11 agents |
39
+ | `/pool create` | Create a named money pool |
40
+ | `/pool list` | See all active pools and balances |
41
+ | `/pool fund` | Add capital to a pool |
42
+ | `/pool close` | Archive a pool |
43
+ | `/tier` | Current fundability tier status and blockers |
44
+ | `/agents` | Full agent directory in plain English |
45
+ | `/status` | System health β€” Bifrost, DB, infrastructure |
46
+ | `/seal` | Last decision seal hash |
47
+ | `/audit` | Last 5 Bifrost events with risk scores |
48
+ | `/merkle` | Merkle root and WORM chain entry count |
49
+
50
+ ---
51
+
52
+ ## The 11 Agents
53
+
54
+ | Agent | Key | Domain |
55
+ |-------|-----|--------|
56
+ | **RELAY** | `bridge` | Human-Machine Bridge β€” start here |
57
+ | **AXIOM** | `finance` | GL Β· Triple-Entry Β· Money Pools |
58
+ | **VAULT** | `treasury` | Reserves Β· Payments Β· **Veto authority** |
59
+ | **NEXUS** | `crm` | Pipeline Β· Deals Β· Forecast |
60
+ | **FORGE** | `procurement` | Vendors Β· POs Β· Spend |
61
+ | **HERALD** | `bifrost` | Event Routing Β· Traces |
62
+ | **TENSOR** | `ml` | Risk Scoring Β· Anomaly Detection |
63
+ | **SENTINEL** | `risk` | Compliance Β· Threat Score |
64
+ | **LEDGE** | `auditor` | WORM Ledger Β· Audit Chain |
65
+ | **ATLAS** | `operator` | Health Β· **Tier gate authority** |
66
+ | **QUILL** | `scriptwriter` | Reports Β· Decks Β· Copy |
67
+
68
+ ---
69
+
70
+ ## Setup
71
+
72
+ ### 1. Clone and install
73
+
74
+ ```bash
75
+ git clone https://github.com/SNAPKITTYWEST/myapplication.git
76
+ cd myapplication
77
+ npm install
78
+ npx prisma generate
79
+ ```
80
+
81
+ ### 2. Configure environment
82
+
83
+ ```bash
84
+ cp .env.example .env
85
+ ```
86
+
87
+ Fill in `.env`:
88
+
89
+ ```env
90
+ DISCORD_PUBLIC_KEY= # from Discord Developer Portal β†’ your app β†’ General Information
91
+ DISCORD_APP_ID= # same page
92
+ DISCORD_BOT_TOKEN= # Bot β†’ Token
93
+ DATABASE_URL= # Neon PostgreSQL connection string
94
+ SNAPKITTY_API_URL=https://collectivekitty.com
95
+ PORT=3001
96
+ ```
97
+
98
+ ### 3. Register slash commands (once)
99
+
100
+ ```bash
101
+ npm run register
102
+ ```
103
+
104
+ ### 4. Run the bot
105
+
106
+ ```bash
107
+ # Development
108
+ npm run dev
109
+
110
+ # Production
111
+ npm run build && npm start
112
+ ```
113
+
114
+ ### 5. Connect to Discord
115
+
116
+ In the [Discord Developer Portal](https://discord.com/developers/applications):
117
+ - Go to **General Information** β†’ set **Interactions Endpoint URL** to your server:
118
+ ```
119
+ https://your-domain.com/interactions
120
+ ```
121
+ - Discord will verify the endpoint with a PING. If it responds with PONG, you're live.
122
+
123
+ For local development, use [ngrok](https://ngrok.com) or [Cloudflare Tunnel](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/) to expose `localhost:3001`.
124
+
125
+ ---
126
+
127
+ ## Architecture
128
+
129
+ ```
130
+ Discord β†’ POST /interactions
131
+ β”‚
132
+ β”œβ”€β”€ verifyKey() β€” Ed25519 signature validation
133
+ β”‚
134
+ β”œβ”€β”€ /ask β†’ askAgent() β†’ Ollama at collectivekitty.com β†’ reply
135
+ β”œβ”€β”€ /pool β†’ Prisma β†’ Neon PostgreSQL β†’ reply
136
+ β”œβ”€β”€ /tier β†’ Prisma β†’ live deal/vendor/pool counts β†’ reply
137
+ β”œβ”€β”€ /status β†’ Prisma β†’ Bifrost event counts β†’ reply
138
+ β”œβ”€β”€ /seal β†’ Prisma β†’ last BifrostEvent β†’ reply
139
+ └── /audit β†’ Prisma β†’ last 5 BifrostEvents β†’ reply
140
+ ```
141
+
142
+ The bot validates every Discord request with Ed25519 before processing. Unauthenticated requests are rejected with 401.
143
+
144
+ ---
145
+
146
+ ## Part of the SnapKitty Fortress
147
+
148
+ This bot is the **Discord interface layer** of the SnapKitty Sovereign OS.
149
+
150
+ The full system lives in [DEVFLOW-FINANCE](https://github.com/SNAPKITTYWEST/DEVFLOW-FINANCE):
151
+ - Rust core with SHA-256 WORM ledger and 5-tier state machine
152
+ - Next.js War Room where agents think out loud in real time
153
+ - Bifrost event pipeline, Plaid banking, Stripe Issuing
154
+ - Local Ollama LLM reasoning (no OpenAI dependency)
155
+
156
+ ---
157
+
158
+ <div align="center">
159
+
160
+ *SnapKitty Sovereign OS β€” built in the open, proven in chain.*
161
+
162
+ **[collectivekitty.com](https://collectivekitty.com) Β· [DEVFLOW-FINANCE](https://github.com/SNAPKITTYWEST/DEVFLOW-FINANCE) Β· [Discord](https://discord.gg/dugymT3rj)**
163
+
164
+ </div>
165
+
166
+ ![](https://sovereign-analytics.snapkittywest.workers.dev/canary/myapplication)
package-lock.json ADDED
@@ -0,0 +1,1888 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "snapkitty-bot",
3
+ "version": "1.0.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "snapkitty-bot",
9
+ "version": "1.0.0",
10
+ "license": "BUSL-1.1",
11
+ "dependencies": {
12
+ "@prisma/client": "^6.19.3",
13
+ "discord-interactions": "^4.4.0",
14
+ "discord.js": "^14.16.3",
15
+ "express": "^4.18.2"
16
+ },
17
+ "devDependencies": {
18
+ "@types/express": "^4.17.21",
19
+ "@types/node": "^20.19.41",
20
+ "prisma": "^6.19.3",
21
+ "ts-node": "^10.9.2",
22
+ "typescript": "^5"
23
+ }
24
+ },
25
+ "node_modules/@cspotcode/source-map-support": {
26
+ "version": "0.8.1",
27
+ "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
28
+ "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
29
+ "dev": true,
30
+ "license": "MIT",
31
+ "dependencies": {
32
+ "@jridgewell/trace-mapping": "0.3.9"
33
+ },
34
+ "engines": {
35
+ "node": ">=12"
36
+ }
37
+ },
38
+ "node_modules/@discordjs/builders": {
39
+ "version": "1.14.1",
40
+ "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.14.1.tgz",
41
+ "integrity": "sha512-gSKkhXLqs96TCzk66VZuHHl8z2bQMJFGwrXC0f33ngK+FLNau4hU1PYny3DNJfNdSH+gVMzE85/d5FQ2BpcNwQ==",
42
+ "license": "Apache-2.0",
43
+ "dependencies": {
44
+ "@discordjs/formatters": "^0.6.2",
45
+ "@discordjs/util": "^1.2.0",
46
+ "@sapphire/shapeshift": "^4.0.0",
47
+ "discord-api-types": "^0.38.40",
48
+ "fast-deep-equal": "^3.1.3",
49
+ "ts-mixer": "^6.0.4",
50
+ "tslib": "^2.6.3"
51
+ },
52
+ "engines": {
53
+ "node": ">=16.11.0"
54
+ },
55
+ "funding": {
56
+ "url": "https://github.com/discordjs/discord.js?sponsor"
57
+ }
58
+ },
59
+ "node_modules/@discordjs/collection": {
60
+ "version": "1.5.3",
61
+ "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.5.3.tgz",
62
+ "integrity": "sha512-SVb428OMd3WO1paV3rm6tSjM4wC+Kecaa1EUGX7vc6/fddvw/6lg90z4QtCqm21zvVe92vMMDt9+DkIvjXImQQ==",
63
+ "license": "Apache-2.0",
64
+ "engines": {
65
+ "node": ">=16.11.0"
66
+ }
67
+ },
68
+ "node_modules/@discordjs/formatters": {
69
+ "version": "0.6.2",
70
+ "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.6.2.tgz",
71
+ "integrity": "sha512-y4UPwWhH6vChKRkGdMB4odasUbHOUwy7KL+OVwF86PvT6QVOwElx+TiI1/6kcmcEe+g5YRXJFiXSXUdabqZOvQ==",
72
+ "license": "Apache-2.0",
73
+ "dependencies": {
74
+ "discord-api-types": "^0.38.33"
75
+ },
76
+ "engines": {
77
+ "node": ">=16.11.0"
78
+ },
79
+ "funding": {
80
+ "url": "https://github.com/discordjs/discord.js?sponsor"
81
+ }
82
+ },
83
+ "node_modules/@discordjs/rest": {
84
+ "version": "2.6.1",
85
+ "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-2.6.1.tgz",
86
+ "integrity": "sha512-wwQdgjeaoYFiaG+atbqx6aJDpqW7JHAo0HrQkBTbYzM3/PJ3GweQIpgElNcGZ26DCUOXMyawYd0YF7vtr+fZXg==",
87
+ "license": "Apache-2.0",
88
+ "dependencies": {
89
+ "@discordjs/collection": "^2.1.1",
90
+ "@discordjs/util": "^1.2.0",
91
+ "@sapphire/async-queue": "^1.5.3",
92
+ "@sapphire/snowflake": "^3.5.5",
93
+ "@vladfrangu/async_event_emitter": "^2.4.6",
94
+ "discord-api-types": "^0.38.40",
95
+ "magic-bytes.js": "^1.13.0",
96
+ "tslib": "^2.6.3",
97
+ "undici": "6.24.1"
98
+ },
99
+ "engines": {
100
+ "node": ">=18"
101
+ },
102
+ "funding": {
103
+ "url": "https://github.com/discordjs/discord.js?sponsor"
104
+ }
105
+ },
106
+ "node_modules/@discordjs/rest/node_modules/@discordjs/collection": {
107
+ "version": "2.1.1",
108
+ "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.1.1.tgz",
109
+ "integrity": "sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg==",
110
+ "license": "Apache-2.0",
111
+ "engines": {
112
+ "node": ">=18"
113
+ },
114
+ "funding": {
115
+ "url": "https://github.com/discordjs/discord.js?sponsor"
116
+ }
117
+ },
118
+ "node_modules/@discordjs/rest/node_modules/@sapphire/snowflake": {
119
+ "version": "3.5.5",
120
+ "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.5.5.tgz",
121
+ "integrity": "sha512-xzvBr1Q1c4lCe7i6sRnrofxeO1QTP/LKQ6A6qy0iB4x5yfiSfARMEQEghojzTNALDTcv8En04qYNIco9/K9eZQ==",
122
+ "license": "MIT",
123
+ "engines": {
124
+ "node": ">=v14.0.0",
125
+ "npm": ">=7.0.0"
126
+ }
127
+ },
128
+ "node_modules/@discordjs/util": {
129
+ "version": "1.2.0",
130
+ "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-1.2.0.tgz",
131
+ "integrity": "sha512-3LKP7F2+atl9vJFhaBjn4nOaSWahZ/yWjOvA4e5pnXkt2qyXRCHLxoBQy81GFtLGCq7K9lPm9R517M1U+/90Qg==",
132
+ "license": "Apache-2.0",
133
+ "dependencies": {
134
+ "discord-api-types": "^0.38.33"
135
+ },
136
+ "engines": {
137
+ "node": ">=18"
138
+ },
139
+ "funding": {
140
+ "url": "https://github.com/discordjs/discord.js?sponsor"
141
+ }
142
+ },
143
+ "node_modules/@discordjs/ws": {
144
+ "version": "1.2.3",
145
+ "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-1.2.3.tgz",
146
+ "integrity": "sha512-wPlQDxEmlDg5IxhJPuxXr3Vy9AjYq5xCvFWGJyD7w7Np8ZGu+Mc+97LCoEc/+AYCo2IDpKioiH0/c/mj5ZR9Uw==",
147
+ "license": "Apache-2.0",
148
+ "dependencies": {
149
+ "@discordjs/collection": "^2.1.0",
150
+ "@discordjs/rest": "^2.5.1",
151
+ "@discordjs/util": "^1.1.0",
152
+ "@sapphire/async-queue": "^1.5.2",
153
+ "@types/ws": "^8.5.10",
154
+ "@vladfrangu/async_event_emitter": "^2.2.4",
155
+ "discord-api-types": "^0.38.1",
156
+ "tslib": "^2.6.2",
157
+ "ws": "^8.17.0"
158
+ },
159
+ "engines": {
160
+ "node": ">=16.11.0"
161
+ },
162
+ "funding": {
163
+ "url": "https://github.com/discordjs/discord.js?sponsor"
164
+ }
165
+ },
166
+ "node_modules/@discordjs/ws/node_modules/@discordjs/collection": {
167
+ "version": "2.1.1",
168
+ "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.1.1.tgz",
169
+ "integrity": "sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg==",
170
+ "license": "Apache-2.0",
171
+ "engines": {
172
+ "node": ">=18"
173
+ },
174
+ "funding": {
175
+ "url": "https://github.com/discordjs/discord.js?sponsor"
176
+ }
177
+ },
178
+ "node_modules/@jridgewell/resolve-uri": {
179
+ "version": "3.1.2",
180
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
181
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
182
+ "dev": true,
183
+ "license": "MIT",
184
+ "engines": {
185
+ "node": ">=6.0.0"
186
+ }
187
+ },
188
+ "node_modules/@jridgewell/sourcemap-codec": {
189
+ "version": "1.5.5",
190
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
191
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
192
+ "dev": true,
193
+ "license": "MIT"
194
+ },
195
+ "node_modules/@jridgewell/trace-mapping": {
196
+ "version": "0.3.9",
197
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
198
+ "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
199
+ "dev": true,
200
+ "license": "MIT",
201
+ "dependencies": {
202
+ "@jridgewell/resolve-uri": "^3.0.3",
203
+ "@jridgewell/sourcemap-codec": "^1.4.10"
204
+ }
205
+ },
206
+ "node_modules/@prisma/client": {
207
+ "version": "6.19.3",
208
+ "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.3.tgz",
209
+ "integrity": "sha512-mKq3jQFhjvko5LTJFHGilsuQs+W+T3Gm451NzuTDGQxwCzwXHYnIu2zGkRoW+Exq3Rob7yp2MfzSrdIiZVhrBg==",
210
+ "hasInstallScript": true,
211
+ "license": "Apache-2.0",
212
+ "engines": {
213
+ "node": ">=18.18"
214
+ },
215
+ "peerDependencies": {
216
+ "prisma": "*",
217
+ "typescript": ">=5.1.0"
218
+ },
219
+ "peerDependenciesMeta": {
220
+ "prisma": {
221
+ "optional": true
222
+ },
223
+ "typescript": {
224
+ "optional": true
225
+ }
226
+ }
227
+ },
228
+ "node_modules/@prisma/config": {
229
+ "version": "6.19.3",
230
+ "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.19.3.tgz",
231
+ "integrity": "sha512-CBPT44BjlQxEt8kiMEauji2WHTDoVBOKl7UlewXmUgBPnr/oPRZC3psci5chJnYmH0ivEIog2OU9PGWoki3DLQ==",
232
+ "devOptional": true,
233
+ "license": "Apache-2.0",
234
+ "dependencies": {
235
+ "c12": "3.1.0",
236
+ "deepmerge-ts": "7.1.5",
237
+ "effect": "3.21.0",
238
+ "empathic": "2.0.0"
239
+ }
240
+ },
241
+ "node_modules/@prisma/debug": {
242
+ "version": "6.19.3",
243
+ "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.19.3.tgz",
244
+ "integrity": "sha512-ljkJ+SgpXNktLG0Q/n4JGYCkKf0f8oYLyjImS2I8e2q2WCfdRRtWER062ZV/ixaNP2M2VKlWXVJiGzZaUgbKZw==",
245
+ "devOptional": true,
246
+ "license": "Apache-2.0"
247
+ },
248
+ "node_modules/@prisma/engines": {
249
+ "version": "6.19.3",
250
+ "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.19.3.tgz",
251
+ "integrity": "sha512-RSYxtlYFl5pJ8ZePgMv0lZ9IzVCOdTPOegrs2qcbAEFrBI1G33h6wyC9kjQvo0DnYEhEVY0X4LsuFHXLKQk88g==",
252
+ "devOptional": true,
253
+ "hasInstallScript": true,
254
+ "license": "Apache-2.0",
255
+ "dependencies": {
256
+ "@prisma/debug": "6.19.3",
257
+ "@prisma/engines-version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7",
258
+ "@prisma/fetch-engine": "6.19.3",
259
+ "@prisma/get-platform": "6.19.3"
260
+ }
261
+ },
262
+ "node_modules/@prisma/engines-version": {
263
+ "version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7",
264
+ "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7.tgz",
265
+ "integrity": "sha512-03bgb1VD5gvuumNf+7fVGBzfpJPjmqV423l/WxsWk2cNQ42JD0/SsFBPhN6z8iAvdHs07/7ei77SKu7aZfq8bA==",
266
+ "devOptional": true,
267
+ "license": "Apache-2.0"
268
+ },
269
+ "node_modules/@prisma/fetch-engine": {
270
+ "version": "6.19.3",
271
+ "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.19.3.tgz",
272
+ "integrity": "sha512-tKtl/qco9Nt7LU5iKhpultD8O4vMCZcU2CHjNTnRrL1QvSUr5W/GcyFPjNL87GtRrwBc7ubXXD9xy4EvLvt8JA==",
273
+ "devOptional": true,
274
+ "license": "Apache-2.0",
275
+ "dependencies": {
276
+ "@prisma/debug": "6.19.3",
277
+ "@prisma/engines-version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7",
278
+ "@prisma/get-platform": "6.19.3"
279
+ }
280
+ },
281
+ "node_modules/@prisma/get-platform": {
282
+ "version": "6.19.3",
283
+ "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.19.3.tgz",
284
+ "integrity": "sha512-xFj1VcJ1N3MKooOQAGO0W5tsd0W2QzIvW7DD7c/8H14Zmp4jseeWAITm+w2LLoLrlhoHdPPh0NMZ8mfL6puoHA==",
285
+ "devOptional": true,
286
+ "license": "Apache-2.0",
287
+ "dependencies": {
288
+ "@prisma/debug": "6.19.3"
289
+ }
290
+ },
291
+ "node_modules/@sapphire/async-queue": {
292
+ "version": "1.5.5",
293
+ "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.5.tgz",
294
+ "integrity": "sha512-cvGzxbba6sav2zZkH8GPf2oGk9yYoD5qrNWdu9fRehifgnFZJMV+nuy2nON2roRO4yQQ+v7MK/Pktl/HgfsUXg==",
295
+ "license": "MIT",
296
+ "engines": {
297
+ "node": ">=v14.0.0",
298
+ "npm": ">=7.0.0"
299
+ }
300
+ },
301
+ "node_modules/@sapphire/shapeshift": {
302
+ "version": "4.0.0",
303
+ "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-4.0.0.tgz",
304
+ "integrity": "sha512-d9dUmWVA7MMiKobL3VpLF8P2aeanRTu6ypG2OIaEv/ZHH/SUQ2iHOVyi5wAPjQ+HmnMuL0whK9ez8I/raWbtIg==",
305
+ "license": "MIT",
306
+ "dependencies": {
307
+ "fast-deep-equal": "^3.1.3",
308
+ "lodash": "^4.17.21"
309
+ },
310
+ "engines": {
311
+ "node": ">=v16"
312
+ }
313
+ },
314
+ "node_modules/@sapphire/snowflake": {
315
+ "version": "3.5.3",
316
+ "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.5.3.tgz",
317
+ "integrity": "sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ==",
318
+ "license": "MIT",
319
+ "engines": {
320
+ "node": ">=v14.0.0",
321
+ "npm": ">=7.0.0"
322
+ }
323
+ },
324
+ "node_modules/@standard-schema/spec": {
325
+ "version": "1.1.0",
326
+ "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz",
327
+ "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==",
328
+ "devOptional": true,
329
+ "license": "MIT"
330
+ },
331
+ "node_modules/@tsconfig/node10": {
332
+ "version": "1.0.12",
333
+ "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz",
334
+ "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==",
335
+ "dev": true,
336
+ "license": "MIT"
337
+ },
338
+ "node_modules/@tsconfig/node12": {
339
+ "version": "1.0.11",
340
+ "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
341
+ "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
342
+ "dev": true,
343
+ "license": "MIT"
344
+ },
345
+ "node_modules/@tsconfig/node14": {
346
+ "version": "1.0.3",
347
+ "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
348
+ "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==",
349
+ "dev": true,
350
+ "license": "MIT"
351
+ },
352
+ "node_modules/@tsconfig/node16": {
353
+ "version": "1.0.4",
354
+ "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz",
355
+ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
356
+ "dev": true,
357
+ "license": "MIT"
358
+ },
359
+ "node_modules/@types/body-parser": {
360
+ "version": "1.19.6",
361
+ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz",
362
+ "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==",
363
+ "dev": true,
364
+ "license": "MIT",
365
+ "dependencies": {
366
+ "@types/connect": "*",
367
+ "@types/node": "*"
368
+ }
369
+ },
370
+ "node_modules/@types/connect": {
371
+ "version": "3.4.38",
372
+ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz",
373
+ "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==",
374
+ "dev": true,
375
+ "license": "MIT",
376
+ "dependencies": {
377
+ "@types/node": "*"
378
+ }
379
+ },
380
+ "node_modules/@types/express": {
381
+ "version": "4.17.25",
382
+ "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz",
383
+ "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==",
384
+ "dev": true,
385
+ "license": "MIT",
386
+ "dependencies": {
387
+ "@types/body-parser": "*",
388
+ "@types/express-serve-static-core": "^4.17.33",
389
+ "@types/qs": "*",
390
+ "@types/serve-static": "^1"
391
+ }
392
+ },
393
+ "node_modules/@types/express-serve-static-core": {
394
+ "version": "4.19.8",
395
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz",
396
+ "integrity": "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==",
397
+ "dev": true,
398
+ "license": "MIT",
399
+ "dependencies": {
400
+ "@types/node": "*",
401
+ "@types/qs": "*",
402
+ "@types/range-parser": "*",
403
+ "@types/send": "*"
404
+ }
405
+ },
406
+ "node_modules/@types/http-errors": {
407
+ "version": "2.0.5",
408
+ "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz",
409
+ "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==",
410
+ "dev": true,
411
+ "license": "MIT"
412
+ },
413
+ "node_modules/@types/mime": {
414
+ "version": "1.3.5",
415
+ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz",
416
+ "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==",
417
+ "dev": true,
418
+ "license": "MIT"
419
+ },
420
+ "node_modules/@types/node": {
421
+ "version": "20.19.41",
422
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.41.tgz",
423
+ "integrity": "sha512-ECymXOukMnOoVkC2bb1Vc/w/836DXncOg5m8Xj1RH7xSHZJWNYY6Zh7EH477vcnD5egKNNfy2RpNOmuChhFPgQ==",
424
+ "license": "MIT",
425
+ "dependencies": {
426
+ "undici-types": "~6.21.0"
427
+ }
428
+ },
429
+ "node_modules/@types/qs": {
430
+ "version": "6.15.1",
431
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.1.tgz",
432
+ "integrity": "sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==",
433
+ "dev": true,
434
+ "license": "MIT"
435
+ },
436
+ "node_modules/@types/range-parser": {
437
+ "version": "1.2.7",
438
+ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz",
439
+ "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==",
440
+ "dev": true,
441
+ "license": "MIT"
442
+ },
443
+ "node_modules/@types/send": {
444
+ "version": "1.2.1",
445
+ "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz",
446
+ "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==",
447
+ "dev": true,
448
+ "license": "MIT",
449
+ "dependencies": {
450
+ "@types/node": "*"
451
+ }
452
+ },
453
+ "node_modules/@types/serve-static": {
454
+ "version": "1.15.10",
455
+ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz",
456
+ "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==",
457
+ "dev": true,
458
+ "license": "MIT",
459
+ "dependencies": {
460
+ "@types/http-errors": "*",
461
+ "@types/node": "*",
462
+ "@types/send": "<1"
463
+ }
464
+ },
465
+ "node_modules/@types/serve-static/node_modules/@types/send": {
466
+ "version": "0.17.6",
467
+ "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz",
468
+ "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==",
469
+ "dev": true,
470
+ "license": "MIT",
471
+ "dependencies": {
472
+ "@types/mime": "^1",
473
+ "@types/node": "*"
474
+ }
475
+ },
476
+ "node_modules/@types/ws": {
477
+ "version": "8.18.1",
478
+ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz",
479
+ "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==",
480
+ "license": "MIT",
481
+ "dependencies": {
482
+ "@types/node": "*"
483
+ }
484
+ },
485
+ "node_modules/@vladfrangu/async_event_emitter": {
486
+ "version": "2.4.7",
487
+ "resolved": "https://registry.npmjs.org/@vladfrangu/async_event_emitter/-/async_event_emitter-2.4.7.tgz",
488
+ "integrity": "sha512-Xfe6rpCTxSxfbswi/W/Pz7zp1WWSNn4A0eW4mLkQUewCrXXtMj31lCg+iQyTkh/CkusZSq9eDflu7tjEDXUY6g==",
489
+ "license": "MIT",
490
+ "engines": {
491
+ "node": ">=v14.0.0",
492
+ "npm": ">=7.0.0"
493
+ }
494
+ },
495
+ "node_modules/accepts": {
496
+ "version": "1.3.8",
497
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
498
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
499
+ "license": "MIT",
500
+ "dependencies": {
501
+ "mime-types": "~2.1.34",
502
+ "negotiator": "0.6.3"
503
+ },
504
+ "engines": {
505
+ "node": ">= 0.6"
506
+ }
507
+ },
508
+ "node_modules/acorn": {
509
+ "version": "8.16.0",
510
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
511
+ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
512
+ "dev": true,
513
+ "license": "MIT",
514
+ "bin": {
515
+ "acorn": "bin/acorn"
516
+ },
517
+ "engines": {
518
+ "node": ">=0.4.0"
519
+ }
520
+ },
521
+ "node_modules/acorn-walk": {
522
+ "version": "8.3.5",
523
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz",
524
+ "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==",
525
+ "dev": true,
526
+ "license": "MIT",
527
+ "dependencies": {
528
+ "acorn": "^8.11.0"
529
+ },
530
+ "engines": {
531
+ "node": ">=0.4.0"
532
+ }
533
+ },
534
+ "node_modules/arg": {
535
+ "version": "4.1.3",
536
+ "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
537
+ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
538
+ "dev": true,
539
+ "license": "MIT"
540
+ },
541
+ "node_modules/array-flatten": {
542
+ "version": "1.1.1",
543
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
544
+ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
545
+ "license": "MIT"
546
+ },
547
+ "node_modules/body-parser": {
548
+ "version": "1.20.5",
549
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz",
550
+ "integrity": "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==",
551
+ "license": "MIT",
552
+ "dependencies": {
553
+ "bytes": "~3.1.2",
554
+ "content-type": "~1.0.5",
555
+ "debug": "2.6.9",
556
+ "depd": "2.0.0",
557
+ "destroy": "~1.2.0",
558
+ "http-errors": "~2.0.1",
559
+ "iconv-lite": "~0.4.24",
560
+ "on-finished": "~2.4.1",
561
+ "qs": "~6.15.1",
562
+ "raw-body": "~2.5.3",
563
+ "type-is": "~1.6.18",
564
+ "unpipe": "~1.0.0"
565
+ },
566
+ "engines": {
567
+ "node": ">= 0.8",
568
+ "npm": "1.2.8000 || >= 1.4.16"
569
+ }
570
+ },
571
+ "node_modules/bytes": {
572
+ "version": "3.1.2",
573
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
574
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
575
+ "license": "MIT",
576
+ "engines": {
577
+ "node": ">= 0.8"
578
+ }
579
+ },
580
+ "node_modules/c12": {
581
+ "version": "3.1.0",
582
+ "resolved": "https://registry.npmjs.org/c12/-/c12-3.1.0.tgz",
583
+ "integrity": "sha512-uWoS8OU1MEIsOv8p/5a82c3H31LsWVR5qiyXVfBNOzfffjUWtPnhAb4BYI2uG2HfGmZmFjCtui5XNWaps+iFuw==",
584
+ "devOptional": true,
585
+ "license": "MIT",
586
+ "dependencies": {
587
+ "chokidar": "^4.0.3",
588
+ "confbox": "^0.2.2",
589
+ "defu": "^6.1.4",
590
+ "dotenv": "^16.6.1",
591
+ "exsolve": "^1.0.7",
592
+ "giget": "^2.0.0",
593
+ "jiti": "^2.4.2",
594
+ "ohash": "^2.0.11",
595
+ "pathe": "^2.0.3",
596
+ "perfect-debounce": "^1.0.0",
597
+ "pkg-types": "^2.2.0",
598
+ "rc9": "^2.1.2"
599
+ },
600
+ "peerDependencies": {
601
+ "magicast": "^0.3.5"
602
+ },
603
+ "peerDependenciesMeta": {
604
+ "magicast": {
605
+ "optional": true
606
+ }
607
+ }
608
+ },
609
+ "node_modules/call-bind-apply-helpers": {
610
+ "version": "1.0.2",
611
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
612
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
613
+ "license": "MIT",
614
+ "dependencies": {
615
+ "es-errors": "^1.3.0",
616
+ "function-bind": "^1.1.2"
617
+ },
618
+ "engines": {
619
+ "node": ">= 0.4"
620
+ }
621
+ },
622
+ "node_modules/call-bound": {
623
+ "version": "1.0.4",
624
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
625
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
626
+ "license": "MIT",
627
+ "dependencies": {
628
+ "call-bind-apply-helpers": "^1.0.2",
629
+ "get-intrinsic": "^1.3.0"
630
+ },
631
+ "engines": {
632
+ "node": ">= 0.4"
633
+ },
634
+ "funding": {
635
+ "url": "https://github.com/sponsors/ljharb"
636
+ }
637
+ },
638
+ "node_modules/chokidar": {
639
+ "version": "4.0.3",
640
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
641
+ "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
642
+ "devOptional": true,
643
+ "license": "MIT",
644
+ "dependencies": {
645
+ "readdirp": "^4.0.1"
646
+ },
647
+ "engines": {
648
+ "node": ">= 14.16.0"
649
+ },
650
+ "funding": {
651
+ "url": "https://paulmillr.com/funding/"
652
+ }
653
+ },
654
+ "node_modules/citty": {
655
+ "version": "0.1.6",
656
+ "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz",
657
+ "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==",
658
+ "devOptional": true,
659
+ "license": "MIT",
660
+ "dependencies": {
661
+ "consola": "^3.2.3"
662
+ }
663
+ },
664
+ "node_modules/confbox": {
665
+ "version": "0.2.4",
666
+ "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz",
667
+ "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==",
668
+ "devOptional": true,
669
+ "license": "MIT"
670
+ },
671
+ "node_modules/consola": {
672
+ "version": "3.4.2",
673
+ "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz",
674
+ "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==",
675
+ "devOptional": true,
676
+ "license": "MIT",
677
+ "engines": {
678
+ "node": "^14.18.0 || >=16.10.0"
679
+ }
680
+ },
681
+ "node_modules/content-disposition": {
682
+ "version": "0.5.4",
683
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
684
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
685
+ "license": "MIT",
686
+ "dependencies": {
687
+ "safe-buffer": "5.2.1"
688
+ },
689
+ "engines": {
690
+ "node": ">= 0.6"
691
+ }
692
+ },
693
+ "node_modules/content-type": {
694
+ "version": "1.0.5",
695
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
696
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
697
+ "license": "MIT",
698
+ "engines": {
699
+ "node": ">= 0.6"
700
+ }
701
+ },
702
+ "node_modules/cookie": {
703
+ "version": "0.7.2",
704
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
705
+ "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
706
+ "license": "MIT",
707
+ "engines": {
708
+ "node": ">= 0.6"
709
+ }
710
+ },
711
+ "node_modules/cookie-signature": {
712
+ "version": "1.0.7",
713
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz",
714
+ "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==",
715
+ "license": "MIT"
716
+ },
717
+ "node_modules/create-require": {
718
+ "version": "1.1.1",
719
+ "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
720
+ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
721
+ "dev": true,
722
+ "license": "MIT"
723
+ },
724
+ "node_modules/debug": {
725
+ "version": "2.6.9",
726
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
727
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
728
+ "license": "MIT",
729
+ "dependencies": {
730
+ "ms": "2.0.0"
731
+ }
732
+ },
733
+ "node_modules/deepmerge-ts": {
734
+ "version": "7.1.5",
735
+ "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-7.1.5.tgz",
736
+ "integrity": "sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==",
737
+ "devOptional": true,
738
+ "license": "BSD-3-Clause",
739
+ "engines": {
740
+ "node": ">=16.0.0"
741
+ }
742
+ },
743
+ "node_modules/defu": {
744
+ "version": "6.1.7",
745
+ "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz",
746
+ "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==",
747
+ "devOptional": true,
748
+ "license": "MIT"
749
+ },
750
+ "node_modules/depd": {
751
+ "version": "2.0.0",
752
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
753
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
754
+ "license": "MIT",
755
+ "engines": {
756
+ "node": ">= 0.8"
757
+ }
758
+ },
759
+ "node_modules/destr": {
760
+ "version": "2.0.5",
761
+ "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz",
762
+ "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==",
763
+ "devOptional": true,
764
+ "license": "MIT"
765
+ },
766
+ "node_modules/destroy": {
767
+ "version": "1.2.0",
768
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
769
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
770
+ "license": "MIT",
771
+ "engines": {
772
+ "node": ">= 0.8",
773
+ "npm": "1.2.8000 || >= 1.4.16"
774
+ }
775
+ },
776
+ "node_modules/diff": {
777
+ "version": "4.0.4",
778
+ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz",
779
+ "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==",
780
+ "dev": true,
781
+ "license": "BSD-3-Clause",
782
+ "engines": {
783
+ "node": ">=0.3.1"
784
+ }
785
+ },
786
+ "node_modules/discord-api-types": {
787
+ "version": "0.38.47",
788
+ "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.38.47.tgz",
789
+ "integrity": "sha512-XgXQodHQBAE6kfD7kMvVo30863iHX1LHSqNq6MGUTDwIFCCvHva13+rwxyxVXDqudyApMNAd32PGjgVETi5rjA==",
790
+ "license": "MIT",
791
+ "workspaces": [
792
+ "scripts/actions/documentation"
793
+ ]
794
+ },
795
+ "node_modules/discord-interactions": {
796
+ "version": "4.4.0",
797
+ "resolved": "https://registry.npmjs.org/discord-interactions/-/discord-interactions-4.4.0.tgz",
798
+ "integrity": "sha512-jjJx8iwAeJcj8oEauV43fue9lNqkf38fy60aSs2+G8D1nJmDxUIrk08o3h0F3wgwuBWWJUZO+X/VgfXsxpCiJA==",
799
+ "license": "MIT",
800
+ "engines": {
801
+ "node": ">=18.4.0"
802
+ }
803
+ },
804
+ "node_modules/discord.js": {
805
+ "version": "14.26.4",
806
+ "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.26.4.tgz",
807
+ "integrity": "sha512-4oBp8tc6Kf8IDBwAHhbsMaAqx1b5fob9SNasZT7V6yyyUydoO5i5fGuX7TmvRtR+q/WgKRnRViRoAWnG7fNyvA==",
808
+ "license": "Apache-2.0",
809
+ "dependencies": {
810
+ "@discordjs/builders": "^1.14.1",
811
+ "@discordjs/collection": "1.5.3",
812
+ "@discordjs/formatters": "^0.6.2",
813
+ "@discordjs/rest": "^2.6.1",
814
+ "@discordjs/util": "^1.2.0",
815
+ "@discordjs/ws": "^1.2.3",
816
+ "@sapphire/snowflake": "3.5.3",
817
+ "discord-api-types": "^0.38.40",
818
+ "fast-deep-equal": "3.1.3",
819
+ "lodash.snakecase": "4.1.1",
820
+ "magic-bytes.js": "^1.13.0",
821
+ "tslib": "^2.6.3",
822
+ "undici": "6.24.1"
823
+ },
824
+ "engines": {
825
+ "node": ">=18"
826
+ },
827
+ "funding": {
828
+ "url": "https://github.com/discordjs/discord.js?sponsor"
829
+ }
830
+ },
831
+ "node_modules/dotenv": {
832
+ "version": "16.6.1",
833
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz",
834
+ "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==",
835
+ "devOptional": true,
836
+ "license": "BSD-2-Clause",
837
+ "engines": {
838
+ "node": ">=12"
839
+ },
840
+ "funding": {
841
+ "url": "https://dotenvx.com"
842
+ }
843
+ },
844
+ "node_modules/dunder-proto": {
845
+ "version": "1.0.1",
846
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
847
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
848
+ "license": "MIT",
849
+ "dependencies": {
850
+ "call-bind-apply-helpers": "^1.0.1",
851
+ "es-errors": "^1.3.0",
852
+ "gopd": "^1.2.0"
853
+ },
854
+ "engines": {
855
+ "node": ">= 0.4"
856
+ }
857
+ },
858
+ "node_modules/ee-first": {
859
+ "version": "1.1.1",
860
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
861
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
862
+ "license": "MIT"
863
+ },
864
+ "node_modules/effect": {
865
+ "version": "3.21.0",
866
+ "resolved": "https://registry.npmjs.org/effect/-/effect-3.21.0.tgz",
867
+ "integrity": "sha512-PPN80qRokCd1f015IANNhrwOnLO7GrrMQfk4/lnZRE/8j7UPWrNNjPV0uBrZutI/nHzernbW+J0hdqQysHiSnQ==",
868
+ "devOptional": true,
869
+ "license": "MIT",
870
+ "dependencies": {
871
+ "@standard-schema/spec": "^1.0.0",
872
+ "fast-check": "^3.23.1"
873
+ }
874
+ },
875
+ "node_modules/empathic": {
876
+ "version": "2.0.0",
877
+ "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.0.0.tgz",
878
+ "integrity": "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==",
879
+ "devOptional": true,
880
+ "license": "MIT",
881
+ "engines": {
882
+ "node": ">=14"
883
+ }
884
+ },
885
+ "node_modules/encodeurl": {
886
+ "version": "2.0.0",
887
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
888
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
889
+ "license": "MIT",
890
+ "engines": {
891
+ "node": ">= 0.8"
892
+ }
893
+ },
894
+ "node_modules/es-define-property": {
895
+ "version": "1.0.1",
896
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
897
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
898
+ "license": "MIT",
899
+ "engines": {
900
+ "node": ">= 0.4"
901
+ }
902
+ },
903
+ "node_modules/es-errors": {
904
+ "version": "1.3.0",
905
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
906
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
907
+ "license": "MIT",
908
+ "engines": {
909
+ "node": ">= 0.4"
910
+ }
911
+ },
912
+ "node_modules/es-object-atoms": {
913
+ "version": "1.1.1",
914
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
915
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
916
+ "license": "MIT",
917
+ "dependencies": {
918
+ "es-errors": "^1.3.0"
919
+ },
920
+ "engines": {
921
+ "node": ">= 0.4"
922
+ }
923
+ },
924
+ "node_modules/escape-html": {
925
+ "version": "1.0.3",
926
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
927
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
928
+ "license": "MIT"
929
+ },
930
+ "node_modules/etag": {
931
+ "version": "1.8.1",
932
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
933
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
934
+ "license": "MIT",
935
+ "engines": {
936
+ "node": ">= 0.6"
937
+ }
938
+ },
939
+ "node_modules/express": {
940
+ "version": "4.22.2",
941
+ "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz",
942
+ "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==",
943
+ "license": "MIT",
944
+ "dependencies": {
945
+ "accepts": "~1.3.8",
946
+ "array-flatten": "1.1.1",
947
+ "body-parser": "~1.20.5",
948
+ "content-disposition": "~0.5.4",
949
+ "content-type": "~1.0.4",
950
+ "cookie": "~0.7.1",
951
+ "cookie-signature": "~1.0.6",
952
+ "debug": "2.6.9",
953
+ "depd": "2.0.0",
954
+ "encodeurl": "~2.0.0",
955
+ "escape-html": "~1.0.3",
956
+ "etag": "~1.8.1",
957
+ "finalhandler": "~1.3.1",
958
+ "fresh": "~0.5.2",
959
+ "http-errors": "~2.0.0",
960
+ "merge-descriptors": "1.0.3",
961
+ "methods": "~1.1.2",
962
+ "on-finished": "~2.4.1",
963
+ "parseurl": "~1.3.3",
964
+ "path-to-regexp": "~0.1.12",
965
+ "proxy-addr": "~2.0.7",
966
+ "qs": "~6.15.1",
967
+ "range-parser": "~1.2.1",
968
+ "safe-buffer": "5.2.1",
969
+ "send": "~0.19.0",
970
+ "serve-static": "~1.16.2",
971
+ "setprototypeof": "1.2.0",
972
+ "statuses": "~2.0.1",
973
+ "type-is": "~1.6.18",
974
+ "utils-merge": "1.0.1",
975
+ "vary": "~1.1.2"
976
+ },
977
+ "engines": {
978
+ "node": ">= 0.10.0"
979
+ },
980
+ "funding": {
981
+ "type": "opencollective",
982
+ "url": "https://opencollective.com/express"
983
+ }
984
+ },
985
+ "node_modules/exsolve": {
986
+ "version": "1.0.8",
987
+ "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz",
988
+ "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==",
989
+ "devOptional": true,
990
+ "license": "MIT"
991
+ },
992
+ "node_modules/fast-check": {
993
+ "version": "3.23.2",
994
+ "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.23.2.tgz",
995
+ "integrity": "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==",
996
+ "devOptional": true,
997
+ "funding": [
998
+ {
999
+ "type": "individual",
1000
+ "url": "https://github.com/sponsors/dubzzz"
1001
+ },
1002
+ {
1003
+ "type": "opencollective",
1004
+ "url": "https://opencollective.com/fast-check"
1005
+ }
1006
+ ],
1007
+ "license": "MIT",
1008
+ "dependencies": {
1009
+ "pure-rand": "^6.1.0"
1010
+ },
1011
+ "engines": {
1012
+ "node": ">=8.0.0"
1013
+ }
1014
+ },
1015
+ "node_modules/fast-deep-equal": {
1016
+ "version": "3.1.3",
1017
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
1018
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
1019
+ "license": "MIT"
1020
+ },
1021
+ "node_modules/finalhandler": {
1022
+ "version": "1.3.2",
1023
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz",
1024
+ "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==",
1025
+ "license": "MIT",
1026
+ "dependencies": {
1027
+ "debug": "2.6.9",
1028
+ "encodeurl": "~2.0.0",
1029
+ "escape-html": "~1.0.3",
1030
+ "on-finished": "~2.4.1",
1031
+ "parseurl": "~1.3.3",
1032
+ "statuses": "~2.0.2",
1033
+ "unpipe": "~1.0.0"
1034
+ },
1035
+ "engines": {
1036
+ "node": ">= 0.8"
1037
+ }
1038
+ },
1039
+ "node_modules/forwarded": {
1040
+ "version": "0.2.0",
1041
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
1042
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
1043
+ "license": "MIT",
1044
+ "engines": {
1045
+ "node": ">= 0.6"
1046
+ }
1047
+ },
1048
+ "node_modules/fresh": {
1049
+ "version": "0.5.2",
1050
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
1051
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
1052
+ "license": "MIT",
1053
+ "engines": {
1054
+ "node": ">= 0.6"
1055
+ }
1056
+ },
1057
+ "node_modules/function-bind": {
1058
+ "version": "1.1.2",
1059
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
1060
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
1061
+ "license": "MIT",
1062
+ "funding": {
1063
+ "url": "https://github.com/sponsors/ljharb"
1064
+ }
1065
+ },
1066
+ "node_modules/get-intrinsic": {
1067
+ "version": "1.3.0",
1068
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
1069
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
1070
+ "license": "MIT",
1071
+ "dependencies": {
1072
+ "call-bind-apply-helpers": "^1.0.2",
1073
+ "es-define-property": "^1.0.1",
1074
+ "es-errors": "^1.3.0",
1075
+ "es-object-atoms": "^1.1.1",
1076
+ "function-bind": "^1.1.2",
1077
+ "get-proto": "^1.0.1",
1078
+ "gopd": "^1.2.0",
1079
+ "has-symbols": "^1.1.0",
1080
+ "hasown": "^2.0.2",
1081
+ "math-intrinsics": "^1.1.0"
1082
+ },
1083
+ "engines": {
1084
+ "node": ">= 0.4"
1085
+ },
1086
+ "funding": {
1087
+ "url": "https://github.com/sponsors/ljharb"
1088
+ }
1089
+ },
1090
+ "node_modules/get-proto": {
1091
+ "version": "1.0.1",
1092
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
1093
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
1094
+ "license": "MIT",
1095
+ "dependencies": {
1096
+ "dunder-proto": "^1.0.1",
1097
+ "es-object-atoms": "^1.0.0"
1098
+ },
1099
+ "engines": {
1100
+ "node": ">= 0.4"
1101
+ }
1102
+ },
1103
+ "node_modules/giget": {
1104
+ "version": "2.0.0",
1105
+ "resolved": "https://registry.npmjs.org/giget/-/giget-2.0.0.tgz",
1106
+ "integrity": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==",
1107
+ "devOptional": true,
1108
+ "license": "MIT",
1109
+ "dependencies": {
1110
+ "citty": "^0.1.6",
1111
+ "consola": "^3.4.0",
1112
+ "defu": "^6.1.4",
1113
+ "node-fetch-native": "^1.6.6",
1114
+ "nypm": "^0.6.0",
1115
+ "pathe": "^2.0.3"
1116
+ },
1117
+ "bin": {
1118
+ "giget": "dist/cli.mjs"
1119
+ }
1120
+ },
1121
+ "node_modules/gopd": {
1122
+ "version": "1.2.0",
1123
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
1124
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
1125
+ "license": "MIT",
1126
+ "engines": {
1127
+ "node": ">= 0.4"
1128
+ },
1129
+ "funding": {
1130
+ "url": "https://github.com/sponsors/ljharb"
1131
+ }
1132
+ },
1133
+ "node_modules/has-symbols": {
1134
+ "version": "1.1.0",
1135
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
1136
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
1137
+ "license": "MIT",
1138
+ "engines": {
1139
+ "node": ">= 0.4"
1140
+ },
1141
+ "funding": {
1142
+ "url": "https://github.com/sponsors/ljharb"
1143
+ }
1144
+ },
1145
+ "node_modules/hasown": {
1146
+ "version": "2.0.3",
1147
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz",
1148
+ "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==",
1149
+ "license": "MIT",
1150
+ "dependencies": {
1151
+ "function-bind": "^1.1.2"
1152
+ },
1153
+ "engines": {
1154
+ "node": ">= 0.4"
1155
+ }
1156
+ },
1157
+ "node_modules/http-errors": {
1158
+ "version": "2.0.1",
1159
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
1160
+ "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
1161
+ "license": "MIT",
1162
+ "dependencies": {
1163
+ "depd": "~2.0.0",
1164
+ "inherits": "~2.0.4",
1165
+ "setprototypeof": "~1.2.0",
1166
+ "statuses": "~2.0.2",
1167
+ "toidentifier": "~1.0.1"
1168
+ },
1169
+ "engines": {
1170
+ "node": ">= 0.8"
1171
+ },
1172
+ "funding": {
1173
+ "type": "opencollective",
1174
+ "url": "https://opencollective.com/express"
1175
+ }
1176
+ },
1177
+ "node_modules/iconv-lite": {
1178
+ "version": "0.4.24",
1179
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
1180
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
1181
+ "license": "MIT",
1182
+ "dependencies": {
1183
+ "safer-buffer": ">= 2.1.2 < 3"
1184
+ },
1185
+ "engines": {
1186
+ "node": ">=0.10.0"
1187
+ }
1188
+ },
1189
+ "node_modules/inherits": {
1190
+ "version": "2.0.4",
1191
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
1192
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
1193
+ "license": "ISC"
1194
+ },
1195
+ "node_modules/ipaddr.js": {
1196
+ "version": "1.9.1",
1197
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
1198
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
1199
+ "license": "MIT",
1200
+ "engines": {
1201
+ "node": ">= 0.10"
1202
+ }
1203
+ },
1204
+ "node_modules/jiti": {
1205
+ "version": "2.7.0",
1206
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz",
1207
+ "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==",
1208
+ "devOptional": true,
1209
+ "license": "MIT",
1210
+ "bin": {
1211
+ "jiti": "lib/jiti-cli.mjs"
1212
+ }
1213
+ },
1214
+ "node_modules/lodash": {
1215
+ "version": "4.18.1",
1216
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz",
1217
+ "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==",
1218
+ "license": "MIT"
1219
+ },
1220
+ "node_modules/lodash.snakecase": {
1221
+ "version": "4.1.1",
1222
+ "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz",
1223
+ "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==",
1224
+ "license": "MIT"
1225
+ },
1226
+ "node_modules/magic-bytes.js": {
1227
+ "version": "1.13.0",
1228
+ "resolved": "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.13.0.tgz",
1229
+ "integrity": "sha512-afO2mnxW7GDTXMm5/AoN1WuOcdoKhtgXjIvHmobqTD1grNplhGdv3PFOyjCVmrnOZBIT/gD/koDKpYG+0mvHcg==",
1230
+ "license": "MIT"
1231
+ },
1232
+ "node_modules/make-error": {
1233
+ "version": "1.3.6",
1234
+ "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
1235
+ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
1236
+ "dev": true,
1237
+ "license": "ISC"
1238
+ },
1239
+ "node_modules/math-intrinsics": {
1240
+ "version": "1.1.0",
1241
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
1242
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
1243
+ "license": "MIT",
1244
+ "engines": {
1245
+ "node": ">= 0.4"
1246
+ }
1247
+ },
1248
+ "node_modules/media-typer": {
1249
+ "version": "0.3.0",
1250
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
1251
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
1252
+ "license": "MIT",
1253
+ "engines": {
1254
+ "node": ">= 0.6"
1255
+ }
1256
+ },
1257
+ "node_modules/merge-descriptors": {
1258
+ "version": "1.0.3",
1259
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
1260
+ "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
1261
+ "license": "MIT",
1262
+ "funding": {
1263
+ "url": "https://github.com/sponsors/sindresorhus"
1264
+ }
1265
+ },
1266
+ "node_modules/methods": {
1267
+ "version": "1.1.2",
1268
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
1269
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
1270
+ "license": "MIT",
1271
+ "engines": {
1272
+ "node": ">= 0.6"
1273
+ }
1274
+ },
1275
+ "node_modules/mime": {
1276
+ "version": "1.6.0",
1277
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
1278
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
1279
+ "license": "MIT",
1280
+ "bin": {
1281
+ "mime": "cli.js"
1282
+ },
1283
+ "engines": {
1284
+ "node": ">=4"
1285
+ }
1286
+ },
1287
+ "node_modules/mime-db": {
1288
+ "version": "1.52.0",
1289
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
1290
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
1291
+ "license": "MIT",
1292
+ "engines": {
1293
+ "node": ">= 0.6"
1294
+ }
1295
+ },
1296
+ "node_modules/mime-types": {
1297
+ "version": "2.1.35",
1298
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
1299
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
1300
+ "license": "MIT",
1301
+ "dependencies": {
1302
+ "mime-db": "1.52.0"
1303
+ },
1304
+ "engines": {
1305
+ "node": ">= 0.6"
1306
+ }
1307
+ },
1308
+ "node_modules/ms": {
1309
+ "version": "2.0.0",
1310
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1311
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
1312
+ "license": "MIT"
1313
+ },
1314
+ "node_modules/negotiator": {
1315
+ "version": "0.6.3",
1316
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
1317
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
1318
+ "license": "MIT",
1319
+ "engines": {
1320
+ "node": ">= 0.6"
1321
+ }
1322
+ },
1323
+ "node_modules/node-fetch-native": {
1324
+ "version": "1.6.7",
1325
+ "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz",
1326
+ "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==",
1327
+ "devOptional": true,
1328
+ "license": "MIT"
1329
+ },
1330
+ "node_modules/nypm": {
1331
+ "version": "0.6.6",
1332
+ "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.6.tgz",
1333
+ "integrity": "sha512-vRyr0r4cbBapw07Xw8xrj9Teq3o7MUD35rSaTcanDbW+aK2XHDgJFiU6ZTj2GBw7Q12ysdsyFss+Vdz4hQ0Y6Q==",
1334
+ "devOptional": true,
1335
+ "license": "MIT",
1336
+ "dependencies": {
1337
+ "citty": "^0.2.2",
1338
+ "pathe": "^2.0.3",
1339
+ "tinyexec": "^1.1.1"
1340
+ },
1341
+ "bin": {
1342
+ "nypm": "dist/cli.mjs"
1343
+ },
1344
+ "engines": {
1345
+ "node": ">=18"
1346
+ }
1347
+ },
1348
+ "node_modules/nypm/node_modules/citty": {
1349
+ "version": "0.2.2",
1350
+ "resolved": "https://registry.npmjs.org/citty/-/citty-0.2.2.tgz",
1351
+ "integrity": "sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==",
1352
+ "devOptional": true,
1353
+ "license": "MIT"
1354
+ },
1355
+ "node_modules/object-inspect": {
1356
+ "version": "1.13.4",
1357
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
1358
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
1359
+ "license": "MIT",
1360
+ "engines": {
1361
+ "node": ">= 0.4"
1362
+ },
1363
+ "funding": {
1364
+ "url": "https://github.com/sponsors/ljharb"
1365
+ }
1366
+ },
1367
+ "node_modules/ohash": {
1368
+ "version": "2.0.11",
1369
+ "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz",
1370
+ "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==",
1371
+ "devOptional": true,
1372
+ "license": "MIT"
1373
+ },
1374
+ "node_modules/on-finished": {
1375
+ "version": "2.4.1",
1376
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
1377
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
1378
+ "license": "MIT",
1379
+ "dependencies": {
1380
+ "ee-first": "1.1.1"
1381
+ },
1382
+ "engines": {
1383
+ "node": ">= 0.8"
1384
+ }
1385
+ },
1386
+ "node_modules/parseurl": {
1387
+ "version": "1.3.3",
1388
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1389
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
1390
+ "license": "MIT",
1391
+ "engines": {
1392
+ "node": ">= 0.8"
1393
+ }
1394
+ },
1395
+ "node_modules/path-to-regexp": {
1396
+ "version": "0.1.13",
1397
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz",
1398
+ "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==",
1399
+ "license": "MIT"
1400
+ },
1401
+ "node_modules/pathe": {
1402
+ "version": "2.0.3",
1403
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
1404
+ "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
1405
+ "devOptional": true,
1406
+ "license": "MIT"
1407
+ },
1408
+ "node_modules/perfect-debounce": {
1409
+ "version": "1.0.0",
1410
+ "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz",
1411
+ "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==",
1412
+ "devOptional": true,
1413
+ "license": "MIT"
1414
+ },
1415
+ "node_modules/pkg-types": {
1416
+ "version": "2.3.1",
1417
+ "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.1.tgz",
1418
+ "integrity": "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==",
1419
+ "devOptional": true,
1420
+ "license": "MIT",
1421
+ "dependencies": {
1422
+ "confbox": "^0.2.4",
1423
+ "exsolve": "^1.0.8",
1424
+ "pathe": "^2.0.3"
1425
+ }
1426
+ },
1427
+ "node_modules/prisma": {
1428
+ "version": "6.19.3",
1429
+ "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.3.tgz",
1430
+ "integrity": "sha512-++ZJ0ijLrDJF6hNB4t4uxg2br3fC4H9Yc9tcbjr2fcNFP3rh/SBNrAgjhsqBU4Ght8JPrVofG/ZkXfnSfnYsFg==",
1431
+ "devOptional": true,
1432
+ "hasInstallScript": true,
1433
+ "license": "Apache-2.0",
1434
+ "dependencies": {
1435
+ "@prisma/config": "6.19.3",
1436
+ "@prisma/engines": "6.19.3"
1437
+ },
1438
+ "bin": {
1439
+ "prisma": "build/index.js"
1440
+ },
1441
+ "engines": {
1442
+ "node": ">=18.18"
1443
+ },
1444
+ "peerDependencies": {
1445
+ "typescript": ">=5.1.0"
1446
+ },
1447
+ "peerDependenciesMeta": {
1448
+ "typescript": {
1449
+ "optional": true
1450
+ }
1451
+ }
1452
+ },
1453
+ "node_modules/proxy-addr": {
1454
+ "version": "2.0.7",
1455
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
1456
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
1457
+ "license": "MIT",
1458
+ "dependencies": {
1459
+ "forwarded": "0.2.0",
1460
+ "ipaddr.js": "1.9.1"
1461
+ },
1462
+ "engines": {
1463
+ "node": ">= 0.10"
1464
+ }
1465
+ },
1466
+ "node_modules/pure-rand": {
1467
+ "version": "6.1.0",
1468
+ "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz",
1469
+ "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==",
1470
+ "devOptional": true,
1471
+ "funding": [
1472
+ {
1473
+ "type": "individual",
1474
+ "url": "https://github.com/sponsors/dubzzz"
1475
+ },
1476
+ {
1477
+ "type": "opencollective",
1478
+ "url": "https://opencollective.com/fast-check"
1479
+ }
1480
+ ],
1481
+ "license": "MIT"
1482
+ },
1483
+ "node_modules/qs": {
1484
+ "version": "6.15.2",
1485
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz",
1486
+ "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==",
1487
+ "license": "BSD-3-Clause",
1488
+ "dependencies": {
1489
+ "side-channel": "^1.1.0"
1490
+ },
1491
+ "engines": {
1492
+ "node": ">=0.6"
1493
+ },
1494
+ "funding": {
1495
+ "url": "https://github.com/sponsors/ljharb"
1496
+ }
1497
+ },
1498
+ "node_modules/range-parser": {
1499
+ "version": "1.2.1",
1500
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1501
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
1502
+ "license": "MIT",
1503
+ "engines": {
1504
+ "node": ">= 0.6"
1505
+ }
1506
+ },
1507
+ "node_modules/raw-body": {
1508
+ "version": "2.5.3",
1509
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz",
1510
+ "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==",
1511
+ "license": "MIT",
1512
+ "dependencies": {
1513
+ "bytes": "~3.1.2",
1514
+ "http-errors": "~2.0.1",
1515
+ "iconv-lite": "~0.4.24",
1516
+ "unpipe": "~1.0.0"
1517
+ },
1518
+ "engines": {
1519
+ "node": ">= 0.8"
1520
+ }
1521
+ },
1522
+ "node_modules/rc9": {
1523
+ "version": "2.1.2",
1524
+ "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz",
1525
+ "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==",
1526
+ "devOptional": true,
1527
+ "license": "MIT",
1528
+ "dependencies": {
1529
+ "defu": "^6.1.4",
1530
+ "destr": "^2.0.3"
1531
+ }
1532
+ },
1533
+ "node_modules/readdirp": {
1534
+ "version": "4.1.2",
1535
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
1536
+ "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
1537
+ "devOptional": true,
1538
+ "license": "MIT",
1539
+ "engines": {
1540
+ "node": ">= 14.18.0"
1541
+ },
1542
+ "funding": {
1543
+ "type": "individual",
1544
+ "url": "https://paulmillr.com/funding/"
1545
+ }
1546
+ },
1547
+ "node_modules/safe-buffer": {
1548
+ "version": "5.2.1",
1549
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1550
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
1551
+ "funding": [
1552
+ {
1553
+ "type": "github",
1554
+ "url": "https://github.com/sponsors/feross"
1555
+ },
1556
+ {
1557
+ "type": "patreon",
1558
+ "url": "https://www.patreon.com/feross"
1559
+ },
1560
+ {
1561
+ "type": "consulting",
1562
+ "url": "https://feross.org/support"
1563
+ }
1564
+ ],
1565
+ "license": "MIT"
1566
+ },
1567
+ "node_modules/safer-buffer": {
1568
+ "version": "2.1.2",
1569
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1570
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
1571
+ "license": "MIT"
1572
+ },
1573
+ "node_modules/send": {
1574
+ "version": "0.19.2",
1575
+ "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz",
1576
+ "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==",
1577
+ "license": "MIT",
1578
+ "dependencies": {
1579
+ "debug": "2.6.9",
1580
+ "depd": "2.0.0",
1581
+ "destroy": "1.2.0",
1582
+ "encodeurl": "~2.0.0",
1583
+ "escape-html": "~1.0.3",
1584
+ "etag": "~1.8.1",
1585
+ "fresh": "~0.5.2",
1586
+ "http-errors": "~2.0.1",
1587
+ "mime": "1.6.0",
1588
+ "ms": "2.1.3",
1589
+ "on-finished": "~2.4.1",
1590
+ "range-parser": "~1.2.1",
1591
+ "statuses": "~2.0.2"
1592
+ },
1593
+ "engines": {
1594
+ "node": ">= 0.8.0"
1595
+ }
1596
+ },
1597
+ "node_modules/send/node_modules/ms": {
1598
+ "version": "2.1.3",
1599
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1600
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
1601
+ "license": "MIT"
1602
+ },
1603
+ "node_modules/serve-static": {
1604
+ "version": "1.16.3",
1605
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz",
1606
+ "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==",
1607
+ "license": "MIT",
1608
+ "dependencies": {
1609
+ "encodeurl": "~2.0.0",
1610
+ "escape-html": "~1.0.3",
1611
+ "parseurl": "~1.3.3",
1612
+ "send": "~0.19.1"
1613
+ },
1614
+ "engines": {
1615
+ "node": ">= 0.8.0"
1616
+ }
1617
+ },
1618
+ "node_modules/setprototypeof": {
1619
+ "version": "1.2.0",
1620
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1621
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
1622
+ "license": "ISC"
1623
+ },
1624
+ "node_modules/side-channel": {
1625
+ "version": "1.1.0",
1626
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
1627
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
1628
+ "license": "MIT",
1629
+ "dependencies": {
1630
+ "es-errors": "^1.3.0",
1631
+ "object-inspect": "^1.13.3",
1632
+ "side-channel-list": "^1.0.0",
1633
+ "side-channel-map": "^1.0.1",
1634
+ "side-channel-weakmap": "^1.0.2"
1635
+ },
1636
+ "engines": {
1637
+ "node": ">= 0.4"
1638
+ },
1639
+ "funding": {
1640
+ "url": "https://github.com/sponsors/ljharb"
1641
+ }
1642
+ },
1643
+ "node_modules/side-channel-list": {
1644
+ "version": "1.0.1",
1645
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz",
1646
+ "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==",
1647
+ "license": "MIT",
1648
+ "dependencies": {
1649
+ "es-errors": "^1.3.0",
1650
+ "object-inspect": "^1.13.4"
1651
+ },
1652
+ "engines": {
1653
+ "node": ">= 0.4"
1654
+ },
1655
+ "funding": {
1656
+ "url": "https://github.com/sponsors/ljharb"
1657
+ }
1658
+ },
1659
+ "node_modules/side-channel-map": {
1660
+ "version": "1.0.1",
1661
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
1662
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
1663
+ "license": "MIT",
1664
+ "dependencies": {
1665
+ "call-bound": "^1.0.2",
1666
+ "es-errors": "^1.3.0",
1667
+ "get-intrinsic": "^1.2.5",
1668
+ "object-inspect": "^1.13.3"
1669
+ },
1670
+ "engines": {
1671
+ "node": ">= 0.4"
1672
+ },
1673
+ "funding": {
1674
+ "url": "https://github.com/sponsors/ljharb"
1675
+ }
1676
+ },
1677
+ "node_modules/side-channel-weakmap": {
1678
+ "version": "1.0.2",
1679
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
1680
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
1681
+ "license": "MIT",
1682
+ "dependencies": {
1683
+ "call-bound": "^1.0.2",
1684
+ "es-errors": "^1.3.0",
1685
+ "get-intrinsic": "^1.2.5",
1686
+ "object-inspect": "^1.13.3",
1687
+ "side-channel-map": "^1.0.1"
1688
+ },
1689
+ "engines": {
1690
+ "node": ">= 0.4"
1691
+ },
1692
+ "funding": {
1693
+ "url": "https://github.com/sponsors/ljharb"
1694
+ }
1695
+ },
1696
+ "node_modules/statuses": {
1697
+ "version": "2.0.2",
1698
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
1699
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
1700
+ "license": "MIT",
1701
+ "engines": {
1702
+ "node": ">= 0.8"
1703
+ }
1704
+ },
1705
+ "node_modules/tinyexec": {
1706
+ "version": "1.1.2",
1707
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.2.tgz",
1708
+ "integrity": "sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==",
1709
+ "devOptional": true,
1710
+ "license": "MIT",
1711
+ "engines": {
1712
+ "node": ">=18"
1713
+ }
1714
+ },
1715
+ "node_modules/toidentifier": {
1716
+ "version": "1.0.1",
1717
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1718
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
1719
+ "license": "MIT",
1720
+ "engines": {
1721
+ "node": ">=0.6"
1722
+ }
1723
+ },
1724
+ "node_modules/ts-mixer": {
1725
+ "version": "6.0.4",
1726
+ "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.4.tgz",
1727
+ "integrity": "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==",
1728
+ "license": "MIT"
1729
+ },
1730
+ "node_modules/ts-node": {
1731
+ "version": "10.9.2",
1732
+ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz",
1733
+ "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==",
1734
+ "dev": true,
1735
+ "license": "MIT",
1736
+ "dependencies": {
1737
+ "@cspotcode/source-map-support": "^0.8.0",
1738
+ "@tsconfig/node10": "^1.0.7",
1739
+ "@tsconfig/node12": "^1.0.7",
1740
+ "@tsconfig/node14": "^1.0.0",
1741
+ "@tsconfig/node16": "^1.0.2",
1742
+ "acorn": "^8.4.1",
1743
+ "acorn-walk": "^8.1.1",
1744
+ "arg": "^4.1.0",
1745
+ "create-require": "^1.1.0",
1746
+ "diff": "^4.0.1",
1747
+ "make-error": "^1.1.1",
1748
+ "v8-compile-cache-lib": "^3.0.1",
1749
+ "yn": "3.1.1"
1750
+ },
1751
+ "bin": {
1752
+ "ts-node": "dist/bin.js",
1753
+ "ts-node-cwd": "dist/bin-cwd.js",
1754
+ "ts-node-esm": "dist/bin-esm.js",
1755
+ "ts-node-script": "dist/bin-script.js",
1756
+ "ts-node-transpile-only": "dist/bin-transpile.js",
1757
+ "ts-script": "dist/bin-script-deprecated.js"
1758
+ },
1759
+ "peerDependencies": {
1760
+ "@swc/core": ">=1.2.50",
1761
+ "@swc/wasm": ">=1.2.50",
1762
+ "@types/node": "*",
1763
+ "typescript": ">=2.7"
1764
+ },
1765
+ "peerDependenciesMeta": {
1766
+ "@swc/core": {
1767
+ "optional": true
1768
+ },
1769
+ "@swc/wasm": {
1770
+ "optional": true
1771
+ }
1772
+ }
1773
+ },
1774
+ "node_modules/tslib": {
1775
+ "version": "2.8.1",
1776
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
1777
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
1778
+ "license": "0BSD"
1779
+ },
1780
+ "node_modules/type-is": {
1781
+ "version": "1.6.18",
1782
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1783
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1784
+ "license": "MIT",
1785
+ "dependencies": {
1786
+ "media-typer": "0.3.0",
1787
+ "mime-types": "~2.1.24"
1788
+ },
1789
+ "engines": {
1790
+ "node": ">= 0.6"
1791
+ }
1792
+ },
1793
+ "node_modules/typescript": {
1794
+ "version": "5.9.3",
1795
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
1796
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
1797
+ "devOptional": true,
1798
+ "license": "Apache-2.0",
1799
+ "bin": {
1800
+ "tsc": "bin/tsc",
1801
+ "tsserver": "bin/tsserver"
1802
+ },
1803
+ "engines": {
1804
+ "node": ">=14.17"
1805
+ }
1806
+ },
1807
+ "node_modules/undici": {
1808
+ "version": "6.24.1",
1809
+ "resolved": "https://registry.npmjs.org/undici/-/undici-6.24.1.tgz",
1810
+ "integrity": "sha512-sC+b0tB1whOCzbtlx20fx3WgCXwkW627p4EA9uM+/tNNPkSS+eSEld6pAs9nDv7WbY1UUljBMYPtu9BCOrCWKA==",
1811
+ "license": "MIT",
1812
+ "engines": {
1813
+ "node": ">=18.17"
1814
+ }
1815
+ },
1816
+ "node_modules/undici-types": {
1817
+ "version": "6.21.0",
1818
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
1819
+ "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
1820
+ "license": "MIT"
1821
+ },
1822
+ "node_modules/unpipe": {
1823
+ "version": "1.0.0",
1824
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1825
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
1826
+ "license": "MIT",
1827
+ "engines": {
1828
+ "node": ">= 0.8"
1829
+ }
1830
+ },
1831
+ "node_modules/utils-merge": {
1832
+ "version": "1.0.1",
1833
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1834
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
1835
+ "license": "MIT",
1836
+ "engines": {
1837
+ "node": ">= 0.4.0"
1838
+ }
1839
+ },
1840
+ "node_modules/v8-compile-cache-lib": {
1841
+ "version": "3.0.1",
1842
+ "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
1843
+ "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
1844
+ "dev": true,
1845
+ "license": "MIT"
1846
+ },
1847
+ "node_modules/vary": {
1848
+ "version": "1.1.2",
1849
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1850
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
1851
+ "license": "MIT",
1852
+ "engines": {
1853
+ "node": ">= 0.8"
1854
+ }
1855
+ },
1856
+ "node_modules/ws": {
1857
+ "version": "8.20.1",
1858
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.1.tgz",
1859
+ "integrity": "sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w==",
1860
+ "license": "MIT",
1861
+ "engines": {
1862
+ "node": ">=10.0.0"
1863
+ },
1864
+ "peerDependencies": {
1865
+ "bufferutil": "^4.0.1",
1866
+ "utf-8-validate": ">=5.0.2"
1867
+ },
1868
+ "peerDependenciesMeta": {
1869
+ "bufferutil": {
1870
+ "optional": true
1871
+ },
1872
+ "utf-8-validate": {
1873
+ "optional": true
1874
+ }
1875
+ }
1876
+ },
1877
+ "node_modules/yn": {
1878
+ "version": "3.1.1",
1879
+ "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
1880
+ "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
1881
+ "dev": true,
1882
+ "license": "MIT",
1883
+ "engines": {
1884
+ "node": ">=6"
1885
+ }
1886
+ }
1887
+ }
1888
+ }
package.json ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "snapkitty-bot",
3
+ "version": "1.0.0",
4
+ "description": "SnapKitty Discord Bot β€” 11 agents, MoneyPool, Bifrost tier status, WORM audit trail",
5
+ "license": "BUSL-1.1",
6
+ "main": "dist/index.js",
7
+ "scripts": {
8
+ "dev": "ts-node src/index.ts",
9
+ "build": "tsc",
10
+ "start": "node dist/index.js",
11
+ "register": "ts-node src/register.ts"
12
+ },
13
+ "dependencies": {
14
+ "@prisma/client": "^6.19.3",
15
+ "discord-interactions": "^4.4.0",
16
+ "discord.js": "^14.16.3",
17
+ "express": "^4.18.2"
18
+ },
19
+ "devDependencies": {
20
+ "@types/express": "^4.17.21",
21
+ "@types/node": "^20.19.41",
22
+ "prisma": "^6.19.3",
23
+ "ts-node": "^10.9.2",
24
+ "typescript": "^5"
25
+ }
26
+ }
src/commands/ask.ts ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ import { askAgent, agentName } from '../lib/agents'
2
+
3
+ export async function handleAsk(agent: string, message: string): Promise<string> {
4
+ const reply = await askAgent(agent, message)
5
+ return `**${agentName(agent)}**\n${reply}`
6
+ }
src/commands/info.ts ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { prisma } from '../lib/prisma'
2
+
3
+ export async function handleAgents(): Promise<string> {
4
+ return `**SnapKitty β€” Agent Directory**
5
+ \`\`\`
6
+ RELAY bridge Your plain-English guide. Start here.
7
+ AXIOM finance Cash flow, revenue, expenses, money pools, GL.
8
+ VAULT treasury Reserve management, payment approvals. Veto power.
9
+ NEXUS crm Deals, contacts, pipeline, forecast.
10
+ FORGE procurement Vendors, purchase orders, spend analysis.
11
+ HERALD bifrost Event routing, infrastructure health, traces.
12
+ TENSOR ml Anomaly detection, predictions, risk scoring.
13
+ SENTINEL risk Risk status, compliance flags, credit utilization.
14
+ LEDGE auditor Permanent record, audit reports, qualification seal.
15
+ ATLAS operator System health, tier gate, agent roster. Gate authority.
16
+ QUILL scriptwriter Board decks, investor pitches, reports, social copy.
17
+ \`\`\`
18
+ Use \`/ask agent:bridge message:where do I start\` to talk to any agent.`
19
+ }
20
+
21
+ export async function handleStatus(): Promise<string> {
22
+ try {
23
+ const count = await prisma.bifrostEvent.count()
24
+ const recent = await prisma.bifrostEvent.findFirst({ orderBy: { createdAt: 'desc' } })
25
+ const pools = await prisma.moneyPool.count({ where: { status: 'active' } })
26
+ return `**SnapKitty OS β€” System Status**
27
+ \`\`\`
28
+ Bifrost Events: ${count}
29
+ Last Event: ${recent?.eventType ?? 'none'}
30
+ Active Pools: ${pools}
31
+ Database: ONLINE
32
+ Agents: 11 ONLINE
33
+ Status: OPERATIONAL
34
+ \`\`\``
35
+ } catch { return '⚠ Database unreachable β€” Bifrost offline' }
36
+ }
37
+
38
+ export async function handleSeal(): Promise<string> {
39
+ try {
40
+ const last = await prisma.bifrostEvent.findFirst({ orderBy: { createdAt: 'desc' } })
41
+ if (!last) return '**Decision Seal**\n```\nNo sealed transactions yet\n```'
42
+ return `**Last Decision Seal**\n\`\`\`\nEvent: ${last.eventType}\nSource: ${last.source}\nRisk: ${((last.riskScore ?? 0) * 100).toFixed(0)}%\nSealed: ${new Date(last.createdAt).toISOString()}\n\`\`\``
43
+ } catch { return '**Decision Seal**\n```\nDatabase unreachable\n```' }
44
+ }
45
+
46
+ export async function handleAudit(): Promise<string> {
47
+ try {
48
+ const events = await prisma.bifrostEvent.findMany({ orderBy: { createdAt: 'desc' }, take: 5 })
49
+ if (!events.length) return '**Audit Trail**\n```\nNo events yet\n```'
50
+ const lines = events.map(e =>
51
+ `${new Date(e.createdAt).toISOString().slice(0, 19)} | ${e.eventType.padEnd(30)} | risk:${((e.riskScore ?? 0) * 100).toFixed(0).padStart(3)}%`
52
+ ).join('\n')
53
+ return `**Audit Trail β€” Last 5 Events**\n\`\`\`\n${lines}\n\`\`\``
54
+ } catch { return '**Audit Trail**\n```\nDatabase unreachable\n```' }
55
+ }
56
+
57
+ export async function handleMerkle(): Promise<string> {
58
+ const base = process.env.SNAPKITTY_API_URL ?? 'http://localhost:3000'
59
+ try {
60
+ const res = await fetch(`${base}/api/ledger/merkle-root`)
61
+ const data = await res.json() as { merkle_root?: string; entry_count?: number; status?: string }
62
+ return `**Merkle Ledger**\n\`\`\`\nRoot: ${data.merkle_root?.slice(0, 32)}…\nEntries: ${data.entry_count}\nStatus: ${data.status}\n\`\`\``
63
+ } catch { return '**Merkle Ledger**\n```\nRust handler offline β€” no merkle data\n```' }
64
+ }
src/commands/pool.ts ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { prisma } from '../lib/prisma'
2
+
3
+ export async function handlePool(subcommand: string, opts: Record<string, any>): Promise<string> {
4
+ if (subcommand === 'list') {
5
+ try {
6
+ const pools = await prisma.moneyPool.findMany({ where: { status: 'active' }, orderBy: { createdAt: 'desc' } })
7
+ if (!pools.length) return '**Money Pools**\nNo active pools. Create one with `/pool create name:my-pool`'
8
+ const lines = pools.map(p => {
9
+ const pct = p.targetAmount ? ` β€” ${Math.round((p.balance / p.targetAmount) * 100)}% of $${p.targetAmount.toLocaleString()} goal` : ''
10
+ return `β€’ **${p.name}** $${p.balance.toLocaleString()}${pct}\n ${p.purpose}`
11
+ }).join('\n')
12
+ return `**Active Money Pools**\n${lines}`
13
+ } catch { return '**Money Pools**\nDatabase unreachable.' }
14
+ }
15
+
16
+ if (subcommand === 'create') {
17
+ const { name, purpose, goal } = opts
18
+ if (!name) return 'Pool name required. Use `/pool create name:my-pool`'
19
+ try {
20
+ const pool = await prisma.moneyPool.create({
21
+ data: { name, purpose: purpose || name, targetAmount: goal ?? null },
22
+ })
23
+ const goalStr = pool.targetAmount != null ? ` Goal: $${pool.targetAmount.toLocaleString()}.` : ''
24
+ return `**Pool Created**\n**${pool.name}** β€” ${pool.purpose}${goalStr}\nBalance: $0. Fund it with \`/pool fund name:${pool.name} amount:1000\``
25
+ } catch { return `Couldn't create pool "${name}". It may already exist.` }
26
+ }
27
+
28
+ if (subcommand === 'fund') {
29
+ const { name, amount } = opts
30
+ if (!name || !amount) return 'Name and amount required. Use `/pool fund name:my-pool amount:1000`'
31
+ try {
32
+ const pool = await prisma.moneyPool.findFirst({ where: { name, status: 'active' } })
33
+ if (!pool) return `Pool "${name}" not found. Use \`/pool list\` to see active pools.`
34
+ const txs = Array.isArray(pool.transactions) ? pool.transactions as any[] : []
35
+ const updated = await prisma.moneyPool.update({
36
+ where: { id: pool.id },
37
+ data: {
38
+ balance: pool.balance + Number(amount),
39
+ transactions: [...txs, { amount: Number(amount), ts: new Date().toISOString(), type: 'fund', via: 'discord' }],
40
+ },
41
+ })
42
+ const pct = updated.targetAmount ? ` (${Math.round((updated.balance / updated.targetAmount) * 100)}% of goal)` : ''
43
+ return `**Pool Funded**\n**${name}** β†’ +$${Number(amount).toLocaleString()}\nNew balance: **$${updated.balance.toLocaleString()}**${pct}`
44
+ } catch { return `Couldn't fund pool "${name}". Database error.` }
45
+ }
46
+
47
+ if (subcommand === 'close') {
48
+ const { name } = opts
49
+ if (!name) return 'Pool name required.'
50
+ try {
51
+ const pool = await prisma.moneyPool.findFirst({ where: { name, status: 'active' } })
52
+ if (!pool) return `Pool "${name}" not found or already closed.`
53
+ await prisma.moneyPool.update({ where: { id: pool.id }, data: { status: 'closed' } })
54
+ return `**Pool Closed**\n"${name}" archived. Final balance: $${pool.balance.toLocaleString()}.`
55
+ } catch { return `Couldn't close pool "${name}". Database error.` }
56
+ }
57
+
58
+ return 'Unknown pool subcommand. Use: `/pool create`, `/pool list`, `/pool fund`, `/pool close`'
59
+ }
src/commands/tier.ts ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { prisma } from '../lib/prisma'
2
+
3
+ export async function handleTier(): Promise<string> {
4
+ try {
5
+ const dealCount = await prisma.deal.count()
6
+ const vendorCount = await prisma.vendor.count({ where: { status: 'active' } })
7
+ const poCount = await prisma.purchaseOrder.count()
8
+ const poolCount = await prisma.moneyPool.count({ where: { status: 'active' } })
9
+ return `**Fundability Tier Status**
10
+ \`\`\`
11
+ Tier 0 β€” Foundation ◐ in progress
12
+ Entity formation β—‹ not confirmed
13
+ EIN registered β—‹ not confirmed
14
+ Business bank account β—‹ not confirmed
15
+
16
+ Tier 1 β€” Fundability β—‹ pending Tier 0
17
+ Google Business Profile β—‹
18
+ 411 directory listing β—‹
19
+ Website + domain email β—‹
20
+ DUNS number β—‹
21
+
22
+ Tier 2 β€” Tradelines β—‹ pending Tier 1
23
+ Net-30 accounts (need 3) β—‹
24
+ Bureau reporting (need 2) β—‹
25
+ Paydex β‰₯ 80 β—‹
26
+
27
+ Tier 3 β€” Revolving Lines β—‹ pending Tier 2
28
+ Revolving accounts (need 2) β—‹
29
+ Utilization < 30% β—‹
30
+ 12+ months in business β—‹
31
+
32
+ Tier 4 β€” Vendor Expansion β—‹ pending Tier 3
33
+ Active vendors: ${vendorCount}/5
34
+ Open POs: ${poCount}
35
+ Active pools: ${poolCount}
36
+ Open deals: ${dealCount}
37
+
38
+ Next step: /ask agent:bridge message:walk me through Tier 0
39
+ \`\`\``
40
+ } catch {
41
+ return '**Tier Status**\n```\nDatabase unreachable β€” use War Room for live status\n```'
42
+ }
43
+ }
src/index.ts ADDED
@@ -0,0 +1,128 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import express, { Request, Response } from 'express'
2
+ import { InteractionType, InteractionResponseType, verifyKey } from 'discord-interactions'
3
+ import { GuildMember } from 'discord.js'
4
+ import { handleAsk } from './commands/ask'
5
+ import { handlePool } from './commands/pool'
6
+ import { handleTier } from './commands/tier'
7
+ import { handleAgents, handleStatus, handleSeal, handleAudit, handleMerkle } from './commands/info'
8
+ import { startGateway, handleVerify } from './onboarding'
9
+
10
+ const app = express()
11
+ const PORT = parseInt(process.env.PORT ?? '3001', 10)
12
+
13
+ app.use(express.raw({ type: 'application/json' }))
14
+
15
+ // Start Discord gateway for member events + button interactions
16
+ const gatewayClient = startGateway()
17
+
18
+ app.get('/health', (_req, res) => {
19
+ res.json({
20
+ status: 'online',
21
+ agents: 11,
22
+ bot: 'snapkitty',
23
+ gateway: gatewayClient ? 'connected' : 'disabled',
24
+ })
25
+ })
26
+
27
+ app.post('/interactions', async (req: Request, res: Response) => {
28
+ const signature = req.headers['x-signature-ed25519'] as string
29
+ const timestamp = req.headers['x-signature-timestamp'] as string
30
+ const publicKey = process.env.DISCORD_PUBLIC_KEY
31
+
32
+ if (!publicKey) {
33
+ res.status(500).json({ error: 'DISCORD_PUBLIC_KEY not configured' })
34
+ return
35
+ }
36
+
37
+ const rawBody = req.body as Buffer
38
+ const isValid = await verifyKey(rawBody, signature, timestamp, publicKey)
39
+ if (!isValid) {
40
+ res.status(401).end('Invalid signature')
41
+ return
42
+ }
43
+
44
+ const body = JSON.parse(rawBody.toString())
45
+
46
+ if (body.type === InteractionType.PING) {
47
+ res.json({ type: InteractionResponseType.PONG })
48
+ return
49
+ }
50
+
51
+ if (body.type === InteractionType.APPLICATION_COMMAND) {
52
+ const { name, options = [] } = body.data
53
+ const getOpt = (key: string) => options.find((o: any) => o.name === key)?.value
54
+
55
+ let content = ''
56
+
57
+ if (name === 'ask') {
58
+ content = await handleAsk(getOpt('agent') || 'bridge', getOpt('message') || '')
59
+
60
+ } else if (name === 'pool') {
61
+ const sub = options[0]
62
+ const subOpts: Record<string, any> = {}
63
+ for (const o of sub?.options ?? []) subOpts[o.name] = o.value
64
+ content = await handlePool(sub?.name || '', subOpts)
65
+
66
+ } else if (name === 'verify') {
67
+ const githubUsername = getOpt('github-username') || ''
68
+ if (!githubUsername) {
69
+ content = 'GitHub username required. Use `/verify github-username:YourHandle`'
70
+ } else if (!gatewayClient) {
71
+ content = 'Gateway not connected β€” bot token required for role assignment.'
72
+ } else {
73
+ const guild = gatewayClient.guilds.cache.first()
74
+ const member = guild ? await guild.members.fetch(body.member?.user?.id).catch(() => null) : null
75
+ if (!member) {
76
+ content = 'Could not find your server membership. Try again in a moment.'
77
+ } else {
78
+ content = await handleVerify(
79
+ body.member.user.id,
80
+ `${body.member.user.username}#${body.member.user.discriminator}`,
81
+ githubUsername,
82
+ member as GuildMember
83
+ )
84
+ }
85
+ }
86
+
87
+ } else if (name === 'community') {
88
+ content = await handleCommunity()
89
+
90
+ } else if (name === 'tier') { content = await handleTier()
91
+ } else if (name === 'agents') { content = await handleAgents()
92
+ } else if (name === 'status') { content = await handleStatus()
93
+ } else if (name === 'seal') { content = await handleSeal()
94
+ } else if (name === 'audit') { content = await handleAudit()
95
+ } else if (name === 'merkle') { content = await handleMerkle()
96
+ } else { content = `Unknown command: ${name}. Try \`/agents\` for the full directory.` }
97
+
98
+ if (content.length > 1990) content = content.slice(0, 1987) + '…'
99
+
100
+ res.json({
101
+ type: InteractionResponseType.CHANNEL_MESSAGE_WITH_SOURCE,
102
+ data: { content },
103
+ })
104
+ return
105
+ }
106
+
107
+ res.status(400).json({ error: 'Unknown interaction type' })
108
+ })
109
+
110
+ async function handleCommunity(): Promise<string> {
111
+ const base = process.env.SNAPKITTY_API_URL ?? 'http://localhost:3000'
112
+ try {
113
+ const res = await fetch(`${base}/api/community/members`)
114
+ const data = await res.json() as { total: number; verified: number; roles: Record<string, number> }
115
+ const roleLines = Object.entries(data.roles)
116
+ .map(([role, count]) => ` ${role.padEnd(22)} ${count}`)
117
+ .join('\n')
118
+ return `**SnapKitty Community**\n\`\`\`\nTotal members: ${data.total}\nVerified devs: ${data.verified}\n\nBy role:\n${roleLines}\n\nJoin: discord.gg/dugymT3rj\n\`\`\``
119
+ } catch {
120
+ return '**SnapKitty Community**\n```\nCommunity hub at collectivekitty.com/community\nJoin: discord.gg/dugymT3rj\n```'
121
+ }
122
+ }
123
+
124
+ app.listen(PORT, () => {
125
+ console.log(`SnapKitty Bot online β€” port ${PORT}`)
126
+ console.log(`Interactions: POST http://localhost:${PORT}/interactions`)
127
+ console.log(`Health: GET http://localhost:${PORT}/health`)
128
+ })
src/lib/agents.ts ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const AGENT_NAMES: Record<string, string> = {
2
+ bridge: 'RELAY',
3
+ finance: 'AXIOM',
4
+ treasury: 'VAULT',
5
+ crm: 'NEXUS',
6
+ procurement: 'FORGE',
7
+ bifrost: 'HERALD',
8
+ ml: 'TENSOR',
9
+ risk: 'SENTINEL',
10
+ auditor: 'LEDGE',
11
+ operator: 'ATLAS',
12
+ scriptwriter: 'QUILL',
13
+ }
14
+
15
+ export function agentName(key: string): string {
16
+ return AGENT_NAMES[key] ?? key.toUpperCase()
17
+ }
18
+
19
+ export async function askAgent(agent: string, message: string): Promise<string> {
20
+ const base = process.env.SNAPKITTY_API_URL ?? 'http://localhost:3000'
21
+ try {
22
+ const res = await fetch(`${base}/api/agents/chat`, {
23
+ method: 'POST',
24
+ headers: { 'Content-Type': 'application/json' },
25
+ body: JSON.stringify({ agent, message }),
26
+ signal: AbortSignal.timeout(35000),
27
+ })
28
+ if (!res.ok) return `Agent ${agentName(agent)} returned an error. Try the War Room.`
29
+ const data = await res.json() as { reply?: string }
30
+ return data.reply ?? 'No response.'
31
+ } catch {
32
+ return `${agentName(agent)} is not responding. Try the War Room at collectivekitty.com`
33
+ }
34
+ }
src/lib/prisma.ts ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ import { PrismaClient } from '@prisma/client'
2
+
3
+ const globalForPrisma = global as unknown as { prisma: PrismaClient }
4
+
5
+ export const prisma =
6
+ globalForPrisma.prisma ??
7
+ new PrismaClient({ log: ['error'] })
8
+
9
+ if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma
src/onboarding.ts ADDED
@@ -0,0 +1,233 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import {
2
+ Client, GatewayIntentBits, Partials,
3
+ EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle,
4
+ Events, GuildMember, ButtonInteraction,
5
+ } from 'discord.js'
6
+ import { prisma } from './lib/prisma'
7
+
8
+ // ── Role names β€” create these in your Discord server ─────────────────────────
9
+ export const ROLES = {
10
+ SOVEREIGN: 'Sovereign',
11
+ CONTRIBUTOR: 'Verified Contributor',
12
+ DEVELOPER: 'Developer',
13
+ BUILDER: 'Builder',
14
+ UK_BUILDER: 'UK Builder',
15
+ CYPHERPUNK: 'Cypherpunk Guild',
16
+ OBSERVER: 'Observer',
17
+ }
18
+
19
+ // ── GitHub contributor check ──────────────────────────────────────────────────
20
+ async function isRepoContributor(githubUsername: string): Promise<boolean> {
21
+ try {
22
+ const res = await fetch(
23
+ `https://api.github.com/repos/SNAPKITTYWEST/DEVFLOW-FINANCE/contributors?per_page=100`,
24
+ { headers: { 'User-Agent': 'snapkitty-bot', ...(process.env.GITHUB_TOKEN ? { Authorization: `token ${process.env.GITHUB_TOKEN}` } : {}) } }
25
+ )
26
+ if (!res.ok) return false
27
+ const contributors = await res.json() as Array<{ login: string }>
28
+ return contributors.some(c => c.login.toLowerCase() === githubUsername.toLowerCase())
29
+ } catch { return false }
30
+ }
31
+
32
+ // ── Write member to DB ────────────────────────────────────────────────────────
33
+ async function upsertCommunityMember(data: {
34
+ discordId: string
35
+ discordTag: string
36
+ role: string
37
+ githubUsername?: string
38
+ verified?: boolean
39
+ }) {
40
+ try {
41
+ await prisma.communityMember.upsert({
42
+ where: { discordId: data.discordId },
43
+ update: { role: data.role, githubUsername: data.githubUsername, verified: data.verified ?? false, updatedAt: new Date() },
44
+ create: {
45
+ discordId: data.discordId,
46
+ discordTag: data.discordTag,
47
+ role: data.role,
48
+ githubUsername: data.githubUsername,
49
+ verified: data.verified ?? false,
50
+ },
51
+ })
52
+ } catch (e) { console.error('DB write failed:', e) }
53
+ }
54
+
55
+ // ── Welcome embed + role buttons ─────────────────────────────────────────────
56
+ function buildWelcomeEmbed(member: GuildMember) {
57
+ return new EmbedBuilder()
58
+ .setColor(0x6d28d9)
59
+ .setTitle('Saint Errant Β· Sovereign Digital Society')
60
+ .setDescription(
61
+ `**${member.user.username}** β€” you have been granted entry.\n\n` +
62
+ `This is not a server. This is a sovereign digital society.\n` +
63
+ `SnapKitty is the operating system. The agents are the mind.\n` +
64
+ `The chain is the record. The fortress does not sleep.\n\n` +
65
+ `**Declare your guild to receive your clearance:**`
66
+ )
67
+ .addFields(
68
+ { name: '⚑ Developer', value: 'Building on the sovereign codebase', inline: true },
69
+ { name: 'πŸ”¨ Builder', value: 'Working in the broader ecosystem', inline: true },
70
+ { name: 'πŸ” Cypherpunk', value: 'Security, cryptography, zero-trust ops', inline: true },
71
+ { name: 'πŸ‡¬πŸ‡§ UK Builder', value: 'UK Treasury Social Nest member', inline: true },
72
+ { name: 'πŸ‘ Observer', value: 'Witness to the machine', inline: true },
73
+ )
74
+ .setFooter({ text: 'Saint Errant Β· Sovereign Digital Society β€” built in the open, proven in chain' })
75
+ }
76
+
77
+ function buildRoleButtons() {
78
+ const row1 = new ActionRowBuilder<ButtonBuilder>().addComponents(
79
+ new ButtonBuilder().setCustomId('role_developer').setLabel('⚑ Developer').setStyle(ButtonStyle.Primary),
80
+ new ButtonBuilder().setCustomId('role_builder').setLabel('πŸ”¨ Builder').setStyle(ButtonStyle.Secondary),
81
+ new ButtonBuilder().setCustomId('role_cypherpunk').setLabel('πŸ” Cypherpunk').setStyle(ButtonStyle.Danger),
82
+ )
83
+ const row2 = new ActionRowBuilder<ButtonBuilder>().addComponents(
84
+ new ButtonBuilder().setCustomId('role_uk').setLabel('πŸ‡¬πŸ‡§ UK Builder').setStyle(ButtonStyle.Secondary),
85
+ new ButtonBuilder().setCustomId('role_observer').setLabel('πŸ‘ Observer').setStyle(ButtonStyle.Secondary),
86
+ )
87
+ return [row1, row2]
88
+ }
89
+
90
+ // ── Assign role helper ────────────────────────────────────────────────────────
91
+ async function assignRole(member: GuildMember, roleName: string): Promise<boolean> {
92
+ try {
93
+ const role = member.guild.roles.cache.find(r => r.name === roleName)
94
+ if (!role) { console.warn(`Role "${roleName}" not found in server`); return false }
95
+ await member.roles.add(role)
96
+ return true
97
+ } catch (e) { console.error('Role assign failed:', e); return false }
98
+ }
99
+
100
+ // ── Gateway client ────────────────────────────────────────────────────────────
101
+ export function startGateway() {
102
+ const token = process.env.DISCORD_BOT_TOKEN
103
+ if (!token) { console.warn('DISCORD_BOT_TOKEN not set β€” gateway disabled'); return }
104
+
105
+ const client = new Client({
106
+ intents: [
107
+ GatewayIntentBits.Guilds,
108
+ GatewayIntentBits.GuildMembers,
109
+ GatewayIntentBits.GuildMessages,
110
+ GatewayIntentBits.MessageContent,
111
+ GatewayIntentBits.DirectMessages,
112
+ ],
113
+ partials: [Partials.Channel, Partials.Message],
114
+ })
115
+
116
+ // ── New member joins ───────────────────────────────────────────────────────
117
+ client.on(Events.GuildMemberAdd, async (member) => {
118
+ console.log(`New member: ${member.user.tag}`)
119
+
120
+ const welcomeChannel = member.guild.channels.cache.find(
121
+ ch => ch.name === 'welcome' || ch.name === 'general'
122
+ )
123
+
124
+ if (welcomeChannel?.isTextBased()) {
125
+ await welcomeChannel.send({
126
+ content: `<@${member.id}>`,
127
+ embeds: [buildWelcomeEmbed(member)],
128
+ components: buildRoleButtons(),
129
+ })
130
+ }
131
+
132
+ // Also DM the member
133
+ try {
134
+ await member.send({
135
+ embeds: [buildWelcomeEmbed(member)],
136
+ components: buildRoleButtons(),
137
+ })
138
+ } catch { /* DMs may be closed */ }
139
+ })
140
+
141
+ // ── Button interactions ────────────────────────────────────────────────────
142
+ client.on(Events.InteractionCreate, async (interaction) => {
143
+ if (!interaction.isButton()) return
144
+ const btn = interaction as ButtonInteraction
145
+ const member = btn.member as GuildMember
146
+
147
+ if (btn.customId === 'role_developer') {
148
+ await assignRole(member, ROLES.DEVELOPER)
149
+ await upsertCommunityMember({ discordId: member.id, discordTag: member.user.tag, role: 'developer' })
150
+ await btn.reply({
151
+ content: `**Developer role assigned.**\n\nNow run \`/verify github-username:YourGitHubHandle\` to verify your contributions to DEVFLOW-FINANCE and unlock **Verified Contributor** status.`,
152
+ ephemeral: true,
153
+ })
154
+ }
155
+
156
+ else if (btn.customId === 'role_builder') {
157
+ await assignRole(member, ROLES.BUILDER)
158
+ await upsertCommunityMember({ discordId: member.id, discordTag: member.user.tag, role: 'builder' })
159
+ await btn.reply({
160
+ content: `**Builder role assigned.** Welcome to the ecosystem.\n\nCheck out the War Room at https://collectivekitty.com and use \`/ask\` to talk to any of the 11 agents.`,
161
+ ephemeral: true,
162
+ })
163
+ }
164
+
165
+ else if (btn.customId === 'role_uk') {
166
+ await assignRole(member, ROLES.UK_BUILDER)
167
+ await upsertCommunityMember({ discordId: member.id, discordTag: member.user.tag, role: 'uk_builder' })
168
+ await btn.reply({
169
+ content: `**UK Builder role assigned.**\n\nYou're now part of the UK Treasury Social Nest. Use \`/ask agent:sterling message:walk me through UK Tier 0\` to get started with the UK business credit system.`,
170
+ ephemeral: true,
171
+ })
172
+ }
173
+
174
+ else if (btn.customId === 'role_cypherpunk') {
175
+ await assignRole(member, ROLES.CYPHERPUNK)
176
+ await upsertCommunityMember({ discordId: member.id, discordTag: member.user.tag, role: 'cypherpunk' })
177
+ await btn.reply({
178
+ content: `**Cypherpunk Guild β€” clearance granted.**\n\n` +
179
+ `The fortress runs SHA-256 sealed decisions, WORM immutable ledger, Ed25519 signature verification on every interaction, and a three-pillar preflight that kills unsigned payloads before they're processed.\n\n` +
180
+ `Use \`/ask agent:sentinel message:show me the threat model\` to start.\n` +
181
+ `The chain is at https://github.com/SNAPKITTYWEST/DEVFLOW-FINANCE`,
182
+ ephemeral: true,
183
+ })
184
+ }
185
+
186
+ else if (btn.customId === 'role_observer') {
187
+ await assignRole(member, ROLES.OBSERVER)
188
+ await upsertCommunityMember({ discordId: member.id, discordTag: member.user.tag, role: 'observer' })
189
+ await btn.reply({
190
+ content: `**Observer clearance granted.**\n\nWitness the machine at https://collectivekitty.com\nThe chain: https://github.com/SNAPKITTYWEST/DEVFLOW-FINANCE`,
191
+ ephemeral: true,
192
+ })
193
+ }
194
+ })
195
+
196
+ client.once(Events.ClientReady, (c) => {
197
+ console.log(`Gateway online β€” logged in as ${c.user.tag}`)
198
+ console.log(`Watching ${c.guilds.cache.size} server(s)`)
199
+ })
200
+
201
+ client.login(token)
202
+ return client
203
+ }
204
+
205
+ // ── GitHub verification slash handler (called from index.ts) ──────────────────
206
+ export async function handleVerify(
207
+ discordId: string,
208
+ discordTag: string,
209
+ githubUsername: string,
210
+ member: GuildMember
211
+ ): Promise<string> {
212
+ const isContributor = await isRepoContributor(githubUsername)
213
+
214
+ if (isContributor) {
215
+ await assignRole(member, ROLES.CONTRIBUTOR)
216
+ await upsertCommunityMember({
217
+ discordId, discordTag,
218
+ role: 'verified_contributor',
219
+ githubUsername,
220
+ verified: true,
221
+ })
222
+ return `**Verified.** @${githubUsername} is a contributor to DEVFLOW-FINANCE.\n**Verified Contributor** role assigned. Welcome to the core.`
223
+ } else {
224
+ await assignRole(member, ROLES.DEVELOPER)
225
+ await upsertCommunityMember({
226
+ discordId, discordTag,
227
+ role: 'developer',
228
+ githubUsername,
229
+ verified: false,
230
+ })
231
+ return `**@${githubUsername}** β€” not yet a contributor to DEVFLOW-FINANCE.\n**Developer** role assigned. Make your first PR at https://github.com/SNAPKITTYWEST/DEVFLOW-FINANCE and run \`/verify\` again to unlock Verified Contributor.`
232
+ }
233
+ }
src/register.ts ADDED
@@ -0,0 +1,80 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Run once to register all slash commands with Discord:
2
+ // npx ts-node src/register.ts
3
+
4
+ const STRING = 3
5
+ const NUMBER = 10
6
+ const SUB_COMMAND = 1
7
+
8
+ const AGENT_CHOICES = [
9
+ { name: 'RELAY β€” your plain-English guide', value: 'bridge' },
10
+ { name: 'AXIOM β€” finance & money pools', value: 'finance' },
11
+ { name: 'VAULT β€” treasury & approvals', value: 'treasury' },
12
+ { name: 'NEXUS β€” deals & CRM pipeline', value: 'crm' },
13
+ { name: 'FORGE β€” vendors & procurement', value: 'procurement' },
14
+ { name: 'HERALD β€” event infrastructure', value: 'bifrost' },
15
+ { name: 'TENSOR β€” anomaly detection & ML', value: 'ml' },
16
+ { name: 'SENTINEL β€” risk & compliance', value: 'risk' },
17
+ { name: 'LEDGE β€” audit & permanent record', value: 'auditor' },
18
+ { name: 'ATLAS β€” system ops & tier gating', value: 'operator' },
19
+ { name: 'QUILL β€” content & narrative engine', value: 'scriptwriter' },
20
+ ]
21
+
22
+ const COMMANDS = [
23
+ {
24
+ name: 'ask',
25
+ description: 'Ask any of the 11 SnapKitty agents a question from Discord',
26
+ options: [
27
+ { name: 'agent', description: 'Which agent to route to', type: STRING, required: true, choices: AGENT_CHOICES },
28
+ { name: 'message', description: 'Your question', type: STRING, required: true },
29
+ ],
30
+ },
31
+ {
32
+ name: 'pool',
33
+ description: 'Money pool management β€” create, fund, and track capital pools',
34
+ options: [
35
+ { name: 'create', description: 'Create a new money pool', type: SUB_COMMAND,
36
+ options: [
37
+ { name: 'name', description: 'Pool name', type: STRING, required: true },
38
+ { name: 'purpose', description: 'What it is for', type: STRING, required: false },
39
+ { name: 'goal', description: 'Target USD amount', type: NUMBER, required: false },
40
+ ] },
41
+ { name: 'list', description: 'List all active pools', type: SUB_COMMAND },
42
+ { name: 'fund', description: 'Add funds to a pool', type: SUB_COMMAND,
43
+ options: [
44
+ { name: 'name', description: 'Pool name', type: STRING, required: true },
45
+ { name: 'amount', description: 'Amount to add', type: NUMBER, required: true },
46
+ ] },
47
+ { name: 'close', description: 'Close a pool', type: SUB_COMMAND,
48
+ options: [{ name: 'name', description: 'Pool name', type: STRING, required: true }] },
49
+ ],
50
+ },
51
+ { name: 'tier', description: 'Current fundability tier status and blockers' },
52
+ { name: 'agents', description: 'Plain-English directory of all 11 SnapKitty agents' },
53
+ { name: 'status', description: 'System health β€” Bifrost, database, infrastructure' },
54
+ { name: 'seal', description: 'Last decision seal β€” event type, risk, timestamp' },
55
+ { name: 'audit', description: 'Audit trail β€” last 5 Bifrost events with risk scores' },
56
+ { name: 'merkle', description: 'Merkle root and WORM chain entry count' },
57
+ ]
58
+
59
+ async function register() {
60
+ const { DISCORD_BOT_TOKEN, DISCORD_APP_ID } = process.env
61
+ if (!DISCORD_BOT_TOKEN || !DISCORD_APP_ID) {
62
+ console.error('Missing DISCORD_BOT_TOKEN or DISCORD_APP_ID in environment')
63
+ process.exit(1)
64
+ }
65
+
66
+ const url = `https://discord.com/api/v10/applications/${DISCORD_APP_ID}/commands`
67
+ const res = await fetch(url, {
68
+ method: 'PUT',
69
+ headers: { Authorization: `Bot ${DISCORD_BOT_TOKEN}`, 'Content-Type': 'application/json' },
70
+ body: JSON.stringify(COMMANDS),
71
+ })
72
+
73
+ const data = await res.json() as any[]
74
+ if (!res.ok) { console.error('Discord error:', data); process.exit(1) }
75
+
76
+ console.log(`Registered ${data.length} commands:`)
77
+ data.forEach((c: any) => console.log(` /${c.name}`))
78
+ }
79
+
80
+ register().catch(console.error)
tsconfig.json ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2020",
4
+ "module": "commonjs",
5
+ "lib": ["ES2020", "DOM"],
6
+ "types": ["node"],
7
+ "outDir": "dist",
8
+ "rootDir": "src",
9
+ "strict": true,
10
+ "esModuleInterop": true,
11
+ "skipLibCheck": true,
12
+ "resolveJsonModule": true
13
+ },
14
+ "include": ["src"],
15
+ "exclude": ["node_modules", "dist"]
16
+ }