@seedcord/services 0.4.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -0
- package/dist/index.cjs +1 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -4
- package/dist/index.d.ts +2 -4
- package/dist/index.mjs +1 -3
- package/dist/index.mjs.map +1 -1
- package/package.json +13 -9
package/README.md
CHANGED
|
@@ -3,3 +3,11 @@
|
|
|
3
3
|
</p>
|
|
4
4
|
|
|
5
5
|
---
|
|
6
|
+
|
|
7
|
+
_This repository is a work in progress._
|
|
8
|
+
|
|
9
|
+
- There are no stable releases yet but changes are being made actively.
|
|
10
|
+
- Till a major v1.0.0 release for seedcord, expect breaking changes in minor versions.
|
|
11
|
+
- Documentation will come soon as well!
|
|
12
|
+
|
|
13
|
+
I'm planning to release the first major version by the end of 2025, or Jan 2026. But till then, if you'd like to try using it, you can check out the code in `packages/mock`
|
package/dist/index.cjs
CHANGED
|
@@ -319,8 +319,7 @@ var SeedcordErrorCode = /* @__PURE__ */ (function(SeedcordErrorCode2) {
|
|
|
319
319
|
SeedcordErrorCode2[SeedcordErrorCode2["CoreSingletonViolation"] = 1201] = "CoreSingletonViolation";
|
|
320
320
|
SeedcordErrorCode2[SeedcordErrorCode2["CorePluginAfterInit"] = 1202] = "CorePluginAfterInit";
|
|
321
321
|
SeedcordErrorCode2[SeedcordErrorCode2["CorePluginKeyExists"] = 1203] = "CorePluginKeyExists";
|
|
322
|
-
SeedcordErrorCode2[SeedcordErrorCode2["
|
|
323
|
-
SeedcordErrorCode2[SeedcordErrorCode2["CoreBotRoleMissing"] = 1205] = "CoreBotRoleMissing";
|
|
322
|
+
SeedcordErrorCode2[SeedcordErrorCode2["CoreBotRoleMissing"] = 1204] = "CoreBotRoleMissing";
|
|
324
323
|
SeedcordErrorCode2[SeedcordErrorCode2["DecoratorInteractionEventFilter"] = 1301] = "DecoratorInteractionEventFilter";
|
|
325
324
|
SeedcordErrorCode2[SeedcordErrorCode2["DecoratorMethodNotFound"] = 1302] = "DecoratorMethodNotFound";
|
|
326
325
|
SeedcordErrorCode2[SeedcordErrorCode2["DecoratorCommandAlreadyRegistered"] = 1303] = "DecoratorCommandAlreadyRegistered";
|
|
@@ -358,7 +357,6 @@ var messages = {
|
|
|
358
357
|
[SeedcordErrorCode.CoreSingletonViolation]: () => "Seedcord can only be instantiated once. Use the existing instance instead.",
|
|
359
358
|
[SeedcordErrorCode.CorePluginAfterInit]: () => "Cannot attach a plugin after initialization.",
|
|
360
359
|
[SeedcordErrorCode.CorePluginKeyExists]: (key) => `Plugin with key "${key}" already exists.`,
|
|
361
|
-
[SeedcordErrorCode.CoreClientUserUnavailable]: () => "Client user is not available.",
|
|
362
360
|
[SeedcordErrorCode.CoreBotRoleMissing]: (guildId) => guildId ? `Bot role not found in guild ${guildId}.` : "Bot role not found in guild.",
|
|
363
361
|
[SeedcordErrorCode.DecoratorInteractionEventFilter]: () => "Interaction middleware cannot specify event filters.",
|
|
364
362
|
[SeedcordErrorCode.DecoratorMethodNotFound]: () => "Decorator could not locate the original method. Ensure the method exists before applying the decorator.",
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/Logger.ts","../src/CooldownManager.ts","../src/Errors/ErrorCodes.ts","../src/Errors/ErrorMessages.ts","../src/Errors/SeedcordError.ts","../src/Lifecycle/CoordinatedLifecycle.ts","../src/Lifecycle/CoordinatedShutdown.ts","../src/HealthCheck.ts","../src/StrictEventEmitter.ts","../src/Lifecycle/CoordinatedStartup.ts"],"names":["Logger","instances","Map","instance","prefix","get","set","transportName","consoleTransport","createConsoleTransport","initializeLogger","getFormatCustomizations","padding","format","errors","stack","splat","colorize","level","timestamp","printf","info","ts","String","lvl","padEnd","lbl","label","msg","message","base","splatSym","Symbol","for","raw","extras","Array","isArray","cleaned","filter","x","Error","Object","keys","length","rendered","parts","push","JSON","stringify","join","transports","Console","combine","Envapter","isDevelopment","isStaging","transportsArray","maxSizeInMB","File","filename","uncolorize","json","bigint","space","maxsize","maxFiles","tailable","logger","createLogger","error","args","warn","http","verbose","debug","silly","Info","Warn","Debug","Silly","CooldownManager","window","Err","map","opts","cooldown","err","key","Date","now","check","last","remaining","undefined","isActive","clear","delete","SeedcordErrorCode","messages","ConfigMissingDiscordToken","ConfigUnknownExceptionWebhookMissing","ConfigUnknownExceptionWebhookInvalid","LifecycleAddAfterCompletion","LifecycleAddDuringRun","LifecycleRemoveDuringRun","LifecycleUnknownPhase","phase","LifecyclePhaseFailures","failures","LifecycleTaskTimeout","taskName","timeout","CoreSingletonViolation","CorePluginAfterInit","CorePluginKeyExists","CoreClientUserUnavailable","CoreBotRoleMissing","guildId","DecoratorInteractionEventFilter","DecoratorMethodNotFound","DecoratorCommandAlreadyRegistered","commandName","existingScope","requestedScope","DecoratorCommandGlobalWithGuilds","DecoratorCommandGuildWithoutGuilds","DecoratorInvalidMiddlewarePriority","UtilHexInputType","UtilHexInvalid","UtilInvalidSlashRouteArgument","PluginMongoServiceDecoratorMissing","className","PluginMongoModelDecoratorMissing","PluginMongoConnectionFailed","databaseName","PluginKpgServiceDecoratorMissing","PluginKpgServiceTableMissing","PluginKpgInvalidStepCount","PluginKpgUnknownDirection","direction","PluginKpgUnresolvedMigrationsPath","PluginKpgNoMigrationFiles","PluginKpgInvalidMigrationModule","filePath","PluginKpgNonErrorFailure","formatSeedcordErrorMessage","code","formatter","resolvedArgs","resolveIdentifier","resolveMessage","formatErrorName","name","_identifier","chalk","bold","red","gray","SeedcordError","identifier","options","setPrototypeOf","prototype","captureStackTrace","SeedcordTypeError","TypeError","SeedcordRangeError","RangeError","SeedcordErrors","isSeedcordError","CoordinatedLifecycle","events","EventEmitter","tasksMap","loggerName","phaseOrder","phaseEnum","forEach","addTask","task","timeoutMs","canAddTask","tasks","italic","getTaskType","cyan","magenta","removeTask","canRemoveTask","initialLength","filteredTasks","removed","runPhase","yellow","emit","results","executeTasksInPhase","r","status","green","runTaskWithTimeout","Promise","race","_","reject","setTimeout","on","event","listener","off","ShutdownPhase","PHASE_ORDER","LOG_FLUSH_DELAY_MS","CoordinatedShutdown","isShuttingDown","exitCode","registerSignalHandlers","isShutdownEnabled","resolve","then","value","reason","process","run","exit","fallback","HTTP_OK","HTTP_NOT_FOUND","HealthCheck","server","shutdown","StopServices","stop","init","createServer","req","res","method","url","path","writeHead","end","once","address","host","port","listen","close","StrictEventEmitter","addListener","removeListener","listeners","listenerCountTyped","listenerCount","eventNamesTyped","eventNames","waitFor","onEvent","cleanup","onAbort","assign","timeoutId","signal","removeEventListener","aborted","addEventListener","StartupPhase","CoordinatedStartup","isStartingUp","hasStarted","isReady","isRunning"],"mappings":";;;;;;;;;;;;;;AAeO,IAAMA,MAAAA,GAAN,MAAMA,OAAAA,CAAAA;EAfb;;;EAiBI,OAAwBC,SAAAA,uBAAgBC,GAAAA,EAAAA;AAExC,EAAA,OAAeC,SAASC,MAAAA,EAAwB;AAC5C,IAAA,IAAID,QAAAA,GAAW,IAAA,CAAKF,SAAAA,CAAUI,GAAAA,CAAID,MAAAA,CAAAA;AAClC,IAAA,IAAI,CAACD,QAAAA,EAAU;AACXA,MAAAA,QAAAA,GAAW,IAAIH,QAAOI,MAAAA,CAAAA;AACtB,MAAA,IAAA,CAAKH,SAAAA,CAAUK,GAAAA,CAAIF,MAAAA,EAAQD,QAAAA,CAAAA;AAC/B,IAAA;AACA,IAAA,OAAOA,QAAAA;AACX,EAAA;AAEA,EAAA,WAAA,CAAYI,aAAAA,EAAuB;AAC/B,IAAA,MAAMC,gBAAAA,GAAmB,IAAA,CAAKC,sBAAAA,CAAuBF,aAAAA,CAAAA;AACrD,IAAA,IAAA,CAAKG,iBAAiBF,gBAAAA,CAAAA;AAC1B,EAAA;EAEQG,uBAAAA,GAA4C;AAChD,IAAA,MAAMC,OAAAA,GAAU,CAAA;AAChB,IAAA,OAAO;AACHC,MAAAA,cAAAA,CAAOC,MAAAA,CAAO;QAAEC,KAAAA,EAAO;OAAK,CAAA;AAC5BF,MAAAA,cAAAA,CAAOG,KAAAA,EAAK;AACZH,MAAAA,cAAAA,CAAOI,QAAAA,CAAS;QAAEC,KAAAA,EAAO;OAAK,CAAA;AAC9BL,MAAAA,cAAAA,CAAOM,SAAAA,CAAU;QAAEN,MAAAA,EAAQ;OAAoB,CAAA;MAC/CA,cAAAA,CAAOO,MAAAA,CAAO,CAACC,IAAAA,KAAAA;AACX,QAAA,MAAMC,EAAAA,GAAKC,MAAAA,CAAOF,IAAAA,CAAKF,SAAAA,IAAa,EAAA,CAAA;AACpC,QAAA,MAAMK,MAAMD,MAAAA,CAAOF,IAAAA,CAAKH,KAAK,CAAA,CAAEO,OAAOb,OAAAA,CAAAA;AACtC,QAAA,MAAMc,GAAAA,GAAMH,MAAAA,CAAOF,IAAAA,CAAKM,KAAAA,IAAS,EAAA,CAAA;AACjC,QAAA,MAAMC,GAAAA,GAAML,MAAAA,CAAOF,IAAAA,CAAKQ,OAAAA,IAAW,EAAA,CAAA;AAEnC,QAAA,MAAMC,IAAAA,GAAO,GAAGR,EAAAA,CAAAA,EAAAA,EAAOE,GAAAA,CAAAA,GAAAA,EAASE,GAAAA,MAASE,GAAAA,CAAAA,CAAAA;AAEzC,QAAA,MAAMG,QAAAA,GAAWC,MAAAA,CAAOC,GAAAA,CAAI,OAAA,CAAA;AAC5B,QAAA,MAAMC,GAAAA,GAAOb,KAAqDU,QAAAA,CAAAA;AAClE,QAAA,MAAMI,SAASC,KAAAA,CAAMC,OAAAA,CAAQH,GAAAA,CAAAA,GAAOA,MAAM,EAAA;AAE1C,QAAA,MAAMI,OAAAA,GAAUH,MAAAA,CACXI,MAAAA,CAAO,CAACC,CAAAA,KAAM,EAAEA,CAAAA,YAAaC,KAAAA,CAAI,CAAA,CACjCF,MAAAA,CAAO,CAACC,CAAAA,KAAAA;AACL,UAAA,IAAI,CAACA,GAAG,OAAO,KAAA;AACf,UAAA,IAAI,OAAOA,CAAAA,KAAM,QAAA,EAAU,OAAO,IAAA;AAClC,UAAA,OAAOE,MAAAA,CAAOC,IAAAA,CAAKH,CAAAA,CAAAA,CAAaI,MAAAA,GAAS,CAAA;QAC7C,CAAA,CAAA;AAEJ,QAAA,IAAIC,QAAAA,GAAWf,IAAAA;AAEf,QAAA,IAAI,OAAOT,IAAAA,CAAKN,KAAAA,KAAU,QAAA,EAAU;AAChC8B,UAAAA,QAAAA,IAAY;EAAKtB,MAAAA,CAAOF,IAAAA,CAAKN,KAAK,CAAA,CAAA,CAAA;AACtC,QAAA;AAEA,QAAA,IAAIuB,QAAQM,MAAAA,EAAQ;AAChB,UAAA,MAAME,QAAkB,EAAA;AACxB,UAAA,KAAA,MAAWN,KAAKF,OAAAA,EAAS;AACrB,YAAA,IAAI,OAAOE,CAAAA,KAAM,QAAA,EAAUM,KAAAA,CAAMC,KAAKP,CAAAA,CAAAA;AACjC,iBAAA;AACD,cAAA,IAAI;AACAM,gBAAAA,KAAAA,CAAMC,KAAKC,IAAAA,CAAKC,SAAAA,CAAUT,CAAAA,EAAG,IAAA,EAAM,CAAA,CAAA,CAAA;cACvC,CAAA,CAAA,MAAQ;AACJM,gBAAAA,KAAAA,CAAMC,IAAAA,CAAKxB,MAAAA,CAAOiB,CAAAA,CAAAA,CAAAA;AACtB,cAAA;AACJ,YAAA;AACJ,UAAA;AACAK,UAAAA,QAAAA,IAAY;EAAKC,KAAAA,CAAMI,IAAAA,CAAK,GAAA,CAAA,CAAA,CAAA;AAChC,QAAA;AAEA,QAAA,OAAOL,QAAAA;MACX,CAAA;;AAER,EAAA;AAEQpC,EAAAA,sBAAAA,CAAuBF,aAAAA,EAAiD;AAC5E,IAAA,OAAO,IAAI4C,mBAAWC,OAAAA,CAAQ;MAC1BvC,MAAAA,EAAQA,cAAAA,CAAOwC,OAAAA,CAAQxC,cAAAA,CAAOc,KAAAA,CAAM;QAAEA,KAAAA,EAAOpB;AAAc,OAAA,CAAA,EAAA,GAAO,IAAA,CAAKI,uBAAAA,EAAuB,CAAA;AAC9FO,MAAAA,KAAAA,EAAOoC,eAAAA,CAASC,aAAAA,GAAgB,OAAA,GAAUD,eAAAA,CAASE,YAAY,OAAA,GAAU;KAC7E,CAAA;AACJ,EAAA;AAEQ9C,EAAAA,gBAAAA,CAAiBF,gBAAAA,EAA6D;AAElF,IAAA,MAAMiD,eAAAA,GAAyB;AAACjD,MAAAA;;AAGhC,IAAA,IAAI8C,gBAASC,aAAAA,EAAe;AACxB,MAAA,MAAMG,WAAAA,GAAc,EAAA;AACpBD,MAAAA,eAAAA,CAAgBV,IAAAA,CACZ,IAAII,kBAAAA,CAAWQ,IAAAA,CAAK;QAChBC,QAAAA,EAAU,sBAAA;QACV1C,KAAAA,EAAO,OAAA;AACPL,QAAAA,MAAAA,EAAQA,eAAOwC,OAAAA,CACXxC,cAAAA,CAAOgD,UAAAA,EAAU,EACjBhD,eAAOC,MAAAA,CAAO;UAAEC,KAAAA,EAAO;AAAK,SAAA,CAAA,EAC5BF,cAAAA,CAAOM,SAAAA,EAAS,EAChBN,eAAOiD,IAAAA,CAAK;UAAEC,MAAAA,EAAQ,IAAA;UAAMC,KAAAA,EAAO;AAAE,SAAA,CAAA,CAAA;AAEzCC,QAAAA,OAAAA,EAASP,cAAc,IAAA,GAAO,IAAA;QAC9BQ,QAAAA,EAAU,CAAA;QACVC,QAAAA,EAAU;AACd,OAAA,CAAA,CAAA;AAER,IAAA;AAEA,IAAA,IAAA,CAAKC,SAASC,oBAAAA,CAAa;MACvBlB,UAAAA,EAAYM;KAChB,CAAA;AACJ,EAAA;;;;;;;AAQOa,EAAAA,KAAAA,CAAM1C,QAAgB2C,IAAAA,EAAuB;AAChD,IAAA,IAAA,CAAKH,MAAAA,CAAOE,KAAAA,CAAM1C,GAAAA,EAAAA,GAAQ2C,IAAAA,CAAAA;AAC9B,EAAA;;;;;;;AAQOC,EAAAA,IAAAA,CAAK5C,QAAgB2C,IAAAA,EAAuB;AAC/C,IAAA,IAAA,CAAKH,MAAAA,CAAOI,IAAAA,CAAK5C,GAAAA,EAAAA,GAAQ2C,IAAAA,CAAAA;AAC7B,EAAA;;;;;;;AAQOlD,EAAAA,IAAAA,CAAKO,QAAgB2C,IAAAA,EAAuB;AAC/C,IAAA,IAAA,CAAKH,MAAAA,CAAO/C,IAAAA,CAAKO,GAAAA,EAAAA,GAAQ2C,IAAAA,CAAAA;AAC7B,EAAA;;;;;;;AAQOE,EAAAA,IAAAA,CAAK7C,QAAgB2C,IAAAA,EAAuB;AAC/C,IAAA,IAAA,CAAKH,MAAAA,CAAOK,IAAAA,CAAK7C,GAAAA,EAAAA,GAAQ2C,IAAAA,CAAAA;AAC7B,EAAA;;;;;;;AAQOG,EAAAA,OAAAA,CAAQ9C,QAAgB2C,IAAAA,EAAuB;AAClD,IAAA,IAAA,CAAKH,MAAAA,CAAOM,OAAAA,CAAQ9C,GAAAA,EAAAA,GAAQ2C,IAAAA,CAAAA;AAChC,EAAA;;;;;;;AAQOI,EAAAA,KAAAA,CAAM/C,QAAgB2C,IAAAA,EAAuB;AAChD,IAAA,IAAA,CAAKH,MAAAA,CAAOO,KAAAA,CAAM/C,GAAAA,EAAAA,GAAQ2C,IAAAA,CAAAA;AAC9B,EAAA;;;;;;;AAQOK,EAAAA,KAAAA,CAAMhD,QAAgB2C,IAAAA,EAAuB;AAChD,IAAA,IAAA,CAAKH,MAAAA,CAAOQ,KAAAA,CAAMhD,GAAAA,EAAAA,GAAQ2C,IAAAA,CAAAA;AAC9B,EAAA;;;;;;;;;EAUA,OAAc9B,KAAAA,CAAMrC,MAAAA,EAAgBwB,GAAAA,EAAAA,GAAgB2C,IAAAA,EAAuB;AACvE,IAAA,MAAMH,MAAAA,GAAS,IAAA,CAAKjE,QAAAA,CAASC,MAAAA,CAAAA;AAC7BgE,IAAAA,MAAAA,CAAOE,KAAAA,CAAM1C,GAAAA,EAAAA,GAAQ2C,IAAAA,CAAAA;AACzB,EAAA;;;;;;;;;EAUA,OAAcM,IAAAA,CAAKzE,MAAAA,EAAgBwB,GAAAA,EAAAA,GAAgB2C,IAAAA,EAAuB;AACtE,IAAA,MAAMH,MAAAA,GAAS,IAAA,CAAKjE,QAAAA,CAASC,MAAAA,CAAAA;AAC7BgE,IAAAA,MAAAA,CAAO/C,IAAAA,CAAKO,GAAAA,EAAAA,GAAQ2C,IAAAA,CAAAA;AACxB,EAAA;;;;;;;;;EAUA,OAAcO,IAAAA,CAAK1E,MAAAA,EAAgBwB,GAAAA,EAAAA,GAAgB2C,IAAAA,EAAuB;AACtE,IAAA,MAAMH,MAAAA,GAAS,IAAA,CAAKjE,QAAAA,CAASC,MAAAA,CAAAA;AAC7BgE,IAAAA,MAAAA,CAAOI,IAAAA,CAAK5C,GAAAA,EAAAA,GAAQ2C,IAAAA,CAAAA;AACxB,EAAA;;;;;;;;;EAUA,OAAcQ,KAAAA,CAAM3E,MAAAA,EAAgBwB,GAAAA,EAAAA,GAAgB2C,IAAAA,EAAuB;AACvE,IAAA,MAAMH,MAAAA,GAAS,IAAA,CAAKjE,QAAAA,CAASC,MAAAA,CAAAA;AAC7BgE,IAAAA,MAAAA,CAAOO,KAAAA,CAAM/C,GAAAA,EAAAA,GAAQ2C,IAAAA,CAAAA;AACzB,EAAA;;;;;;;;;EAUA,OAAcS,KAAAA,CAAM5E,MAAAA,EAAgBwB,GAAAA,EAAAA,GAAgB2C,IAAAA,EAAuB;AACvE,IAAA,MAAMH,MAAAA,GAAS,IAAA,CAAKjE,QAAAA,CAASC,MAAAA,CAAAA;AAC7BgE,IAAAA,MAAAA,CAAOQ,KAAAA,CAAMhD,GAAAA,EAAAA,GAAQ2C,IAAAA,CAAAA;AACzB,EAAA;AACJ;;;AC1OO,IAAMU,kBAAN,MAAMA;EAtBb;;;AAuBqBC,EAAAA,MAAAA;AACAC,EAAAA,GAAAA;AACAvD,EAAAA,GAAAA;AACAwD,EAAAA,GAAAA,uBAAUlF,GAAAA,EAAAA;;;;;;EAO3B,WAAA,CAAYmF,IAAAA,GAAwB,EAAC,EAAG;AACpC,IAAA,IAAA,CAAKH,MAAAA,GAASG,KAAKC,QAAAA,IAAY,GAAA;AAC/B,IAAA,IAAA,CAAKH,GAAAA,GAAME,KAAKE,GAAAA,IAAO9C,KAAAA;AACvB,IAAA,IAAA,CAAKb,GAAAA,GAAMyD,KAAKxD,OAAAA,IAAW,iBAAA;AAC/B,EAAA;;;;;;AAOAvB,EAAAA,GAAAA,CAAIkF,GAAAA,EAAmB;AACnB,IAAA,IAAA,CAAKJ,GAAAA,CAAI9E,GAAAA,CAAIkF,GAAAA,EAAKC,IAAAA,CAAKC,KAAG,CAAA;AAC9B,EAAA;;;;;;;;;;AAWAC,EAAAA,KAAAA,CAAMH,GAAAA,EAAmB;AACrB,IAAA,MAAME,GAAAA,GAAMD,KAAKC,GAAAA,EAAG;AACpB,IAAA,MAAME,IAAAA,GAAO,IAAA,CAAKR,GAAAA,CAAI/E,GAAAA,CAAImF,GAAAA,CAAAA;AAC1B,IAAA,MAAMK,SAAAA,GAAY,IAAA,CAAKX,MAAAA,IAAUQ,GAAAA,IAAOE,IAAAA,IAAQ,CAAA,CAAA,CAAA;AAEhD,IAAA,IAAItC,eAAAA,CAASC,aAAAA,IAAiBsC,SAAAA,GAAY,CAAA,EAAG;AACzC7F,MAAAA,MAAAA,CAAO+E,MAAM,iBAAA,EAAmB,CAAA,EAAGS,GAAAA,CAAAA,GAAAA,EAASK,SAAAA,CAAAA,YAAAA,CAAuB,CAAA;AACvE,IAAA;AAEA,IAAA,IAAID,IAAAA,KAASE,MAAAA,IAAaD,SAAAA,GAAY,CAAA,EAAG;AACrC,MAAA,MAAM,IAAI,IAAA,CAAKV,GAAAA,CAAI,IAAA,CAAKvD,KAAKiE,SAAAA,CAAAA;AACjC,IAAA;AACA,IAAA,IAAA,CAAKT,GAAAA,CAAI9E,GAAAA,CAAIkF,GAAAA,EAAKE,GAAAA,CAAAA;AACtB,EAAA;;;;;;;AAQAK,EAAAA,QAAAA,CAASP,GAAAA,EAAsB;AAC3B,IAAA,MAAMI,IAAAA,GAAO,IAAA,CAAKR,GAAAA,CAAI/E,GAAAA,CAAImF,GAAAA,CAAAA;AAC1B,IAAA,OAAOI,SAASE,MAAAA,IAAaL,IAAAA,CAAKC,GAAAA,EAAG,GAAKE,OAAO,IAAA,CAAKV,MAAAA;AAC1D,EAAA;;;;;;AAOAc,EAAAA,KAAAA,CAAMR,GAAAA,EAAmB;AACrB,IAAA,IAAA,CAAKJ,GAAAA,CAAIa,OAAOT,GAAAA,CAAAA;AACpB,EAAA;AACJ;;;ACzFO,IAAKU,iBAAAA,6BAAAA,kBAAAA,EAAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAAA,EAAAA,OAAAA,kBAAAA;;;;ACAZ,IAAMC,QAAAA,GAAW;EACb,CAACD,iBAAAA,CAAkBE,yBAAyB,GAAG,MAAM,iDAAA;EACrD,CAACF,iBAAAA,CAAkBG,oCAAoC,GAAG,MACtD,6DAAA;EACJ,CAACH,iBAAAA,CAAkBI,oCAAoC,GAAG,MAAM,8CAAA;EAEhE,CAACJ,iBAAAA,CAAkBK,2BAA2B,GAAG,MAC7C,gEAAA;EACJ,CAACL,iBAAAA,CAAkBM,qBAAqB,GAAG,MAAM,yDAAA;EACjD,CAACN,iBAAAA,CAAkBO,wBAAwB,GAAG,MAAM,4DAAA;EACpD,CAACP,iBAAAA,CAAkBQ,qBAAqB,GAAG,CAACC,UAAmB,CAAA,eAAA,EAAkBpF,MAAAA,CAAOoF,KAAAA,CAAAA,CAAAA,CAAAA,CAAAA;AACxF,EAAA,CAACT,iBAAAA,CAAkBU,sBAAsB,GAAG,CAACD,OAAeE,QAAAA,KACxD,CAAA,MAAA,EAASF,KAAAA,CAAAA,gBAAAA,EAAwBE,QAAAA,CAAAA,YAAAA,EAAuBA,QAAAA,KAAa,CAAA,GAAI,KAAK,GAAA,CAAA,CAAA,CAAA;EAClF,CAACX,iBAAAA,CAAkBY,oBAAoB,GAAG,CAACC,UAAkBC,OAAAA,KACzD,CAAA,MAAA,EAASD,QAAAA,CAAAA,kBAAAA,EAA6BC,OAAAA,CAAAA,GAAAA,CAAAA;EAE1C,CAACd,iBAAAA,CAAkBe,sBAAsB,GAAG,MACxC,4EAAA;EACJ,CAACf,iBAAAA,CAAkBgB,mBAAmB,GAAG,MAAM,8CAAA;AAC/C,EAAA,CAAChB,kBAAkBiB,mBAAmB,GAAG,CAAC3B,GAAAA,KAAgB,oBAAoBA,GAAAA,CAAAA,iBAAAA,CAAAA;EAC9E,CAACU,iBAAAA,CAAkBkB,yBAAyB,GAAG,MAAM,+BAAA;EACrD,CAAClB,iBAAAA,CAAkBmB,kBAAkB,GAAG,CAACC,YACrCA,OAAAA,GAAU,CAAA,4BAAA,EAA+BA,OAAAA,CAAAA,CAAAA,CAAAA,GAAa,8BAAA;EAE1D,CAACpB,iBAAAA,CAAkBqB,+BAA+B,GAAG,MAAM,sDAAA;EAC3D,CAACrB,iBAAAA,CAAkBsB,uBAAuB,GAAG,MACzC,yGAAA;AACJ,EAAA,CAACtB,iBAAAA,CAAkBuB,iCAAiC,GAAG,CACnDC,WAAAA,EACAC,aAAAA,EACAC,cAAAA,KAEA,CAAA,SAAA,EAAYF,WAAAA,CAAAA,8BAAAA,EAA4CC,aAAAA,CAAAA,4CAAAA,EAA4DC,cAAAA,CAAAA,UAAAA,CAAAA;EACxH,CAAC1B,iBAAAA,CAAkB2B,gCAAgC,GAAG,MAClD,yDAAA;EACJ,CAAC3B,iBAAAA,CAAkB4B,kCAAkC,GAAG,MACpD,6DAAA;EACJ,CAAC5B,iBAAAA,CAAkB6B,kCAAkC,GAAG,MAAM,8CAAA;EAE9D,CAAC7B,iBAAAA,CAAkB8B,gBAAgB,GAAG,MAAM,qCAAA;EAC5C,CAAC9B,iBAAAA,CAAkB+B,cAAc,GAAG,MAAM,qBAAA;EAC1C,CAAC/B,iBAAAA,CAAkBgC,6BAA6B,GAAG,MAAM,6CAAA;AAEzD,EAAA,CAAChC,kBAAkBiC,kCAAkC,GAAG,CAACC,SAAAA,KACrD,oCAAoCA,SAAAA,CAAAA,CAAAA,CAAAA;AACxC,EAAA,CAAClC,kBAAkBmC,gCAAgC,GAAG,CAACD,SAAAA,KACnD,kCAAkCA,SAAAA,CAAAA,CAAAA,CAAAA;EACtC,CAAClC,iBAAAA,CAAkBoC,2BAA2B,GAAG,CAACC,iBAC9CA,YAAAA,GAAe,CAAA,8BAAA,EAAiCA,YAAAA,CAAAA,EAAAA,CAAAA,GAAmB,+BAAA;AAEvE,EAAA,CAACrC,kBAAkBsC,gCAAgC,GAAG,CAACJ,SAAAA,KACnD,kCAAkCA,SAAAA,CAAAA,CAAAA,CAAAA;AACtC,EAAA,CAAClC,kBAAkBuC,4BAA4B,GAAG,CAACL,SAAAA,KAC/C,8BAA8BA,SAAAA,CAAAA,4CAAAA,CAAAA;EAClC,CAAClC,iBAAAA,CAAkBwC,yBAAyB,GAAG,MAAM,sDAAA;EACrD,CAACxC,iBAAAA,CAAkByC,yBAAyB,GAAG,CAACC,cAC5C,CAAA,6BAAA,EAAgCrH,MAAAA,CAAOqH,SAAAA,CAAAA,CAAAA,CAAAA,CAAAA;AAC3C,EAAA,CAAC1C,kBAAkB2C,iCAAiC,GAAG,CAAClH,KAAAA,KACpD,yCAAyCA,KAAAA,CAAAA,CAAAA,CAAAA;EAC7C,CAACuE,iBAAAA,CAAkB4C,yBAAyB,GAAG,MAAM,8BAAA;AACrD,EAAA,CAAC5C,kBAAkB6C,+BAA+B,GAAG,CAACC,QAAAA,KAClD,kBAAkBA,QAAAA,CAAAA,yCAAAA,CAAAA;AACtB,EAAA,CAAC9C,kBAAkB+C,wBAAwB,GAAG,CAACpH,OAAAA,KAAoB,sBAAsBA,OAAAA,CAAAA,CAAAA;AAC7F;AAIO,SAASqH,0BAAAA,CACZC,MACA5E,IAAAA,EAAoC;AAEpC,EAAA,MAAM6E,SAAAA,GAAYjD,SAASgD,IAAAA,CAAAA;AAC3B,EAAA,MAAME,YAAAA,GAAgB9E,QAAQ,EAAA;AAC9B,EAAA,OAAQ6E,SAAAA,CAAAA,GAAkDC,YAAAA,CAAAA;AAC9D;AAPgBH,MAAAA,CAAAA,0BAAAA,EAAAA,4BAAAA,CAAAA;AC5DhB,SAASI,kBAAkBH,IAAAA,EAAuB;AAC9C,EAAA,OAAOjD,kBAAkBiD,IAAAA,CAAAA;AAC7B;AAFSG,MAAAA,CAAAA,iBAAAA,EAAAA,mBAAAA,CAAAA;AAIT,SAASC,cAAAA,CAAeJ,MAAyB5E,IAAAA,EAAgD;AAC7F,EAAA,OAAO2E,0BAAAA,CAA2BC,MAAM5E,IAAAA,CAAAA;AAC5C;AAFSgF,MAAAA,CAAAA,cAAAA,EAAAA,gBAAAA,CAAAA;AAIT,SAASC,eAAAA,CAAgBC,IAAAA,EAAcC,WAAAA,EAAsCP,IAAAA,EAAuB;AAChG,EAAA,OAAO,CAAA,EAAGQ,uBAAAA,CAAMC,IAAAA,CAAKC,GAAAA,CAAIJ,IAAAA,CAAAA,CAAAA,CAAAA,EAASE,uBAAAA,CAAMG,IAAAA,CAAKX,IAAAA,CAAAA,CAAAA,CAAAA,CAAAA;AACjD;AAFSK,MAAAA,CAAAA,eAAAA,EAAAA,iBAAAA,CAAAA;AAIF,IAAMO,aAAAA,GAAN,cAA4BtH,KAAAA,CAAAA;EArBnC;;;AAsBoB0G,EAAAA,IAAAA;AACAa,EAAAA,UAAAA;EAEhB,WAAA,CACIb,IAAAA,EACA5E,MACA0F,OAAAA,EACF;AACE,IAAA,MAAMpI,OAAAA,GAAU0H,cAAAA,CAAeJ,IAAAA,EAAM5E,IAAAA,CAAAA;AACrC,IAAA,KAAA,CAAM1C,SAASoI,OAAAA,CAAAA;AACf,IAAA,IAAA,CAAKd,IAAAA,GAAOA,IAAAA;AACZ,IAAA,IAAA,CAAKa,UAAAA,GAAaV,kBAAkBH,IAAAA,CAAAA;AACpC,IAAA,IAAA,CAAKM,OAAOD,eAAAA,CAAgB,GAAA,CAAA,MAAA,CAAWC,MAAM,IAAA,CAAKO,UAAAA,EAAY,KAAKb,IAAI,CAAA;AACvEzG,IAAAA,MAAAA,CAAOwH,cAAAA,CAAe,IAAA,EAAM,GAAA,CAAA,MAAA,CAAWC,SAAS,CAAA;AAChD,IAAA,IAAI,OAAO1H,KAAAA,CAAM2H,iBAAAA,KAAsB,UAAA,EAAY;AAC/C3H,MAAAA,KAAAA,CAAM2H,iBAAAA,CAAkB,MAAM,GAAA,CAAA,MAAA,CAAA;AAClC,IAAA;AACJ,EAAA;AACJ;AAEO,IAAMC,iBAAAA,GAAN,cAAgCC,SAAAA,CAAAA;EA1CvC;;;AA2CoBnB,EAAAA,IAAAA;AACAa,EAAAA,UAAAA;EAEhB,WAAA,CACIb,IAAAA,EACA5E,MACA0F,OAAAA,EACF;AACE,IAAA,MAAMpI,OAAAA,GAAU0H,cAAAA,CAAeJ,IAAAA,EAAM5E,IAAAA,CAAAA;AACrC,IAAA,KAAA,CAAM1C,SAASoI,OAAAA,CAAAA;AACf,IAAA,IAAA,CAAKd,IAAAA,GAAOA,IAAAA;AACZ,IAAA,IAAA,CAAKa,UAAAA,GAAaV,kBAAkBH,IAAAA,CAAAA;AACpC,IAAA,IAAA,CAAKM,OAAOD,eAAAA,CAAgB,GAAA,CAAA,MAAA,CAAWC,MAAM,IAAA,CAAKO,UAAAA,EAAY,KAAKb,IAAI,CAAA;AACvEzG,IAAAA,MAAAA,CAAOwH,cAAAA,CAAe,IAAA,EAAM,GAAA,CAAA,MAAA,CAAWC,SAAS,CAAA;AAChD,IAAA,IAAI,OAAO1H,KAAAA,CAAM2H,iBAAAA,KAAsB,UAAA,EAAY;AAC/C3H,MAAAA,KAAAA,CAAM2H,iBAAAA,CAAkB,MAAM,GAAA,CAAA,MAAA,CAAA;AAClC,IAAA;AACJ,EAAA;AACJ;AAEO,IAAMG,kBAAAA,GAAN,cAAiCC,UAAAA,CAAAA;EA/DxC;;;AAgEoBrB,EAAAA,IAAAA;AACAa,EAAAA,UAAAA;EAEhB,WAAA,CACIb,IAAAA,EACA5E,MACA0F,OAAAA,EACF;AACE,IAAA,MAAMpI,OAAAA,GAAU0H,cAAAA,CAAeJ,IAAAA,EAAM5E,IAAAA,CAAAA;AACrC,IAAA,KAAA,CAAM1C,SAASoI,OAAAA,CAAAA;AACf,IAAA,IAAA,CAAKd,IAAAA,GAAOA,IAAAA;AACZ,IAAA,IAAA,CAAKa,UAAAA,GAAaV,kBAAkBH,IAAAA,CAAAA;AACpC,IAAA,IAAA,CAAKM,OAAOD,eAAAA,CAAgB,GAAA,CAAA,MAAA,CAAWC,MAAM,IAAA,CAAKO,UAAAA,EAAY,KAAKb,IAAI,CAAA;AACvEzG,IAAAA,MAAAA,CAAOwH,cAAAA,CAAe,IAAA,EAAM,GAAA,CAAA,MAAA,CAAWC,SAAS,CAAA;AAChD,IAAA,IAAI,OAAO1H,KAAAA,CAAM2H,iBAAAA,KAAsB,UAAA,EAAY;AAC/C3H,MAAAA,KAAAA,CAAM2H,iBAAAA,CAAkB,MAAM,GAAA,CAAA,MAAA,CAAA;AAClC,IAAA;AACJ,EAAA;AACJ;AAEO,IAAMK,cAAAA,GAAiB;EAC1BhI,KAAAA,EAAOsH,aAAAA;EACPO,SAAAA,EAAWD,iBAAAA;EACXG,UAAAA,EAAYD;AAChB;AAIO,SAASG,gBAAgBpG,KAAAA,EAAc;AAC1C,EAAA,OACI,OAAOA,KAAAA,KAAU,QAAA,IACjBA,KAAAA,KAAU,QACV,MAAA,IAAUA,KAAAA,IACV,OAAQA,KAAAA,CAA4B6E,SAAS,QAAA,IAC7C,YAAA,IAAgB7E,KAAAA,IAChB,OAAQA,MAAkC0F,UAAAA,KAAe,QAAA;AAEjE;AATgBU,MAAAA,CAAAA,eAAAA,EAAAA,iBAAAA,CAAAA;AC3ET,IAAeC,uBAAf,MAAeA;EAjBtB;;;;;AAkBuBvG,EAAAA,MAAAA;AACAwG,EAAAA,MAAAA,GAAS,IAAIC,mBAAAA,EAAAA;AACbC,EAAAA,QAAAA,uBAAe5K,GAAAA,EAAAA;EAElC,WAAA,CACI6K,UAAAA,EACmBC,YACAC,SAAAA,EACrB;SAFqBD,UAAAA,GAAAA,UAAAA;SACAC,SAAAA,GAAAA,SAAAA;AAEnB,IAAA,IAAA,CAAK7G,MAAAA,GAAS,IAAIpE,MAAAA,CAAO+K,UAAAA,CAAAA;AAEzB,IAAA,IAAA,CAAKC,UAAAA,CAAWE,OAAAA,CAAQ,CAACvE,KAAAA,KAAU,IAAA,CAAKmE,SAASxK,GAAAA,CAAIqG,KAAAA,EAAO,EAAE,CAAA,CAAA;AAClE,EAAA;;;;;;;;;;;;;;;;;;EAmBOwE,OAAAA,CAAQxE,KAAAA,EAAeI,QAAAA,EAAkBqE,IAAAA,EAA2BC,SAAAA,EAAyB;AAChG,IAAA,IAAI,CAAC,IAAA,CAAKC,UAAAA,EAAU,EAAI;AAExB,IAAA,MAAMC,KAAAA,GAAQ,IAAA,CAAKT,QAAAA,CAASzK,GAAAA,CAAIsG,KAAAA,CAAAA;AAChC,IAAA,IAAI,CAAC4E,KAAAA,EAAO;AACR,MAAA,MAAM,IAAIxB,aAAAA,CAAc7D,iBAAAA,CAAkBQ,qBAAAA,EAAuB;AAACC,QAAAA;AAAM,OAAA,CAAA;AAC5E,IAAA;AAEA4E,IAAAA,KAAAA,CAAMxI,IAAAA,CAAK;MAAE0G,IAAAA,EAAM1C,QAAAA;AAAUqE,MAAAA,IAAAA;MAAMpE,OAAAA,EAASqE;KAAU,CAAA;AACtD,IAAA,IAAA,CAAKjH,MAAAA,CAAOO,KAAAA,CACR,CAAA,EAAGgF,uBAAAA,CAAM6B,MAAAA,CAAO,OAAA,CAAA,CAAA,CAAA,EAAY,IAAA,CAAKC,WAAAA,EAAW,CAAA,MAAA,EAAW9B,uBAAAA,CAAMC,KAAK8B,IAAAA,CAAK3E,QAAAA,CAAAA,CAAAA,UAAAA,EAAsB4C,uBAAAA,CAAMC,IAAAA,CAAK+B,OAAAA,CAAQ,IAAA,CAAKV,SAAAA,CAAUtE,KAAAA,CAAM,CAAA,CAAA,CAAG,CAAA;AAEhJ,EAAA;;;;;;;;AASOiF,EAAAA,UAAAA,CAAWjF,OAAeI,QAAAA,EAA2B;AACxD,IAAA,IAAI,CAAC,IAAA,CAAK8E,aAAAA,EAAa,EAAI,OAAO,KAAA;AAElC,IAAA,MAAMN,KAAAA,GAAQ,IAAA,CAAKT,QAAAA,CAASzK,GAAAA,CAAIsG,KAAAA,CAAAA;AAChC,IAAA,IAAI,CAAC4E,OAAO,OAAO,KAAA;AAEnB,IAAA,MAAMO,gBAAgBP,KAAAA,CAAM3I,MAAAA;AAC5B,IAAA,MAAMmJ,gBAAgBR,KAAAA,CAAMhJ,MAAAA,CAAO,CAAC6I,IAAAA,KAASA,IAAAA,CAAK3B,SAAS1C,QAAAA,CAAAA;AAC3D,IAAA,IAAA,CAAK+D,QAAAA,CAASxK,GAAAA,CAAIqG,KAAAA,EAAOoF,aAAAA,CAAAA;AAEzB,IAAA,MAAMC,OAAAA,GAAUF,kBAAkBC,aAAAA,CAAcnJ,MAAAA;AAChD,IAAA,IAAIoJ,OAAAA,EAAS;AACT,MAAA,IAAA,CAAK5H,MAAAA,CAAOO,KAAAA,CACR,CAAA,EAAGgF,uBAAAA,CAAM6B,MAAAA,CAAO,SAAA,CAAA,CAAA,CAAA,EAAc,IAAA,CAAKC,WAAAA,EAAW,CAAA,MAAA,EAAW9B,uBAAAA,CAAMC,KAAK8B,IAAAA,CAAK3E,QAAAA,CAAAA,CAAAA,YAAAA,EAAwB4C,uBAAAA,CAAMC,IAAAA,CAAK+B,OAAAA,CAAQ,IAAA,CAAKV,SAAAA,CAAUtE,KAAAA,CAAM,CAAA,CAAA,CAAG,CAAA;AAEpJ,IAAA;AAEA,IAAA,OAAOqF,OAAAA;AACX,EAAA;;;;AAKA,EAAA,MAAgBC,SAAStF,KAAAA,EAA8B;AACnD,IAAA,MAAM4E,QAAQ,IAAA,CAAKT,QAAAA,CAASzK,GAAAA,CAAIsG,KAAAA,KAAU,EAAA;AAC1C,IAAA,IAAI4E,KAAAA,CAAM3I,WAAW,CAAA,EAAG;AACpB,MAAA,IAAA,CAAKwB,MAAAA,CAAOI,IAAAA,CAAK,CAAA,yBAAA,EAA4BmF,uBAAAA,CAAMC,IAAAA,CAAK+B,OAAAA,CAAQ,IAAA,CAAKV,SAAAA,CAAUtE,KAAAA,CAAM,CAAA,CAAA,CAAG,CAAA;AACxF,MAAA;AACJ,IAAA;AAEA,IAAA,IAAA,CAAKvC,MAAAA,CAAO/C,IAAAA,CACR,CAAA,EAAGsI,uBAAAA,CAAMC,IAAAA,CAAKsC,MAAAA,CAAO,SAAA,CAAA,CAAA,CAAA,EAAc,IAAA,CAAKT,WAAAA,EAAW,CAAA,OAAA,EAAY9B,uBAAAA,CAAMC,IAAAA,CAAK+B,OAAAA,CAAQ,IAAA,CAAKV,SAAAA,CAAUtE,KAAAA,CAAM,CAAA,CAAA,MAAA,EAAUgD,uBAAAA,CAAMC,IAAAA,CAAK8B,IAAAA,CAAKH,KAAAA,CAAM3I,MAAM,CAAA,CAAA,MAAA,CAAS,CAAA;AAE1J,IAAA,IAAA,CAAKuJ,IAAAA,CAAK,CAAA,MAAA,EAASxF,KAAAA,CAAAA,MAAAA,CAAa,CAAA;AAGhC,IAAA,MAAMyF,OAAAA,GAAwC,MAAM,IAAA,CAAKC,mBAAAA,CAAoB1F,OAAO4E,KAAAA,CAAAA;AAGpF,IAAA,MAAM1E,QAAAA,GAAWuF,QAAQ7J,MAAAA,CAAO,CAAC+J,MAAMA,CAAAA,CAAEC,MAAAA,KAAW,UAAA,CAAA,CAAY3J,MAAAA;AAChE,IAAA,IAAIiE,WAAW,CAAA,EAAG;AACd,MAAA,MAAM,IAAIkD,aAAAA,CAAc7D,iBAAAA,CAAkBU,sBAAAA,EAAwB;AAC9D+C,QAAAA,uBAAAA,CAAMC,IAAAA,CAAK+B,OAAAA,CAAQ,IAAA,CAAKV,SAAAA,CAAUtE,KAAAA,CAAM,CAAA;AACxCE,QAAAA;AACH,OAAA,CAAA;IACL,CAAA,MAAO;AACH,MAAA,IAAA,CAAKzC,OAAO/C,IAAAA,CACR,CAAA,MAAA,EAASsI,uBAAAA,CAAMC,IAAAA,CAAK+B,QAAQ,IAAA,CAAKV,SAAAA,CAAUtE,KAAAA,CAAM,CAAA,CAAA,CAAA,EAAKgD,uBAAAA,CAAMC,KAAK4C,KAAAA,CAAM,wBAAA,CAAA,CAAA,CAA2B,CAAA;AAE1G,IAAA;AAEA,IAAA,IAAA,CAAKL,IAAAA,CAAK,CAAA,MAAA,EAASxF,KAAAA,CAAAA,SAAAA,CAAgB,CAAA;AACvC,EAAA;;;;EAKA,MAAgB8F,kBAAAA,CAAmB9F,OAAeyE,IAAAA,EAAoC;AAClF,IAAA,IAAA,CAAKhH,MAAAA,CAAO/C,KACR,CAAA,EAAGsI,uBAAAA,CAAM6B,OAAO,UAAA,CAAA,CAAA,MAAA,EAAoB7B,uBAAAA,CAAMC,IAAAA,CAAK8B,IAAAA,CAAKN,KAAK3B,IAAI,CAAA,CAAA,UAAA,EAAcE,uBAAAA,CAAMC,IAAAA,CAAK+B,OAAAA,CAAQ,KAAKV,SAAAA,CAAUtE,KAAAA,CAAM,CAAA,CAAA,CAAG,CAAA;AAG1H,IAAA,IAAI;AAEA,MAAA,MAAM+F,QAAQC,IAAAA,CAAK;AACfvB,QAAAA,IAAAA,CAAKA,IAAAA,EAAI;QACT,IAAIsB,OAAAA,CAAc,CAACE,CAAAA,EAAGC,MAAAA,KAAAA;AAClBC,UAAAA,UAAAA,CAAW,MAAA;AACPD,YAAAA,MAAAA,CAAO,IAAI9C,aAAAA,CAAc7D,iBAAAA,CAAkBY,oBAAAA,EAAsB;cAACsE,IAAAA,CAAK3B,IAAAA;cAAM2B,IAAAA,CAAKpE;aAAQ,CAAA,CAAA;AAC9F,UAAA,CAAA,EAAGoE,KAAKpE,OAAO,CAAA;QACnB,CAAA;AACH,OAAA,CAAA;AAED,MAAA,IAAA,CAAK5C,MAAAA,CAAO/C,KACR,CAAA,EAAGsI,uBAAAA,CAAM6B,OAAO,WAAA,CAAA,CAAA,MAAA,EAAqB7B,uBAAAA,CAAMC,IAAAA,CAAK8B,IAAAA,CAAKN,KAAK3B,IAAI,CAAA,CAAA,UAAA,EAAcE,uBAAAA,CAAMC,IAAAA,CAAK+B,OAAAA,CAAQ,KAAKV,SAAAA,CAAUtE,KAAAA,CAAM,CAAA,CAAA,CAAG,CAAA;AAE/H,IAAA,CAAA,CAAA,OAASrC,KAAAA,EAAO;AACZ,MAAA,IAAA,CAAKF,MAAAA,CAAOE,KAAAA,CACR,CAAA,EAAGqF,uBAAAA,CAAM6B,MAAAA,CAAO,QAAA,CAAA,CAAA,MAAA,EAAkB7B,uBAAAA,CAAMC,IAAAA,CAAK8B,IAAAA,CAAKN,IAAAA,CAAK3B,IAAI,CAAA,CAAA,UAAA,EAAcE,uBAAAA,CAAMC,IAAAA,CAAK+B,OAAAA,CAAQ,IAAA,CAAKV,UAAUtE,KAAAA,CAAM,CAAA,CAAA,CAAA,CAAA,EACjHrC,KAAAA,CAAAA;AAEJ,MAAA,MAAMA,KAAAA;AACV,IAAA;AACJ,EAAA;;;;AAKOyI,EAAAA,EAAAA,CAAGC,OAAeC,QAAAA,EAA8C;AACnE,IAAA,IAAA,CAAKrC,MAAAA,CAAOmC,EAAAA,CAAGC,KAAAA,EAAOC,QAAAA,CAAAA;AAC1B,EAAA;;;;AAKOC,EAAAA,GAAAA,CAAIF,OAAeC,QAAAA,EAA8C;AACpE,IAAA,IAAA,CAAKrC,MAAAA,CAAOsC,GAAAA,CAAIF,KAAAA,EAAOC,QAAAA,CAAAA;AAC3B,EAAA;AAEUd,EAAAA,IAAAA,CAAKa,UAAkBzI,IAAAA,EAA0B;AACvD,IAAA,OAAO,IAAA,CAAKqG,MAAAA,CAAOuB,IAAAA,CAAKa,KAAAA,EAAAA,GAAUzI,IAAAA,CAAAA;AACtC,EAAA;AAUJ;;;;;;;;;;;;;;AC1KO,IAAK4I,aAAAA,6BAAAA,cAAAA,EAAAA;AACqC,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,uBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,uBAAA;AAEM,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,cAAA,CAAA,GAAA,CAAA,CAAA,GAAA,cAAA;AAEK,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,mBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,mBAAA;AAE5B,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,gBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,gBAAA;AAEJ,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,cAAA,CAAA,GAAA,CAAA,CAAA,GAAA,cAAA;AAThBA,EAAAA,OAAAA,cAAAA;;AAcZ,IAAMC,WAAAA,GAA+B;;;;;;;AAarC,IAAMC,kBAAAA,GAAqB,GAAA;AAUpB,IAAMC,mBAAAA,GAAN,cAAkC3C,oBAAAA,CAAAA;AAAAA,EAAAA;;;EAI7B4C,cAAAA,GAAiB,KAAA;EACjBC,QAAAA,GAAW,CAAA;EAEnB,WAAA,GAAqB;AACjB,IAAA,KAAA,CAAM,qBAAA,EAAuBJ,aAAaD,aAAAA,CAAAA;AAG1C,IAAA,IAAA,CAAKM,sBAAAA,EAAsB;AAC/B,EAAA;EAEUnC,UAAAA,GAAsB;AAC5B,IAAA,OAAO,IAAA,CAAKoC,iBAAAA;AAChB,EAAA;EAEU7B,aAAAA,GAAyB;AAC/B,IAAA,OAAO,IAAA;AACX,EAAA;EAEUJ,WAAAA,GAAsB;AAC5B,IAAA,OAAO,UAAA;AACX,EAAA;EAEA,MAAgBY,mBAAAA,CACZ1F,OACA4E,KAAAA,EACqC;AAErC,IAAA,MAAMa,UAAwC,EAAA;AAC9C,IAAA,KAAA,MAAWhB,QAAQG,KAAAA,EAAO;AACtBa,MAAAA,OAAAA,CAAQrJ,IAAAA,CACJ,MAAM2J,OAAAA,CAAQiB,OAAAA,EAAO,CAChBC,IAAAA,CAAK,MAAM,IAAA,CAAKnB,kBAAAA,CAAmB9F,KAAAA,EAAOyE,IAAAA,CAAAA,CAAAA,CAC1CwC,IAAAA;QACG,OAAO;UAAErB,MAAAA,EAAQ,WAAA;UAAasB,KAAAA,EAAO/H;AAAU,SAAA,CAAA;;AAE/C,QAAA,CAACgI,MAAAA,MAAY;UAAEvB,MAAAA,EAAQ,UAAA;AAAYuB,UAAAA;AAAO,SAAA;OAAA,CAAA;AAG1D,IAAA;AACA,IAAA,OAAO1B,OAAAA;AACX,EAAA;EAEQqB,sBAAAA,GAA+B;AACnC,IAAA,IAAI,CAAC,KAAKC,iBAAAA,EAAmB;AAE7BK,IAAAA,OAAAA,CAAQhB,EAAAA,CAAG,WAAW,MAAA;AAClB,MAAA,IAAA,CAAK3I,MAAAA,CAAO/C,KAAK,CAAA,SAAA,EAAYsI,uBAAAA,CAAMuC,OAAOtC,IAAAA,CAAK,SAAA,CAAA,CAAA,OAAA,CAAmB,CAAA;AAClE,MAAA,KAAK,IAAA,CAAKoE,IAAI,CAAA,CAAA;IAClB,CAAA,CAAA;AAEAD,IAAAA,OAAAA,CAAQhB,EAAAA,CAAG,UAAU,MAAA;AACjB,MAAA,IAAA,CAAK3I,MAAAA,CAAO/C,KAAK,CAAA,SAAA,EAAYsI,uBAAAA,CAAMuC,OAAOtC,IAAAA,CAAK,QAAA,CAAA,CAAA,OAAA,CAAkB,CAAA;AACjE,MAAA,KAAK,IAAA,CAAKoE,IAAI,CAAA,CAAA;IAClB,CAAA,CAAA;AACJ,EAAA;;;;;;;;;AAUgB7C,EAAAA,OAAAA,CAAQxE,KAAAA,EAAsBI,QAAAA,EAAkBqE,IAAAA,EAA2BC,SAAAA,GAAY,GAAA,EAAY;AAC/G,IAAA,KAAA,CAAMF,OAAAA,CAAQxE,KAAAA,EAAOI,QAAAA,EAAUqE,IAAAA,EAAMC,SAAAA,CAAAA;AACzC,EAAA;;;;;;;;AASgBO,EAAAA,UAAAA,CAAWjF,OAAsBI,QAAAA,EAA2B;AACxE,IAAA,OAAO,KAAA,CAAM6E,UAAAA,CAAWjF,KAAAA,EAAOI,QAAAA,CAAAA;AACnC,EAAA;;;;;;;;;;;;;;;;EAiBA,MAAaiH,GAAAA,CAAIR,WAAW,CAAA,EAAkB;AAC1C,IAAA,IAAI,KAAKD,cAAAA,EAAgB;AACrB,MAAA,IAAA,CAAKnJ,MAAAA,CAAOI,KAAK,uCAAA,CAAA;AACjB,MAAA;AACJ,IAAA;AAEA,IAAA,IAAA,CAAK+I,cAAAA,GAAiB,IAAA;AACtB,IAAA,IAAA,CAAKC,QAAAA,GAAWA,QAAAA;AAChB,IAAA,IAAA,CAAKpJ,MAAAA,CAAO/C,IAAAA,CACR,CAAA,EAAGsI,uBAAAA,CAAMC,KAAKsC,MAAAA,CAAO,UAAA,CAAA,CAAA,qCAAA,EAAmDvC,uBAAAA,CAAMC,IAAAA,CAAK8B,IAAAA,CAAK8B,QAAAA,CAAAA,CAAAA,CAAW,CAAA;AAEvG,IAAA,IAAA,CAAKrB,KAAK,gBAAA,CAAA;AAEV,IAAA,IAAI;AAEA,MAAA,KAAA,MAAWxF,SAASyG,WAAAA,EAAa;AAC7B,QAAA,MAAM,IAAA,CAAKnB,SAAStF,KAAAA,CAAAA;AACxB,MAAA;AAEA,MAAA,IAAA,CAAKvC,MAAAA,CAAO/C,KAAK,CAAA,EAAGsI,uBAAAA,CAAMC,KAAK4C,KAAAA,CAAM,gCAAA,CAAA,CAAA,aAAA,CAAgD,CAAA;AACrF,MAAA,IAAA,CAAKL,KAAK,mBAAA,CAAA;AACd,IAAA,CAAA,CAAA,OAAS7H,KAAAA,EAAO;AACZ,MAAA,IAAA,CAAKF,MAAAA,CAAOE,MAAM,CAAA,EAAGqF,uBAAAA,CAAMC,KAAKC,GAAAA,CAAI,6BAAA,CAAA,CAAA,CAAgC,CAAA;AACpE,MAAA,IAAA,CAAKsC,IAAAA,CAAK,kBAAkB7H,KAAAA,CAAAA;IAChC,CAAA,SAAA;AACI,MAAA,IAAA,CAAKF,MAAAA,CAAO/C,IAAAA,CAAK,CAAA,EAAGsI,uBAAAA,CAAMC,KAAKC,GAAAA,CAAI,SAAA,CAAA,CAAA,mBAAA,EAAgCF,wBAAMC,IAAAA,CAAK8B,IAAAA,CAAK,IAAA,CAAK8B,QAAQ,CAAA,CAAA,CAAG,CAAA;AACnGV,MAAAA,UAAAA,CAAW,MAAA;AACPiB,QAAAA,OAAAA,CAAQE,IAAAA,CAAK,KAAKT,QAAQ,CAAA;AAC9B,MAAA,CAAA,EAAGH,kBAAAA,CAAAA;AACP,IAAA;AACJ,EAAA;;;;AAKgBN,EAAAA,EAAAA,CAAGC,OAAoCC,QAAAA,EAA8C;AACjG,IAAA,KAAA,CAAMF,EAAAA,CAAGC,OAAOC,QAAAA,CAAAA;AACpB,EAAA;;;;AAKgBC,EAAAA,GAAAA,CAAIF,OAAoCC,QAAAA,EAA8C;AAClG,IAAA,KAAA,CAAMC,GAAAA,CAAIF,OAAOC,QAAAA,CAAAA;AACrB,EAAA;AACJ;;;IA9IqCiB,QAAAA,EAAU;;;;;;;;;;;;;;;;;ACvC/C,IAAMC,OAAAA,GAAU,GAAA;AAChB,IAAMC,cAAAA,GAAiB,GAAA;AAQhB,IAAMC,cAAN,MAAMA;AAAAA,EAAAA;;;EACOjK,MAAAA,GAAS,IAAIpE,OAAO,aAAA,CAAA;AAoB5BsO,EAAAA,MAAAA;AAER,EAAA,WAAA,CAAYC,QAAAA,EAA+B;AAEvCA,IAAAA,QAAAA,CAASpD,OAAAA,CAAQgC,cAAcqB,YAAAA,EAAc,yBAAA,EAA2B,YAAY,MAAM,IAAA,CAAKC,MAAI,CAAA;AACvG,EAAA;;;;;AAMA,EAAA,MAAaC,IAAAA,GAAsB;AAC/B,IAAA,OAAO,IAAIhC,OAAAA,CAAc,CAACiB,OAAAA,EAASd,MAAAA,KAAAA;AAC/B,MAAA,IAAA,CAAKyB,MAAAA,GAASK,iBAAAA,CAAa,CAACC,GAAAA,EAAsBC,GAAAA,KAAAA;AAC9C,QAAA,IAAID,IAAIE,MAAAA,KAAW,KAAA,IAASF,GAAAA,CAAIG,GAAAA,KAAQ,KAAKC,IAAAA,EAAM;AAC/CH,UAAAA,GAAAA,CAAII,UAAUd,OAAAA,EAAS;YAAE,cAAA,EAAgB;WAAmB,CAAA;AAC5DU,UAAAA,GAAAA,CAAIK,GAAAA,CAAIlM,KAAKC,SAAAA,CAAU;YAAEsJ,MAAAA,EAAQ,IAAA;AAAMpL,YAAAA,SAAAA,EAAWsE,KAAKC,GAAAA;AAAM,WAAA,CAAA,CAAA;QACjE,CAAA,MAAO;AACHmJ,UAAAA,GAAAA,CAAII,UAAUb,cAAAA,EAAgB;YAAE,cAAA,EAAgB;WAAmB,CAAA;AACnES,UAAAA,GAAAA,CAAIK,GAAAA,CAAIlM,KAAKC,SAAAA,CAAU;YAAEsJ,MAAAA,EAAQ;AAAY,WAAA,CAAA,CAAA;AACjD,QAAA;MACJ,CAAA,CAAA;AAEA,MAAA,IAAA,CAAK+B,MAAAA,CAAOvB,EAAAA,CAAG,OAAA,EAASF,MAAAA,CAAAA;AACxB,MAAA,IAAA,CAAKyB,MAAAA,CAAOa,IAAAA,CAAK,WAAA,EAAa,MAAA;AAC1B,QAAA,MAAMC,OAAAA,GAAU,KAAKC,IAAAA,IAAQ,WAAA;AAC7B,QAAA,IAAA,CAAKjL,MAAAA,CAAO/C,KACR,CAAA,EAAGsI,uBAAAA,CAAM6C,MAAM5C,IAAAA,CAAK,QAAA,CAAA,CAAA,kCAAA,EAAyCD,uBAAAA,CAAM+B,KAAK,CAAA,OAAA,EAAU0D,OAAAA,IAAW,IAAA,CAAKE,IAAI,GAAG,IAAA,CAAKN,IAAI,CAAA,CAAE,CAAA,CAAA,CAAG,CAAA;AAE3HrB,QAAAA,OAAAA,EAAAA;MACJ,CAAA,CAAA;AAEA,MAAA,IAAI,KAAK0B,IAAAA,EAAM;AACX,QAAA,IAAA,CAAKjL,MAAAA,CAAOO,KAAAA,CAAM,CAAA,+BAAA,EAAkC,IAAA,CAAK0K,IAAI,CAAA,CAAE,CAAA;AAC/D,QAAA,IAAA,CAAKf,MAAAA,CAAOiB,MAAAA,CAAO,IAAA,CAAKD,IAAAA,EAAM,KAAKD,IAAI,CAAA;MAC3C,CAAA,MAAO;AACH,QAAA,IAAA,CAAKjL,MAAAA,CAAOO,MAAM,+CAAA,CAAA;AAClB,QAAA,IAAA,CAAK2J,MAAAA,CAAOiB,MAAAA,CAAO,IAAA,CAAKD,IAAI,CAAA;AAChC,MAAA;IACJ,CAAA,CAAA;AACJ,EAAA;;;;;;EAOOb,IAAAA,GAAsB;AACzB,IAAA,IAAI,IAAA,CAAKH,WAAWxI,MAAAA,EAAW;AAC3B,MAAA,MAAMwI,SAAS,IAAA,CAAKA,MAAAA;AACpB,MAAA,OAAO,IAAI5B,OAAAA,CAAQ,CAACiB,OAAAA,KAAAA;AAChBW,QAAAA,MAAAA,CAAOa,IAAAA,CAAK,OAAA,EAAS,MAAMxB,OAAAA,EAAAA,CAAAA;AAE3BW,QAAAA,MAAAA,CAAOkB,MAAM,MAAA;AACT,UAAA,IAAA,CAAKpL,OAAO/C,IAAAA,CAAKsI,uBAAAA,CAAMC,IAAAA,CAAKC,GAAAA,CAAI,6BAAA,CAAA,CAAA;QACpC,CAAA,CAAA;MACJ,CAAA,CAAA;AACJ,IAAA;AAEA,IAAA,OAAO6C,QAAQiB,OAAAA,EAAO;AAC1B,EAAA;AACJ;;;IA5EmCO,QAAAA,EAAU;;;;;;IAMVA,QAAAA,EAAU;;;;;;;;ACHtC,IAAMuB,kBAAAA,GAAN,cAA0E5E,mBAAAA,CAAAA;EA5BjF;;;;;;;;;;AAoCakC,EAAAA,EAAAA,CACLC,OACAC,QAAAA,EACI;AACJ,IAAA,OAAO,KAAA,CAAMF,EAAAA,CAAGC,KAAAA,EAAOC,QAAAA,CAAAA;AAC3B,EAAA;;;;;;;;AASSkC,EAAAA,IAAAA,CACLnC,OACAC,QAAAA,EACI;AACJ,IAAA,OAAO,KAAA,CAAMkC,IAAAA,CAAKnC,KAAAA,EAAOC,QAAAA,CAAAA;AAC7B,EAAA;;;;;;;;AASSC,EAAAA,GAAAA,CACLF,OACAC,QAAAA,EACI;AACJ,IAAA,OAAO,KAAA,CAAMC,GAAAA,CAAIF,KAAAA,EAAOC,QAAAA,CAAAA;AAC5B,EAAA;;;;;;;;AASSyC,EAAAA,WAAAA,CACL1C,OACAC,QAAAA,EACI;AACJ,IAAA,OAAO,IAAA,CAAKF,EAAAA,CAAGC,KAAAA,EAAOC,QAAAA,CAAAA;AAC1B,EAAA;;;;;;;;AASS0C,EAAAA,cAAAA,CACL3C,OACAC,QAAAA,EACI;AACJ,IAAA,OAAO,KAAA,CAAM0C,cAAAA,CAAe3C,KAAAA,EAAOC,QAAAA,CAAAA;AACvC,EAAA;;;;;;;;AASSd,EAAAA,IAAAA,CAA4Ca,UAAqBzI,IAAAA,EAAmC;AACzG,IAAA,OAAO,KAAA,CAAM4H,IAAAA,CAAKa,KAAAA,EAAAA,GAAWzI,IAAAA,CAAAA;AACjC,EAAA;;;;;;;AAQSqL,EAAAA,SAAAA,CACL5C,KAAAA,EACyC;AACzC,IAAA,OAAO,KAAA,CAAM4C,UAAU5C,KAAAA,CAAAA;AAC3B,EAAA;;;;;;;AAQA6C,EAAAA,kBAAAA,CAA0D7C,KAAAA,EAA0B;AAChF,IAAA,OAAO,KAAA,CAAM8C,cAAc9C,KAAAA,CAAAA;AAC/B,EAAA;;;;;;EAOA+C,eAAAA,GAAyC;AACrC,IAAA,OAAO,MAAMC,UAAAA,EAAAA;AACjB,EAAA;;;;;;;;;AAUAC,EAAAA,OAAAA,CACIjD,OACA3H,IAAAA,EAC2B;AAC3B,IAAA,OAAO,IAAIqH,OAAAA,CAA4B,CAACiB,OAAAA,EAASd,MAAAA,KAAAA;AAC7C,MAAA,MAAMqD,OAAAA,8BAAc3L,IAAAA,KAAAA;AAChB4L,QAAAA,OAAAA,EAAAA;AACAxC,QAAAA,OAAAA,CAAQpJ,IAAAA,CAAAA;MACZ,CAAA,EAHgB,SAAA,CAAA;AAKhB,MAAA,MAAM6L,0BAAU,MAAA,CAAA,MAAA;AACZD,QAAAA,OAAAA,EAAAA;AACAtD,QAAAA,MAAAA,CAAOnK,MAAAA,CAAO2N,MAAAA,CAAO,IAAI5N,KAAAA,CAAM,SAAA,CAAA,EAAY;UAAEgH,IAAAA,EAAM;AAAa,SAAA,CAAA,CAAA;MACpE,CAAA,EAHgB,SAAA,CAAA;AAKhB,MAAA,IAAI6G,SAAAA,GAAmC,IAAA;AAEvC,MAAA,MAAMH,0BAAU,MAAA,CAAA,MAAA;AACZ,QAAA,IAAA,CAAKjD,GAAAA,CAAIF,OAAOkD,OAAAA,CAAAA;AAChB7K,QAAAA,IAAAA,EAAMkL,MAAAA,EAAQC,mBAAAA,CAAoB,OAAA,EAASJ,OAAAA,CAAAA;AAC3C,QAAA,IAAIE,SAAAA,eAAwBA,SAAAA,CAAAA;MAChC,CAAA,EAJgB,SAAA,CAAA;AAMhB,MAAA,IAAA,CAAKnB,IAAAA,CAAKnC,OAAOkD,OAAAA,CAAAA;AAEjB,MAAA,IAAI7K,MAAMkL,MAAAA,EAAQ;AACd,QAAA,IAAIlL,IAAAA,CAAKkL,MAAAA,CAAOE,OAAAA,EAAS,OAAOL,OAAAA,EAAAA;AAChC/K,QAAAA,IAAAA,CAAKkL,MAAAA,CAAOG,gBAAAA,CAAiB,OAAA,EAASN,OAAAA,EAAS;UAAEjB,IAAAA,EAAM;SAAK,CAAA;AAChE,MAAA;AAEA,MAAA,IAAI9J,IAAAA,EAAMgG,cAAcvF,MAAAA,EAAW;AAC/BwK,QAAAA,SAAAA,GAAYxD,WAAW,MAAA;AACnBqD,UAAAA,OAAAA,EAAAA;AACAtD,UAAAA,MAAAA,CAAO,IAAIpK,KAAAA,CAAM,WAAA,CAAA,CAAA;AACrB,QAAA,CAAA,EAAG4C,KAAKgG,SAAS,CAAA;AACrB,MAAA;IACJ,CAAA,CAAA;AACJ,EAAA;AACJ;AC9KO,IAAKsF,YAAAA,6BAAAA,aAAAA,EAAAA;AAC4C,EAAAA,aAAAA,CAAAA,aAAAA,CAAA,YAAA,CAAA,GAAA,CAAA,CAAA,GAAA,YAAA;AAEQ,EAAAA,aAAAA,CAAAA,aAAAA,CAAA,WAAA,CAAA,GAAA,CAAA,CAAA,GAAA,WAAA;AAEL,EAAAA,aAAAA,CAAAA,aAAAA,CAAA,cAAA,CAAA,GAAA,CAAA,CAAA,GAAA,cAAA;AAED,EAAAA,aAAAA,CAAAA,aAAAA,CAAA,eAAA,CAAA,GAAA,CAAA,CAAA,GAAA,eAAA;AAEC,EAAAA,aAAAA,CAAAA,aAAAA,CAAA,eAAA,CAAA,GAAA,CAAA,CAAA,GAAA,eAAA;AAEE,EAAAA,aAAAA,CAAAA,aAAAA,CAAA,YAAA,CAAA,GAAA,CAAA,CAAA,GAAA,YAAA;AAEE,EAAAA,aAAAA,CAAAA,aAAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAA;AAbnDA,EAAAA,OAAAA,aAAAA;;AAkBZ,IAAMvD,YAAAA,GAA8B;;;;;;;;;AAqB7B,IAAMwD,kBAAAA,GAAN,cAAiCjG,oBAAAA,CAAAA;EApDxC;;;EAqDYkG,YAAAA,GAAe,KAAA;EACfC,UAAAA,GAAa,KAAA;EAErB,WAAA,GAAqB;AACjB,IAAA,KAAA,CAAM,oBAAA,EAAsB1D,cAAauD,YAAAA,CAAAA;AAC7C,EAAA;;;;;;;;;AAUgBxF,EAAAA,OAAAA,CAAQxE,KAAAA,EAAqBI,QAAAA,EAAkBqE,IAAAA,EAA2BC,SAAAA,GAAY,GAAA,EAAa;AAC/G,IAAA,KAAA,CAAMF,OAAAA,CAAQxE,KAAAA,EAAOI,QAAAA,EAAUqE,IAAAA,EAAMC,SAAAA,CAAAA;AACzC,EAAA;EAEUC,UAAAA,GAAsB;AAC5B,IAAA,IAAI,KAAKwF,UAAAA,EAAY;AACjB,MAAA,MAAM,IAAI/G,aAAAA,CAAc7D,iBAAAA,CAAkBK,2BAA2B,CAAA;AACzE,IAAA;AAEA,IAAA,IAAI,KAAKsK,YAAAA,EAAc;AACnB,MAAA,MAAM,IAAI9G,aAAAA,CAAc7D,iBAAAA,CAAkBM,qBAAqB,CAAA;AACnE,IAAA;AAEA,IAAA,OAAO,IAAA;AACX,EAAA;EAEUqF,aAAAA,GAAyB;AAC/B,IAAA,IAAI,KAAKgF,YAAAA,EAAc;AACnB,MAAA,MAAM,IAAI9G,aAAAA,CAAc7D,iBAAAA,CAAkBO,wBAAwB,CAAA;AACtE,IAAA;AAEA,IAAA,OAAO,IAAA;AACX,EAAA;EAEUgF,WAAAA,GAAsB;AAC5B,IAAA,OAAO,SAAA;AACX,EAAA;EAEA,MAAgBY,mBAAAA,CACZ1F,OACA4E,KAAAA,EACqC;AAErC,IAAA,MAAMa,UAAwC,EAAA;AAC9C,IAAA,KAAA,MAAWhB,QAAQG,KAAAA,EAAO;AACtBa,MAAAA,OAAAA,CAAQrJ,IAAAA,CACJ,MAAM2J,OAAAA,CAAQiB,OAAAA,EAAO,CAChBC,IAAAA,CAAK,MAAM,IAAA,CAAKnB,kBAAAA,CAAmB9F,KAAAA,EAAOyE,IAAAA,CAAAA,CAAAA,CAC1CwC,IAAAA;QACG,OAAO;UAAErB,MAAAA,EAAQ,WAAA;UAAasB,KAAAA,EAAO/H;AAAU,SAAA,CAAA;;AAE/C,QAAA,CAACgI,MAAAA,MAAY;UAAEvB,MAAAA,EAAQ,UAAA;AAAYuB,UAAAA;AAAO,SAAA;OAAA,CAAA;AAG1D,IAAA;AACA,IAAA,OAAO1B,OAAAA;AACX,EAAA;;;;;;;;;;;;;;;;;AAkBA,EAAA,MAAa4B,GAAAA,GAAqB;AAC9B,IAAA,IAAI,KAAK8C,UAAAA,EAAY;AACjB,MAAA,IAAA,CAAK1M,MAAAA,CAAOI,KAAK,wCAAA,CAAA;AACjB,MAAA;AACJ,IAAA;AAEA,IAAA,IAAI,KAAKqM,YAAAA,EAAc;AACnB,MAAA,IAAA,CAAKzM,MAAAA,CAAOI,KAAK,sCAAA,CAAA;AACjB,MAAA;AACJ,IAAA;AAEA,IAAA,IAAA,CAAKqM,YAAAA,GAAe,IAAA;AACpB,IAAA,IAAA,CAAKzM,MAAAA,CAAO/C,KAAK,CAAA,EAAGsI,uBAAAA,CAAMC,KAAK4C,KAAAA,CAAM,UAAA,CAAA,CAAA,6BAAA,CAA0C,CAAA;AAC/E,IAAA,IAAA,CAAKL,KAAK,eAAA,CAAA;AAEV,IAAA,IAAI;AAEA,MAAA,KAAA,MAAWxF,KAAAA,IAASyG,YAAAA,EAAa,MAAM,IAAA,CAAKnB,SAAStF,KAAAA,CAAAA;AAErD,MAAA,IAAA,CAAKmK,UAAAA,GAAa,IAAA;AAClB,MAAA,IAAA,CAAK1M,MAAAA,CAAO/C,KAAK,CAAA,EAAGsI,uBAAAA,CAAMC,KAAK4C,KAAAA,CAAM,+BAAA,CAAA,CAAA,aAAA,CAA+C,CAAA;AACpF,MAAA,IAAA,CAAKL,KAAK,kBAAA,CAAA;AACd,IAAA,CAAA,CAAA,OAAS7H,KAAAA,EAAO;AACZ,MAAA,IAAA,CAAKF,MAAAA,CAAOE,MAAM,CAAA,EAAGqF,uBAAAA,CAAMC,KAAKC,GAAAA,CAAI,4BAAA,CAAA,CAAA,CAA+B,CAAA;AACnE,MAAA,IAAA,CAAKsC,IAAAA,CAAK,iBAAiB7H,KAAAA,CAAAA;AAC3B,MAAA,MAAMA,KAAAA;IACV,CAAA,SAAA;AACI,MAAA,IAAA,CAAKuM,YAAAA,GAAe,KAAA;AACxB,IAAA;AACJ,EAAA;;;;AAKgB9D,EAAAA,EAAAA,CAAGC,OAAmCC,QAAAA,EAA8C;AAChG,IAAA,KAAA,CAAMF,EAAAA,CAAGC,OAAOC,QAAAA,CAAAA;AACpB,EAAA;;;;AAKgBC,EAAAA,GAAAA,CAAIF,OAAmCC,QAAAA,EAA8C;AACjG,IAAA,KAAA,CAAMC,GAAAA,CAAIF,OAAOC,QAAAA,CAAAA;AACrB,EAAA;;;;AAKA,EAAA,IAAW8D,OAAAA,GAAmB;AAC1B,IAAA,OAAO,IAAA,CAAKD,UAAAA;AAChB,EAAA;;;;AAKA,EAAA,IAAWE,SAAAA,GAAqB;AAC5B,IAAA,OAAO,IAAA,CAAKH,YAAAA;AAChB,EAAA;AACJ","file":"index.cjs","sourcesContent":["/* eslint-disable @typescript-eslint/no-base-to-string */\n/* eslint-disable @typescript-eslint/naming-convention */\nimport { Envapter } from 'envapt';\nimport { createLogger, format, transports } from 'winston';\n\nimport type { ILogger } from '@seedcord/types';\nimport type { Logform, Logger as Winston } from 'winston';\nimport type { ConsoleTransportInstance } from 'winston/lib/winston/transports';\n\n/**\n * Logging service with console and file output support\n *\n * Provides structured logging with timestamps, levels, and labels.\n * Instances are cached by transport name for consistent formatting.\n */\nexport class Logger implements ILogger {\n declare private logger: Winston;\n private static readonly instances = new Map<string, Logger>();\n\n private static instance(prefix: string): Logger {\n let instance = this.instances.get(prefix);\n if (!instance) {\n instance = new Logger(prefix);\n this.instances.set(prefix, instance);\n }\n return instance;\n }\n\n constructor(transportName: string) {\n const consoleTransport = this.createConsoleTransport(transportName);\n this.initializeLogger(consoleTransport);\n }\n\n private getFormatCustomizations(): Logform.Format[] {\n const padding = 7;\n return [\n format.errors({ stack: true }),\n format.splat(),\n format.colorize({ level: true }),\n format.timestamp({ format: 'D MMM, hh:mm:ss a' }),\n format.printf((info: Logform.TransformableInfo) => {\n const ts = String(info.timestamp ?? '');\n const lvl = String(info.level).padEnd(padding);\n const lbl = String(info.label ?? '');\n const msg = String(info.message ?? '');\n\n const base = `${ts} [${lvl}]: ${lbl} - ${msg}`;\n\n const splatSym = Symbol.for('splat');\n const raw = (info as unknown as Record<string | symbol, unknown>)[splatSym];\n const extras = Array.isArray(raw) ? raw : [];\n\n const cleaned = extras\n .filter((x) => !(x instanceof Error))\n .filter((x) => {\n if (!x) return false;\n if (typeof x !== 'object') return true;\n return Object.keys(x as object).length > 0;\n });\n\n let rendered = base;\n\n if (typeof info.stack === 'string') {\n rendered += `\\n${String(info.stack)}`;\n }\n\n if (cleaned.length) {\n const parts: string[] = [];\n for (const x of cleaned) {\n if (typeof x === 'string') parts.push(x);\n else {\n try {\n parts.push(JSON.stringify(x, null, 2));\n } catch {\n parts.push(String(x));\n }\n }\n }\n rendered += `\\n${parts.join(' ')}`;\n }\n\n return rendered;\n })\n ];\n }\n\n private createConsoleTransport(transportName: string): ConsoleTransportInstance {\n return new transports.Console({\n format: format.combine(format.label({ label: transportName }), ...this.getFormatCustomizations()),\n level: Envapter.isDevelopment ? 'silly' : Envapter.isStaging ? 'debug' : 'info'\n });\n }\n\n private initializeLogger(consoleTransport: transports.ConsoleTransportInstance): void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const transportsArray: any[] = [consoleTransport];\n\n // Add file transport only in non-production environments\n if (Envapter.isDevelopment) {\n const maxSizeInMB = 10;\n transportsArray.push(\n new transports.File({\n filename: 'logs/application.log',\n level: 'debug',\n format: format.combine(\n format.uncolorize(),\n format.errors({ stack: true }),\n format.timestamp(),\n format.json({ bigint: true, space: 2 })\n ),\n maxsize: maxSizeInMB * 1024 * 1024, // 10MB\n maxFiles: 5,\n tailable: true\n })\n );\n }\n\n this.logger = createLogger({\n transports: transportsArray\n });\n }\n\n /**\n * Logs an error message with optional additional data.\n *\n * @param msg - The error message to log\n * @param args - Additional data to include in the log entry\n */\n public error(msg: string, ...args: unknown[]): void {\n this.logger.error(msg, ...args);\n }\n\n /**\n * Logs a warning message with optional additional data.\n *\n * @param msg - The warning message to log\n * @param args - Additional data to include in the log entry\n */\n public warn(msg: string, ...args: unknown[]): void {\n this.logger.warn(msg, ...args);\n }\n\n /**\n * Logs an informational message with optional additional data.\n *\n * @param msg - The informational message to log\n * @param args - Additional data to include in the log entry\n */\n public info(msg: string, ...args: unknown[]): void {\n this.logger.info(msg, ...args);\n }\n\n /**\n * Logs an HTTP-related message with optional additional data.\n *\n * @param msg - The HTTP message to log\n * @param args - Additional data to include in the log entry\n */\n public http(msg: string, ...args: unknown[]): void {\n this.logger.http(msg, ...args);\n }\n\n /**\n * Logs a verbose message with optional additional data.\n *\n * @param msg - The verbose message to log\n * @param args - Additional data to include in the log entry\n */\n public verbose(msg: string, ...args: unknown[]): void {\n this.logger.verbose(msg, ...args);\n }\n\n /**\n * Logs a debug message with optional additional data.\n *\n * @param msg - The debug message to log\n * @param args - Additional data to include in the log entry\n */\n public debug(msg: string, ...args: unknown[]): void {\n this.logger.debug(msg, ...args);\n }\n\n /**\n * Logs a silly/trace level message with optional additional data.\n *\n * @param msg - The silly message to log\n * @param args - Additional data to include in the log entry\n */\n public silly(msg: string, ...args: unknown[]): void {\n this.logger.silly(msg, ...args);\n }\n\n /**\n * Static method to log an error message with a specific prefix.\n * Creates or retrieves a logger instance for the given prefix.\n *\n * @param prefix - The logger prefix/label to use\n * @param msg - The error message to log\n * @param args - Additional data to include in the log entry\n */\n public static Error(prefix: string, msg: string, ...args: unknown[]): void {\n const logger = this.instance(prefix);\n logger.error(msg, ...args);\n }\n\n /**\n * Static method to log an informational message with a specific prefix.\n * Creates or retrieves a logger instance for the given prefix.\n *\n * @param prefix - The logger prefix/label to use\n * @param msg - The informational message to log\n * @param args - Additional data to include in the log entry\n */\n public static Info(prefix: string, msg: string, ...args: unknown[]): void {\n const logger = this.instance(prefix);\n logger.info(msg, ...args);\n }\n\n /**\n * Static method to log a warning message with a specific prefix.\n * Creates or retrieves a logger instance for the given prefix.\n *\n * @param prefix - The logger prefix/label to use\n * @param msg - The warning message to log\n * @param args - Additional data to include in the log entry\n */\n public static Warn(prefix: string, msg: string, ...args: unknown[]): void {\n const logger = this.instance(prefix);\n logger.warn(msg, ...args);\n }\n\n /**\n * Static method to log a debug message with a specific prefix.\n * Creates or retrieves a logger instance for the given prefix.\n *\n * @param prefix - The logger prefix/label to use\n * @param msg - The debug message to log\n * @param args - Additional data to include in the log entry\n */\n public static Debug(prefix: string, msg: string, ...args: unknown[]): void {\n const logger = this.instance(prefix);\n logger.debug(msg, ...args);\n }\n\n /**\n * Static method to log a silly/trace level message with a specific prefix.\n * Creates or retrieves a logger instance for the given prefix.\n *\n * @param prefix - The logger prefix/label to use\n * @param msg - The silly message to log\n * @param args - Additional data to include in the log entry\n */\n public static Silly(prefix: string, msg: string, ...args: unknown[]): void {\n const logger = this.instance(prefix);\n logger.silly(msg, ...args);\n }\n}\n","import { Envapter } from 'envapt';\n\nimport { Logger } from './Logger';\n\n/**\n * Configuration options for CooldownManager.\n */\nexport interface CooldownOptions {\n /** Cooldown window in milliseconds (default 1000) */\n cooldown?: number;\n /** Custom error class to throw when a key is still cooling down */\n err?: new (msg: string, ...args: any[]) => Error;\n /** Message passed to the error constructor (default \"Cooldown active\") */\n message?: string;\n}\n\n/**\n * Lightweight utility for per-key cooldowns.\n *\n * Manages time-based restrictions on operations by key,\n * useful for rate limiting, command cooldowns, and spam prevention.\n */\nexport class CooldownManager {\n private readonly window: number;\n private readonly Err: new (msg: string, ...args: any[]) => Error;\n private readonly msg: string;\n private readonly map = new Map<string, number>();\n\n /**\n * Creates a new CooldownManager instance.\n *\n * @param opts - Configuration options for the cooldown behavior\n */\n constructor(opts: CooldownOptions = {}) {\n this.window = opts.cooldown ?? 1_000;\n this.Err = opts.err ?? Error;\n this.msg = opts.message ?? 'Cooldown active';\n }\n\n /**\n * Records usage timestamp for a key without any cooldown checks.\n *\n * @param key - The unique identifier for the cooldown entry\n */\n set(key: string): void {\n this.map.set(key, Date.now());\n }\n\n /**\n * Verifies cooldown status for a key and updates timestamp if not active.\n *\n * If the cooldown is still active, throws the configured error.\n * If not active, updates the timestamp and returns successfully.\n *\n * @param key - The unique identifier to check cooldown for\n * @throws An {@link Err} When the cooldown is still active for the given key\n */\n check(key: string): void {\n const now = Date.now();\n const last = this.map.get(key);\n const remaining = this.window - (now - (last ?? 0));\n\n if (Envapter.isDevelopment && remaining > 0) {\n Logger.Debug('CooldownManager', `${key} - ${remaining}ms remaining`);\n }\n\n if (last !== undefined && remaining > 0) {\n throw new this.Err(this.msg, remaining);\n }\n this.map.set(key, now);\n }\n\n /**\n * Checks if a key is currently cooling down without updating timestamp.\n *\n * @param key - The unique identifier to check\n * @returns True if the key is still cooling down, false otherwise\n */\n isActive(key: string): boolean {\n const last = this.map.get(key);\n return last !== undefined && Date.now() - last < this.window;\n }\n\n /**\n * Removes a key from the cooldown map.\n *\n * @param key - The unique identifier to remove (useful for manual resets)\n */\n clear(key: string): void {\n this.map.delete(key);\n }\n}\n","/* eslint-disable no-magic-numbers */\n\nexport enum SeedcordErrorCode {\n ConfigMissingDiscordToken = 1001,\n ConfigUnknownExceptionWebhookMissing = 1002,\n ConfigUnknownExceptionWebhookInvalid = 1003,\n\n LifecycleAddAfterCompletion = 1101,\n LifecycleAddDuringRun = 1102,\n LifecycleRemoveDuringRun = 1103,\n LifecycleUnknownPhase = 1104,\n LifecyclePhaseFailures = 1105,\n LifecycleTaskTimeout = 1106,\n\n CoreSingletonViolation = 1201,\n CorePluginAfterInit = 1202,\n CorePluginKeyExists = 1203,\n CoreClientUserUnavailable = 1204,\n CoreBotRoleMissing = 1205,\n\n DecoratorInteractionEventFilter = 1301,\n DecoratorMethodNotFound = 1302,\n DecoratorCommandAlreadyRegistered = 1303,\n DecoratorCommandGlobalWithGuilds = 1304,\n DecoratorCommandGuildWithoutGuilds = 1305,\n DecoratorInvalidMiddlewarePriority = 1306,\n\n UtilHexInputType = 1401,\n UtilHexInvalid = 1402,\n UtilInvalidSlashRouteArgument = 1403,\n\n PluginMongoServiceDecoratorMissing = 2101,\n PluginMongoModelDecoratorMissing = 2102,\n PluginMongoConnectionFailed = 2103,\n\n PluginKpgServiceDecoratorMissing = 2201,\n PluginKpgServiceTableMissing = 2202,\n PluginKpgInvalidStepCount = 2203,\n PluginKpgUnknownDirection = 2204,\n PluginKpgUnresolvedMigrationsPath = 2205,\n PluginKpgNoMigrationFiles = 2206,\n PluginKpgInvalidMigrationModule = 2207,\n PluginKpgNonErrorFailure = 2208\n}\n","import { SeedcordErrorCode } from './ErrorCodes';\n\nconst messages = {\n [SeedcordErrorCode.ConfigMissingDiscordToken]: () => 'Missing DISCORD_BOT_TOKEN environment variable.',\n [SeedcordErrorCode.ConfigUnknownExceptionWebhookMissing]: () =>\n 'Missing UNKNOWN_EXCEPTION_WEBHOOK_URL environment variable.',\n [SeedcordErrorCode.ConfigUnknownExceptionWebhookInvalid]: () => 'Invalid UNKNOWN_EXCEPTION_WEBHOOK_URL value.',\n\n [SeedcordErrorCode.LifecycleAddAfterCompletion]: () =>\n 'Cannot add tasks after startup sequence has already completed.',\n [SeedcordErrorCode.LifecycleAddDuringRun]: () => 'Cannot add tasks while startup sequence is in progress.',\n [SeedcordErrorCode.LifecycleRemoveDuringRun]: () => 'Cannot remove tasks while startup sequence is in progress.',\n [SeedcordErrorCode.LifecycleUnknownPhase]: (phase: unknown) => `Unknown phase: ${String(phase)}.`,\n [SeedcordErrorCode.LifecyclePhaseFailures]: (phase: string, failures: number) =>\n `Phase ${phase} completed with ${failures} failed task${failures === 1 ? '' : 's'}.`,\n [SeedcordErrorCode.LifecycleTaskTimeout]: (taskName: string, timeout: number) =>\n `Task \"${taskName}\" timed out after ${timeout}ms.`,\n\n [SeedcordErrorCode.CoreSingletonViolation]: () =>\n 'Seedcord can only be instantiated once. Use the existing instance instead.',\n [SeedcordErrorCode.CorePluginAfterInit]: () => 'Cannot attach a plugin after initialization.',\n [SeedcordErrorCode.CorePluginKeyExists]: (key: string) => `Plugin with key \"${key}\" already exists.`,\n [SeedcordErrorCode.CoreClientUserUnavailable]: () => 'Client user is not available.',\n [SeedcordErrorCode.CoreBotRoleMissing]: (guildId?: string) =>\n guildId ? `Bot role not found in guild ${guildId}.` : 'Bot role not found in guild.',\n\n [SeedcordErrorCode.DecoratorInteractionEventFilter]: () => 'Interaction middleware cannot specify event filters.',\n [SeedcordErrorCode.DecoratorMethodNotFound]: () =>\n 'Decorator could not locate the original method. Ensure the method exists before applying the decorator.',\n [SeedcordErrorCode.DecoratorCommandAlreadyRegistered]: (\n commandName: string,\n existingScope: string,\n requestedScope: string\n ) =>\n `Command \"${commandName}\" is already registered as a \"${existingScope}\" command and cannot be re-registered as a \"${requestedScope}\" command.`,\n [SeedcordErrorCode.DecoratorCommandGlobalWithGuilds]: () =>\n 'RegisterCommand(\"global\") cannot have guilds specified.',\n [SeedcordErrorCode.DecoratorCommandGuildWithoutGuilds]: () =>\n 'RegisterCommand(\"guild\") requires a non-empty guilds array.',\n [SeedcordErrorCode.DecoratorInvalidMiddlewarePriority]: () => 'Middleware priority must be a finite number.',\n\n [SeedcordErrorCode.UtilHexInputType]: () => 'hexToNumber expects a string input.',\n [SeedcordErrorCode.UtilHexInvalid]: () => 'Invalid hex string.',\n [SeedcordErrorCode.UtilInvalidSlashRouteArgument]: () => 'Invalid argument passed to buildSlashRoute.',\n\n [SeedcordErrorCode.PluginMongoServiceDecoratorMissing]: (className: string) =>\n `Missing @RegisterMongoService on ${className}.`,\n [SeedcordErrorCode.PluginMongoModelDecoratorMissing]: (className: string) =>\n `Missing @RegisterMongoModel on ${className}.`,\n [SeedcordErrorCode.PluginMongoConnectionFailed]: (databaseName?: string) =>\n databaseName ? `Could not connect to MongoDB (${databaseName}).` : 'Could not connect to MongoDB.',\n\n [SeedcordErrorCode.PluginKpgServiceDecoratorMissing]: (className: string) =>\n `Missing @RegisterKpgService on ${className}.`,\n [SeedcordErrorCode.PluginKpgServiceTableMissing]: (className: string) =>\n `Missing table metadata for ${className}. Provide a table via @RegisterKpgService().`,\n [SeedcordErrorCode.PluginKpgInvalidStepCount]: () => 'Migration step count must be a non-negative integer.',\n [SeedcordErrorCode.PluginKpgUnknownDirection]: (direction: unknown) =>\n `Unknown migration direction: ${String(direction)}.`,\n [SeedcordErrorCode.PluginKpgUnresolvedMigrationsPath]: (label: string) =>\n `Unable to resolve migrations at path: ${label}.`,\n [SeedcordErrorCode.PluginKpgNoMigrationFiles]: () => 'No migration files provided.',\n [SeedcordErrorCode.PluginKpgInvalidMigrationModule]: (filePath: string) =>\n `Migration file ${filePath} must export async functions up and down.`,\n [SeedcordErrorCode.PluginKpgNonErrorFailure]: (message: string) => `Migration failure: ${message}.`\n} as const;\n\nexport type SeedcordErrorArguments<TCode extends SeedcordErrorCode> = Parameters<(typeof messages)[TCode]>;\n\nexport function formatSeedcordErrorMessage<TCode extends SeedcordErrorCode>(\n code: TCode,\n args?: SeedcordErrorArguments<TCode>\n): string {\n const formatter = messages[code];\n const resolvedArgs = (args ?? []) as unknown[];\n return (formatter as (...params: unknown[]) => string)(...resolvedArgs);\n}\n\nexport { messages as seedcordErrorMessages };\n","import chalk from 'chalk';\n\nimport { SeedcordErrorCode } from './ErrorCodes';\nimport { formatSeedcordErrorMessage, type SeedcordErrorArguments } from './ErrorMessages';\n\nexport type SeedcordErrorIdentifier = keyof typeof SeedcordErrorCode;\n\nexport interface SeedcordErrorOptions extends ErrorOptions {}\n\nfunction resolveIdentifier(code: SeedcordErrorCode): SeedcordErrorIdentifier {\n return SeedcordErrorCode[code] as SeedcordErrorIdentifier;\n}\n\nfunction resolveMessage(code: SeedcordErrorCode, args?: SeedcordErrorArguments<SeedcordErrorCode>): string {\n return formatSeedcordErrorMessage(code, args);\n}\n\nfunction formatErrorName(name: string, _identifier: SeedcordErrorIdentifier, code: SeedcordErrorCode): string {\n return `${chalk.bold.red(name)}[${chalk.gray(code)}]`;\n}\n\nexport class SeedcordError extends Error {\n public readonly code: SeedcordErrorCode;\n public readonly identifier: SeedcordErrorIdentifier;\n\n constructor(\n code: SeedcordErrorCode,\n args?: SeedcordErrorArguments<SeedcordErrorCode>,\n options?: SeedcordErrorOptions\n ) {\n const message = resolveMessage(code, args);\n super(message, options);\n this.code = code;\n this.identifier = resolveIdentifier(code);\n this.name = formatErrorName(new.target.name, this.identifier, this.code);\n Object.setPrototypeOf(this, new.target.prototype);\n if (typeof Error.captureStackTrace === 'function') {\n Error.captureStackTrace(this, new.target);\n }\n }\n}\n\nexport class SeedcordTypeError extends TypeError {\n public readonly code: SeedcordErrorCode;\n public readonly identifier: SeedcordErrorIdentifier;\n\n constructor(\n code: SeedcordErrorCode,\n args?: SeedcordErrorArguments<SeedcordErrorCode>,\n options?: SeedcordErrorOptions\n ) {\n const message = resolveMessage(code, args);\n super(message, options);\n this.code = code;\n this.identifier = resolveIdentifier(code);\n this.name = formatErrorName(new.target.name, this.identifier, this.code);\n Object.setPrototypeOf(this, new.target.prototype);\n if (typeof Error.captureStackTrace === 'function') {\n Error.captureStackTrace(this, new.target);\n }\n }\n}\n\nexport class SeedcordRangeError extends RangeError {\n public readonly code: SeedcordErrorCode;\n public readonly identifier: SeedcordErrorIdentifier;\n\n constructor(\n code: SeedcordErrorCode,\n args?: SeedcordErrorArguments<SeedcordErrorCode>,\n options?: SeedcordErrorOptions\n ) {\n const message = resolveMessage(code, args);\n super(message, options);\n this.code = code;\n this.identifier = resolveIdentifier(code);\n this.name = formatErrorName(new.target.name, this.identifier, this.code);\n Object.setPrototypeOf(this, new.target.prototype);\n if (typeof Error.captureStackTrace === 'function') {\n Error.captureStackTrace(this, new.target);\n }\n }\n}\n\nexport const SeedcordErrors = {\n Error: SeedcordError,\n TypeError: SeedcordTypeError,\n RangeError: SeedcordRangeError\n} as const;\n\nexport type AnySeedcordError = SeedcordError | SeedcordTypeError | SeedcordRangeError;\n\nexport function isSeedcordError(error: unknown): error is AnySeedcordError {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'code' in error &&\n typeof (error as { code: unknown }).code === 'number' &&\n 'identifier' in error &&\n typeof (error as { identifier: unknown }).identifier === 'string'\n );\n}\n","/*\n * Inspired by Akka Coordinated Shutdown: https://doc.akka.io/libraries/akka-core/current/coordinated-shutdown.html\n * and Lewis's implementation in a private repo elsewhere (https://github.com/Yomanz)\n */\n\nimport { EventEmitter } from 'node:events';\n\nimport chalk from 'chalk';\n\nimport { SeedcordError, SeedcordErrorCode } from '../Errors';\nimport { Logger } from '../Logger';\n\nimport type { LifecycleTask } from './LifecycleTypes';\n\n/**\n * Abstract base class for coordinated lifecycle management (startup/shutdown)\n */\nexport abstract class CoordinatedLifecycle<TPhase extends number> {\n protected readonly logger: Logger;\n protected readonly events = new EventEmitter();\n protected readonly tasksMap = new Map<TPhase, LifecycleTask[]>();\n\n protected constructor(\n loggerName: string,\n protected readonly phaseOrder: TPhase[],\n protected readonly phaseEnum: Record<number, string>\n ) {\n this.logger = new Logger(loggerName);\n // Initialize phases\n this.phaseOrder.forEach((phase) => this.tasksMap.set(phase, []));\n }\n\n /**\n * Adds a lifecycle task to a specific phase.\n *\n * Tasks are executed in phase order during lifecycle operations.\n * Each task has a timeout to prevent hanging operations.\n *\n * @param phase - The lifecycle phase to add the task to\n * @param taskName - Unique name for the task (used for logging and removal)\n * @param task - Async function to execute during the phase\n * @param timeoutMs - Maximum time allowed for task execution in milliseconds\n * @example\n * ```typescript\n * lifecycle.addTask(StartupPhase.Services, 'start-database', async () => {\n * await database.connect();\n * }, 10000);\n * ```\n */\n public addTask(phase: TPhase, taskName: string, task: () => Promise<void>, timeoutMs: number): void {\n if (!this.canAddTask()) return;\n\n const tasks = this.tasksMap.get(phase);\n if (!tasks) {\n throw new SeedcordError(SeedcordErrorCode.LifecycleUnknownPhase, [phase]);\n }\n\n tasks.push({ name: taskName, task, timeout: timeoutMs });\n this.logger.debug(\n `${chalk.italic('Added')} ${this.getTaskType()} task ${chalk.bold.cyan(taskName)} to phase ${chalk.bold.magenta(this.phaseEnum[phase])}`\n );\n }\n\n /**\n * Removes a lifecycle task from a specific phase.\n *\n * @param phase - The lifecycle phase to remove the task from\n * @param taskName - Name of the task to remove\n * @returns True if the task was found and removed, false otherwise\n */\n public removeTask(phase: TPhase, taskName: string): boolean {\n if (!this.canRemoveTask()) return false;\n\n const tasks = this.tasksMap.get(phase);\n if (!tasks) return false;\n\n const initialLength = tasks.length;\n const filteredTasks = tasks.filter((task) => task.name !== taskName);\n this.tasksMap.set(phase, filteredTasks);\n\n const removed = initialLength !== filteredTasks.length;\n if (removed) {\n this.logger.debug(\n `${chalk.italic('Removed')} ${this.getTaskType()} task ${chalk.bold.cyan(taskName)} from phase ${chalk.bold.magenta(this.phaseEnum[phase])}`\n );\n }\n\n return removed;\n }\n\n /**\n * Run all tasks in a specific phase\n */\n protected async runPhase(phase: TPhase): Promise<void> {\n const tasks = this.tasksMap.get(phase) ?? [];\n if (tasks.length === 0) {\n this.logger.warn(`No tasks to run in phase ${chalk.bold.magenta(this.phaseEnum[phase])}`);\n return;\n }\n\n this.logger.info(\n `${chalk.bold.yellow('Running')} ${this.getTaskType()} phase ${chalk.bold.magenta(this.phaseEnum[phase])} with ${chalk.bold.cyan(tasks.length)} tasks`\n );\n this.emit(`phase:${phase}:start`);\n\n // Execute all tasks with the execution strategy\n const results: PromiseSettledResult<void>[] = await this.executeTasksInPhase(phase, tasks);\n\n // Check results\n const failures = results.filter((r) => r.status === 'rejected').length;\n if (failures > 0) {\n throw new SeedcordError(SeedcordErrorCode.LifecyclePhaseFailures, [\n chalk.bold.magenta(this.phaseEnum[phase]),\n failures\n ]);\n } else {\n this.logger.info(\n `Phase ${chalk.bold.magenta(this.phaseEnum[phase])} ${chalk.bold.green('completed successfully')}`\n );\n }\n\n this.emit(`phase:${phase}:complete`);\n }\n\n /**\n * Run a single task with timeout\n */\n protected async runTaskWithTimeout(phase: TPhase, task: LifecycleTask): Promise<void> {\n this.logger.info(\n `${chalk.italic('Starting')} task ${chalk.bold.cyan(task.name)} in phase ${chalk.bold.magenta(this.phaseEnum[phase])}`\n );\n\n try {\n // Create a race between the task and a timeout\n await Promise.race([\n task.task(),\n new Promise<void>((_, reject) => {\n setTimeout(() => {\n reject(new SeedcordError(SeedcordErrorCode.LifecycleTaskTimeout, [task.name, task.timeout]));\n }, task.timeout);\n })\n ]);\n\n this.logger.info(\n `${chalk.italic('Completed')} task ${chalk.bold.cyan(task.name)} in phase ${chalk.bold.magenta(this.phaseEnum[phase])}`\n );\n } catch (error) {\n this.logger.error(\n `${chalk.italic('Failed')} task ${chalk.bold.cyan(task.name)} in phase ${chalk.bold.magenta(this.phaseEnum[phase])}:`,\n error\n );\n throw error;\n }\n }\n\n /**\n * Subscribe to lifecycle events\n */\n public on(event: string, listener: (...args: unknown[]) => void): void {\n this.events.on(event, listener);\n }\n\n /**\n * Unsubscribe from lifecycle events\n */\n public off(event: string, listener: (...args: unknown[]) => void): void {\n this.events.off(event, listener);\n }\n\n protected emit(event: string, ...args: unknown[]): boolean {\n return this.events.emit(event, ...args);\n }\n\n // Abstract methods to be implemented by subclasses\n protected abstract canAddTask(): boolean;\n protected abstract canRemoveTask(): boolean;\n protected abstract getTaskType(): string;\n protected abstract executeTasksInPhase(\n phase: TPhase,\n tasks: LifecycleTask[]\n ): Promise<PromiseSettledResult<void>[]>;\n}\n","import chalk from 'chalk';\nimport { Envapt } from 'envapt';\n\nimport { CoordinatedLifecycle } from './CoordinatedLifecycle';\n\nimport type { LifecycleTask, PhaseEvents } from './LifecycleTypes';\nimport type { UnionToTuple } from 'type-fest';\n\n/**\n * Shutdown phases for coordinated application shutdown.\n */\nexport enum ShutdownPhase {\n /** Stop accepting new requests/interactions */\n StopAcceptingRequests = 1,\n /** Stop background services (health checks, etc.) */\n StopServices,\n /** Disconnect from external resources (database, APIs) */\n ExternalResources,\n /** Disconnect from Discord */\n DiscordCleanup,\n /** Final cleanup tasks */\n FinalCleanup\n}\n\n/** Define the order of phases */\nconst PHASE_ORDER: ShutdownPhase[] = [\n ShutdownPhase.StopAcceptingRequests,\n ShutdownPhase.StopServices,\n ShutdownPhase.ExternalResources,\n ShutdownPhase.DiscordCleanup,\n ShutdownPhase.FinalCleanup\n];\n\n/**\n * Event keys for coordinated shutdown phases\n */\nexport type CoordinatedShutdownEventKey = PhaseEvents<'shutdown', UnionToTuple<ShutdownPhase>>;\n\nconst LOG_FLUSH_DELAY_MS = 500;\n\n/**\n * CoordinatedShutdown manages graceful application shutdown by executing registered tasks across defined phases.\n *\n * It listens for termination signals (SIGINT, SIGTERM) and runs tasks in parallel within each phase.\n * Tasks can be added or removed dynamically, and each task has an associated timeout.\n *\n * Enable or disable the shutdown mechanism via the SHUTDOWN_IS_ENABLED environment variable. It's disabled by default. I recommend enabling it in production environments.\n */\nexport class CoordinatedShutdown extends CoordinatedLifecycle<ShutdownPhase> {\n @Envapt('SHUTDOWN_IS_ENABLED', { fallback: false })\n declare private readonly isShutdownEnabled: boolean;\n\n private isShuttingDown = false;\n private exitCode = 0;\n\n public constructor() {\n super('CoordinatedShutdown', PHASE_ORDER, ShutdownPhase);\n\n // Register signal effects\n this.registerSignalHandlers();\n }\n\n protected canAddTask(): boolean {\n return this.isShutdownEnabled;\n }\n\n protected canRemoveTask(): boolean {\n return true;\n }\n\n protected getTaskType(): string {\n return 'shutdown';\n }\n\n protected async executeTasksInPhase(\n phase: ShutdownPhase,\n tasks: LifecycleTask[]\n ): Promise<PromiseSettledResult<void>[]> {\n // Execute all tasks in parallel (unlike startup which uses sequential)\n const results: PromiseSettledResult<void>[] = [];\n for (const task of tasks) {\n results.push(\n await Promise.resolve()\n .then(() => this.runTaskWithTimeout(phase, task))\n .then(\n () => ({ status: 'fulfilled', value: undefined }) satisfies PromiseSettledResult<void>,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n (reason) => ({ status: 'rejected', reason }) satisfies PromiseSettledResult<void>\n )\n );\n }\n return results;\n }\n\n private registerSignalHandlers(): void {\n if (!this.isShutdownEnabled) return;\n\n process.on('SIGTERM', () => {\n this.logger.info(`Received ${chalk.yellow.bold('SIGTERM')} signal`);\n void this.run(0);\n });\n\n process.on('SIGINT', () => {\n this.logger.info(`Received ${chalk.yellow.bold('SIGINT')} signal`);\n void this.run(0);\n });\n }\n\n /**\n * Adds a task to a specific shutdown phase with timeout.\n *\n * @param phase - The shutdown phase from {@link ShutdownPhase}\n * @param taskName - Unique identifier for the task\n * @param task - Async function to execute\n * @param timeoutMs - Task timeout in milliseconds (default: 5000)\n */\n public override addTask(phase: ShutdownPhase, taskName: string, task: () => Promise<void>, timeoutMs = 5000): void {\n super.addTask(phase, taskName, task, timeoutMs);\n }\n\n /**\n * Removes a task from a specific shutdown phase.\n *\n * @param phase - The shutdown phase to remove from\n * @param taskName - Name of the task to remove\n * @returns True if task was found and removed\n */\n public override removeTask(phase: ShutdownPhase, taskName: string): boolean {\n return super.removeTask(phase, taskName);\n }\n\n /**\n * Executes the coordinated shutdown sequence.\n *\n * Runs all registered tasks across shutdown phases in reverse order.\n * Tasks within each phase are executed in parallel for faster shutdown.\n * Process exits with the specified code when complete.\n *\n * @param exitCode - Process exit code (default: `0`)\n * @returns Promise that resolves when shutdown is complete\n * @example\n * ```typescript\n * shutdown.addTask(ShutdownPhase.Services, 'database', () => db.disconnect(), 5000);\n * await shutdown.run(0); // Graceful shutdown\n * ```\n */\n public async run(exitCode = 0): Promise<void> {\n if (this.isShuttingDown) {\n this.logger.warn('Shutdown sequence already in progress');\n return;\n }\n\n this.isShuttingDown = true;\n this.exitCode = exitCode;\n this.logger.info(\n `${chalk.bold.yellow('Starting')} coordinated shutdown with exit code ${chalk.bold.cyan(exitCode)}`\n );\n this.emit('shutdown:start');\n\n try {\n // Execute each phase in order\n for (const phase of PHASE_ORDER) {\n await this.runPhase(phase);\n }\n\n this.logger.info(`${chalk.bold.green('Coordinated shutdown completed')} successfully`);\n this.emit('shutdown:complete');\n } catch (error) {\n this.logger.error(`${chalk.bold.red('Coordinated shutdown failed')}`);\n this.emit('shutdown:error', error);\n } finally {\n this.logger.info(`${chalk.bold.red('Exiting')} process with code ${chalk.bold.cyan(this.exitCode)}`);\n setTimeout(() => {\n process.exit(this.exitCode);\n }, LOG_FLUSH_DELAY_MS);\n }\n }\n\n /**\n * Subscribe to shutdown events\n */\n public override on(event: CoordinatedShutdownEventKey, listener: (...args: unknown[]) => void): void {\n super.on(event, listener);\n }\n\n /**\n * Unsubscribe from shutdown events\n */\n public override off(event: CoordinatedShutdownEventKey, listener: (...args: unknown[]) => void): void {\n super.off(event, listener);\n }\n}\n","import { createServer } from 'http';\n\nimport chalk from 'chalk';\nimport { Envapt } from 'envapt';\n\nimport { CoordinatedShutdown, ShutdownPhase } from './Lifecycle/CoordinatedShutdown';\nimport { Logger } from './Logger';\n\nimport type { IncomingMessage, Server, ServerResponse } from 'http';\n\nconst HTTP_OK = 200;\nconst HTTP_NOT_FOUND = 404;\n\n/**\n * HTTP health check service for monitoring bot status.\n *\n * Provides a simple HTTP endpoint that responds with JSON status\n * information, useful for container orchestration and monitoring.\n */\nexport class HealthCheck {\n public readonly logger = new Logger('HealthCheck');\n\n /**\n * Set `PORT` in your `.env` to change the default port (6956).\n */\n @Envapt('HEALTH_CHECK_PORT', { fallback: 6956 })\n declare public readonly port: number;\n\n /**\n * Set `HEALTH_CHECK_PATH` in your `.env` to change the default path (`/healthcheck`).\n */\n @Envapt('HEALTH_CHECK_PATH', { fallback: '/healthcheck' })\n declare public readonly path: string;\n\n /**\n * Set `HEALTH_CHECK_HOST` in your `.env` to change the host. Defaults to `null` (all interfaces).\n */\n @Envapt('HEALTH_CHECK_HOST')\n declare public readonly host: string | null;\n\n private server?: Server;\n\n constructor(shutdown: CoordinatedShutdown) {\n // Register shutdown task\n shutdown.addTask(ShutdownPhase.StopServices, 'stop-healthcheck-server', async () => await this.stop());\n }\n\n /**\n * Starts the health check server.\n * @returns Promise that resolves when the server is listening\n */\n public async init(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n this.server = createServer((req: IncomingMessage, res: ServerResponse) => {\n if (req.method === 'GET' && req.url === this.path) {\n res.writeHead(HTTP_OK, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ status: 'ok', timestamp: Date.now() }));\n } else {\n res.writeHead(HTTP_NOT_FOUND, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ status: 'not found' }));\n }\n });\n\n this.server.on('error', reject);\n this.server.once('listening', () => {\n const address = this.host ?? 'localhost';\n this.logger.info(\n `${chalk.green.bold('✓')} Health check server listening on ${chalk.cyan(`http://${address}:${this.port}${this.path}`)}`\n );\n resolve();\n });\n\n if (this.host) {\n this.logger.debug(`Binding health check server to ${this.host}`);\n this.server.listen(this.port, this.host);\n } else {\n this.logger.debug('Binding health check server to all interfaces');\n this.server.listen(this.port);\n }\n });\n }\n\n /**\n * Stops the health check server.\n *\n * @returns Promise that resolves when the server is closed\n */\n public stop(): Promise<void> {\n if (this.server !== undefined) {\n const server = this.server;\n return new Promise((resolve) => {\n server.once('close', () => resolve());\n\n server.close(() => {\n this.logger.info(chalk.bold.red('Health check server stopped'));\n });\n });\n }\n\n return Promise.resolve();\n }\n}\n","import { EventEmitter } from 'node:events';\n\n/** Tuple type used for all event payloads. */\nexport type SEArgsTuple = readonly unknown[];\n\n/** Convenience map for emitters that intentionally expose no events. */\nexport type SENoEvents = Record<never, SEArgsTuple>;\n\n/**\n * Accepts any object type and constrains every value to be a tuple.\n *\n * @typeParam TEvents - Map of event names to readonly tuple payloads\n */\nexport type SEEventMapLike<TEvents extends object> = { [K in keyof TEvents]: SEArgsTuple };\n\n/**\n * Narrows a provided event map to the keys that can be emitted or listened for.\n *\n * @typeParam TEvents - Map of event names to readonly tuple payloads\n * @internal\n */\nexport type SEEventKey<TEvents extends object> = Extract<keyof TEvents, string | symbol>;\n\n/**\n * Typed wrapper around Node.js {@link EventEmitter} enforcing tuple payloads per event name.\n *\n * @typeParam TEvents - Map of event names to readonly tuple payloads\n */\nexport class StrictEventEmitter<TEvents extends SEEventMapLike<TEvents>> extends EventEmitter {\n /**\n * Registers a persistent listener with tuple-safe arguments for the given event.\n *\n * @param event - The event name to attach to\n * @param listener - Callback operating on the typed argument tuple for the event\n * @returns This emitter instance for chaining\n */\n override on<TEventKey extends SEEventKey<TEvents>>(\n event: TEventKey,\n listener: (...args: TEvents[TEventKey]) => void\n ): this {\n return super.on(event, listener as unknown as (...args: unknown[]) => void);\n }\n\n /**\n * Registers a one time listener that is removed after the first invocation.\n *\n * @param event - The event name to attach to\n * @param listener - Callback operating on the typed argument tuple for the event\n * @returns This emitter instance for chaining\n */\n override once<TEventKey extends SEEventKey<TEvents>>(\n event: TEventKey,\n listener: (...args: TEvents[TEventKey]) => void\n ): this {\n return super.once(event, listener as unknown as (...args: unknown[]) => void);\n }\n\n /**\n * Removes a previously registered listener for the given event.\n *\n * @param event - The event name whose listener should be removed\n * @param listener - Callback originally registered for the event\n * @returns This emitter instance for chaining\n */\n override off<TEventKey extends SEEventKey<TEvents>>(\n event: TEventKey,\n listener: (...args: TEvents[TEventKey]) => void\n ): this {\n return super.off(event, listener as unknown as (...args: unknown[]) => void);\n }\n\n /**\n * Alias of {@link StrictEventEmitter.on} for compatibility with Node.js EventEmitter APIs.\n *\n * @param event - The event name to attach to\n * @param listener - Callback operating on the typed argument tuple for the event\n * @returns This emitter instance for chaining\n */\n override addListener<TEventKey extends SEEventKey<TEvents>>(\n event: TEventKey,\n listener: (...args: TEvents[TEventKey]) => void\n ): this {\n return this.on(event, listener);\n }\n\n /**\n * Alias of {@link StrictEventEmitter.off} for compatibility with Node.js EventEmitter APIs.\n *\n * @param event - The event name whose listener should be removed\n * @param listener - Callback originally registered for the event\n * @returns This emitter instance for chaining\n */\n override removeListener<TEventKey extends SEEventKey<TEvents>>(\n event: TEventKey,\n listener: (...args: TEvents[TEventKey]) => void\n ): this {\n return super.removeListener(event, listener as unknown as (...args: unknown[]) => void);\n }\n\n /**\n * Emits an event with the strictly typed argument tuple for the event name.\n *\n * @param event - The event name to emit\n * @param args - Tuple payload for the event\n * @returns True when the event had listeners, false otherwise\n */\n override emit<TEventKey extends SEEventKey<TEvents>>(event: TEventKey, ...args: TEvents[TEventKey]): boolean {\n return super.emit(event, ...(args as unknown as unknown[]));\n }\n\n /**\n * Retrieves the listener list for a given event with the correct tuple signature.\n *\n * @param event - The event name to inspect\n * @returns Array of listeners registered for the event\n */\n override listeners<TEventKey extends SEEventKey<TEvents>>(\n event: TEventKey\n ): ((...args: TEvents[TEventKey]) => void)[] {\n return super.listeners(event) as ((...args: TEvents[TEventKey]) => void)[];\n }\n\n /**\n * Counts listeners for an event without widening the return type of {@link EventEmitter.listenerCount}.\n *\n * @param event - The event name to inspect\n * @returns The total number of listeners registered for the event\n */\n listenerCountTyped<TEventKey extends SEEventKey<TEvents>>(event: TEventKey): number {\n return super.listenerCount(event);\n }\n\n /**\n * Returns the list of event names known to the emitter with the mapped key type.\n *\n * @returns Array of event keys supported by the emitter\n */\n eventNamesTyped(): SEEventKey<TEvents>[] {\n return super.eventNames() as SEEventKey<TEvents>[];\n }\n\n /**\n * Waits for an event to be emitted, resolving with the listener arguments tuple once triggered.\n * Supports optional abort signals and timeouts for cancellation semantics.\n *\n * @param event - The event name to wait for\n * @param opts - Optional abort signal or timeout in milliseconds\n * @returns Promise resolving with the emitted argument tuple; rejects when aborted or timed out\n */\n waitFor<TEventKey extends SEEventKey<TEvents>>(\n event: TEventKey,\n opts?: { signal?: AbortSignal; timeoutMs?: number }\n ): Promise<TEvents[TEventKey]> {\n return new Promise<TEvents[TEventKey]>((resolve, reject) => {\n const onEvent = (...args: TEvents[TEventKey]): void => {\n cleanup();\n resolve(args);\n };\n\n const onAbort = (): void => {\n cleanup();\n reject(Object.assign(new Error('Aborted'), { name: 'AbortError' }));\n };\n\n let timeoutId: NodeJS.Timeout | null = null;\n\n const cleanup = (): void => {\n this.off(event, onEvent);\n opts?.signal?.removeEventListener('abort', onAbort);\n if (timeoutId) clearTimeout(timeoutId);\n };\n\n this.once(event, onEvent);\n\n if (opts?.signal) {\n if (opts.signal.aborted) return onAbort();\n opts.signal.addEventListener('abort', onAbort, { once: true });\n }\n\n if (opts?.timeoutMs !== undefined) {\n timeoutId = setTimeout(() => {\n cleanup();\n reject(new Error('Timed out'));\n }, opts.timeoutMs);\n }\n });\n }\n}\n","import chalk from 'chalk';\n\nimport { SeedcordError, SeedcordErrorCode } from '../Errors';\nimport { CoordinatedLifecycle } from './CoordinatedLifecycle';\n\nimport type { LifecycleTask, PhaseEvents } from './LifecycleTypes';\nimport type { UnionToTuple } from 'type-fest';\n\n/**\n * Startup phases for coordinated initialization\n *\n * Defines the order in which different components are initialized during bot startup.\n */\nexport enum StartupPhase {\n /** Validate environment variables and config files */\n Validation = 1,\n /** Discover plugin constructors via decorators or registry */\n Discovery,\n /** Register plugin metadata and declared dependencies */\n Registration,\n /** Inject and validate plugin-specific configuration */\n Configuration,\n /** Instantiate plugin classes with Core and arguments */\n Instantiation,\n /** Activate plugins by calling their init/setup effects */\n Activation,\n /** Mark seedcord as ready and start handling interactions */\n Ready\n}\n\n/** Define the order of phases */\nconst PHASE_ORDER: StartupPhase[] = [\n StartupPhase.Validation,\n StartupPhase.Discovery,\n StartupPhase.Registration,\n StartupPhase.Configuration,\n StartupPhase.Instantiation,\n StartupPhase.Activation,\n StartupPhase.Ready\n];\n\n/**\n * Event keys for coordinated startup phases\n */\nexport type CoordinatedStartupEventKey = PhaseEvents<'startup', UnionToTuple<StartupPhase>>;\n\n/**\n * Manages bot startup lifecycle with ordered phases\n *\n * Coordinates initialization of all bot components in a predictable sequence.\n * Tasks are executed within their designated phases to ensure proper dependency order.\n */\nexport class CoordinatedStartup extends CoordinatedLifecycle<StartupPhase> {\n private isStartingUp = false;\n private hasStarted = false;\n\n public constructor() {\n super('CoordinatedStartup', PHASE_ORDER, StartupPhase);\n }\n\n /**\n * Adds a task to a specific startup phase with timeout.\n *\n * @param phase - The startup phase from {@link StartupPhase}\n * @param taskName - Unique identifier for the task\n * @param task - Async function to execute\n * @param timeoutMs - Task timeout in milliseconds (default: 10000)\n */\n public override addTask(phase: StartupPhase, taskName: string, task: () => Promise<void>, timeoutMs = 10000): void {\n super.addTask(phase, taskName, task, timeoutMs);\n }\n\n protected canAddTask(): boolean {\n if (this.hasStarted) {\n throw new SeedcordError(SeedcordErrorCode.LifecycleAddAfterCompletion);\n }\n\n if (this.isStartingUp) {\n throw new SeedcordError(SeedcordErrorCode.LifecycleAddDuringRun);\n }\n\n return true;\n }\n\n protected canRemoveTask(): boolean {\n if (this.isStartingUp) {\n throw new SeedcordError(SeedcordErrorCode.LifecycleRemoveDuringRun);\n }\n\n return true;\n }\n\n protected getTaskType(): string {\n return 'startup';\n }\n\n protected async executeTasksInPhase(\n phase: StartupPhase,\n tasks: LifecycleTask[]\n ): Promise<PromiseSettledResult<void>[]> {\n // Execute all tasks in sequence\n const results: PromiseSettledResult<void>[] = [];\n for (const task of tasks) {\n results.push(\n await Promise.resolve()\n .then(() => this.runTaskWithTimeout(phase, task))\n .then(\n () => ({ status: 'fulfilled', value: undefined }) satisfies PromiseSettledResult<void>,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n (reason) => ({ status: 'rejected', reason }) satisfies PromiseSettledResult<void>\n )\n );\n }\n return results;\n }\n\n /**\n * Executes the coordinated startup sequence.\n *\n * Runs all registered tasks across startup phases in the correct order.\n * Each phase completes before the next phase begins. Tasks within a phase\n * are executed sequentially to maintain predictable initialization.\n *\n * @returns Promise that resolves when startup is complete\n * @throws An {@link Error} If startup fails or is called multiple times\n * @example\n * ```typescript\n * const startup = new CoordinatedStartup();\n * startup.addTask(StartupPhase.Services, 'database', () => db.connect(), 10000);\n * await startup.run();\n * ```\n */\n public async run(): Promise<void> {\n if (this.hasStarted) {\n this.logger.warn('Startup sequence has already completed');\n return;\n }\n\n if (this.isStartingUp) {\n this.logger.warn('Startup sequence already in progress');\n return;\n }\n\n this.isStartingUp = true;\n this.logger.info(`${chalk.bold.green('Starting')} coordinated startup sequence`);\n this.emit('startup:start');\n\n try {\n // Execute each phase in order\n for (const phase of PHASE_ORDER) await this.runPhase(phase);\n\n this.hasStarted = true;\n this.logger.info(`${chalk.bold.green('Coordinated startup completed')} successfully`);\n this.emit('startup:complete');\n } catch (error) {\n this.logger.error(`${chalk.bold.red('Coordinated startup failed')}`);\n this.emit('startup:error', error);\n throw error;\n } finally {\n this.isStartingUp = false;\n }\n }\n\n /**\n * Subscribe to startup events\n */\n public override on(event: CoordinatedStartupEventKey, listener: (...args: unknown[]) => void): void {\n super.on(event, listener);\n }\n\n /**\n * Unsubscribe from startup events\n */\n public override off(event: CoordinatedStartupEventKey, listener: (...args: unknown[]) => void): void {\n super.off(event, listener);\n }\n\n /**\n * Check if startup has completed\n */\n public get isReady(): boolean {\n return this.hasStarted;\n }\n\n /**\n * Check if startup is currently running\n */\n public get isRunning(): boolean {\n return this.isStartingUp;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/Logger.ts","../src/CooldownManager.ts","../src/Errors/ErrorCodes.ts","../src/Errors/ErrorMessages.ts","../src/Errors/SeedcordError.ts","../src/Lifecycle/CoordinatedLifecycle.ts","../src/Lifecycle/CoordinatedShutdown.ts","../src/HealthCheck.ts","../src/StrictEventEmitter.ts","../src/Lifecycle/CoordinatedStartup.ts"],"names":["Logger","instances","Map","instance","prefix","get","set","transportName","consoleTransport","createConsoleTransport","initializeLogger","getFormatCustomizations","padding","format","errors","stack","splat","colorize","level","timestamp","printf","info","ts","String","lvl","padEnd","lbl","label","msg","message","base","splatSym","Symbol","for","raw","extras","Array","isArray","cleaned","filter","x","Error","Object","keys","length","rendered","parts","push","JSON","stringify","join","transports","Console","combine","Envapter","isDevelopment","isStaging","transportsArray","maxSizeInMB","File","filename","uncolorize","json","bigint","space","maxsize","maxFiles","tailable","logger","createLogger","error","args","warn","http","verbose","debug","silly","Info","Warn","Debug","Silly","CooldownManager","window","Err","map","opts","cooldown","err","key","Date","now","check","last","remaining","undefined","isActive","clear","delete","SeedcordErrorCode","messages","ConfigMissingDiscordToken","ConfigUnknownExceptionWebhookMissing","ConfigUnknownExceptionWebhookInvalid","LifecycleAddAfterCompletion","LifecycleAddDuringRun","LifecycleRemoveDuringRun","LifecycleUnknownPhase","phase","LifecyclePhaseFailures","failures","LifecycleTaskTimeout","taskName","timeout","CoreSingletonViolation","CorePluginAfterInit","CorePluginKeyExists","CoreBotRoleMissing","guildId","DecoratorInteractionEventFilter","DecoratorMethodNotFound","DecoratorCommandAlreadyRegistered","commandName","existingScope","requestedScope","DecoratorCommandGlobalWithGuilds","DecoratorCommandGuildWithoutGuilds","DecoratorInvalidMiddlewarePriority","UtilHexInputType","UtilHexInvalid","UtilInvalidSlashRouteArgument","PluginMongoServiceDecoratorMissing","className","PluginMongoModelDecoratorMissing","PluginMongoConnectionFailed","databaseName","PluginKpgServiceDecoratorMissing","PluginKpgServiceTableMissing","PluginKpgInvalidStepCount","PluginKpgUnknownDirection","direction","PluginKpgUnresolvedMigrationsPath","PluginKpgNoMigrationFiles","PluginKpgInvalidMigrationModule","filePath","PluginKpgNonErrorFailure","formatSeedcordErrorMessage","code","formatter","resolvedArgs","resolveIdentifier","resolveMessage","formatErrorName","name","_identifier","chalk","bold","red","gray","SeedcordError","identifier","options","setPrototypeOf","prototype","captureStackTrace","SeedcordTypeError","TypeError","SeedcordRangeError","RangeError","SeedcordErrors","isSeedcordError","CoordinatedLifecycle","events","EventEmitter","tasksMap","loggerName","phaseOrder","phaseEnum","forEach","addTask","task","timeoutMs","canAddTask","tasks","italic","getTaskType","cyan","magenta","removeTask","canRemoveTask","initialLength","filteredTasks","removed","runPhase","yellow","emit","results","executeTasksInPhase","r","status","green","runTaskWithTimeout","Promise","race","_","reject","setTimeout","on","event","listener","off","ShutdownPhase","PHASE_ORDER","LOG_FLUSH_DELAY_MS","CoordinatedShutdown","isShuttingDown","exitCode","registerSignalHandlers","isShutdownEnabled","resolve","then","value","reason","process","run","exit","fallback","HTTP_OK","HTTP_NOT_FOUND","HealthCheck","server","shutdown","StopServices","stop","init","createServer","req","res","method","url","path","writeHead","end","once","address","host","port","listen","close","StrictEventEmitter","addListener","removeListener","listeners","listenerCountTyped","listenerCount","eventNamesTyped","eventNames","waitFor","onEvent","cleanup","onAbort","assign","timeoutId","signal","removeEventListener","aborted","addEventListener","StartupPhase","CoordinatedStartup","isStartingUp","hasStarted","isReady","isRunning"],"mappings":"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","file":"index.cjs","sourcesContent":["/* eslint-disable @typescript-eslint/no-base-to-string */\n/* eslint-disable @typescript-eslint/naming-convention */\nimport { Envapter } from 'envapt';\nimport { createLogger, format, transports } from 'winston';\n\nimport type { ILogger } from '@seedcord/types';\nimport type { Logform, Logger as Winston } from 'winston';\nimport type { ConsoleTransportInstance } from 'winston/lib/winston/transports';\n\n/**\n * Logging service with console and file output support\n *\n * Provides structured logging with timestamps, levels, and labels.\n * Instances are cached by transport name for consistent formatting.\n */\nexport class Logger implements ILogger {\n declare private logger: Winston;\n private static readonly instances = new Map<string, Logger>();\n\n private static instance(prefix: string): Logger {\n let instance = this.instances.get(prefix);\n if (!instance) {\n instance = new Logger(prefix);\n this.instances.set(prefix, instance);\n }\n return instance;\n }\n\n constructor(transportName: string) {\n const consoleTransport = this.createConsoleTransport(transportName);\n this.initializeLogger(consoleTransport);\n }\n\n private getFormatCustomizations(): Logform.Format[] {\n const padding = 7;\n return [\n format.errors({ stack: true }),\n format.splat(),\n format.colorize({ level: true }),\n format.timestamp({ format: 'D MMM, hh:mm:ss a' }),\n format.printf((info: Logform.TransformableInfo) => {\n const ts = String(info.timestamp ?? '');\n const lvl = String(info.level).padEnd(padding);\n const lbl = String(info.label ?? '');\n const msg = String(info.message ?? '');\n\n const base = `${ts} [${lvl}]: ${lbl} - ${msg}`;\n\n const splatSym = Symbol.for('splat');\n const raw = (info as unknown as Record<string | symbol, unknown>)[splatSym];\n const extras = Array.isArray(raw) ? raw : [];\n\n const cleaned = extras\n .filter((x) => !(x instanceof Error))\n .filter((x) => {\n if (!x) return false;\n if (typeof x !== 'object') return true;\n return Object.keys(x as object).length > 0;\n });\n\n let rendered = base;\n\n if (typeof info.stack === 'string') {\n rendered += `\\n${String(info.stack)}`;\n }\n\n if (cleaned.length) {\n const parts: string[] = [];\n for (const x of cleaned) {\n if (typeof x === 'string') parts.push(x);\n else {\n try {\n parts.push(JSON.stringify(x, null, 2));\n } catch {\n parts.push(String(x));\n }\n }\n }\n rendered += `\\n${parts.join(' ')}`;\n }\n\n return rendered;\n })\n ];\n }\n\n private createConsoleTransport(transportName: string): ConsoleTransportInstance {\n return new transports.Console({\n format: format.combine(format.label({ label: transportName }), ...this.getFormatCustomizations()),\n level: Envapter.isDevelopment ? 'silly' : Envapter.isStaging ? 'debug' : 'info'\n });\n }\n\n private initializeLogger(consoleTransport: transports.ConsoleTransportInstance): void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const transportsArray: any[] = [consoleTransport];\n\n // Add file transport only in non-production environments\n if (Envapter.isDevelopment) {\n const maxSizeInMB = 10;\n transportsArray.push(\n new transports.File({\n filename: 'logs/application.log',\n level: 'debug',\n format: format.combine(\n format.uncolorize(),\n format.errors({ stack: true }),\n format.timestamp(),\n format.json({ bigint: true, space: 2 })\n ),\n maxsize: maxSizeInMB * 1024 * 1024, // 10MB\n maxFiles: 5,\n tailable: true\n })\n );\n }\n\n this.logger = createLogger({\n transports: transportsArray\n });\n }\n\n /**\n * Logs an error message with optional additional data.\n *\n * @param msg - The error message to log\n * @param args - Additional data to include in the log entry\n */\n public error(msg: string, ...args: unknown[]): void {\n this.logger.error(msg, ...args);\n }\n\n /**\n * Logs a warning message with optional additional data.\n *\n * @param msg - The warning message to log\n * @param args - Additional data to include in the log entry\n */\n public warn(msg: string, ...args: unknown[]): void {\n this.logger.warn(msg, ...args);\n }\n\n /**\n * Logs an informational message with optional additional data.\n *\n * @param msg - The informational message to log\n * @param args - Additional data to include in the log entry\n */\n public info(msg: string, ...args: unknown[]): void {\n this.logger.info(msg, ...args);\n }\n\n /**\n * Logs an HTTP-related message with optional additional data.\n *\n * @param msg - The HTTP message to log\n * @param args - Additional data to include in the log entry\n */\n public http(msg: string, ...args: unknown[]): void {\n this.logger.http(msg, ...args);\n }\n\n /**\n * Logs a verbose message with optional additional data.\n *\n * @param msg - The verbose message to log\n * @param args - Additional data to include in the log entry\n */\n public verbose(msg: string, ...args: unknown[]): void {\n this.logger.verbose(msg, ...args);\n }\n\n /**\n * Logs a debug message with optional additional data.\n *\n * @param msg - The debug message to log\n * @param args - Additional data to include in the log entry\n */\n public debug(msg: string, ...args: unknown[]): void {\n this.logger.debug(msg, ...args);\n }\n\n /**\n * Logs a silly/trace level message with optional additional data.\n *\n * @param msg - The silly message to log\n * @param args - Additional data to include in the log entry\n */\n public silly(msg: string, ...args: unknown[]): void {\n this.logger.silly(msg, ...args);\n }\n\n /**\n * Static method to log an error message with a specific prefix.\n * Creates or retrieves a logger instance for the given prefix.\n *\n * @param prefix - The logger prefix/label to use\n * @param msg - The error message to log\n * @param args - Additional data to include in the log entry\n */\n public static Error(prefix: string, msg: string, ...args: unknown[]): void {\n const logger = this.instance(prefix);\n logger.error(msg, ...args);\n }\n\n /**\n * Static method to log an informational message with a specific prefix.\n * Creates or retrieves a logger instance for the given prefix.\n *\n * @param prefix - The logger prefix/label to use\n * @param msg - The informational message to log\n * @param args - Additional data to include in the log entry\n */\n public static Info(prefix: string, msg: string, ...args: unknown[]): void {\n const logger = this.instance(prefix);\n logger.info(msg, ...args);\n }\n\n /**\n * Static method to log a warning message with a specific prefix.\n * Creates or retrieves a logger instance for the given prefix.\n *\n * @param prefix - The logger prefix/label to use\n * @param msg - The warning message to log\n * @param args - Additional data to include in the log entry\n */\n public static Warn(prefix: string, msg: string, ...args: unknown[]): void {\n const logger = this.instance(prefix);\n logger.warn(msg, ...args);\n }\n\n /**\n * Static method to log a debug message with a specific prefix.\n * Creates or retrieves a logger instance for the given prefix.\n *\n * @param prefix - The logger prefix/label to use\n * @param msg - The debug message to log\n * @param args - Additional data to include in the log entry\n */\n public static Debug(prefix: string, msg: string, ...args: unknown[]): void {\n const logger = this.instance(prefix);\n logger.debug(msg, ...args);\n }\n\n /**\n * Static method to log a silly/trace level message with a specific prefix.\n * Creates or retrieves a logger instance for the given prefix.\n *\n * @param prefix - The logger prefix/label to use\n * @param msg - The silly message to log\n * @param args - Additional data to include in the log entry\n */\n public static Silly(prefix: string, msg: string, ...args: unknown[]): void {\n const logger = this.instance(prefix);\n logger.silly(msg, ...args);\n }\n}\n","import { Envapter } from 'envapt';\n\nimport { Logger } from './Logger';\n\n/**\n * Configuration options for CooldownManager.\n */\nexport interface CooldownOptions {\n /** Cooldown window in milliseconds (default 1000) */\n cooldown?: number;\n /** Custom error class to throw when a key is still cooling down */\n err?: new (msg: string, ...args: any[]) => Error;\n /** Message passed to the error constructor (default \"Cooldown active\") */\n message?: string;\n}\n\n/**\n * Lightweight utility for per-key cooldowns.\n *\n * Manages time-based restrictions on operations by key,\n * useful for rate limiting, command cooldowns, and spam prevention.\n */\nexport class CooldownManager {\n private readonly window: number;\n private readonly Err: new (msg: string, ...args: any[]) => Error;\n private readonly msg: string;\n private readonly map = new Map<string, number>();\n\n /**\n * Creates a new CooldownManager instance.\n *\n * @param opts - Configuration options for the cooldown behavior\n */\n constructor(opts: CooldownOptions = {}) {\n this.window = opts.cooldown ?? 1_000;\n this.Err = opts.err ?? Error;\n this.msg = opts.message ?? 'Cooldown active';\n }\n\n /**\n * Records usage timestamp for a key without any cooldown checks.\n *\n * @param key - The unique identifier for the cooldown entry\n */\n set(key: string): void {\n this.map.set(key, Date.now());\n }\n\n /**\n * Verifies cooldown status for a key and updates timestamp if not active.\n *\n * If the cooldown is still active, throws the configured error.\n * If not active, updates the timestamp and returns successfully.\n *\n * @param key - The unique identifier to check cooldown for\n * @throws An {@link Err} When the cooldown is still active for the given key\n */\n check(key: string): void {\n const now = Date.now();\n const last = this.map.get(key);\n const remaining = this.window - (now - (last ?? 0));\n\n if (Envapter.isDevelopment && remaining > 0) {\n Logger.Debug('CooldownManager', `${key} - ${remaining}ms remaining`);\n }\n\n if (last !== undefined && remaining > 0) {\n throw new this.Err(this.msg, remaining);\n }\n this.map.set(key, now);\n }\n\n /**\n * Checks if a key is currently cooling down without updating timestamp.\n *\n * @param key - The unique identifier to check\n * @returns True if the key is still cooling down, false otherwise\n */\n isActive(key: string): boolean {\n const last = this.map.get(key);\n return last !== undefined && Date.now() - last < this.window;\n }\n\n /**\n * Removes a key from the cooldown map.\n *\n * @param key - The unique identifier to remove (useful for manual resets)\n */\n clear(key: string): void {\n this.map.delete(key);\n }\n}\n","/* eslint-disable no-magic-numbers */\n\nexport enum SeedcordErrorCode {\n ConfigMissingDiscordToken = 1001,\n ConfigUnknownExceptionWebhookMissing = 1002,\n ConfigUnknownExceptionWebhookInvalid = 1003,\n\n LifecycleAddAfterCompletion = 1101,\n LifecycleAddDuringRun = 1102,\n LifecycleRemoveDuringRun = 1103,\n LifecycleUnknownPhase = 1104,\n LifecyclePhaseFailures = 1105,\n LifecycleTaskTimeout = 1106,\n\n CoreSingletonViolation = 1201,\n CorePluginAfterInit = 1202,\n CorePluginKeyExists = 1203,\n CoreBotRoleMissing = 1204,\n\n DecoratorInteractionEventFilter = 1301,\n DecoratorMethodNotFound = 1302,\n DecoratorCommandAlreadyRegistered = 1303,\n DecoratorCommandGlobalWithGuilds = 1304,\n DecoratorCommandGuildWithoutGuilds = 1305,\n DecoratorInvalidMiddlewarePriority = 1306,\n\n UtilHexInputType = 1401,\n UtilHexInvalid = 1402,\n UtilInvalidSlashRouteArgument = 1403,\n\n PluginMongoServiceDecoratorMissing = 2101,\n PluginMongoModelDecoratorMissing = 2102,\n PluginMongoConnectionFailed = 2103,\n\n PluginKpgServiceDecoratorMissing = 2201,\n PluginKpgServiceTableMissing = 2202,\n PluginKpgInvalidStepCount = 2203,\n PluginKpgUnknownDirection = 2204,\n PluginKpgUnresolvedMigrationsPath = 2205,\n PluginKpgNoMigrationFiles = 2206,\n PluginKpgInvalidMigrationModule = 2207,\n PluginKpgNonErrorFailure = 2208\n}\n","import { SeedcordErrorCode } from './ErrorCodes';\n\nconst messages = {\n [SeedcordErrorCode.ConfigMissingDiscordToken]: () => 'Missing DISCORD_BOT_TOKEN environment variable.',\n [SeedcordErrorCode.ConfigUnknownExceptionWebhookMissing]: () =>\n 'Missing UNKNOWN_EXCEPTION_WEBHOOK_URL environment variable.',\n [SeedcordErrorCode.ConfigUnknownExceptionWebhookInvalid]: () => 'Invalid UNKNOWN_EXCEPTION_WEBHOOK_URL value.',\n\n [SeedcordErrorCode.LifecycleAddAfterCompletion]: () =>\n 'Cannot add tasks after startup sequence has already completed.',\n [SeedcordErrorCode.LifecycleAddDuringRun]: () => 'Cannot add tasks while startup sequence is in progress.',\n [SeedcordErrorCode.LifecycleRemoveDuringRun]: () => 'Cannot remove tasks while startup sequence is in progress.',\n [SeedcordErrorCode.LifecycleUnknownPhase]: (phase: unknown) => `Unknown phase: ${String(phase)}.`,\n [SeedcordErrorCode.LifecyclePhaseFailures]: (phase: string, failures: number) =>\n `Phase ${phase} completed with ${failures} failed task${failures === 1 ? '' : 's'}.`,\n [SeedcordErrorCode.LifecycleTaskTimeout]: (taskName: string, timeout: number) =>\n `Task \"${taskName}\" timed out after ${timeout}ms.`,\n\n [SeedcordErrorCode.CoreSingletonViolation]: () =>\n 'Seedcord can only be instantiated once. Use the existing instance instead.',\n [SeedcordErrorCode.CorePluginAfterInit]: () => 'Cannot attach a plugin after initialization.',\n [SeedcordErrorCode.CorePluginKeyExists]: (key: string) => `Plugin with key \"${key}\" already exists.`,\n [SeedcordErrorCode.CoreBotRoleMissing]: (guildId?: string) =>\n guildId ? `Bot role not found in guild ${guildId}.` : 'Bot role not found in guild.',\n\n [SeedcordErrorCode.DecoratorInteractionEventFilter]: () => 'Interaction middleware cannot specify event filters.',\n [SeedcordErrorCode.DecoratorMethodNotFound]: () =>\n 'Decorator could not locate the original method. Ensure the method exists before applying the decorator.',\n [SeedcordErrorCode.DecoratorCommandAlreadyRegistered]: (\n commandName: string,\n existingScope: string,\n requestedScope: string\n ) =>\n `Command \"${commandName}\" is already registered as a \"${existingScope}\" command and cannot be re-registered as a \"${requestedScope}\" command.`,\n [SeedcordErrorCode.DecoratorCommandGlobalWithGuilds]: () =>\n 'RegisterCommand(\"global\") cannot have guilds specified.',\n [SeedcordErrorCode.DecoratorCommandGuildWithoutGuilds]: () =>\n 'RegisterCommand(\"guild\") requires a non-empty guilds array.',\n [SeedcordErrorCode.DecoratorInvalidMiddlewarePriority]: () => 'Middleware priority must be a finite number.',\n\n [SeedcordErrorCode.UtilHexInputType]: () => 'hexToNumber expects a string input.',\n [SeedcordErrorCode.UtilHexInvalid]: () => 'Invalid hex string.',\n [SeedcordErrorCode.UtilInvalidSlashRouteArgument]: () => 'Invalid argument passed to buildSlashRoute.',\n\n [SeedcordErrorCode.PluginMongoServiceDecoratorMissing]: (className: string) =>\n `Missing @RegisterMongoService on ${className}.`,\n [SeedcordErrorCode.PluginMongoModelDecoratorMissing]: (className: string) =>\n `Missing @RegisterMongoModel on ${className}.`,\n [SeedcordErrorCode.PluginMongoConnectionFailed]: (databaseName?: string) =>\n databaseName ? `Could not connect to MongoDB (${databaseName}).` : 'Could not connect to MongoDB.',\n\n [SeedcordErrorCode.PluginKpgServiceDecoratorMissing]: (className: string) =>\n `Missing @RegisterKpgService on ${className}.`,\n [SeedcordErrorCode.PluginKpgServiceTableMissing]: (className: string) =>\n `Missing table metadata for ${className}. Provide a table via @RegisterKpgService().`,\n [SeedcordErrorCode.PluginKpgInvalidStepCount]: () => 'Migration step count must be a non-negative integer.',\n [SeedcordErrorCode.PluginKpgUnknownDirection]: (direction: unknown) =>\n `Unknown migration direction: ${String(direction)}.`,\n [SeedcordErrorCode.PluginKpgUnresolvedMigrationsPath]: (label: string) =>\n `Unable to resolve migrations at path: ${label}.`,\n [SeedcordErrorCode.PluginKpgNoMigrationFiles]: () => 'No migration files provided.',\n [SeedcordErrorCode.PluginKpgInvalidMigrationModule]: (filePath: string) =>\n `Migration file ${filePath} must export async functions up and down.`,\n [SeedcordErrorCode.PluginKpgNonErrorFailure]: (message: string) => `Migration failure: ${message}.`\n} as const;\n\nexport type SeedcordErrorArguments<TCode extends SeedcordErrorCode> = Parameters<(typeof messages)[TCode]>;\n\nexport function formatSeedcordErrorMessage<TCode extends SeedcordErrorCode>(\n code: TCode,\n args?: SeedcordErrorArguments<TCode>\n): string {\n const formatter = messages[code];\n const resolvedArgs = (args ?? []) as unknown[];\n return (formatter as (...params: unknown[]) => string)(...resolvedArgs);\n}\n\nexport { messages as seedcordErrorMessages };\n","import chalk from 'chalk';\n\nimport { SeedcordErrorCode } from './ErrorCodes';\nimport { formatSeedcordErrorMessage, type SeedcordErrorArguments } from './ErrorMessages';\n\nexport type SeedcordErrorIdentifier = keyof typeof SeedcordErrorCode;\n\nexport interface SeedcordErrorOptions extends ErrorOptions {}\n\nfunction resolveIdentifier(code: SeedcordErrorCode): SeedcordErrorIdentifier {\n return SeedcordErrorCode[code] as SeedcordErrorIdentifier;\n}\n\nfunction resolveMessage(code: SeedcordErrorCode, args?: SeedcordErrorArguments<SeedcordErrorCode>): string {\n return formatSeedcordErrorMessage(code, args);\n}\n\nfunction formatErrorName(name: string, _identifier: SeedcordErrorIdentifier, code: SeedcordErrorCode): string {\n return `${chalk.bold.red(name)}[${chalk.gray(code)}]`;\n}\n\nexport class SeedcordError extends Error {\n public readonly code: SeedcordErrorCode;\n public readonly identifier: SeedcordErrorIdentifier;\n\n constructor(\n code: SeedcordErrorCode,\n args?: SeedcordErrorArguments<SeedcordErrorCode>,\n options?: SeedcordErrorOptions\n ) {\n const message = resolveMessage(code, args);\n super(message, options);\n this.code = code;\n this.identifier = resolveIdentifier(code);\n this.name = formatErrorName(new.target.name, this.identifier, this.code);\n Object.setPrototypeOf(this, new.target.prototype);\n if (typeof Error.captureStackTrace === 'function') {\n Error.captureStackTrace(this, new.target);\n }\n }\n}\n\nexport class SeedcordTypeError extends TypeError {\n public readonly code: SeedcordErrorCode;\n public readonly identifier: SeedcordErrorIdentifier;\n\n constructor(\n code: SeedcordErrorCode,\n args?: SeedcordErrorArguments<SeedcordErrorCode>,\n options?: SeedcordErrorOptions\n ) {\n const message = resolveMessage(code, args);\n super(message, options);\n this.code = code;\n this.identifier = resolveIdentifier(code);\n this.name = formatErrorName(new.target.name, this.identifier, this.code);\n Object.setPrototypeOf(this, new.target.prototype);\n if (typeof Error.captureStackTrace === 'function') {\n Error.captureStackTrace(this, new.target);\n }\n }\n}\n\nexport class SeedcordRangeError extends RangeError {\n public readonly code: SeedcordErrorCode;\n public readonly identifier: SeedcordErrorIdentifier;\n\n constructor(\n code: SeedcordErrorCode,\n args?: SeedcordErrorArguments<SeedcordErrorCode>,\n options?: SeedcordErrorOptions\n ) {\n const message = resolveMessage(code, args);\n super(message, options);\n this.code = code;\n this.identifier = resolveIdentifier(code);\n this.name = formatErrorName(new.target.name, this.identifier, this.code);\n Object.setPrototypeOf(this, new.target.prototype);\n if (typeof Error.captureStackTrace === 'function') {\n Error.captureStackTrace(this, new.target);\n }\n }\n}\n\nexport const SeedcordErrors = {\n Error: SeedcordError,\n TypeError: SeedcordTypeError,\n RangeError: SeedcordRangeError\n} as const;\n\nexport type AnySeedcordError = SeedcordError | SeedcordTypeError | SeedcordRangeError;\n\nexport function isSeedcordError(error: unknown): error is AnySeedcordError {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'code' in error &&\n typeof (error as { code: unknown }).code === 'number' &&\n 'identifier' in error &&\n typeof (error as { identifier: unknown }).identifier === 'string'\n );\n}\n","/*\n * Inspired by Akka Coordinated Shutdown: https://doc.akka.io/libraries/akka-core/current/coordinated-shutdown.html\n * and Lewis's implementation in a private repo elsewhere (https://github.com/Yomanz)\n */\n\nimport { EventEmitter } from 'node:events';\n\nimport chalk from 'chalk';\n\nimport { SeedcordError, SeedcordErrorCode } from '../Errors';\nimport { Logger } from '../Logger';\n\nimport type { LifecycleTask } from './LifecycleTypes';\n\n/**\n * Abstract base class for coordinated lifecycle management (startup/shutdown)\n */\nexport abstract class CoordinatedLifecycle<TPhase extends number> {\n protected readonly logger: Logger;\n protected readonly events = new EventEmitter();\n protected readonly tasksMap = new Map<TPhase, LifecycleTask[]>();\n\n protected constructor(\n loggerName: string,\n protected readonly phaseOrder: TPhase[],\n protected readonly phaseEnum: Record<number, string>\n ) {\n this.logger = new Logger(loggerName);\n // Initialize phases\n this.phaseOrder.forEach((phase) => this.tasksMap.set(phase, []));\n }\n\n /**\n * Adds a lifecycle task to a specific phase.\n *\n * Tasks are executed in phase order during lifecycle operations.\n * Each task has a timeout to prevent hanging operations.\n *\n * @param phase - The lifecycle phase to add the task to\n * @param taskName - Unique name for the task (used for logging and removal)\n * @param task - Async function to execute during the phase\n * @param timeoutMs - Maximum time allowed for task execution in milliseconds\n * @example\n * ```typescript\n * lifecycle.addTask(StartupPhase.Services, 'start-database', async () => {\n * await database.connect();\n * }, 10000);\n * ```\n */\n public addTask(phase: TPhase, taskName: string, task: () => Promise<void>, timeoutMs: number): void {\n if (!this.canAddTask()) return;\n\n const tasks = this.tasksMap.get(phase);\n if (!tasks) {\n throw new SeedcordError(SeedcordErrorCode.LifecycleUnknownPhase, [phase]);\n }\n\n tasks.push({ name: taskName, task, timeout: timeoutMs });\n this.logger.debug(\n `${chalk.italic('Added')} ${this.getTaskType()} task ${chalk.bold.cyan(taskName)} to phase ${chalk.bold.magenta(this.phaseEnum[phase])}`\n );\n }\n\n /**\n * Removes a lifecycle task from a specific phase.\n *\n * @param phase - The lifecycle phase to remove the task from\n * @param taskName - Name of the task to remove\n * @returns True if the task was found and removed, false otherwise\n */\n public removeTask(phase: TPhase, taskName: string): boolean {\n if (!this.canRemoveTask()) return false;\n\n const tasks = this.tasksMap.get(phase);\n if (!tasks) return false;\n\n const initialLength = tasks.length;\n const filteredTasks = tasks.filter((task) => task.name !== taskName);\n this.tasksMap.set(phase, filteredTasks);\n\n const removed = initialLength !== filteredTasks.length;\n if (removed) {\n this.logger.debug(\n `${chalk.italic('Removed')} ${this.getTaskType()} task ${chalk.bold.cyan(taskName)} from phase ${chalk.bold.magenta(this.phaseEnum[phase])}`\n );\n }\n\n return removed;\n }\n\n /**\n * Run all tasks in a specific phase\n */\n protected async runPhase(phase: TPhase): Promise<void> {\n const tasks = this.tasksMap.get(phase) ?? [];\n if (tasks.length === 0) {\n this.logger.warn(`No tasks to run in phase ${chalk.bold.magenta(this.phaseEnum[phase])}`);\n return;\n }\n\n this.logger.info(\n `${chalk.bold.yellow('Running')} ${this.getTaskType()} phase ${chalk.bold.magenta(this.phaseEnum[phase])} with ${chalk.bold.cyan(tasks.length)} tasks`\n );\n this.emit(`phase:${phase}:start`);\n\n // Execute all tasks with the execution strategy\n const results: PromiseSettledResult<void>[] = await this.executeTasksInPhase(phase, tasks);\n\n // Check results\n const failures = results.filter((r) => r.status === 'rejected').length;\n if (failures > 0) {\n throw new SeedcordError(SeedcordErrorCode.LifecyclePhaseFailures, [\n chalk.bold.magenta(this.phaseEnum[phase]),\n failures\n ]);\n } else {\n this.logger.info(\n `Phase ${chalk.bold.magenta(this.phaseEnum[phase])} ${chalk.bold.green('completed successfully')}`\n );\n }\n\n this.emit(`phase:${phase}:complete`);\n }\n\n /**\n * Run a single task with timeout\n */\n protected async runTaskWithTimeout(phase: TPhase, task: LifecycleTask): Promise<void> {\n this.logger.info(\n `${chalk.italic('Starting')} task ${chalk.bold.cyan(task.name)} in phase ${chalk.bold.magenta(this.phaseEnum[phase])}`\n );\n\n try {\n // Create a race between the task and a timeout\n await Promise.race([\n task.task(),\n new Promise<void>((_, reject) => {\n setTimeout(() => {\n reject(new SeedcordError(SeedcordErrorCode.LifecycleTaskTimeout, [task.name, task.timeout]));\n }, task.timeout);\n })\n ]);\n\n this.logger.info(\n `${chalk.italic('Completed')} task ${chalk.bold.cyan(task.name)} in phase ${chalk.bold.magenta(this.phaseEnum[phase])}`\n );\n } catch (error) {\n this.logger.error(\n `${chalk.italic('Failed')} task ${chalk.bold.cyan(task.name)} in phase ${chalk.bold.magenta(this.phaseEnum[phase])}:`,\n error\n );\n throw error;\n }\n }\n\n /**\n * Subscribe to lifecycle events\n */\n public on(event: string, listener: (...args: unknown[]) => void): void {\n this.events.on(event, listener);\n }\n\n /**\n * Unsubscribe from lifecycle events\n */\n public off(event: string, listener: (...args: unknown[]) => void): void {\n this.events.off(event, listener);\n }\n\n protected emit(event: string, ...args: unknown[]): boolean {\n return this.events.emit(event, ...args);\n }\n\n // Abstract methods to be implemented by subclasses\n protected abstract canAddTask(): boolean;\n protected abstract canRemoveTask(): boolean;\n protected abstract getTaskType(): string;\n protected abstract executeTasksInPhase(\n phase: TPhase,\n tasks: LifecycleTask[]\n ): Promise<PromiseSettledResult<void>[]>;\n}\n","import chalk from 'chalk';\nimport { Envapt } from 'envapt';\n\nimport { CoordinatedLifecycle } from './CoordinatedLifecycle';\n\nimport type { LifecycleTask, PhaseEvents } from './LifecycleTypes';\nimport type { UnionToTuple } from 'type-fest';\n\n/**\n * Shutdown phases for coordinated application shutdown.\n */\nexport enum ShutdownPhase {\n /** Stop accepting new requests/interactions */\n StopAcceptingRequests = 1,\n /** Stop background services (health checks, etc.) */\n StopServices,\n /** Disconnect from external resources (database, APIs) */\n ExternalResources,\n /** Disconnect from Discord */\n DiscordCleanup,\n /** Final cleanup tasks */\n FinalCleanup\n}\n\n/** Define the order of phases */\nconst PHASE_ORDER: ShutdownPhase[] = [\n ShutdownPhase.StopAcceptingRequests,\n ShutdownPhase.StopServices,\n ShutdownPhase.ExternalResources,\n ShutdownPhase.DiscordCleanup,\n ShutdownPhase.FinalCleanup\n];\n\n/**\n * Event keys for coordinated shutdown phases\n */\nexport type CoordinatedShutdownEventKey = PhaseEvents<'shutdown', UnionToTuple<ShutdownPhase>>;\n\nconst LOG_FLUSH_DELAY_MS = 500;\n\n/**\n * CoordinatedShutdown manages graceful application shutdown by executing registered tasks across defined phases.\n *\n * It listens for termination signals (SIGINT, SIGTERM) and runs tasks in parallel within each phase.\n * Tasks can be added or removed dynamically, and each task has an associated timeout.\n *\n * Enable or disable the shutdown mechanism via the SHUTDOWN_IS_ENABLED environment variable. It's disabled by default. I recommend enabling it in production environments.\n */\nexport class CoordinatedShutdown extends CoordinatedLifecycle<ShutdownPhase> {\n @Envapt('SHUTDOWN_IS_ENABLED', { fallback: false })\n declare private readonly isShutdownEnabled: boolean;\n\n private isShuttingDown = false;\n private exitCode = 0;\n\n public constructor() {\n super('CoordinatedShutdown', PHASE_ORDER, ShutdownPhase);\n\n // Register signal effects\n this.registerSignalHandlers();\n }\n\n protected canAddTask(): boolean {\n return this.isShutdownEnabled;\n }\n\n protected canRemoveTask(): boolean {\n return true;\n }\n\n protected getTaskType(): string {\n return 'shutdown';\n }\n\n protected async executeTasksInPhase(\n phase: ShutdownPhase,\n tasks: LifecycleTask[]\n ): Promise<PromiseSettledResult<void>[]> {\n // Execute all tasks in parallel (unlike startup which uses sequential)\n const results: PromiseSettledResult<void>[] = [];\n for (const task of tasks) {\n results.push(\n await Promise.resolve()\n .then(() => this.runTaskWithTimeout(phase, task))\n .then(\n () => ({ status: 'fulfilled', value: undefined }) satisfies PromiseSettledResult<void>,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n (reason) => ({ status: 'rejected', reason }) satisfies PromiseSettledResult<void>\n )\n );\n }\n return results;\n }\n\n private registerSignalHandlers(): void {\n if (!this.isShutdownEnabled) return;\n\n process.on('SIGTERM', () => {\n this.logger.info(`Received ${chalk.yellow.bold('SIGTERM')} signal`);\n void this.run(0);\n });\n\n process.on('SIGINT', () => {\n this.logger.info(`Received ${chalk.yellow.bold('SIGINT')} signal`);\n void this.run(0);\n });\n }\n\n /**\n * Adds a task to a specific shutdown phase with timeout.\n *\n * @param phase - The shutdown phase from {@link ShutdownPhase}\n * @param taskName - Unique identifier for the task\n * @param task - Async function to execute\n * @param timeoutMs - Task timeout in milliseconds (default: 5000)\n */\n public override addTask(phase: ShutdownPhase, taskName: string, task: () => Promise<void>, timeoutMs = 5000): void {\n super.addTask(phase, taskName, task, timeoutMs);\n }\n\n /**\n * Removes a task from a specific shutdown phase.\n *\n * @param phase - The shutdown phase to remove from\n * @param taskName - Name of the task to remove\n * @returns True if task was found and removed\n */\n public override removeTask(phase: ShutdownPhase, taskName: string): boolean {\n return super.removeTask(phase, taskName);\n }\n\n /**\n * Executes the coordinated shutdown sequence.\n *\n * Runs all registered tasks across shutdown phases in reverse order.\n * Tasks within each phase are executed in parallel for faster shutdown.\n * Process exits with the specified code when complete.\n *\n * @param exitCode - Process exit code (default: `0`)\n * @returns Promise that resolves when shutdown is complete\n * @example\n * ```typescript\n * shutdown.addTask(ShutdownPhase.Services, 'database', () => db.disconnect(), 5000);\n * await shutdown.run(0); // Graceful shutdown\n * ```\n */\n public async run(exitCode = 0): Promise<void> {\n if (this.isShuttingDown) {\n this.logger.warn('Shutdown sequence already in progress');\n return;\n }\n\n this.isShuttingDown = true;\n this.exitCode = exitCode;\n this.logger.info(\n `${chalk.bold.yellow('Starting')} coordinated shutdown with exit code ${chalk.bold.cyan(exitCode)}`\n );\n this.emit('shutdown:start');\n\n try {\n // Execute each phase in order\n for (const phase of PHASE_ORDER) {\n await this.runPhase(phase);\n }\n\n this.logger.info(`${chalk.bold.green('Coordinated shutdown completed')} successfully`);\n this.emit('shutdown:complete');\n } catch (error) {\n this.logger.error(`${chalk.bold.red('Coordinated shutdown failed')}`);\n this.emit('shutdown:error', error);\n } finally {\n this.logger.info(`${chalk.bold.red('Exiting')} process with code ${chalk.bold.cyan(this.exitCode)}`);\n setTimeout(() => {\n process.exit(this.exitCode);\n }, LOG_FLUSH_DELAY_MS);\n }\n }\n\n /**\n * Subscribe to shutdown events\n */\n public override on(event: CoordinatedShutdownEventKey, listener: (...args: unknown[]) => void): void {\n super.on(event, listener);\n }\n\n /**\n * Unsubscribe from shutdown events\n */\n public override off(event: CoordinatedShutdownEventKey, listener: (...args: unknown[]) => void): void {\n super.off(event, listener);\n }\n}\n","import { createServer } from 'http';\n\nimport chalk from 'chalk';\nimport { Envapt } from 'envapt';\n\nimport { CoordinatedShutdown, ShutdownPhase } from './Lifecycle/CoordinatedShutdown';\nimport { Logger } from './Logger';\n\nimport type { IncomingMessage, Server, ServerResponse } from 'http';\n\nconst HTTP_OK = 200;\nconst HTTP_NOT_FOUND = 404;\n\n/**\n * HTTP health check service for monitoring bot status.\n *\n * Provides a simple HTTP endpoint that responds with JSON status\n * information, useful for container orchestration and monitoring.\n */\nexport class HealthCheck {\n public readonly logger = new Logger('HealthCheck');\n\n /**\n * Set `PORT` in your `.env` to change the default port (6956).\n */\n @Envapt('HEALTH_CHECK_PORT', { fallback: 6956 })\n declare public readonly port: number;\n\n /**\n * Set `HEALTH_CHECK_PATH` in your `.env` to change the default path (`/healthcheck`).\n */\n @Envapt('HEALTH_CHECK_PATH', { fallback: '/healthcheck' })\n declare public readonly path: string;\n\n /**\n * Set `HEALTH_CHECK_HOST` in your `.env` to change the host. Defaults to `null` (all interfaces).\n */\n @Envapt('HEALTH_CHECK_HOST')\n declare public readonly host: string | null;\n\n private server?: Server;\n\n constructor(shutdown: CoordinatedShutdown) {\n // Register shutdown task\n shutdown.addTask(ShutdownPhase.StopServices, 'stop-healthcheck-server', async () => await this.stop());\n }\n\n /**\n * Starts the health check server.\n * @returns Promise that resolves when the server is listening\n */\n public async init(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n this.server = createServer((req: IncomingMessage, res: ServerResponse) => {\n if (req.method === 'GET' && req.url === this.path) {\n res.writeHead(HTTP_OK, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ status: 'ok', timestamp: Date.now() }));\n } else {\n res.writeHead(HTTP_NOT_FOUND, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ status: 'not found' }));\n }\n });\n\n this.server.on('error', reject);\n this.server.once('listening', () => {\n const address = this.host ?? 'localhost';\n this.logger.info(\n `${chalk.green.bold('✓')} Health check server listening on ${chalk.cyan(`http://${address}:${this.port}${this.path}`)}`\n );\n resolve();\n });\n\n if (this.host) {\n this.logger.debug(`Binding health check server to ${this.host}`);\n this.server.listen(this.port, this.host);\n } else {\n this.logger.debug('Binding health check server to all interfaces');\n this.server.listen(this.port);\n }\n });\n }\n\n /**\n * Stops the health check server.\n *\n * @returns Promise that resolves when the server is closed\n */\n public stop(): Promise<void> {\n if (this.server !== undefined) {\n const server = this.server;\n return new Promise((resolve) => {\n server.once('close', () => resolve());\n\n server.close(() => {\n this.logger.info(chalk.bold.red('Health check server stopped'));\n });\n });\n }\n\n return Promise.resolve();\n }\n}\n","import { EventEmitter } from 'node:events';\n\n/** Tuple type used for all event payloads. */\nexport type SEArgsTuple = readonly unknown[];\n\n/** Convenience map for emitters that intentionally expose no events. */\nexport type SENoEvents = Record<never, SEArgsTuple>;\n\n/**\n * Accepts any object type and constrains every value to be a tuple.\n *\n * @typeParam TEvents - Map of event names to readonly tuple payloads\n */\nexport type SEEventMapLike<TEvents extends object> = { [K in keyof TEvents]: SEArgsTuple };\n\n/**\n * Narrows a provided event map to the keys that can be emitted or listened for.\n *\n * @typeParam TEvents - Map of event names to readonly tuple payloads\n * @internal\n */\nexport type SEEventKey<TEvents extends object> = Extract<keyof TEvents, string | symbol>;\n\n/**\n * Typed wrapper around Node.js {@link EventEmitter} enforcing tuple payloads per event name.\n *\n * @typeParam TEvents - Map of event names to readonly tuple payloads\n */\nexport class StrictEventEmitter<TEvents extends SEEventMapLike<TEvents>> extends EventEmitter {\n /**\n * Registers a persistent listener with tuple-safe arguments for the given event.\n *\n * @param event - The event name to attach to\n * @param listener - Callback operating on the typed argument tuple for the event\n * @returns This emitter instance for chaining\n */\n override on<TEventKey extends SEEventKey<TEvents>>(\n event: TEventKey,\n listener: (...args: TEvents[TEventKey]) => void\n ): this {\n return super.on(event, listener as unknown as (...args: unknown[]) => void);\n }\n\n /**\n * Registers a one time listener that is removed after the first invocation.\n *\n * @param event - The event name to attach to\n * @param listener - Callback operating on the typed argument tuple for the event\n * @returns This emitter instance for chaining\n */\n override once<TEventKey extends SEEventKey<TEvents>>(\n event: TEventKey,\n listener: (...args: TEvents[TEventKey]) => void\n ): this {\n return super.once(event, listener as unknown as (...args: unknown[]) => void);\n }\n\n /**\n * Removes a previously registered listener for the given event.\n *\n * @param event - The event name whose listener should be removed\n * @param listener - Callback originally registered for the event\n * @returns This emitter instance for chaining\n */\n override off<TEventKey extends SEEventKey<TEvents>>(\n event: TEventKey,\n listener: (...args: TEvents[TEventKey]) => void\n ): this {\n return super.off(event, listener as unknown as (...args: unknown[]) => void);\n }\n\n /**\n * Alias of {@link StrictEventEmitter.on} for compatibility with Node.js EventEmitter APIs.\n *\n * @param event - The event name to attach to\n * @param listener - Callback operating on the typed argument tuple for the event\n * @returns This emitter instance for chaining\n */\n override addListener<TEventKey extends SEEventKey<TEvents>>(\n event: TEventKey,\n listener: (...args: TEvents[TEventKey]) => void\n ): this {\n return this.on(event, listener);\n }\n\n /**\n * Alias of {@link StrictEventEmitter.off} for compatibility with Node.js EventEmitter APIs.\n *\n * @param event - The event name whose listener should be removed\n * @param listener - Callback originally registered for the event\n * @returns This emitter instance for chaining\n */\n override removeListener<TEventKey extends SEEventKey<TEvents>>(\n event: TEventKey,\n listener: (...args: TEvents[TEventKey]) => void\n ): this {\n return super.removeListener(event, listener as unknown as (...args: unknown[]) => void);\n }\n\n /**\n * Emits an event with the strictly typed argument tuple for the event name.\n *\n * @param event - The event name to emit\n * @param args - Tuple payload for the event\n * @returns True when the event had listeners, false otherwise\n */\n override emit<TEventKey extends SEEventKey<TEvents>>(event: TEventKey, ...args: TEvents[TEventKey]): boolean {\n return super.emit(event, ...(args as unknown as unknown[]));\n }\n\n /**\n * Retrieves the listener list for a given event with the correct tuple signature.\n *\n * @param event - The event name to inspect\n * @returns Array of listeners registered for the event\n */\n override listeners<TEventKey extends SEEventKey<TEvents>>(\n event: TEventKey\n ): ((...args: TEvents[TEventKey]) => void)[] {\n return super.listeners(event) as ((...args: TEvents[TEventKey]) => void)[];\n }\n\n /**\n * Counts listeners for an event without widening the return type of {@link EventEmitter.listenerCount}.\n *\n * @param event - The event name to inspect\n * @returns The total number of listeners registered for the event\n */\n listenerCountTyped<TEventKey extends SEEventKey<TEvents>>(event: TEventKey): number {\n return super.listenerCount(event);\n }\n\n /**\n * Returns the list of event names known to the emitter with the mapped key type.\n *\n * @returns Array of event keys supported by the emitter\n */\n eventNamesTyped(): SEEventKey<TEvents>[] {\n return super.eventNames() as SEEventKey<TEvents>[];\n }\n\n /**\n * Waits for an event to be emitted, resolving with the listener arguments tuple once triggered.\n * Supports optional abort signals and timeouts for cancellation semantics.\n *\n * @param event - The event name to wait for\n * @param opts - Optional abort signal or timeout in milliseconds\n * @returns Promise resolving with the emitted argument tuple; rejects when aborted or timed out\n */\n waitFor<TEventKey extends SEEventKey<TEvents>>(\n event: TEventKey,\n opts?: { signal?: AbortSignal; timeoutMs?: number }\n ): Promise<TEvents[TEventKey]> {\n return new Promise<TEvents[TEventKey]>((resolve, reject) => {\n const onEvent = (...args: TEvents[TEventKey]): void => {\n cleanup();\n resolve(args);\n };\n\n const onAbort = (): void => {\n cleanup();\n reject(Object.assign(new Error('Aborted'), { name: 'AbortError' }));\n };\n\n let timeoutId: NodeJS.Timeout | null = null;\n\n const cleanup = (): void => {\n this.off(event, onEvent);\n opts?.signal?.removeEventListener('abort', onAbort);\n if (timeoutId) clearTimeout(timeoutId);\n };\n\n this.once(event, onEvent);\n\n if (opts?.signal) {\n if (opts.signal.aborted) return onAbort();\n opts.signal.addEventListener('abort', onAbort, { once: true });\n }\n\n if (opts?.timeoutMs !== undefined) {\n timeoutId = setTimeout(() => {\n cleanup();\n reject(new Error('Timed out'));\n }, opts.timeoutMs);\n }\n });\n }\n}\n","import chalk from 'chalk';\n\nimport { SeedcordError, SeedcordErrorCode } from '../Errors';\nimport { CoordinatedLifecycle } from './CoordinatedLifecycle';\n\nimport type { LifecycleTask, PhaseEvents } from './LifecycleTypes';\nimport type { UnionToTuple } from 'type-fest';\n\n/**\n * Startup phases for coordinated initialization\n *\n * Defines the order in which different components are initialized during bot startup.\n */\nexport enum StartupPhase {\n /** Validate environment variables and config files */\n Validation = 1,\n /** Discover plugin constructors via decorators or registry */\n Discovery,\n /** Register plugin metadata and declared dependencies */\n Registration,\n /** Inject and validate plugin-specific configuration */\n Configuration,\n /** Instantiate plugin classes with Core and arguments */\n Instantiation,\n /** Activate plugins by calling their init/setup effects */\n Activation,\n /** Mark seedcord as ready and start handling interactions */\n Ready\n}\n\n/** Define the order of phases */\nconst PHASE_ORDER: StartupPhase[] = [\n StartupPhase.Validation,\n StartupPhase.Discovery,\n StartupPhase.Registration,\n StartupPhase.Configuration,\n StartupPhase.Instantiation,\n StartupPhase.Activation,\n StartupPhase.Ready\n];\n\n/**\n * Event keys for coordinated startup phases\n */\nexport type CoordinatedStartupEventKey = PhaseEvents<'startup', UnionToTuple<StartupPhase>>;\n\n/**\n * Manages bot startup lifecycle with ordered phases\n *\n * Coordinates initialization of all bot components in a predictable sequence.\n * Tasks are executed within their designated phases to ensure proper dependency order.\n */\nexport class CoordinatedStartup extends CoordinatedLifecycle<StartupPhase> {\n private isStartingUp = false;\n private hasStarted = false;\n\n public constructor() {\n super('CoordinatedStartup', PHASE_ORDER, StartupPhase);\n }\n\n /**\n * Adds a task to a specific startup phase with timeout.\n *\n * @param phase - The startup phase from {@link StartupPhase}\n * @param taskName - Unique identifier for the task\n * @param task - Async function to execute\n * @param timeoutMs - Task timeout in milliseconds (default: 10000)\n */\n public override addTask(phase: StartupPhase, taskName: string, task: () => Promise<void>, timeoutMs = 10000): void {\n super.addTask(phase, taskName, task, timeoutMs);\n }\n\n protected canAddTask(): boolean {\n if (this.hasStarted) {\n throw new SeedcordError(SeedcordErrorCode.LifecycleAddAfterCompletion);\n }\n\n if (this.isStartingUp) {\n throw new SeedcordError(SeedcordErrorCode.LifecycleAddDuringRun);\n }\n\n return true;\n }\n\n protected canRemoveTask(): boolean {\n if (this.isStartingUp) {\n throw new SeedcordError(SeedcordErrorCode.LifecycleRemoveDuringRun);\n }\n\n return true;\n }\n\n protected getTaskType(): string {\n return 'startup';\n }\n\n protected async executeTasksInPhase(\n phase: StartupPhase,\n tasks: LifecycleTask[]\n ): Promise<PromiseSettledResult<void>[]> {\n // Execute all tasks in sequence\n const results: PromiseSettledResult<void>[] = [];\n for (const task of tasks) {\n results.push(\n await Promise.resolve()\n .then(() => this.runTaskWithTimeout(phase, task))\n .then(\n () => ({ status: 'fulfilled', value: undefined }) satisfies PromiseSettledResult<void>,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n (reason) => ({ status: 'rejected', reason }) satisfies PromiseSettledResult<void>\n )\n );\n }\n return results;\n }\n\n /**\n * Executes the coordinated startup sequence.\n *\n * Runs all registered tasks across startup phases in the correct order.\n * Each phase completes before the next phase begins. Tasks within a phase\n * are executed sequentially to maintain predictable initialization.\n *\n * @returns Promise that resolves when startup is complete\n * @throws An {@link Error} If startup fails or is called multiple times\n * @example\n * ```typescript\n * const startup = new CoordinatedStartup();\n * startup.addTask(StartupPhase.Services, 'database', () => db.connect(), 10000);\n * await startup.run();\n * ```\n */\n public async run(): Promise<void> {\n if (this.hasStarted) {\n this.logger.warn('Startup sequence has already completed');\n return;\n }\n\n if (this.isStartingUp) {\n this.logger.warn('Startup sequence already in progress');\n return;\n }\n\n this.isStartingUp = true;\n this.logger.info(`${chalk.bold.green('Starting')} coordinated startup sequence`);\n this.emit('startup:start');\n\n try {\n // Execute each phase in order\n for (const phase of PHASE_ORDER) await this.runPhase(phase);\n\n this.hasStarted = true;\n this.logger.info(`${chalk.bold.green('Coordinated startup completed')} successfully`);\n this.emit('startup:complete');\n } catch (error) {\n this.logger.error(`${chalk.bold.red('Coordinated startup failed')}`);\n this.emit('startup:error', error);\n throw error;\n } finally {\n this.isStartingUp = false;\n }\n }\n\n /**\n * Subscribe to startup events\n */\n public override on(event: CoordinatedStartupEventKey, listener: (...args: unknown[]) => void): void {\n super.on(event, listener);\n }\n\n /**\n * Unsubscribe from startup events\n */\n public override off(event: CoordinatedStartupEventKey, listener: (...args: unknown[]) => void): void {\n super.off(event, listener);\n }\n\n /**\n * Check if startup has completed\n */\n public get isReady(): boolean {\n return this.hasStarted;\n }\n\n /**\n * Check if startup is currently running\n */\n public get isRunning(): boolean {\n return this.isStartingUp;\n }\n}\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -74,8 +74,7 @@ declare enum SeedcordErrorCode {
|
|
|
74
74
|
CoreSingletonViolation = 1201,
|
|
75
75
|
CorePluginAfterInit = 1202,
|
|
76
76
|
CorePluginKeyExists = 1203,
|
|
77
|
-
|
|
78
|
-
CoreBotRoleMissing = 1205,
|
|
77
|
+
CoreBotRoleMissing = 1204,
|
|
79
78
|
DecoratorInteractionEventFilter = 1301,
|
|
80
79
|
DecoratorMethodNotFound = 1302,
|
|
81
80
|
DecoratorCommandAlreadyRegistered = 1303,
|
|
@@ -111,8 +110,7 @@ declare const messages: {
|
|
|
111
110
|
readonly 1201: () => string;
|
|
112
111
|
readonly 1202: () => string;
|
|
113
112
|
readonly 1203: (key: string) => string;
|
|
114
|
-
readonly 1204: () => string;
|
|
115
|
-
readonly 1205: (guildId?: string) => string;
|
|
113
|
+
readonly 1204: (guildId?: string) => string;
|
|
116
114
|
readonly 1301: () => string;
|
|
117
115
|
readonly 1302: () => string;
|
|
118
116
|
readonly 1303: (commandName: string, existingScope: string, requestedScope: string) => string;
|
package/dist/index.d.ts
CHANGED
|
@@ -74,8 +74,7 @@ declare enum SeedcordErrorCode {
|
|
|
74
74
|
CoreSingletonViolation = 1201,
|
|
75
75
|
CorePluginAfterInit = 1202,
|
|
76
76
|
CorePluginKeyExists = 1203,
|
|
77
|
-
|
|
78
|
-
CoreBotRoleMissing = 1205,
|
|
77
|
+
CoreBotRoleMissing = 1204,
|
|
79
78
|
DecoratorInteractionEventFilter = 1301,
|
|
80
79
|
DecoratorMethodNotFound = 1302,
|
|
81
80
|
DecoratorCommandAlreadyRegistered = 1303,
|
|
@@ -111,8 +110,7 @@ declare const messages: {
|
|
|
111
110
|
readonly 1201: () => string;
|
|
112
111
|
readonly 1202: () => string;
|
|
113
112
|
readonly 1203: (key: string) => string;
|
|
114
|
-
readonly 1204: () => string;
|
|
115
|
-
readonly 1205: (guildId?: string) => string;
|
|
113
|
+
readonly 1204: (guildId?: string) => string;
|
|
116
114
|
readonly 1301: () => string;
|
|
117
115
|
readonly 1302: () => string;
|
|
118
116
|
readonly 1303: (commandName: string, existingScope: string, requestedScope: string) => string;
|
package/dist/index.mjs
CHANGED
|
@@ -313,8 +313,7 @@ var SeedcordErrorCode = /* @__PURE__ */ (function(SeedcordErrorCode2) {
|
|
|
313
313
|
SeedcordErrorCode2[SeedcordErrorCode2["CoreSingletonViolation"] = 1201] = "CoreSingletonViolation";
|
|
314
314
|
SeedcordErrorCode2[SeedcordErrorCode2["CorePluginAfterInit"] = 1202] = "CorePluginAfterInit";
|
|
315
315
|
SeedcordErrorCode2[SeedcordErrorCode2["CorePluginKeyExists"] = 1203] = "CorePluginKeyExists";
|
|
316
|
-
SeedcordErrorCode2[SeedcordErrorCode2["
|
|
317
|
-
SeedcordErrorCode2[SeedcordErrorCode2["CoreBotRoleMissing"] = 1205] = "CoreBotRoleMissing";
|
|
316
|
+
SeedcordErrorCode2[SeedcordErrorCode2["CoreBotRoleMissing"] = 1204] = "CoreBotRoleMissing";
|
|
318
317
|
SeedcordErrorCode2[SeedcordErrorCode2["DecoratorInteractionEventFilter"] = 1301] = "DecoratorInteractionEventFilter";
|
|
319
318
|
SeedcordErrorCode2[SeedcordErrorCode2["DecoratorMethodNotFound"] = 1302] = "DecoratorMethodNotFound";
|
|
320
319
|
SeedcordErrorCode2[SeedcordErrorCode2["DecoratorCommandAlreadyRegistered"] = 1303] = "DecoratorCommandAlreadyRegistered";
|
|
@@ -352,7 +351,6 @@ var messages = {
|
|
|
352
351
|
[SeedcordErrorCode.CoreSingletonViolation]: () => "Seedcord can only be instantiated once. Use the existing instance instead.",
|
|
353
352
|
[SeedcordErrorCode.CorePluginAfterInit]: () => "Cannot attach a plugin after initialization.",
|
|
354
353
|
[SeedcordErrorCode.CorePluginKeyExists]: (key) => `Plugin with key "${key}" already exists.`,
|
|
355
|
-
[SeedcordErrorCode.CoreClientUserUnavailable]: () => "Client user is not available.",
|
|
356
354
|
[SeedcordErrorCode.CoreBotRoleMissing]: (guildId) => guildId ? `Bot role not found in guild ${guildId}.` : "Bot role not found in guild.",
|
|
357
355
|
[SeedcordErrorCode.DecoratorInteractionEventFilter]: () => "Interaction middleware cannot specify event filters.",
|
|
358
356
|
[SeedcordErrorCode.DecoratorMethodNotFound]: () => "Decorator could not locate the original method. Ensure the method exists before applying the decorator.",
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/Logger.ts","../src/CooldownManager.ts","../src/Errors/ErrorCodes.ts","../src/Errors/ErrorMessages.ts","../src/Errors/SeedcordError.ts","../src/Lifecycle/CoordinatedLifecycle.ts","../src/Lifecycle/CoordinatedShutdown.ts","../src/HealthCheck.ts","../src/StrictEventEmitter.ts","../src/Lifecycle/CoordinatedStartup.ts"],"names":["Logger","instances","Map","instance","prefix","get","set","transportName","consoleTransport","createConsoleTransport","initializeLogger","getFormatCustomizations","padding","format","errors","stack","splat","colorize","level","timestamp","printf","info","ts","String","lvl","padEnd","lbl","label","msg","message","base","splatSym","Symbol","for","raw","extras","Array","isArray","cleaned","filter","x","Error","Object","keys","length","rendered","parts","push","JSON","stringify","join","transports","Console","combine","Envapter","isDevelopment","isStaging","transportsArray","maxSizeInMB","File","filename","uncolorize","json","bigint","space","maxsize","maxFiles","tailable","logger","createLogger","error","args","warn","http","verbose","debug","silly","Info","Warn","Debug","Silly","CooldownManager","window","Err","map","opts","cooldown","err","key","Date","now","check","last","remaining","undefined","isActive","clear","delete","SeedcordErrorCode","messages","ConfigMissingDiscordToken","ConfigUnknownExceptionWebhookMissing","ConfigUnknownExceptionWebhookInvalid","LifecycleAddAfterCompletion","LifecycleAddDuringRun","LifecycleRemoveDuringRun","LifecycleUnknownPhase","phase","LifecyclePhaseFailures","failures","LifecycleTaskTimeout","taskName","timeout","CoreSingletonViolation","CorePluginAfterInit","CorePluginKeyExists","CoreClientUserUnavailable","CoreBotRoleMissing","guildId","DecoratorInteractionEventFilter","DecoratorMethodNotFound","DecoratorCommandAlreadyRegistered","commandName","existingScope","requestedScope","DecoratorCommandGlobalWithGuilds","DecoratorCommandGuildWithoutGuilds","DecoratorInvalidMiddlewarePriority","UtilHexInputType","UtilHexInvalid","UtilInvalidSlashRouteArgument","PluginMongoServiceDecoratorMissing","className","PluginMongoModelDecoratorMissing","PluginMongoConnectionFailed","databaseName","PluginKpgServiceDecoratorMissing","PluginKpgServiceTableMissing","PluginKpgInvalidStepCount","PluginKpgUnknownDirection","direction","PluginKpgUnresolvedMigrationsPath","PluginKpgNoMigrationFiles","PluginKpgInvalidMigrationModule","filePath","PluginKpgNonErrorFailure","formatSeedcordErrorMessage","code","formatter","resolvedArgs","resolveIdentifier","resolveMessage","formatErrorName","name","_identifier","chalk","bold","red","gray","SeedcordError","identifier","options","setPrototypeOf","prototype","captureStackTrace","SeedcordTypeError","TypeError","SeedcordRangeError","RangeError","SeedcordErrors","isSeedcordError","CoordinatedLifecycle","events","EventEmitter","tasksMap","loggerName","phaseOrder","phaseEnum","forEach","addTask","task","timeoutMs","canAddTask","tasks","italic","getTaskType","cyan","magenta","removeTask","canRemoveTask","initialLength","filteredTasks","removed","runPhase","yellow","emit","results","executeTasksInPhase","r","status","green","runTaskWithTimeout","Promise","race","_","reject","setTimeout","on","event","listener","off","ShutdownPhase","PHASE_ORDER","LOG_FLUSH_DELAY_MS","CoordinatedShutdown","isShuttingDown","exitCode","registerSignalHandlers","isShutdownEnabled","resolve","then","value","reason","process","run","exit","fallback","HTTP_OK","HTTP_NOT_FOUND","HealthCheck","server","shutdown","StopServices","stop","init","createServer","req","res","method","url","path","writeHead","end","once","address","host","port","listen","close","StrictEventEmitter","addListener","removeListener","listeners","listenerCountTyped","listenerCount","eventNamesTyped","eventNames","waitFor","onEvent","cleanup","onAbort","assign","timeoutId","signal","removeEventListener","aborted","addEventListener","StartupPhase","CoordinatedStartup","isStartingUp","hasStarted","isReady","isRunning"],"mappings":"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","file":"index.mjs","sourcesContent":["/* eslint-disable @typescript-eslint/no-base-to-string */\n/* eslint-disable @typescript-eslint/naming-convention */\nimport { Envapter } from 'envapt';\nimport { createLogger, format, transports } from 'winston';\n\nimport type { ILogger } from '@seedcord/types';\nimport type { Logform, Logger as Winston } from 'winston';\nimport type { ConsoleTransportInstance } from 'winston/lib/winston/transports';\n\n/**\n * Logging service with console and file output support\n *\n * Provides structured logging with timestamps, levels, and labels.\n * Instances are cached by transport name for consistent formatting.\n */\nexport class Logger implements ILogger {\n declare private logger: Winston;\n private static readonly instances = new Map<string, Logger>();\n\n private static instance(prefix: string): Logger {\n let instance = this.instances.get(prefix);\n if (!instance) {\n instance = new Logger(prefix);\n this.instances.set(prefix, instance);\n }\n return instance;\n }\n\n constructor(transportName: string) {\n const consoleTransport = this.createConsoleTransport(transportName);\n this.initializeLogger(consoleTransport);\n }\n\n private getFormatCustomizations(): Logform.Format[] {\n const padding = 7;\n return [\n format.errors({ stack: true }),\n format.splat(),\n format.colorize({ level: true }),\n format.timestamp({ format: 'D MMM, hh:mm:ss a' }),\n format.printf((info: Logform.TransformableInfo) => {\n const ts = String(info.timestamp ?? '');\n const lvl = String(info.level).padEnd(padding);\n const lbl = String(info.label ?? '');\n const msg = String(info.message ?? '');\n\n const base = `${ts} [${lvl}]: ${lbl} - ${msg}`;\n\n const splatSym = Symbol.for('splat');\n const raw = (info as unknown as Record<string | symbol, unknown>)[splatSym];\n const extras = Array.isArray(raw) ? raw : [];\n\n const cleaned = extras\n .filter((x) => !(x instanceof Error))\n .filter((x) => {\n if (!x) return false;\n if (typeof x !== 'object') return true;\n return Object.keys(x as object).length > 0;\n });\n\n let rendered = base;\n\n if (typeof info.stack === 'string') {\n rendered += `\\n${String(info.stack)}`;\n }\n\n if (cleaned.length) {\n const parts: string[] = [];\n for (const x of cleaned) {\n if (typeof x === 'string') parts.push(x);\n else {\n try {\n parts.push(JSON.stringify(x, null, 2));\n } catch {\n parts.push(String(x));\n }\n }\n }\n rendered += `\\n${parts.join(' ')}`;\n }\n\n return rendered;\n })\n ];\n }\n\n private createConsoleTransport(transportName: string): ConsoleTransportInstance {\n return new transports.Console({\n format: format.combine(format.label({ label: transportName }), ...this.getFormatCustomizations()),\n level: Envapter.isDevelopment ? 'silly' : Envapter.isStaging ? 'debug' : 'info'\n });\n }\n\n private initializeLogger(consoleTransport: transports.ConsoleTransportInstance): void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const transportsArray: any[] = [consoleTransport];\n\n // Add file transport only in non-production environments\n if (Envapter.isDevelopment) {\n const maxSizeInMB = 10;\n transportsArray.push(\n new transports.File({\n filename: 'logs/application.log',\n level: 'debug',\n format: format.combine(\n format.uncolorize(),\n format.errors({ stack: true }),\n format.timestamp(),\n format.json({ bigint: true, space: 2 })\n ),\n maxsize: maxSizeInMB * 1024 * 1024, // 10MB\n maxFiles: 5,\n tailable: true\n })\n );\n }\n\n this.logger = createLogger({\n transports: transportsArray\n });\n }\n\n /**\n * Logs an error message with optional additional data.\n *\n * @param msg - The error message to log\n * @param args - Additional data to include in the log entry\n */\n public error(msg: string, ...args: unknown[]): void {\n this.logger.error(msg, ...args);\n }\n\n /**\n * Logs a warning message with optional additional data.\n *\n * @param msg - The warning message to log\n * @param args - Additional data to include in the log entry\n */\n public warn(msg: string, ...args: unknown[]): void {\n this.logger.warn(msg, ...args);\n }\n\n /**\n * Logs an informational message with optional additional data.\n *\n * @param msg - The informational message to log\n * @param args - Additional data to include in the log entry\n */\n public info(msg: string, ...args: unknown[]): void {\n this.logger.info(msg, ...args);\n }\n\n /**\n * Logs an HTTP-related message with optional additional data.\n *\n * @param msg - The HTTP message to log\n * @param args - Additional data to include in the log entry\n */\n public http(msg: string, ...args: unknown[]): void {\n this.logger.http(msg, ...args);\n }\n\n /**\n * Logs a verbose message with optional additional data.\n *\n * @param msg - The verbose message to log\n * @param args - Additional data to include in the log entry\n */\n public verbose(msg: string, ...args: unknown[]): void {\n this.logger.verbose(msg, ...args);\n }\n\n /**\n * Logs a debug message with optional additional data.\n *\n * @param msg - The debug message to log\n * @param args - Additional data to include in the log entry\n */\n public debug(msg: string, ...args: unknown[]): void {\n this.logger.debug(msg, ...args);\n }\n\n /**\n * Logs a silly/trace level message with optional additional data.\n *\n * @param msg - The silly message to log\n * @param args - Additional data to include in the log entry\n */\n public silly(msg: string, ...args: unknown[]): void {\n this.logger.silly(msg, ...args);\n }\n\n /**\n * Static method to log an error message with a specific prefix.\n * Creates or retrieves a logger instance for the given prefix.\n *\n * @param prefix - The logger prefix/label to use\n * @param msg - The error message to log\n * @param args - Additional data to include in the log entry\n */\n public static Error(prefix: string, msg: string, ...args: unknown[]): void {\n const logger = this.instance(prefix);\n logger.error(msg, ...args);\n }\n\n /**\n * Static method to log an informational message with a specific prefix.\n * Creates or retrieves a logger instance for the given prefix.\n *\n * @param prefix - The logger prefix/label to use\n * @param msg - The informational message to log\n * @param args - Additional data to include in the log entry\n */\n public static Info(prefix: string, msg: string, ...args: unknown[]): void {\n const logger = this.instance(prefix);\n logger.info(msg, ...args);\n }\n\n /**\n * Static method to log a warning message with a specific prefix.\n * Creates or retrieves a logger instance for the given prefix.\n *\n * @param prefix - The logger prefix/label to use\n * @param msg - The warning message to log\n * @param args - Additional data to include in the log entry\n */\n public static Warn(prefix: string, msg: string, ...args: unknown[]): void {\n const logger = this.instance(prefix);\n logger.warn(msg, ...args);\n }\n\n /**\n * Static method to log a debug message with a specific prefix.\n * Creates or retrieves a logger instance for the given prefix.\n *\n * @param prefix - The logger prefix/label to use\n * @param msg - The debug message to log\n * @param args - Additional data to include in the log entry\n */\n public static Debug(prefix: string, msg: string, ...args: unknown[]): void {\n const logger = this.instance(prefix);\n logger.debug(msg, ...args);\n }\n\n /**\n * Static method to log a silly/trace level message with a specific prefix.\n * Creates or retrieves a logger instance for the given prefix.\n *\n * @param prefix - The logger prefix/label to use\n * @param msg - The silly message to log\n * @param args - Additional data to include in the log entry\n */\n public static Silly(prefix: string, msg: string, ...args: unknown[]): void {\n const logger = this.instance(prefix);\n logger.silly(msg, ...args);\n }\n}\n","import { Envapter } from 'envapt';\n\nimport { Logger } from './Logger';\n\n/**\n * Configuration options for CooldownManager.\n */\nexport interface CooldownOptions {\n /** Cooldown window in milliseconds (default 1000) */\n cooldown?: number;\n /** Custom error class to throw when a key is still cooling down */\n err?: new (msg: string, ...args: any[]) => Error;\n /** Message passed to the error constructor (default \"Cooldown active\") */\n message?: string;\n}\n\n/**\n * Lightweight utility for per-key cooldowns.\n *\n * Manages time-based restrictions on operations by key,\n * useful for rate limiting, command cooldowns, and spam prevention.\n */\nexport class CooldownManager {\n private readonly window: number;\n private readonly Err: new (msg: string, ...args: any[]) => Error;\n private readonly msg: string;\n private readonly map = new Map<string, number>();\n\n /**\n * Creates a new CooldownManager instance.\n *\n * @param opts - Configuration options for the cooldown behavior\n */\n constructor(opts: CooldownOptions = {}) {\n this.window = opts.cooldown ?? 1_000;\n this.Err = opts.err ?? Error;\n this.msg = opts.message ?? 'Cooldown active';\n }\n\n /**\n * Records usage timestamp for a key without any cooldown checks.\n *\n * @param key - The unique identifier for the cooldown entry\n */\n set(key: string): void {\n this.map.set(key, Date.now());\n }\n\n /**\n * Verifies cooldown status for a key and updates timestamp if not active.\n *\n * If the cooldown is still active, throws the configured error.\n * If not active, updates the timestamp and returns successfully.\n *\n * @param key - The unique identifier to check cooldown for\n * @throws An {@link Err} When the cooldown is still active for the given key\n */\n check(key: string): void {\n const now = Date.now();\n const last = this.map.get(key);\n const remaining = this.window - (now - (last ?? 0));\n\n if (Envapter.isDevelopment && remaining > 0) {\n Logger.Debug('CooldownManager', `${key} - ${remaining}ms remaining`);\n }\n\n if (last !== undefined && remaining > 0) {\n throw new this.Err(this.msg, remaining);\n }\n this.map.set(key, now);\n }\n\n /**\n * Checks if a key is currently cooling down without updating timestamp.\n *\n * @param key - The unique identifier to check\n * @returns True if the key is still cooling down, false otherwise\n */\n isActive(key: string): boolean {\n const last = this.map.get(key);\n return last !== undefined && Date.now() - last < this.window;\n }\n\n /**\n * Removes a key from the cooldown map.\n *\n * @param key - The unique identifier to remove (useful for manual resets)\n */\n clear(key: string): void {\n this.map.delete(key);\n }\n}\n","/* eslint-disable no-magic-numbers */\n\nexport enum SeedcordErrorCode {\n ConfigMissingDiscordToken = 1001,\n ConfigUnknownExceptionWebhookMissing = 1002,\n ConfigUnknownExceptionWebhookInvalid = 1003,\n\n LifecycleAddAfterCompletion = 1101,\n LifecycleAddDuringRun = 1102,\n LifecycleRemoveDuringRun = 1103,\n LifecycleUnknownPhase = 1104,\n LifecyclePhaseFailures = 1105,\n LifecycleTaskTimeout = 1106,\n\n CoreSingletonViolation = 1201,\n CorePluginAfterInit = 1202,\n CorePluginKeyExists = 1203,\n CoreClientUserUnavailable = 1204,\n CoreBotRoleMissing = 1205,\n\n DecoratorInteractionEventFilter = 1301,\n DecoratorMethodNotFound = 1302,\n DecoratorCommandAlreadyRegistered = 1303,\n DecoratorCommandGlobalWithGuilds = 1304,\n DecoratorCommandGuildWithoutGuilds = 1305,\n DecoratorInvalidMiddlewarePriority = 1306,\n\n UtilHexInputType = 1401,\n UtilHexInvalid = 1402,\n UtilInvalidSlashRouteArgument = 1403,\n\n PluginMongoServiceDecoratorMissing = 2101,\n PluginMongoModelDecoratorMissing = 2102,\n PluginMongoConnectionFailed = 2103,\n\n PluginKpgServiceDecoratorMissing = 2201,\n PluginKpgServiceTableMissing = 2202,\n PluginKpgInvalidStepCount = 2203,\n PluginKpgUnknownDirection = 2204,\n PluginKpgUnresolvedMigrationsPath = 2205,\n PluginKpgNoMigrationFiles = 2206,\n PluginKpgInvalidMigrationModule = 2207,\n PluginKpgNonErrorFailure = 2208\n}\n","import { SeedcordErrorCode } from './ErrorCodes';\n\nconst messages = {\n [SeedcordErrorCode.ConfigMissingDiscordToken]: () => 'Missing DISCORD_BOT_TOKEN environment variable.',\n [SeedcordErrorCode.ConfigUnknownExceptionWebhookMissing]: () =>\n 'Missing UNKNOWN_EXCEPTION_WEBHOOK_URL environment variable.',\n [SeedcordErrorCode.ConfigUnknownExceptionWebhookInvalid]: () => 'Invalid UNKNOWN_EXCEPTION_WEBHOOK_URL value.',\n\n [SeedcordErrorCode.LifecycleAddAfterCompletion]: () =>\n 'Cannot add tasks after startup sequence has already completed.',\n [SeedcordErrorCode.LifecycleAddDuringRun]: () => 'Cannot add tasks while startup sequence is in progress.',\n [SeedcordErrorCode.LifecycleRemoveDuringRun]: () => 'Cannot remove tasks while startup sequence is in progress.',\n [SeedcordErrorCode.LifecycleUnknownPhase]: (phase: unknown) => `Unknown phase: ${String(phase)}.`,\n [SeedcordErrorCode.LifecyclePhaseFailures]: (phase: string, failures: number) =>\n `Phase ${phase} completed with ${failures} failed task${failures === 1 ? '' : 's'}.`,\n [SeedcordErrorCode.LifecycleTaskTimeout]: (taskName: string, timeout: number) =>\n `Task \"${taskName}\" timed out after ${timeout}ms.`,\n\n [SeedcordErrorCode.CoreSingletonViolation]: () =>\n 'Seedcord can only be instantiated once. Use the existing instance instead.',\n [SeedcordErrorCode.CorePluginAfterInit]: () => 'Cannot attach a plugin after initialization.',\n [SeedcordErrorCode.CorePluginKeyExists]: (key: string) => `Plugin with key \"${key}\" already exists.`,\n [SeedcordErrorCode.CoreClientUserUnavailable]: () => 'Client user is not available.',\n [SeedcordErrorCode.CoreBotRoleMissing]: (guildId?: string) =>\n guildId ? `Bot role not found in guild ${guildId}.` : 'Bot role not found in guild.',\n\n [SeedcordErrorCode.DecoratorInteractionEventFilter]: () => 'Interaction middleware cannot specify event filters.',\n [SeedcordErrorCode.DecoratorMethodNotFound]: () =>\n 'Decorator could not locate the original method. Ensure the method exists before applying the decorator.',\n [SeedcordErrorCode.DecoratorCommandAlreadyRegistered]: (\n commandName: string,\n existingScope: string,\n requestedScope: string\n ) =>\n `Command \"${commandName}\" is already registered as a \"${existingScope}\" command and cannot be re-registered as a \"${requestedScope}\" command.`,\n [SeedcordErrorCode.DecoratorCommandGlobalWithGuilds]: () =>\n 'RegisterCommand(\"global\") cannot have guilds specified.',\n [SeedcordErrorCode.DecoratorCommandGuildWithoutGuilds]: () =>\n 'RegisterCommand(\"guild\") requires a non-empty guilds array.',\n [SeedcordErrorCode.DecoratorInvalidMiddlewarePriority]: () => 'Middleware priority must be a finite number.',\n\n [SeedcordErrorCode.UtilHexInputType]: () => 'hexToNumber expects a string input.',\n [SeedcordErrorCode.UtilHexInvalid]: () => 'Invalid hex string.',\n [SeedcordErrorCode.UtilInvalidSlashRouteArgument]: () => 'Invalid argument passed to buildSlashRoute.',\n\n [SeedcordErrorCode.PluginMongoServiceDecoratorMissing]: (className: string) =>\n `Missing @RegisterMongoService on ${className}.`,\n [SeedcordErrorCode.PluginMongoModelDecoratorMissing]: (className: string) =>\n `Missing @RegisterMongoModel on ${className}.`,\n [SeedcordErrorCode.PluginMongoConnectionFailed]: (databaseName?: string) =>\n databaseName ? `Could not connect to MongoDB (${databaseName}).` : 'Could not connect to MongoDB.',\n\n [SeedcordErrorCode.PluginKpgServiceDecoratorMissing]: (className: string) =>\n `Missing @RegisterKpgService on ${className}.`,\n [SeedcordErrorCode.PluginKpgServiceTableMissing]: (className: string) =>\n `Missing table metadata for ${className}. Provide a table via @RegisterKpgService().`,\n [SeedcordErrorCode.PluginKpgInvalidStepCount]: () => 'Migration step count must be a non-negative integer.',\n [SeedcordErrorCode.PluginKpgUnknownDirection]: (direction: unknown) =>\n `Unknown migration direction: ${String(direction)}.`,\n [SeedcordErrorCode.PluginKpgUnresolvedMigrationsPath]: (label: string) =>\n `Unable to resolve migrations at path: ${label}.`,\n [SeedcordErrorCode.PluginKpgNoMigrationFiles]: () => 'No migration files provided.',\n [SeedcordErrorCode.PluginKpgInvalidMigrationModule]: (filePath: string) =>\n `Migration file ${filePath} must export async functions up and down.`,\n [SeedcordErrorCode.PluginKpgNonErrorFailure]: (message: string) => `Migration failure: ${message}.`\n} as const;\n\nexport type SeedcordErrorArguments<TCode extends SeedcordErrorCode> = Parameters<(typeof messages)[TCode]>;\n\nexport function formatSeedcordErrorMessage<TCode extends SeedcordErrorCode>(\n code: TCode,\n args?: SeedcordErrorArguments<TCode>\n): string {\n const formatter = messages[code];\n const resolvedArgs = (args ?? []) as unknown[];\n return (formatter as (...params: unknown[]) => string)(...resolvedArgs);\n}\n\nexport { messages as seedcordErrorMessages };\n","import chalk from 'chalk';\n\nimport { SeedcordErrorCode } from './ErrorCodes';\nimport { formatSeedcordErrorMessage, type SeedcordErrorArguments } from './ErrorMessages';\n\nexport type SeedcordErrorIdentifier = keyof typeof SeedcordErrorCode;\n\nexport interface SeedcordErrorOptions extends ErrorOptions {}\n\nfunction resolveIdentifier(code: SeedcordErrorCode): SeedcordErrorIdentifier {\n return SeedcordErrorCode[code] as SeedcordErrorIdentifier;\n}\n\nfunction resolveMessage(code: SeedcordErrorCode, args?: SeedcordErrorArguments<SeedcordErrorCode>): string {\n return formatSeedcordErrorMessage(code, args);\n}\n\nfunction formatErrorName(name: string, _identifier: SeedcordErrorIdentifier, code: SeedcordErrorCode): string {\n return `${chalk.bold.red(name)}[${chalk.gray(code)}]`;\n}\n\nexport class SeedcordError extends Error {\n public readonly code: SeedcordErrorCode;\n public readonly identifier: SeedcordErrorIdentifier;\n\n constructor(\n code: SeedcordErrorCode,\n args?: SeedcordErrorArguments<SeedcordErrorCode>,\n options?: SeedcordErrorOptions\n ) {\n const message = resolveMessage(code, args);\n super(message, options);\n this.code = code;\n this.identifier = resolveIdentifier(code);\n this.name = formatErrorName(new.target.name, this.identifier, this.code);\n Object.setPrototypeOf(this, new.target.prototype);\n if (typeof Error.captureStackTrace === 'function') {\n Error.captureStackTrace(this, new.target);\n }\n }\n}\n\nexport class SeedcordTypeError extends TypeError {\n public readonly code: SeedcordErrorCode;\n public readonly identifier: SeedcordErrorIdentifier;\n\n constructor(\n code: SeedcordErrorCode,\n args?: SeedcordErrorArguments<SeedcordErrorCode>,\n options?: SeedcordErrorOptions\n ) {\n const message = resolveMessage(code, args);\n super(message, options);\n this.code = code;\n this.identifier = resolveIdentifier(code);\n this.name = formatErrorName(new.target.name, this.identifier, this.code);\n Object.setPrototypeOf(this, new.target.prototype);\n if (typeof Error.captureStackTrace === 'function') {\n Error.captureStackTrace(this, new.target);\n }\n }\n}\n\nexport class SeedcordRangeError extends RangeError {\n public readonly code: SeedcordErrorCode;\n public readonly identifier: SeedcordErrorIdentifier;\n\n constructor(\n code: SeedcordErrorCode,\n args?: SeedcordErrorArguments<SeedcordErrorCode>,\n options?: SeedcordErrorOptions\n ) {\n const message = resolveMessage(code, args);\n super(message, options);\n this.code = code;\n this.identifier = resolveIdentifier(code);\n this.name = formatErrorName(new.target.name, this.identifier, this.code);\n Object.setPrototypeOf(this, new.target.prototype);\n if (typeof Error.captureStackTrace === 'function') {\n Error.captureStackTrace(this, new.target);\n }\n }\n}\n\nexport const SeedcordErrors = {\n Error: SeedcordError,\n TypeError: SeedcordTypeError,\n RangeError: SeedcordRangeError\n} as const;\n\nexport type AnySeedcordError = SeedcordError | SeedcordTypeError | SeedcordRangeError;\n\nexport function isSeedcordError(error: unknown): error is AnySeedcordError {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'code' in error &&\n typeof (error as { code: unknown }).code === 'number' &&\n 'identifier' in error &&\n typeof (error as { identifier: unknown }).identifier === 'string'\n );\n}\n","/*\n * Inspired by Akka Coordinated Shutdown: https://doc.akka.io/libraries/akka-core/current/coordinated-shutdown.html\n * and Lewis's implementation in a private repo elsewhere (https://github.com/Yomanz)\n */\n\nimport { EventEmitter } from 'node:events';\n\nimport chalk from 'chalk';\n\nimport { SeedcordError, SeedcordErrorCode } from '../Errors';\nimport { Logger } from '../Logger';\n\nimport type { LifecycleTask } from './LifecycleTypes';\n\n/**\n * Abstract base class for coordinated lifecycle management (startup/shutdown)\n */\nexport abstract class CoordinatedLifecycle<TPhase extends number> {\n protected readonly logger: Logger;\n protected readonly events = new EventEmitter();\n protected readonly tasksMap = new Map<TPhase, LifecycleTask[]>();\n\n protected constructor(\n loggerName: string,\n protected readonly phaseOrder: TPhase[],\n protected readonly phaseEnum: Record<number, string>\n ) {\n this.logger = new Logger(loggerName);\n // Initialize phases\n this.phaseOrder.forEach((phase) => this.tasksMap.set(phase, []));\n }\n\n /**\n * Adds a lifecycle task to a specific phase.\n *\n * Tasks are executed in phase order during lifecycle operations.\n * Each task has a timeout to prevent hanging operations.\n *\n * @param phase - The lifecycle phase to add the task to\n * @param taskName - Unique name for the task (used for logging and removal)\n * @param task - Async function to execute during the phase\n * @param timeoutMs - Maximum time allowed for task execution in milliseconds\n * @example\n * ```typescript\n * lifecycle.addTask(StartupPhase.Services, 'start-database', async () => {\n * await database.connect();\n * }, 10000);\n * ```\n */\n public addTask(phase: TPhase, taskName: string, task: () => Promise<void>, timeoutMs: number): void {\n if (!this.canAddTask()) return;\n\n const tasks = this.tasksMap.get(phase);\n if (!tasks) {\n throw new SeedcordError(SeedcordErrorCode.LifecycleUnknownPhase, [phase]);\n }\n\n tasks.push({ name: taskName, task, timeout: timeoutMs });\n this.logger.debug(\n `${chalk.italic('Added')} ${this.getTaskType()} task ${chalk.bold.cyan(taskName)} to phase ${chalk.bold.magenta(this.phaseEnum[phase])}`\n );\n }\n\n /**\n * Removes a lifecycle task from a specific phase.\n *\n * @param phase - The lifecycle phase to remove the task from\n * @param taskName - Name of the task to remove\n * @returns True if the task was found and removed, false otherwise\n */\n public removeTask(phase: TPhase, taskName: string): boolean {\n if (!this.canRemoveTask()) return false;\n\n const tasks = this.tasksMap.get(phase);\n if (!tasks) return false;\n\n const initialLength = tasks.length;\n const filteredTasks = tasks.filter((task) => task.name !== taskName);\n this.tasksMap.set(phase, filteredTasks);\n\n const removed = initialLength !== filteredTasks.length;\n if (removed) {\n this.logger.debug(\n `${chalk.italic('Removed')} ${this.getTaskType()} task ${chalk.bold.cyan(taskName)} from phase ${chalk.bold.magenta(this.phaseEnum[phase])}`\n );\n }\n\n return removed;\n }\n\n /**\n * Run all tasks in a specific phase\n */\n protected async runPhase(phase: TPhase): Promise<void> {\n const tasks = this.tasksMap.get(phase) ?? [];\n if (tasks.length === 0) {\n this.logger.warn(`No tasks to run in phase ${chalk.bold.magenta(this.phaseEnum[phase])}`);\n return;\n }\n\n this.logger.info(\n `${chalk.bold.yellow('Running')} ${this.getTaskType()} phase ${chalk.bold.magenta(this.phaseEnum[phase])} with ${chalk.bold.cyan(tasks.length)} tasks`\n );\n this.emit(`phase:${phase}:start`);\n\n // Execute all tasks with the execution strategy\n const results: PromiseSettledResult<void>[] = await this.executeTasksInPhase(phase, tasks);\n\n // Check results\n const failures = results.filter((r) => r.status === 'rejected').length;\n if (failures > 0) {\n throw new SeedcordError(SeedcordErrorCode.LifecyclePhaseFailures, [\n chalk.bold.magenta(this.phaseEnum[phase]),\n failures\n ]);\n } else {\n this.logger.info(\n `Phase ${chalk.bold.magenta(this.phaseEnum[phase])} ${chalk.bold.green('completed successfully')}`\n );\n }\n\n this.emit(`phase:${phase}:complete`);\n }\n\n /**\n * Run a single task with timeout\n */\n protected async runTaskWithTimeout(phase: TPhase, task: LifecycleTask): Promise<void> {\n this.logger.info(\n `${chalk.italic('Starting')} task ${chalk.bold.cyan(task.name)} in phase ${chalk.bold.magenta(this.phaseEnum[phase])}`\n );\n\n try {\n // Create a race between the task and a timeout\n await Promise.race([\n task.task(),\n new Promise<void>((_, reject) => {\n setTimeout(() => {\n reject(new SeedcordError(SeedcordErrorCode.LifecycleTaskTimeout, [task.name, task.timeout]));\n }, task.timeout);\n })\n ]);\n\n this.logger.info(\n `${chalk.italic('Completed')} task ${chalk.bold.cyan(task.name)} in phase ${chalk.bold.magenta(this.phaseEnum[phase])}`\n );\n } catch (error) {\n this.logger.error(\n `${chalk.italic('Failed')} task ${chalk.bold.cyan(task.name)} in phase ${chalk.bold.magenta(this.phaseEnum[phase])}:`,\n error\n );\n throw error;\n }\n }\n\n /**\n * Subscribe to lifecycle events\n */\n public on(event: string, listener: (...args: unknown[]) => void): void {\n this.events.on(event, listener);\n }\n\n /**\n * Unsubscribe from lifecycle events\n */\n public off(event: string, listener: (...args: unknown[]) => void): void {\n this.events.off(event, listener);\n }\n\n protected emit(event: string, ...args: unknown[]): boolean {\n return this.events.emit(event, ...args);\n }\n\n // Abstract methods to be implemented by subclasses\n protected abstract canAddTask(): boolean;\n protected abstract canRemoveTask(): boolean;\n protected abstract getTaskType(): string;\n protected abstract executeTasksInPhase(\n phase: TPhase,\n tasks: LifecycleTask[]\n ): Promise<PromiseSettledResult<void>[]>;\n}\n","import chalk from 'chalk';\nimport { Envapt } from 'envapt';\n\nimport { CoordinatedLifecycle } from './CoordinatedLifecycle';\n\nimport type { LifecycleTask, PhaseEvents } from './LifecycleTypes';\nimport type { UnionToTuple } from 'type-fest';\n\n/**\n * Shutdown phases for coordinated application shutdown.\n */\nexport enum ShutdownPhase {\n /** Stop accepting new requests/interactions */\n StopAcceptingRequests = 1,\n /** Stop background services (health checks, etc.) */\n StopServices,\n /** Disconnect from external resources (database, APIs) */\n ExternalResources,\n /** Disconnect from Discord */\n DiscordCleanup,\n /** Final cleanup tasks */\n FinalCleanup\n}\n\n/** Define the order of phases */\nconst PHASE_ORDER: ShutdownPhase[] = [\n ShutdownPhase.StopAcceptingRequests,\n ShutdownPhase.StopServices,\n ShutdownPhase.ExternalResources,\n ShutdownPhase.DiscordCleanup,\n ShutdownPhase.FinalCleanup\n];\n\n/**\n * Event keys for coordinated shutdown phases\n */\nexport type CoordinatedShutdownEventKey = PhaseEvents<'shutdown', UnionToTuple<ShutdownPhase>>;\n\nconst LOG_FLUSH_DELAY_MS = 500;\n\n/**\n * CoordinatedShutdown manages graceful application shutdown by executing registered tasks across defined phases.\n *\n * It listens for termination signals (SIGINT, SIGTERM) and runs tasks in parallel within each phase.\n * Tasks can be added or removed dynamically, and each task has an associated timeout.\n *\n * Enable or disable the shutdown mechanism via the SHUTDOWN_IS_ENABLED environment variable. It's disabled by default. I recommend enabling it in production environments.\n */\nexport class CoordinatedShutdown extends CoordinatedLifecycle<ShutdownPhase> {\n @Envapt('SHUTDOWN_IS_ENABLED', { fallback: false })\n declare private readonly isShutdownEnabled: boolean;\n\n private isShuttingDown = false;\n private exitCode = 0;\n\n public constructor() {\n super('CoordinatedShutdown', PHASE_ORDER, ShutdownPhase);\n\n // Register signal effects\n this.registerSignalHandlers();\n }\n\n protected canAddTask(): boolean {\n return this.isShutdownEnabled;\n }\n\n protected canRemoveTask(): boolean {\n return true;\n }\n\n protected getTaskType(): string {\n return 'shutdown';\n }\n\n protected async executeTasksInPhase(\n phase: ShutdownPhase,\n tasks: LifecycleTask[]\n ): Promise<PromiseSettledResult<void>[]> {\n // Execute all tasks in parallel (unlike startup which uses sequential)\n const results: PromiseSettledResult<void>[] = [];\n for (const task of tasks) {\n results.push(\n await Promise.resolve()\n .then(() => this.runTaskWithTimeout(phase, task))\n .then(\n () => ({ status: 'fulfilled', value: undefined }) satisfies PromiseSettledResult<void>,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n (reason) => ({ status: 'rejected', reason }) satisfies PromiseSettledResult<void>\n )\n );\n }\n return results;\n }\n\n private registerSignalHandlers(): void {\n if (!this.isShutdownEnabled) return;\n\n process.on('SIGTERM', () => {\n this.logger.info(`Received ${chalk.yellow.bold('SIGTERM')} signal`);\n void this.run(0);\n });\n\n process.on('SIGINT', () => {\n this.logger.info(`Received ${chalk.yellow.bold('SIGINT')} signal`);\n void this.run(0);\n });\n }\n\n /**\n * Adds a task to a specific shutdown phase with timeout.\n *\n * @param phase - The shutdown phase from {@link ShutdownPhase}\n * @param taskName - Unique identifier for the task\n * @param task - Async function to execute\n * @param timeoutMs - Task timeout in milliseconds (default: 5000)\n */\n public override addTask(phase: ShutdownPhase, taskName: string, task: () => Promise<void>, timeoutMs = 5000): void {\n super.addTask(phase, taskName, task, timeoutMs);\n }\n\n /**\n * Removes a task from a specific shutdown phase.\n *\n * @param phase - The shutdown phase to remove from\n * @param taskName - Name of the task to remove\n * @returns True if task was found and removed\n */\n public override removeTask(phase: ShutdownPhase, taskName: string): boolean {\n return super.removeTask(phase, taskName);\n }\n\n /**\n * Executes the coordinated shutdown sequence.\n *\n * Runs all registered tasks across shutdown phases in reverse order.\n * Tasks within each phase are executed in parallel for faster shutdown.\n * Process exits with the specified code when complete.\n *\n * @param exitCode - Process exit code (default: `0`)\n * @returns Promise that resolves when shutdown is complete\n * @example\n * ```typescript\n * shutdown.addTask(ShutdownPhase.Services, 'database', () => db.disconnect(), 5000);\n * await shutdown.run(0); // Graceful shutdown\n * ```\n */\n public async run(exitCode = 0): Promise<void> {\n if (this.isShuttingDown) {\n this.logger.warn('Shutdown sequence already in progress');\n return;\n }\n\n this.isShuttingDown = true;\n this.exitCode = exitCode;\n this.logger.info(\n `${chalk.bold.yellow('Starting')} coordinated shutdown with exit code ${chalk.bold.cyan(exitCode)}`\n );\n this.emit('shutdown:start');\n\n try {\n // Execute each phase in order\n for (const phase of PHASE_ORDER) {\n await this.runPhase(phase);\n }\n\n this.logger.info(`${chalk.bold.green('Coordinated shutdown completed')} successfully`);\n this.emit('shutdown:complete');\n } catch (error) {\n this.logger.error(`${chalk.bold.red('Coordinated shutdown failed')}`);\n this.emit('shutdown:error', error);\n } finally {\n this.logger.info(`${chalk.bold.red('Exiting')} process with code ${chalk.bold.cyan(this.exitCode)}`);\n setTimeout(() => {\n process.exit(this.exitCode);\n }, LOG_FLUSH_DELAY_MS);\n }\n }\n\n /**\n * Subscribe to shutdown events\n */\n public override on(event: CoordinatedShutdownEventKey, listener: (...args: unknown[]) => void): void {\n super.on(event, listener);\n }\n\n /**\n * Unsubscribe from shutdown events\n */\n public override off(event: CoordinatedShutdownEventKey, listener: (...args: unknown[]) => void): void {\n super.off(event, listener);\n }\n}\n","import { createServer } from 'http';\n\nimport chalk from 'chalk';\nimport { Envapt } from 'envapt';\n\nimport { CoordinatedShutdown, ShutdownPhase } from './Lifecycle/CoordinatedShutdown';\nimport { Logger } from './Logger';\n\nimport type { IncomingMessage, Server, ServerResponse } from 'http';\n\nconst HTTP_OK = 200;\nconst HTTP_NOT_FOUND = 404;\n\n/**\n * HTTP health check service for monitoring bot status.\n *\n * Provides a simple HTTP endpoint that responds with JSON status\n * information, useful for container orchestration and monitoring.\n */\nexport class HealthCheck {\n public readonly logger = new Logger('HealthCheck');\n\n /**\n * Set `PORT` in your `.env` to change the default port (6956).\n */\n @Envapt('HEALTH_CHECK_PORT', { fallback: 6956 })\n declare public readonly port: number;\n\n /**\n * Set `HEALTH_CHECK_PATH` in your `.env` to change the default path (`/healthcheck`).\n */\n @Envapt('HEALTH_CHECK_PATH', { fallback: '/healthcheck' })\n declare public readonly path: string;\n\n /**\n * Set `HEALTH_CHECK_HOST` in your `.env` to change the host. Defaults to `null` (all interfaces).\n */\n @Envapt('HEALTH_CHECK_HOST')\n declare public readonly host: string | null;\n\n private server?: Server;\n\n constructor(shutdown: CoordinatedShutdown) {\n // Register shutdown task\n shutdown.addTask(ShutdownPhase.StopServices, 'stop-healthcheck-server', async () => await this.stop());\n }\n\n /**\n * Starts the health check server.\n * @returns Promise that resolves when the server is listening\n */\n public async init(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n this.server = createServer((req: IncomingMessage, res: ServerResponse) => {\n if (req.method === 'GET' && req.url === this.path) {\n res.writeHead(HTTP_OK, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ status: 'ok', timestamp: Date.now() }));\n } else {\n res.writeHead(HTTP_NOT_FOUND, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ status: 'not found' }));\n }\n });\n\n this.server.on('error', reject);\n this.server.once('listening', () => {\n const address = this.host ?? 'localhost';\n this.logger.info(\n `${chalk.green.bold('✓')} Health check server listening on ${chalk.cyan(`http://${address}:${this.port}${this.path}`)}`\n );\n resolve();\n });\n\n if (this.host) {\n this.logger.debug(`Binding health check server to ${this.host}`);\n this.server.listen(this.port, this.host);\n } else {\n this.logger.debug('Binding health check server to all interfaces');\n this.server.listen(this.port);\n }\n });\n }\n\n /**\n * Stops the health check server.\n *\n * @returns Promise that resolves when the server is closed\n */\n public stop(): Promise<void> {\n if (this.server !== undefined) {\n const server = this.server;\n return new Promise((resolve) => {\n server.once('close', () => resolve());\n\n server.close(() => {\n this.logger.info(chalk.bold.red('Health check server stopped'));\n });\n });\n }\n\n return Promise.resolve();\n }\n}\n","import { EventEmitter } from 'node:events';\n\n/** Tuple type used for all event payloads. */\nexport type SEArgsTuple = readonly unknown[];\n\n/** Convenience map for emitters that intentionally expose no events. */\nexport type SENoEvents = Record<never, SEArgsTuple>;\n\n/**\n * Accepts any object type and constrains every value to be a tuple.\n *\n * @typeParam TEvents - Map of event names to readonly tuple payloads\n */\nexport type SEEventMapLike<TEvents extends object> = { [K in keyof TEvents]: SEArgsTuple };\n\n/**\n * Narrows a provided event map to the keys that can be emitted or listened for.\n *\n * @typeParam TEvents - Map of event names to readonly tuple payloads\n * @internal\n */\nexport type SEEventKey<TEvents extends object> = Extract<keyof TEvents, string | symbol>;\n\n/**\n * Typed wrapper around Node.js {@link EventEmitter} enforcing tuple payloads per event name.\n *\n * @typeParam TEvents - Map of event names to readonly tuple payloads\n */\nexport class StrictEventEmitter<TEvents extends SEEventMapLike<TEvents>> extends EventEmitter {\n /**\n * Registers a persistent listener with tuple-safe arguments for the given event.\n *\n * @param event - The event name to attach to\n * @param listener - Callback operating on the typed argument tuple for the event\n * @returns This emitter instance for chaining\n */\n override on<TEventKey extends SEEventKey<TEvents>>(\n event: TEventKey,\n listener: (...args: TEvents[TEventKey]) => void\n ): this {\n return super.on(event, listener as unknown as (...args: unknown[]) => void);\n }\n\n /**\n * Registers a one time listener that is removed after the first invocation.\n *\n * @param event - The event name to attach to\n * @param listener - Callback operating on the typed argument tuple for the event\n * @returns This emitter instance for chaining\n */\n override once<TEventKey extends SEEventKey<TEvents>>(\n event: TEventKey,\n listener: (...args: TEvents[TEventKey]) => void\n ): this {\n return super.once(event, listener as unknown as (...args: unknown[]) => void);\n }\n\n /**\n * Removes a previously registered listener for the given event.\n *\n * @param event - The event name whose listener should be removed\n * @param listener - Callback originally registered for the event\n * @returns This emitter instance for chaining\n */\n override off<TEventKey extends SEEventKey<TEvents>>(\n event: TEventKey,\n listener: (...args: TEvents[TEventKey]) => void\n ): this {\n return super.off(event, listener as unknown as (...args: unknown[]) => void);\n }\n\n /**\n * Alias of {@link StrictEventEmitter.on} for compatibility with Node.js EventEmitter APIs.\n *\n * @param event - The event name to attach to\n * @param listener - Callback operating on the typed argument tuple for the event\n * @returns This emitter instance for chaining\n */\n override addListener<TEventKey extends SEEventKey<TEvents>>(\n event: TEventKey,\n listener: (...args: TEvents[TEventKey]) => void\n ): this {\n return this.on(event, listener);\n }\n\n /**\n * Alias of {@link StrictEventEmitter.off} for compatibility with Node.js EventEmitter APIs.\n *\n * @param event - The event name whose listener should be removed\n * @param listener - Callback originally registered for the event\n * @returns This emitter instance for chaining\n */\n override removeListener<TEventKey extends SEEventKey<TEvents>>(\n event: TEventKey,\n listener: (...args: TEvents[TEventKey]) => void\n ): this {\n return super.removeListener(event, listener as unknown as (...args: unknown[]) => void);\n }\n\n /**\n * Emits an event with the strictly typed argument tuple for the event name.\n *\n * @param event - The event name to emit\n * @param args - Tuple payload for the event\n * @returns True when the event had listeners, false otherwise\n */\n override emit<TEventKey extends SEEventKey<TEvents>>(event: TEventKey, ...args: TEvents[TEventKey]): boolean {\n return super.emit(event, ...(args as unknown as unknown[]));\n }\n\n /**\n * Retrieves the listener list for a given event with the correct tuple signature.\n *\n * @param event - The event name to inspect\n * @returns Array of listeners registered for the event\n */\n override listeners<TEventKey extends SEEventKey<TEvents>>(\n event: TEventKey\n ): ((...args: TEvents[TEventKey]) => void)[] {\n return super.listeners(event) as ((...args: TEvents[TEventKey]) => void)[];\n }\n\n /**\n * Counts listeners for an event without widening the return type of {@link EventEmitter.listenerCount}.\n *\n * @param event - The event name to inspect\n * @returns The total number of listeners registered for the event\n */\n listenerCountTyped<TEventKey extends SEEventKey<TEvents>>(event: TEventKey): number {\n return super.listenerCount(event);\n }\n\n /**\n * Returns the list of event names known to the emitter with the mapped key type.\n *\n * @returns Array of event keys supported by the emitter\n */\n eventNamesTyped(): SEEventKey<TEvents>[] {\n return super.eventNames() as SEEventKey<TEvents>[];\n }\n\n /**\n * Waits for an event to be emitted, resolving with the listener arguments tuple once triggered.\n * Supports optional abort signals and timeouts for cancellation semantics.\n *\n * @param event - The event name to wait for\n * @param opts - Optional abort signal or timeout in milliseconds\n * @returns Promise resolving with the emitted argument tuple; rejects when aborted or timed out\n */\n waitFor<TEventKey extends SEEventKey<TEvents>>(\n event: TEventKey,\n opts?: { signal?: AbortSignal; timeoutMs?: number }\n ): Promise<TEvents[TEventKey]> {\n return new Promise<TEvents[TEventKey]>((resolve, reject) => {\n const onEvent = (...args: TEvents[TEventKey]): void => {\n cleanup();\n resolve(args);\n };\n\n const onAbort = (): void => {\n cleanup();\n reject(Object.assign(new Error('Aborted'), { name: 'AbortError' }));\n };\n\n let timeoutId: NodeJS.Timeout | null = null;\n\n const cleanup = (): void => {\n this.off(event, onEvent);\n opts?.signal?.removeEventListener('abort', onAbort);\n if (timeoutId) clearTimeout(timeoutId);\n };\n\n this.once(event, onEvent);\n\n if (opts?.signal) {\n if (opts.signal.aborted) return onAbort();\n opts.signal.addEventListener('abort', onAbort, { once: true });\n }\n\n if (opts?.timeoutMs !== undefined) {\n timeoutId = setTimeout(() => {\n cleanup();\n reject(new Error('Timed out'));\n }, opts.timeoutMs);\n }\n });\n }\n}\n","import chalk from 'chalk';\n\nimport { SeedcordError, SeedcordErrorCode } from '../Errors';\nimport { CoordinatedLifecycle } from './CoordinatedLifecycle';\n\nimport type { LifecycleTask, PhaseEvents } from './LifecycleTypes';\nimport type { UnionToTuple } from 'type-fest';\n\n/**\n * Startup phases for coordinated initialization\n *\n * Defines the order in which different components are initialized during bot startup.\n */\nexport enum StartupPhase {\n /** Validate environment variables and config files */\n Validation = 1,\n /** Discover plugin constructors via decorators or registry */\n Discovery,\n /** Register plugin metadata and declared dependencies */\n Registration,\n /** Inject and validate plugin-specific configuration */\n Configuration,\n /** Instantiate plugin classes with Core and arguments */\n Instantiation,\n /** Activate plugins by calling their init/setup effects */\n Activation,\n /** Mark seedcord as ready and start handling interactions */\n Ready\n}\n\n/** Define the order of phases */\nconst PHASE_ORDER: StartupPhase[] = [\n StartupPhase.Validation,\n StartupPhase.Discovery,\n StartupPhase.Registration,\n StartupPhase.Configuration,\n StartupPhase.Instantiation,\n StartupPhase.Activation,\n StartupPhase.Ready\n];\n\n/**\n * Event keys for coordinated startup phases\n */\nexport type CoordinatedStartupEventKey = PhaseEvents<'startup', UnionToTuple<StartupPhase>>;\n\n/**\n * Manages bot startup lifecycle with ordered phases\n *\n * Coordinates initialization of all bot components in a predictable sequence.\n * Tasks are executed within their designated phases to ensure proper dependency order.\n */\nexport class CoordinatedStartup extends CoordinatedLifecycle<StartupPhase> {\n private isStartingUp = false;\n private hasStarted = false;\n\n public constructor() {\n super('CoordinatedStartup', PHASE_ORDER, StartupPhase);\n }\n\n /**\n * Adds a task to a specific startup phase with timeout.\n *\n * @param phase - The startup phase from {@link StartupPhase}\n * @param taskName - Unique identifier for the task\n * @param task - Async function to execute\n * @param timeoutMs - Task timeout in milliseconds (default: 10000)\n */\n public override addTask(phase: StartupPhase, taskName: string, task: () => Promise<void>, timeoutMs = 10000): void {\n super.addTask(phase, taskName, task, timeoutMs);\n }\n\n protected canAddTask(): boolean {\n if (this.hasStarted) {\n throw new SeedcordError(SeedcordErrorCode.LifecycleAddAfterCompletion);\n }\n\n if (this.isStartingUp) {\n throw new SeedcordError(SeedcordErrorCode.LifecycleAddDuringRun);\n }\n\n return true;\n }\n\n protected canRemoveTask(): boolean {\n if (this.isStartingUp) {\n throw new SeedcordError(SeedcordErrorCode.LifecycleRemoveDuringRun);\n }\n\n return true;\n }\n\n protected getTaskType(): string {\n return 'startup';\n }\n\n protected async executeTasksInPhase(\n phase: StartupPhase,\n tasks: LifecycleTask[]\n ): Promise<PromiseSettledResult<void>[]> {\n // Execute all tasks in sequence\n const results: PromiseSettledResult<void>[] = [];\n for (const task of tasks) {\n results.push(\n await Promise.resolve()\n .then(() => this.runTaskWithTimeout(phase, task))\n .then(\n () => ({ status: 'fulfilled', value: undefined }) satisfies PromiseSettledResult<void>,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n (reason) => ({ status: 'rejected', reason }) satisfies PromiseSettledResult<void>\n )\n );\n }\n return results;\n }\n\n /**\n * Executes the coordinated startup sequence.\n *\n * Runs all registered tasks across startup phases in the correct order.\n * Each phase completes before the next phase begins. Tasks within a phase\n * are executed sequentially to maintain predictable initialization.\n *\n * @returns Promise that resolves when startup is complete\n * @throws An {@link Error} If startup fails or is called multiple times\n * @example\n * ```typescript\n * const startup = new CoordinatedStartup();\n * startup.addTask(StartupPhase.Services, 'database', () => db.connect(), 10000);\n * await startup.run();\n * ```\n */\n public async run(): Promise<void> {\n if (this.hasStarted) {\n this.logger.warn('Startup sequence has already completed');\n return;\n }\n\n if (this.isStartingUp) {\n this.logger.warn('Startup sequence already in progress');\n return;\n }\n\n this.isStartingUp = true;\n this.logger.info(`${chalk.bold.green('Starting')} coordinated startup sequence`);\n this.emit('startup:start');\n\n try {\n // Execute each phase in order\n for (const phase of PHASE_ORDER) await this.runPhase(phase);\n\n this.hasStarted = true;\n this.logger.info(`${chalk.bold.green('Coordinated startup completed')} successfully`);\n this.emit('startup:complete');\n } catch (error) {\n this.logger.error(`${chalk.bold.red('Coordinated startup failed')}`);\n this.emit('startup:error', error);\n throw error;\n } finally {\n this.isStartingUp = false;\n }\n }\n\n /**\n * Subscribe to startup events\n */\n public override on(event: CoordinatedStartupEventKey, listener: (...args: unknown[]) => void): void {\n super.on(event, listener);\n }\n\n /**\n * Unsubscribe from startup events\n */\n public override off(event: CoordinatedStartupEventKey, listener: (...args: unknown[]) => void): void {\n super.off(event, listener);\n }\n\n /**\n * Check if startup has completed\n */\n public get isReady(): boolean {\n return this.hasStarted;\n }\n\n /**\n * Check if startup is currently running\n */\n public get isRunning(): boolean {\n return this.isStartingUp;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/Logger.ts","../src/CooldownManager.ts","../src/Errors/ErrorCodes.ts","../src/Errors/ErrorMessages.ts","../src/Errors/SeedcordError.ts","../src/Lifecycle/CoordinatedLifecycle.ts","../src/Lifecycle/CoordinatedShutdown.ts","../src/HealthCheck.ts","../src/StrictEventEmitter.ts","../src/Lifecycle/CoordinatedStartup.ts"],"names":["Logger","instances","Map","instance","prefix","get","set","transportName","consoleTransport","createConsoleTransport","initializeLogger","getFormatCustomizations","padding","format","errors","stack","splat","colorize","level","timestamp","printf","info","ts","String","lvl","padEnd","lbl","label","msg","message","base","splatSym","Symbol","for","raw","extras","Array","isArray","cleaned","filter","x","Error","Object","keys","length","rendered","parts","push","JSON","stringify","join","transports","Console","combine","Envapter","isDevelopment","isStaging","transportsArray","maxSizeInMB","File","filename","uncolorize","json","bigint","space","maxsize","maxFiles","tailable","logger","createLogger","error","args","warn","http","verbose","debug","silly","Info","Warn","Debug","Silly","CooldownManager","window","Err","map","opts","cooldown","err","key","Date","now","check","last","remaining","undefined","isActive","clear","delete","SeedcordErrorCode","messages","ConfigMissingDiscordToken","ConfigUnknownExceptionWebhookMissing","ConfigUnknownExceptionWebhookInvalid","LifecycleAddAfterCompletion","LifecycleAddDuringRun","LifecycleRemoveDuringRun","LifecycleUnknownPhase","phase","LifecyclePhaseFailures","failures","LifecycleTaskTimeout","taskName","timeout","CoreSingletonViolation","CorePluginAfterInit","CorePluginKeyExists","CoreBotRoleMissing","guildId","DecoratorInteractionEventFilter","DecoratorMethodNotFound","DecoratorCommandAlreadyRegistered","commandName","existingScope","requestedScope","DecoratorCommandGlobalWithGuilds","DecoratorCommandGuildWithoutGuilds","DecoratorInvalidMiddlewarePriority","UtilHexInputType","UtilHexInvalid","UtilInvalidSlashRouteArgument","PluginMongoServiceDecoratorMissing","className","PluginMongoModelDecoratorMissing","PluginMongoConnectionFailed","databaseName","PluginKpgServiceDecoratorMissing","PluginKpgServiceTableMissing","PluginKpgInvalidStepCount","PluginKpgUnknownDirection","direction","PluginKpgUnresolvedMigrationsPath","PluginKpgNoMigrationFiles","PluginKpgInvalidMigrationModule","filePath","PluginKpgNonErrorFailure","formatSeedcordErrorMessage","code","formatter","resolvedArgs","resolveIdentifier","resolveMessage","formatErrorName","name","_identifier","chalk","bold","red","gray","SeedcordError","identifier","options","setPrototypeOf","prototype","captureStackTrace","SeedcordTypeError","TypeError","SeedcordRangeError","RangeError","SeedcordErrors","isSeedcordError","CoordinatedLifecycle","events","EventEmitter","tasksMap","loggerName","phaseOrder","phaseEnum","forEach","addTask","task","timeoutMs","canAddTask","tasks","italic","getTaskType","cyan","magenta","removeTask","canRemoveTask","initialLength","filteredTasks","removed","runPhase","yellow","emit","results","executeTasksInPhase","r","status","green","runTaskWithTimeout","Promise","race","_","reject","setTimeout","on","event","listener","off","ShutdownPhase","PHASE_ORDER","LOG_FLUSH_DELAY_MS","CoordinatedShutdown","isShuttingDown","exitCode","registerSignalHandlers","isShutdownEnabled","resolve","then","value","reason","process","run","exit","fallback","HTTP_OK","HTTP_NOT_FOUND","HealthCheck","server","shutdown","StopServices","stop","init","createServer","req","res","method","url","path","writeHead","end","once","address","host","port","listen","close","StrictEventEmitter","addListener","removeListener","listeners","listenerCountTyped","listenerCount","eventNamesTyped","eventNames","waitFor","onEvent","cleanup","onAbort","assign","timeoutId","signal","removeEventListener","aborted","addEventListener","StartupPhase","CoordinatedStartup","isStartingUp","hasStarted","isReady","isRunning"],"mappings":"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","file":"index.mjs","sourcesContent":["/* eslint-disable @typescript-eslint/no-base-to-string */\n/* eslint-disable @typescript-eslint/naming-convention */\nimport { Envapter } from 'envapt';\nimport { createLogger, format, transports } from 'winston';\n\nimport type { ILogger } from '@seedcord/types';\nimport type { Logform, Logger as Winston } from 'winston';\nimport type { ConsoleTransportInstance } from 'winston/lib/winston/transports';\n\n/**\n * Logging service with console and file output support\n *\n * Provides structured logging with timestamps, levels, and labels.\n * Instances are cached by transport name for consistent formatting.\n */\nexport class Logger implements ILogger {\n declare private logger: Winston;\n private static readonly instances = new Map<string, Logger>();\n\n private static instance(prefix: string): Logger {\n let instance = this.instances.get(prefix);\n if (!instance) {\n instance = new Logger(prefix);\n this.instances.set(prefix, instance);\n }\n return instance;\n }\n\n constructor(transportName: string) {\n const consoleTransport = this.createConsoleTransport(transportName);\n this.initializeLogger(consoleTransport);\n }\n\n private getFormatCustomizations(): Logform.Format[] {\n const padding = 7;\n return [\n format.errors({ stack: true }),\n format.splat(),\n format.colorize({ level: true }),\n format.timestamp({ format: 'D MMM, hh:mm:ss a' }),\n format.printf((info: Logform.TransformableInfo) => {\n const ts = String(info.timestamp ?? '');\n const lvl = String(info.level).padEnd(padding);\n const lbl = String(info.label ?? '');\n const msg = String(info.message ?? '');\n\n const base = `${ts} [${lvl}]: ${lbl} - ${msg}`;\n\n const splatSym = Symbol.for('splat');\n const raw = (info as unknown as Record<string | symbol, unknown>)[splatSym];\n const extras = Array.isArray(raw) ? raw : [];\n\n const cleaned = extras\n .filter((x) => !(x instanceof Error))\n .filter((x) => {\n if (!x) return false;\n if (typeof x !== 'object') return true;\n return Object.keys(x as object).length > 0;\n });\n\n let rendered = base;\n\n if (typeof info.stack === 'string') {\n rendered += `\\n${String(info.stack)}`;\n }\n\n if (cleaned.length) {\n const parts: string[] = [];\n for (const x of cleaned) {\n if (typeof x === 'string') parts.push(x);\n else {\n try {\n parts.push(JSON.stringify(x, null, 2));\n } catch {\n parts.push(String(x));\n }\n }\n }\n rendered += `\\n${parts.join(' ')}`;\n }\n\n return rendered;\n })\n ];\n }\n\n private createConsoleTransport(transportName: string): ConsoleTransportInstance {\n return new transports.Console({\n format: format.combine(format.label({ label: transportName }), ...this.getFormatCustomizations()),\n level: Envapter.isDevelopment ? 'silly' : Envapter.isStaging ? 'debug' : 'info'\n });\n }\n\n private initializeLogger(consoleTransport: transports.ConsoleTransportInstance): void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const transportsArray: any[] = [consoleTransport];\n\n // Add file transport only in non-production environments\n if (Envapter.isDevelopment) {\n const maxSizeInMB = 10;\n transportsArray.push(\n new transports.File({\n filename: 'logs/application.log',\n level: 'debug',\n format: format.combine(\n format.uncolorize(),\n format.errors({ stack: true }),\n format.timestamp(),\n format.json({ bigint: true, space: 2 })\n ),\n maxsize: maxSizeInMB * 1024 * 1024, // 10MB\n maxFiles: 5,\n tailable: true\n })\n );\n }\n\n this.logger = createLogger({\n transports: transportsArray\n });\n }\n\n /**\n * Logs an error message with optional additional data.\n *\n * @param msg - The error message to log\n * @param args - Additional data to include in the log entry\n */\n public error(msg: string, ...args: unknown[]): void {\n this.logger.error(msg, ...args);\n }\n\n /**\n * Logs a warning message with optional additional data.\n *\n * @param msg - The warning message to log\n * @param args - Additional data to include in the log entry\n */\n public warn(msg: string, ...args: unknown[]): void {\n this.logger.warn(msg, ...args);\n }\n\n /**\n * Logs an informational message with optional additional data.\n *\n * @param msg - The informational message to log\n * @param args - Additional data to include in the log entry\n */\n public info(msg: string, ...args: unknown[]): void {\n this.logger.info(msg, ...args);\n }\n\n /**\n * Logs an HTTP-related message with optional additional data.\n *\n * @param msg - The HTTP message to log\n * @param args - Additional data to include in the log entry\n */\n public http(msg: string, ...args: unknown[]): void {\n this.logger.http(msg, ...args);\n }\n\n /**\n * Logs a verbose message with optional additional data.\n *\n * @param msg - The verbose message to log\n * @param args - Additional data to include in the log entry\n */\n public verbose(msg: string, ...args: unknown[]): void {\n this.logger.verbose(msg, ...args);\n }\n\n /**\n * Logs a debug message with optional additional data.\n *\n * @param msg - The debug message to log\n * @param args - Additional data to include in the log entry\n */\n public debug(msg: string, ...args: unknown[]): void {\n this.logger.debug(msg, ...args);\n }\n\n /**\n * Logs a silly/trace level message with optional additional data.\n *\n * @param msg - The silly message to log\n * @param args - Additional data to include in the log entry\n */\n public silly(msg: string, ...args: unknown[]): void {\n this.logger.silly(msg, ...args);\n }\n\n /**\n * Static method to log an error message with a specific prefix.\n * Creates or retrieves a logger instance for the given prefix.\n *\n * @param prefix - The logger prefix/label to use\n * @param msg - The error message to log\n * @param args - Additional data to include in the log entry\n */\n public static Error(prefix: string, msg: string, ...args: unknown[]): void {\n const logger = this.instance(prefix);\n logger.error(msg, ...args);\n }\n\n /**\n * Static method to log an informational message with a specific prefix.\n * Creates or retrieves a logger instance for the given prefix.\n *\n * @param prefix - The logger prefix/label to use\n * @param msg - The informational message to log\n * @param args - Additional data to include in the log entry\n */\n public static Info(prefix: string, msg: string, ...args: unknown[]): void {\n const logger = this.instance(prefix);\n logger.info(msg, ...args);\n }\n\n /**\n * Static method to log a warning message with a specific prefix.\n * Creates or retrieves a logger instance for the given prefix.\n *\n * @param prefix - The logger prefix/label to use\n * @param msg - The warning message to log\n * @param args - Additional data to include in the log entry\n */\n public static Warn(prefix: string, msg: string, ...args: unknown[]): void {\n const logger = this.instance(prefix);\n logger.warn(msg, ...args);\n }\n\n /**\n * Static method to log a debug message with a specific prefix.\n * Creates or retrieves a logger instance for the given prefix.\n *\n * @param prefix - The logger prefix/label to use\n * @param msg - The debug message to log\n * @param args - Additional data to include in the log entry\n */\n public static Debug(prefix: string, msg: string, ...args: unknown[]): void {\n const logger = this.instance(prefix);\n logger.debug(msg, ...args);\n }\n\n /**\n * Static method to log a silly/trace level message with a specific prefix.\n * Creates or retrieves a logger instance for the given prefix.\n *\n * @param prefix - The logger prefix/label to use\n * @param msg - The silly message to log\n * @param args - Additional data to include in the log entry\n */\n public static Silly(prefix: string, msg: string, ...args: unknown[]): void {\n const logger = this.instance(prefix);\n logger.silly(msg, ...args);\n }\n}\n","import { Envapter } from 'envapt';\n\nimport { Logger } from './Logger';\n\n/**\n * Configuration options for CooldownManager.\n */\nexport interface CooldownOptions {\n /** Cooldown window in milliseconds (default 1000) */\n cooldown?: number;\n /** Custom error class to throw when a key is still cooling down */\n err?: new (msg: string, ...args: any[]) => Error;\n /** Message passed to the error constructor (default \"Cooldown active\") */\n message?: string;\n}\n\n/**\n * Lightweight utility for per-key cooldowns.\n *\n * Manages time-based restrictions on operations by key,\n * useful for rate limiting, command cooldowns, and spam prevention.\n */\nexport class CooldownManager {\n private readonly window: number;\n private readonly Err: new (msg: string, ...args: any[]) => Error;\n private readonly msg: string;\n private readonly map = new Map<string, number>();\n\n /**\n * Creates a new CooldownManager instance.\n *\n * @param opts - Configuration options for the cooldown behavior\n */\n constructor(opts: CooldownOptions = {}) {\n this.window = opts.cooldown ?? 1_000;\n this.Err = opts.err ?? Error;\n this.msg = opts.message ?? 'Cooldown active';\n }\n\n /**\n * Records usage timestamp for a key without any cooldown checks.\n *\n * @param key - The unique identifier for the cooldown entry\n */\n set(key: string): void {\n this.map.set(key, Date.now());\n }\n\n /**\n * Verifies cooldown status for a key and updates timestamp if not active.\n *\n * If the cooldown is still active, throws the configured error.\n * If not active, updates the timestamp and returns successfully.\n *\n * @param key - The unique identifier to check cooldown for\n * @throws An {@link Err} When the cooldown is still active for the given key\n */\n check(key: string): void {\n const now = Date.now();\n const last = this.map.get(key);\n const remaining = this.window - (now - (last ?? 0));\n\n if (Envapter.isDevelopment && remaining > 0) {\n Logger.Debug('CooldownManager', `${key} - ${remaining}ms remaining`);\n }\n\n if (last !== undefined && remaining > 0) {\n throw new this.Err(this.msg, remaining);\n }\n this.map.set(key, now);\n }\n\n /**\n * Checks if a key is currently cooling down without updating timestamp.\n *\n * @param key - The unique identifier to check\n * @returns True if the key is still cooling down, false otherwise\n */\n isActive(key: string): boolean {\n const last = this.map.get(key);\n return last !== undefined && Date.now() - last < this.window;\n }\n\n /**\n * Removes a key from the cooldown map.\n *\n * @param key - The unique identifier to remove (useful for manual resets)\n */\n clear(key: string): void {\n this.map.delete(key);\n }\n}\n","/* eslint-disable no-magic-numbers */\n\nexport enum SeedcordErrorCode {\n ConfigMissingDiscordToken = 1001,\n ConfigUnknownExceptionWebhookMissing = 1002,\n ConfigUnknownExceptionWebhookInvalid = 1003,\n\n LifecycleAddAfterCompletion = 1101,\n LifecycleAddDuringRun = 1102,\n LifecycleRemoveDuringRun = 1103,\n LifecycleUnknownPhase = 1104,\n LifecyclePhaseFailures = 1105,\n LifecycleTaskTimeout = 1106,\n\n CoreSingletonViolation = 1201,\n CorePluginAfterInit = 1202,\n CorePluginKeyExists = 1203,\n CoreBotRoleMissing = 1204,\n\n DecoratorInteractionEventFilter = 1301,\n DecoratorMethodNotFound = 1302,\n DecoratorCommandAlreadyRegistered = 1303,\n DecoratorCommandGlobalWithGuilds = 1304,\n DecoratorCommandGuildWithoutGuilds = 1305,\n DecoratorInvalidMiddlewarePriority = 1306,\n\n UtilHexInputType = 1401,\n UtilHexInvalid = 1402,\n UtilInvalidSlashRouteArgument = 1403,\n\n PluginMongoServiceDecoratorMissing = 2101,\n PluginMongoModelDecoratorMissing = 2102,\n PluginMongoConnectionFailed = 2103,\n\n PluginKpgServiceDecoratorMissing = 2201,\n PluginKpgServiceTableMissing = 2202,\n PluginKpgInvalidStepCount = 2203,\n PluginKpgUnknownDirection = 2204,\n PluginKpgUnresolvedMigrationsPath = 2205,\n PluginKpgNoMigrationFiles = 2206,\n PluginKpgInvalidMigrationModule = 2207,\n PluginKpgNonErrorFailure = 2208\n}\n","import { SeedcordErrorCode } from './ErrorCodes';\n\nconst messages = {\n [SeedcordErrorCode.ConfigMissingDiscordToken]: () => 'Missing DISCORD_BOT_TOKEN environment variable.',\n [SeedcordErrorCode.ConfigUnknownExceptionWebhookMissing]: () =>\n 'Missing UNKNOWN_EXCEPTION_WEBHOOK_URL environment variable.',\n [SeedcordErrorCode.ConfigUnknownExceptionWebhookInvalid]: () => 'Invalid UNKNOWN_EXCEPTION_WEBHOOK_URL value.',\n\n [SeedcordErrorCode.LifecycleAddAfterCompletion]: () =>\n 'Cannot add tasks after startup sequence has already completed.',\n [SeedcordErrorCode.LifecycleAddDuringRun]: () => 'Cannot add tasks while startup sequence is in progress.',\n [SeedcordErrorCode.LifecycleRemoveDuringRun]: () => 'Cannot remove tasks while startup sequence is in progress.',\n [SeedcordErrorCode.LifecycleUnknownPhase]: (phase: unknown) => `Unknown phase: ${String(phase)}.`,\n [SeedcordErrorCode.LifecyclePhaseFailures]: (phase: string, failures: number) =>\n `Phase ${phase} completed with ${failures} failed task${failures === 1 ? '' : 's'}.`,\n [SeedcordErrorCode.LifecycleTaskTimeout]: (taskName: string, timeout: number) =>\n `Task \"${taskName}\" timed out after ${timeout}ms.`,\n\n [SeedcordErrorCode.CoreSingletonViolation]: () =>\n 'Seedcord can only be instantiated once. Use the existing instance instead.',\n [SeedcordErrorCode.CorePluginAfterInit]: () => 'Cannot attach a plugin after initialization.',\n [SeedcordErrorCode.CorePluginKeyExists]: (key: string) => `Plugin with key \"${key}\" already exists.`,\n [SeedcordErrorCode.CoreBotRoleMissing]: (guildId?: string) =>\n guildId ? `Bot role not found in guild ${guildId}.` : 'Bot role not found in guild.',\n\n [SeedcordErrorCode.DecoratorInteractionEventFilter]: () => 'Interaction middleware cannot specify event filters.',\n [SeedcordErrorCode.DecoratorMethodNotFound]: () =>\n 'Decorator could not locate the original method. Ensure the method exists before applying the decorator.',\n [SeedcordErrorCode.DecoratorCommandAlreadyRegistered]: (\n commandName: string,\n existingScope: string,\n requestedScope: string\n ) =>\n `Command \"${commandName}\" is already registered as a \"${existingScope}\" command and cannot be re-registered as a \"${requestedScope}\" command.`,\n [SeedcordErrorCode.DecoratorCommandGlobalWithGuilds]: () =>\n 'RegisterCommand(\"global\") cannot have guilds specified.',\n [SeedcordErrorCode.DecoratorCommandGuildWithoutGuilds]: () =>\n 'RegisterCommand(\"guild\") requires a non-empty guilds array.',\n [SeedcordErrorCode.DecoratorInvalidMiddlewarePriority]: () => 'Middleware priority must be a finite number.',\n\n [SeedcordErrorCode.UtilHexInputType]: () => 'hexToNumber expects a string input.',\n [SeedcordErrorCode.UtilHexInvalid]: () => 'Invalid hex string.',\n [SeedcordErrorCode.UtilInvalidSlashRouteArgument]: () => 'Invalid argument passed to buildSlashRoute.',\n\n [SeedcordErrorCode.PluginMongoServiceDecoratorMissing]: (className: string) =>\n `Missing @RegisterMongoService on ${className}.`,\n [SeedcordErrorCode.PluginMongoModelDecoratorMissing]: (className: string) =>\n `Missing @RegisterMongoModel on ${className}.`,\n [SeedcordErrorCode.PluginMongoConnectionFailed]: (databaseName?: string) =>\n databaseName ? `Could not connect to MongoDB (${databaseName}).` : 'Could not connect to MongoDB.',\n\n [SeedcordErrorCode.PluginKpgServiceDecoratorMissing]: (className: string) =>\n `Missing @RegisterKpgService on ${className}.`,\n [SeedcordErrorCode.PluginKpgServiceTableMissing]: (className: string) =>\n `Missing table metadata for ${className}. Provide a table via @RegisterKpgService().`,\n [SeedcordErrorCode.PluginKpgInvalidStepCount]: () => 'Migration step count must be a non-negative integer.',\n [SeedcordErrorCode.PluginKpgUnknownDirection]: (direction: unknown) =>\n `Unknown migration direction: ${String(direction)}.`,\n [SeedcordErrorCode.PluginKpgUnresolvedMigrationsPath]: (label: string) =>\n `Unable to resolve migrations at path: ${label}.`,\n [SeedcordErrorCode.PluginKpgNoMigrationFiles]: () => 'No migration files provided.',\n [SeedcordErrorCode.PluginKpgInvalidMigrationModule]: (filePath: string) =>\n `Migration file ${filePath} must export async functions up and down.`,\n [SeedcordErrorCode.PluginKpgNonErrorFailure]: (message: string) => `Migration failure: ${message}.`\n} as const;\n\nexport type SeedcordErrorArguments<TCode extends SeedcordErrorCode> = Parameters<(typeof messages)[TCode]>;\n\nexport function formatSeedcordErrorMessage<TCode extends SeedcordErrorCode>(\n code: TCode,\n args?: SeedcordErrorArguments<TCode>\n): string {\n const formatter = messages[code];\n const resolvedArgs = (args ?? []) as unknown[];\n return (formatter as (...params: unknown[]) => string)(...resolvedArgs);\n}\n\nexport { messages as seedcordErrorMessages };\n","import chalk from 'chalk';\n\nimport { SeedcordErrorCode } from './ErrorCodes';\nimport { formatSeedcordErrorMessage, type SeedcordErrorArguments } from './ErrorMessages';\n\nexport type SeedcordErrorIdentifier = keyof typeof SeedcordErrorCode;\n\nexport interface SeedcordErrorOptions extends ErrorOptions {}\n\nfunction resolveIdentifier(code: SeedcordErrorCode): SeedcordErrorIdentifier {\n return SeedcordErrorCode[code] as SeedcordErrorIdentifier;\n}\n\nfunction resolveMessage(code: SeedcordErrorCode, args?: SeedcordErrorArguments<SeedcordErrorCode>): string {\n return formatSeedcordErrorMessage(code, args);\n}\n\nfunction formatErrorName(name: string, _identifier: SeedcordErrorIdentifier, code: SeedcordErrorCode): string {\n return `${chalk.bold.red(name)}[${chalk.gray(code)}]`;\n}\n\nexport class SeedcordError extends Error {\n public readonly code: SeedcordErrorCode;\n public readonly identifier: SeedcordErrorIdentifier;\n\n constructor(\n code: SeedcordErrorCode,\n args?: SeedcordErrorArguments<SeedcordErrorCode>,\n options?: SeedcordErrorOptions\n ) {\n const message = resolveMessage(code, args);\n super(message, options);\n this.code = code;\n this.identifier = resolveIdentifier(code);\n this.name = formatErrorName(new.target.name, this.identifier, this.code);\n Object.setPrototypeOf(this, new.target.prototype);\n if (typeof Error.captureStackTrace === 'function') {\n Error.captureStackTrace(this, new.target);\n }\n }\n}\n\nexport class SeedcordTypeError extends TypeError {\n public readonly code: SeedcordErrorCode;\n public readonly identifier: SeedcordErrorIdentifier;\n\n constructor(\n code: SeedcordErrorCode,\n args?: SeedcordErrorArguments<SeedcordErrorCode>,\n options?: SeedcordErrorOptions\n ) {\n const message = resolveMessage(code, args);\n super(message, options);\n this.code = code;\n this.identifier = resolveIdentifier(code);\n this.name = formatErrorName(new.target.name, this.identifier, this.code);\n Object.setPrototypeOf(this, new.target.prototype);\n if (typeof Error.captureStackTrace === 'function') {\n Error.captureStackTrace(this, new.target);\n }\n }\n}\n\nexport class SeedcordRangeError extends RangeError {\n public readonly code: SeedcordErrorCode;\n public readonly identifier: SeedcordErrorIdentifier;\n\n constructor(\n code: SeedcordErrorCode,\n args?: SeedcordErrorArguments<SeedcordErrorCode>,\n options?: SeedcordErrorOptions\n ) {\n const message = resolveMessage(code, args);\n super(message, options);\n this.code = code;\n this.identifier = resolveIdentifier(code);\n this.name = formatErrorName(new.target.name, this.identifier, this.code);\n Object.setPrototypeOf(this, new.target.prototype);\n if (typeof Error.captureStackTrace === 'function') {\n Error.captureStackTrace(this, new.target);\n }\n }\n}\n\nexport const SeedcordErrors = {\n Error: SeedcordError,\n TypeError: SeedcordTypeError,\n RangeError: SeedcordRangeError\n} as const;\n\nexport type AnySeedcordError = SeedcordError | SeedcordTypeError | SeedcordRangeError;\n\nexport function isSeedcordError(error: unknown): error is AnySeedcordError {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'code' in error &&\n typeof (error as { code: unknown }).code === 'number' &&\n 'identifier' in error &&\n typeof (error as { identifier: unknown }).identifier === 'string'\n );\n}\n","/*\n * Inspired by Akka Coordinated Shutdown: https://doc.akka.io/libraries/akka-core/current/coordinated-shutdown.html\n * and Lewis's implementation in a private repo elsewhere (https://github.com/Yomanz)\n */\n\nimport { EventEmitter } from 'node:events';\n\nimport chalk from 'chalk';\n\nimport { SeedcordError, SeedcordErrorCode } from '../Errors';\nimport { Logger } from '../Logger';\n\nimport type { LifecycleTask } from './LifecycleTypes';\n\n/**\n * Abstract base class for coordinated lifecycle management (startup/shutdown)\n */\nexport abstract class CoordinatedLifecycle<TPhase extends number> {\n protected readonly logger: Logger;\n protected readonly events = new EventEmitter();\n protected readonly tasksMap = new Map<TPhase, LifecycleTask[]>();\n\n protected constructor(\n loggerName: string,\n protected readonly phaseOrder: TPhase[],\n protected readonly phaseEnum: Record<number, string>\n ) {\n this.logger = new Logger(loggerName);\n // Initialize phases\n this.phaseOrder.forEach((phase) => this.tasksMap.set(phase, []));\n }\n\n /**\n * Adds a lifecycle task to a specific phase.\n *\n * Tasks are executed in phase order during lifecycle operations.\n * Each task has a timeout to prevent hanging operations.\n *\n * @param phase - The lifecycle phase to add the task to\n * @param taskName - Unique name for the task (used for logging and removal)\n * @param task - Async function to execute during the phase\n * @param timeoutMs - Maximum time allowed for task execution in milliseconds\n * @example\n * ```typescript\n * lifecycle.addTask(StartupPhase.Services, 'start-database', async () => {\n * await database.connect();\n * }, 10000);\n * ```\n */\n public addTask(phase: TPhase, taskName: string, task: () => Promise<void>, timeoutMs: number): void {\n if (!this.canAddTask()) return;\n\n const tasks = this.tasksMap.get(phase);\n if (!tasks) {\n throw new SeedcordError(SeedcordErrorCode.LifecycleUnknownPhase, [phase]);\n }\n\n tasks.push({ name: taskName, task, timeout: timeoutMs });\n this.logger.debug(\n `${chalk.italic('Added')} ${this.getTaskType()} task ${chalk.bold.cyan(taskName)} to phase ${chalk.bold.magenta(this.phaseEnum[phase])}`\n );\n }\n\n /**\n * Removes a lifecycle task from a specific phase.\n *\n * @param phase - The lifecycle phase to remove the task from\n * @param taskName - Name of the task to remove\n * @returns True if the task was found and removed, false otherwise\n */\n public removeTask(phase: TPhase, taskName: string): boolean {\n if (!this.canRemoveTask()) return false;\n\n const tasks = this.tasksMap.get(phase);\n if (!tasks) return false;\n\n const initialLength = tasks.length;\n const filteredTasks = tasks.filter((task) => task.name !== taskName);\n this.tasksMap.set(phase, filteredTasks);\n\n const removed = initialLength !== filteredTasks.length;\n if (removed) {\n this.logger.debug(\n `${chalk.italic('Removed')} ${this.getTaskType()} task ${chalk.bold.cyan(taskName)} from phase ${chalk.bold.magenta(this.phaseEnum[phase])}`\n );\n }\n\n return removed;\n }\n\n /**\n * Run all tasks in a specific phase\n */\n protected async runPhase(phase: TPhase): Promise<void> {\n const tasks = this.tasksMap.get(phase) ?? [];\n if (tasks.length === 0) {\n this.logger.warn(`No tasks to run in phase ${chalk.bold.magenta(this.phaseEnum[phase])}`);\n return;\n }\n\n this.logger.info(\n `${chalk.bold.yellow('Running')} ${this.getTaskType()} phase ${chalk.bold.magenta(this.phaseEnum[phase])} with ${chalk.bold.cyan(tasks.length)} tasks`\n );\n this.emit(`phase:${phase}:start`);\n\n // Execute all tasks with the execution strategy\n const results: PromiseSettledResult<void>[] = await this.executeTasksInPhase(phase, tasks);\n\n // Check results\n const failures = results.filter((r) => r.status === 'rejected').length;\n if (failures > 0) {\n throw new SeedcordError(SeedcordErrorCode.LifecyclePhaseFailures, [\n chalk.bold.magenta(this.phaseEnum[phase]),\n failures\n ]);\n } else {\n this.logger.info(\n `Phase ${chalk.bold.magenta(this.phaseEnum[phase])} ${chalk.bold.green('completed successfully')}`\n );\n }\n\n this.emit(`phase:${phase}:complete`);\n }\n\n /**\n * Run a single task with timeout\n */\n protected async runTaskWithTimeout(phase: TPhase, task: LifecycleTask): Promise<void> {\n this.logger.info(\n `${chalk.italic('Starting')} task ${chalk.bold.cyan(task.name)} in phase ${chalk.bold.magenta(this.phaseEnum[phase])}`\n );\n\n try {\n // Create a race between the task and a timeout\n await Promise.race([\n task.task(),\n new Promise<void>((_, reject) => {\n setTimeout(() => {\n reject(new SeedcordError(SeedcordErrorCode.LifecycleTaskTimeout, [task.name, task.timeout]));\n }, task.timeout);\n })\n ]);\n\n this.logger.info(\n `${chalk.italic('Completed')} task ${chalk.bold.cyan(task.name)} in phase ${chalk.bold.magenta(this.phaseEnum[phase])}`\n );\n } catch (error) {\n this.logger.error(\n `${chalk.italic('Failed')} task ${chalk.bold.cyan(task.name)} in phase ${chalk.bold.magenta(this.phaseEnum[phase])}:`,\n error\n );\n throw error;\n }\n }\n\n /**\n * Subscribe to lifecycle events\n */\n public on(event: string, listener: (...args: unknown[]) => void): void {\n this.events.on(event, listener);\n }\n\n /**\n * Unsubscribe from lifecycle events\n */\n public off(event: string, listener: (...args: unknown[]) => void): void {\n this.events.off(event, listener);\n }\n\n protected emit(event: string, ...args: unknown[]): boolean {\n return this.events.emit(event, ...args);\n }\n\n // Abstract methods to be implemented by subclasses\n protected abstract canAddTask(): boolean;\n protected abstract canRemoveTask(): boolean;\n protected abstract getTaskType(): string;\n protected abstract executeTasksInPhase(\n phase: TPhase,\n tasks: LifecycleTask[]\n ): Promise<PromiseSettledResult<void>[]>;\n}\n","import chalk from 'chalk';\nimport { Envapt } from 'envapt';\n\nimport { CoordinatedLifecycle } from './CoordinatedLifecycle';\n\nimport type { LifecycleTask, PhaseEvents } from './LifecycleTypes';\nimport type { UnionToTuple } from 'type-fest';\n\n/**\n * Shutdown phases for coordinated application shutdown.\n */\nexport enum ShutdownPhase {\n /** Stop accepting new requests/interactions */\n StopAcceptingRequests = 1,\n /** Stop background services (health checks, etc.) */\n StopServices,\n /** Disconnect from external resources (database, APIs) */\n ExternalResources,\n /** Disconnect from Discord */\n DiscordCleanup,\n /** Final cleanup tasks */\n FinalCleanup\n}\n\n/** Define the order of phases */\nconst PHASE_ORDER: ShutdownPhase[] = [\n ShutdownPhase.StopAcceptingRequests,\n ShutdownPhase.StopServices,\n ShutdownPhase.ExternalResources,\n ShutdownPhase.DiscordCleanup,\n ShutdownPhase.FinalCleanup\n];\n\n/**\n * Event keys for coordinated shutdown phases\n */\nexport type CoordinatedShutdownEventKey = PhaseEvents<'shutdown', UnionToTuple<ShutdownPhase>>;\n\nconst LOG_FLUSH_DELAY_MS = 500;\n\n/**\n * CoordinatedShutdown manages graceful application shutdown by executing registered tasks across defined phases.\n *\n * It listens for termination signals (SIGINT, SIGTERM) and runs tasks in parallel within each phase.\n * Tasks can be added or removed dynamically, and each task has an associated timeout.\n *\n * Enable or disable the shutdown mechanism via the SHUTDOWN_IS_ENABLED environment variable. It's disabled by default. I recommend enabling it in production environments.\n */\nexport class CoordinatedShutdown extends CoordinatedLifecycle<ShutdownPhase> {\n @Envapt('SHUTDOWN_IS_ENABLED', { fallback: false })\n declare private readonly isShutdownEnabled: boolean;\n\n private isShuttingDown = false;\n private exitCode = 0;\n\n public constructor() {\n super('CoordinatedShutdown', PHASE_ORDER, ShutdownPhase);\n\n // Register signal effects\n this.registerSignalHandlers();\n }\n\n protected canAddTask(): boolean {\n return this.isShutdownEnabled;\n }\n\n protected canRemoveTask(): boolean {\n return true;\n }\n\n protected getTaskType(): string {\n return 'shutdown';\n }\n\n protected async executeTasksInPhase(\n phase: ShutdownPhase,\n tasks: LifecycleTask[]\n ): Promise<PromiseSettledResult<void>[]> {\n // Execute all tasks in parallel (unlike startup which uses sequential)\n const results: PromiseSettledResult<void>[] = [];\n for (const task of tasks) {\n results.push(\n await Promise.resolve()\n .then(() => this.runTaskWithTimeout(phase, task))\n .then(\n () => ({ status: 'fulfilled', value: undefined }) satisfies PromiseSettledResult<void>,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n (reason) => ({ status: 'rejected', reason }) satisfies PromiseSettledResult<void>\n )\n );\n }\n return results;\n }\n\n private registerSignalHandlers(): void {\n if (!this.isShutdownEnabled) return;\n\n process.on('SIGTERM', () => {\n this.logger.info(`Received ${chalk.yellow.bold('SIGTERM')} signal`);\n void this.run(0);\n });\n\n process.on('SIGINT', () => {\n this.logger.info(`Received ${chalk.yellow.bold('SIGINT')} signal`);\n void this.run(0);\n });\n }\n\n /**\n * Adds a task to a specific shutdown phase with timeout.\n *\n * @param phase - The shutdown phase from {@link ShutdownPhase}\n * @param taskName - Unique identifier for the task\n * @param task - Async function to execute\n * @param timeoutMs - Task timeout in milliseconds (default: 5000)\n */\n public override addTask(phase: ShutdownPhase, taskName: string, task: () => Promise<void>, timeoutMs = 5000): void {\n super.addTask(phase, taskName, task, timeoutMs);\n }\n\n /**\n * Removes a task from a specific shutdown phase.\n *\n * @param phase - The shutdown phase to remove from\n * @param taskName - Name of the task to remove\n * @returns True if task was found and removed\n */\n public override removeTask(phase: ShutdownPhase, taskName: string): boolean {\n return super.removeTask(phase, taskName);\n }\n\n /**\n * Executes the coordinated shutdown sequence.\n *\n * Runs all registered tasks across shutdown phases in reverse order.\n * Tasks within each phase are executed in parallel for faster shutdown.\n * Process exits with the specified code when complete.\n *\n * @param exitCode - Process exit code (default: `0`)\n * @returns Promise that resolves when shutdown is complete\n * @example\n * ```typescript\n * shutdown.addTask(ShutdownPhase.Services, 'database', () => db.disconnect(), 5000);\n * await shutdown.run(0); // Graceful shutdown\n * ```\n */\n public async run(exitCode = 0): Promise<void> {\n if (this.isShuttingDown) {\n this.logger.warn('Shutdown sequence already in progress');\n return;\n }\n\n this.isShuttingDown = true;\n this.exitCode = exitCode;\n this.logger.info(\n `${chalk.bold.yellow('Starting')} coordinated shutdown with exit code ${chalk.bold.cyan(exitCode)}`\n );\n this.emit('shutdown:start');\n\n try {\n // Execute each phase in order\n for (const phase of PHASE_ORDER) {\n await this.runPhase(phase);\n }\n\n this.logger.info(`${chalk.bold.green('Coordinated shutdown completed')} successfully`);\n this.emit('shutdown:complete');\n } catch (error) {\n this.logger.error(`${chalk.bold.red('Coordinated shutdown failed')}`);\n this.emit('shutdown:error', error);\n } finally {\n this.logger.info(`${chalk.bold.red('Exiting')} process with code ${chalk.bold.cyan(this.exitCode)}`);\n setTimeout(() => {\n process.exit(this.exitCode);\n }, LOG_FLUSH_DELAY_MS);\n }\n }\n\n /**\n * Subscribe to shutdown events\n */\n public override on(event: CoordinatedShutdownEventKey, listener: (...args: unknown[]) => void): void {\n super.on(event, listener);\n }\n\n /**\n * Unsubscribe from shutdown events\n */\n public override off(event: CoordinatedShutdownEventKey, listener: (...args: unknown[]) => void): void {\n super.off(event, listener);\n }\n}\n","import { createServer } from 'http';\n\nimport chalk from 'chalk';\nimport { Envapt } from 'envapt';\n\nimport { CoordinatedShutdown, ShutdownPhase } from './Lifecycle/CoordinatedShutdown';\nimport { Logger } from './Logger';\n\nimport type { IncomingMessage, Server, ServerResponse } from 'http';\n\nconst HTTP_OK = 200;\nconst HTTP_NOT_FOUND = 404;\n\n/**\n * HTTP health check service for monitoring bot status.\n *\n * Provides a simple HTTP endpoint that responds with JSON status\n * information, useful for container orchestration and monitoring.\n */\nexport class HealthCheck {\n public readonly logger = new Logger('HealthCheck');\n\n /**\n * Set `PORT` in your `.env` to change the default port (6956).\n */\n @Envapt('HEALTH_CHECK_PORT', { fallback: 6956 })\n declare public readonly port: number;\n\n /**\n * Set `HEALTH_CHECK_PATH` in your `.env` to change the default path (`/healthcheck`).\n */\n @Envapt('HEALTH_CHECK_PATH', { fallback: '/healthcheck' })\n declare public readonly path: string;\n\n /**\n * Set `HEALTH_CHECK_HOST` in your `.env` to change the host. Defaults to `null` (all interfaces).\n */\n @Envapt('HEALTH_CHECK_HOST')\n declare public readonly host: string | null;\n\n private server?: Server;\n\n constructor(shutdown: CoordinatedShutdown) {\n // Register shutdown task\n shutdown.addTask(ShutdownPhase.StopServices, 'stop-healthcheck-server', async () => await this.stop());\n }\n\n /**\n * Starts the health check server.\n * @returns Promise that resolves when the server is listening\n */\n public async init(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n this.server = createServer((req: IncomingMessage, res: ServerResponse) => {\n if (req.method === 'GET' && req.url === this.path) {\n res.writeHead(HTTP_OK, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ status: 'ok', timestamp: Date.now() }));\n } else {\n res.writeHead(HTTP_NOT_FOUND, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ status: 'not found' }));\n }\n });\n\n this.server.on('error', reject);\n this.server.once('listening', () => {\n const address = this.host ?? 'localhost';\n this.logger.info(\n `${chalk.green.bold('✓')} Health check server listening on ${chalk.cyan(`http://${address}:${this.port}${this.path}`)}`\n );\n resolve();\n });\n\n if (this.host) {\n this.logger.debug(`Binding health check server to ${this.host}`);\n this.server.listen(this.port, this.host);\n } else {\n this.logger.debug('Binding health check server to all interfaces');\n this.server.listen(this.port);\n }\n });\n }\n\n /**\n * Stops the health check server.\n *\n * @returns Promise that resolves when the server is closed\n */\n public stop(): Promise<void> {\n if (this.server !== undefined) {\n const server = this.server;\n return new Promise((resolve) => {\n server.once('close', () => resolve());\n\n server.close(() => {\n this.logger.info(chalk.bold.red('Health check server stopped'));\n });\n });\n }\n\n return Promise.resolve();\n }\n}\n","import { EventEmitter } from 'node:events';\n\n/** Tuple type used for all event payloads. */\nexport type SEArgsTuple = readonly unknown[];\n\n/** Convenience map for emitters that intentionally expose no events. */\nexport type SENoEvents = Record<never, SEArgsTuple>;\n\n/**\n * Accepts any object type and constrains every value to be a tuple.\n *\n * @typeParam TEvents - Map of event names to readonly tuple payloads\n */\nexport type SEEventMapLike<TEvents extends object> = { [K in keyof TEvents]: SEArgsTuple };\n\n/**\n * Narrows a provided event map to the keys that can be emitted or listened for.\n *\n * @typeParam TEvents - Map of event names to readonly tuple payloads\n * @internal\n */\nexport type SEEventKey<TEvents extends object> = Extract<keyof TEvents, string | symbol>;\n\n/**\n * Typed wrapper around Node.js {@link EventEmitter} enforcing tuple payloads per event name.\n *\n * @typeParam TEvents - Map of event names to readonly tuple payloads\n */\nexport class StrictEventEmitter<TEvents extends SEEventMapLike<TEvents>> extends EventEmitter {\n /**\n * Registers a persistent listener with tuple-safe arguments for the given event.\n *\n * @param event - The event name to attach to\n * @param listener - Callback operating on the typed argument tuple for the event\n * @returns This emitter instance for chaining\n */\n override on<TEventKey extends SEEventKey<TEvents>>(\n event: TEventKey,\n listener: (...args: TEvents[TEventKey]) => void\n ): this {\n return super.on(event, listener as unknown as (...args: unknown[]) => void);\n }\n\n /**\n * Registers a one time listener that is removed after the first invocation.\n *\n * @param event - The event name to attach to\n * @param listener - Callback operating on the typed argument tuple for the event\n * @returns This emitter instance for chaining\n */\n override once<TEventKey extends SEEventKey<TEvents>>(\n event: TEventKey,\n listener: (...args: TEvents[TEventKey]) => void\n ): this {\n return super.once(event, listener as unknown as (...args: unknown[]) => void);\n }\n\n /**\n * Removes a previously registered listener for the given event.\n *\n * @param event - The event name whose listener should be removed\n * @param listener - Callback originally registered for the event\n * @returns This emitter instance for chaining\n */\n override off<TEventKey extends SEEventKey<TEvents>>(\n event: TEventKey,\n listener: (...args: TEvents[TEventKey]) => void\n ): this {\n return super.off(event, listener as unknown as (...args: unknown[]) => void);\n }\n\n /**\n * Alias of {@link StrictEventEmitter.on} for compatibility with Node.js EventEmitter APIs.\n *\n * @param event - The event name to attach to\n * @param listener - Callback operating on the typed argument tuple for the event\n * @returns This emitter instance for chaining\n */\n override addListener<TEventKey extends SEEventKey<TEvents>>(\n event: TEventKey,\n listener: (...args: TEvents[TEventKey]) => void\n ): this {\n return this.on(event, listener);\n }\n\n /**\n * Alias of {@link StrictEventEmitter.off} for compatibility with Node.js EventEmitter APIs.\n *\n * @param event - The event name whose listener should be removed\n * @param listener - Callback originally registered for the event\n * @returns This emitter instance for chaining\n */\n override removeListener<TEventKey extends SEEventKey<TEvents>>(\n event: TEventKey,\n listener: (...args: TEvents[TEventKey]) => void\n ): this {\n return super.removeListener(event, listener as unknown as (...args: unknown[]) => void);\n }\n\n /**\n * Emits an event with the strictly typed argument tuple for the event name.\n *\n * @param event - The event name to emit\n * @param args - Tuple payload for the event\n * @returns True when the event had listeners, false otherwise\n */\n override emit<TEventKey extends SEEventKey<TEvents>>(event: TEventKey, ...args: TEvents[TEventKey]): boolean {\n return super.emit(event, ...(args as unknown as unknown[]));\n }\n\n /**\n * Retrieves the listener list for a given event with the correct tuple signature.\n *\n * @param event - The event name to inspect\n * @returns Array of listeners registered for the event\n */\n override listeners<TEventKey extends SEEventKey<TEvents>>(\n event: TEventKey\n ): ((...args: TEvents[TEventKey]) => void)[] {\n return super.listeners(event) as ((...args: TEvents[TEventKey]) => void)[];\n }\n\n /**\n * Counts listeners for an event without widening the return type of {@link EventEmitter.listenerCount}.\n *\n * @param event - The event name to inspect\n * @returns The total number of listeners registered for the event\n */\n listenerCountTyped<TEventKey extends SEEventKey<TEvents>>(event: TEventKey): number {\n return super.listenerCount(event);\n }\n\n /**\n * Returns the list of event names known to the emitter with the mapped key type.\n *\n * @returns Array of event keys supported by the emitter\n */\n eventNamesTyped(): SEEventKey<TEvents>[] {\n return super.eventNames() as SEEventKey<TEvents>[];\n }\n\n /**\n * Waits for an event to be emitted, resolving with the listener arguments tuple once triggered.\n * Supports optional abort signals and timeouts for cancellation semantics.\n *\n * @param event - The event name to wait for\n * @param opts - Optional abort signal or timeout in milliseconds\n * @returns Promise resolving with the emitted argument tuple; rejects when aborted or timed out\n */\n waitFor<TEventKey extends SEEventKey<TEvents>>(\n event: TEventKey,\n opts?: { signal?: AbortSignal; timeoutMs?: number }\n ): Promise<TEvents[TEventKey]> {\n return new Promise<TEvents[TEventKey]>((resolve, reject) => {\n const onEvent = (...args: TEvents[TEventKey]): void => {\n cleanup();\n resolve(args);\n };\n\n const onAbort = (): void => {\n cleanup();\n reject(Object.assign(new Error('Aborted'), { name: 'AbortError' }));\n };\n\n let timeoutId: NodeJS.Timeout | null = null;\n\n const cleanup = (): void => {\n this.off(event, onEvent);\n opts?.signal?.removeEventListener('abort', onAbort);\n if (timeoutId) clearTimeout(timeoutId);\n };\n\n this.once(event, onEvent);\n\n if (opts?.signal) {\n if (opts.signal.aborted) return onAbort();\n opts.signal.addEventListener('abort', onAbort, { once: true });\n }\n\n if (opts?.timeoutMs !== undefined) {\n timeoutId = setTimeout(() => {\n cleanup();\n reject(new Error('Timed out'));\n }, opts.timeoutMs);\n }\n });\n }\n}\n","import chalk from 'chalk';\n\nimport { SeedcordError, SeedcordErrorCode } from '../Errors';\nimport { CoordinatedLifecycle } from './CoordinatedLifecycle';\n\nimport type { LifecycleTask, PhaseEvents } from './LifecycleTypes';\nimport type { UnionToTuple } from 'type-fest';\n\n/**\n * Startup phases for coordinated initialization\n *\n * Defines the order in which different components are initialized during bot startup.\n */\nexport enum StartupPhase {\n /** Validate environment variables and config files */\n Validation = 1,\n /** Discover plugin constructors via decorators or registry */\n Discovery,\n /** Register plugin metadata and declared dependencies */\n Registration,\n /** Inject and validate plugin-specific configuration */\n Configuration,\n /** Instantiate plugin classes with Core and arguments */\n Instantiation,\n /** Activate plugins by calling their init/setup effects */\n Activation,\n /** Mark seedcord as ready and start handling interactions */\n Ready\n}\n\n/** Define the order of phases */\nconst PHASE_ORDER: StartupPhase[] = [\n StartupPhase.Validation,\n StartupPhase.Discovery,\n StartupPhase.Registration,\n StartupPhase.Configuration,\n StartupPhase.Instantiation,\n StartupPhase.Activation,\n StartupPhase.Ready\n];\n\n/**\n * Event keys for coordinated startup phases\n */\nexport type CoordinatedStartupEventKey = PhaseEvents<'startup', UnionToTuple<StartupPhase>>;\n\n/**\n * Manages bot startup lifecycle with ordered phases\n *\n * Coordinates initialization of all bot components in a predictable sequence.\n * Tasks are executed within their designated phases to ensure proper dependency order.\n */\nexport class CoordinatedStartup extends CoordinatedLifecycle<StartupPhase> {\n private isStartingUp = false;\n private hasStarted = false;\n\n public constructor() {\n super('CoordinatedStartup', PHASE_ORDER, StartupPhase);\n }\n\n /**\n * Adds a task to a specific startup phase with timeout.\n *\n * @param phase - The startup phase from {@link StartupPhase}\n * @param taskName - Unique identifier for the task\n * @param task - Async function to execute\n * @param timeoutMs - Task timeout in milliseconds (default: 10000)\n */\n public override addTask(phase: StartupPhase, taskName: string, task: () => Promise<void>, timeoutMs = 10000): void {\n super.addTask(phase, taskName, task, timeoutMs);\n }\n\n protected canAddTask(): boolean {\n if (this.hasStarted) {\n throw new SeedcordError(SeedcordErrorCode.LifecycleAddAfterCompletion);\n }\n\n if (this.isStartingUp) {\n throw new SeedcordError(SeedcordErrorCode.LifecycleAddDuringRun);\n }\n\n return true;\n }\n\n protected canRemoveTask(): boolean {\n if (this.isStartingUp) {\n throw new SeedcordError(SeedcordErrorCode.LifecycleRemoveDuringRun);\n }\n\n return true;\n }\n\n protected getTaskType(): string {\n return 'startup';\n }\n\n protected async executeTasksInPhase(\n phase: StartupPhase,\n tasks: LifecycleTask[]\n ): Promise<PromiseSettledResult<void>[]> {\n // Execute all tasks in sequence\n const results: PromiseSettledResult<void>[] = [];\n for (const task of tasks) {\n results.push(\n await Promise.resolve()\n .then(() => this.runTaskWithTimeout(phase, task))\n .then(\n () => ({ status: 'fulfilled', value: undefined }) satisfies PromiseSettledResult<void>,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n (reason) => ({ status: 'rejected', reason }) satisfies PromiseSettledResult<void>\n )\n );\n }\n return results;\n }\n\n /**\n * Executes the coordinated startup sequence.\n *\n * Runs all registered tasks across startup phases in the correct order.\n * Each phase completes before the next phase begins. Tasks within a phase\n * are executed sequentially to maintain predictable initialization.\n *\n * @returns Promise that resolves when startup is complete\n * @throws An {@link Error} If startup fails or is called multiple times\n * @example\n * ```typescript\n * const startup = new CoordinatedStartup();\n * startup.addTask(StartupPhase.Services, 'database', () => db.connect(), 10000);\n * await startup.run();\n * ```\n */\n public async run(): Promise<void> {\n if (this.hasStarted) {\n this.logger.warn('Startup sequence has already completed');\n return;\n }\n\n if (this.isStartingUp) {\n this.logger.warn('Startup sequence already in progress');\n return;\n }\n\n this.isStartingUp = true;\n this.logger.info(`${chalk.bold.green('Starting')} coordinated startup sequence`);\n this.emit('startup:start');\n\n try {\n // Execute each phase in order\n for (const phase of PHASE_ORDER) await this.runPhase(phase);\n\n this.hasStarted = true;\n this.logger.info(`${chalk.bold.green('Coordinated startup completed')} successfully`);\n this.emit('startup:complete');\n } catch (error) {\n this.logger.error(`${chalk.bold.red('Coordinated startup failed')}`);\n this.emit('startup:error', error);\n throw error;\n } finally {\n this.isStartingUp = false;\n }\n }\n\n /**\n * Subscribe to startup events\n */\n public override on(event: CoordinatedStartupEventKey, listener: (...args: unknown[]) => void): void {\n super.on(event, listener);\n }\n\n /**\n * Unsubscribe from startup events\n */\n public override off(event: CoordinatedStartupEventKey, listener: (...args: unknown[]) => void): void {\n super.off(event, listener);\n }\n\n /**\n * Check if startup has completed\n */\n public get isReady(): boolean {\n return this.hasStarted;\n }\n\n /**\n * Check if startup is currently running\n */\n public get isRunning(): boolean {\n return this.isStartingUp;\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seedcord/services",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.5.1",
|
|
5
5
|
"description": "Services for Seedcord packages",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
8
|
-
"url": "https://github.com/
|
|
8
|
+
"url": "https://github.com/materwelonDhruv/seedcord.git",
|
|
9
9
|
"directory": "packages/services"
|
|
10
10
|
},
|
|
11
11
|
"types": "./dist/index.d.ts",
|
|
@@ -28,16 +28,20 @@
|
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
30
|
"chalk": "5.6.2",
|
|
31
|
-
"discord.js": "14.
|
|
32
|
-
"envapt": "4.0
|
|
33
|
-
"type-fest": "5.
|
|
31
|
+
"discord.js": "14.25.0",
|
|
32
|
+
"envapt": "4.1.0",
|
|
33
|
+
"type-fest": "5.2.0",
|
|
34
34
|
"winston": "^3.18.3",
|
|
35
|
-
"@seedcord/types": "^0.3.
|
|
35
|
+
"@seedcord/types": "^0.3.4"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
|
-
"@seedcord/eslint-config": "^1.3.
|
|
39
|
-
"@seedcord/tsconfig": "^1.
|
|
40
|
-
"@seedcord/tsup-config": "^1.
|
|
38
|
+
"@seedcord/eslint-config": "^1.3.2",
|
|
39
|
+
"@seedcord/tsconfig": "^1.1.1",
|
|
40
|
+
"@seedcord/tsup-config": "^1.1.1"
|
|
41
|
+
},
|
|
42
|
+
"publishConfig": {
|
|
43
|
+
"access": "public",
|
|
44
|
+
"provenance": true
|
|
41
45
|
},
|
|
42
46
|
"scripts": {
|
|
43
47
|
"build": "tsup",
|