wyrm-mcp 7.2.0 → 7.2.2
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/LICENSE +26 -667
- package/NOTICE +14 -33
- package/dist/activation.d.ts.map +1 -1
- package/dist/activation.js +1 -44
- package/dist/activation.js.map +1 -1
- package/dist/agent-daemon.js +4 -281
- package/dist/agent-loop.js +7 -332
- package/dist/analytics.js +13 -236
- package/dist/attribution.js +1 -49
- package/dist/audit.js +2 -457
- package/dist/auto-capture.js +3 -138
- package/dist/auto-orchestrator.js +1 -325
- package/dist/autoconfig.js +39 -840
- package/dist/buddy-runner.js +1 -109
- package/dist/buddy.js +14 -564
- package/dist/build-flags.js +1 -17
- package/dist/capabilities.js +3 -183
- package/dist/capture.js +1 -56
- package/dist/causality.js +6 -107
- package/dist/cli.js +20 -281
- package/dist/cloud/cli.js +5 -541
- package/dist/cloud/client.js +1 -221
- package/dist/cloud/crypto.js +1 -85
- package/dist/cloud/machine-id.js +2 -113
- package/dist/cloud/recovery.js +1 -60
- package/dist/cloud/sync-engine.js +7 -543
- package/dist/cloud-backup.js +5 -579
- package/dist/cloud-profile.js +1 -138
- package/dist/cloud-sync-entrypoint.js +1 -47
- package/dist/cloud-sync.js +2 -309
- package/dist/constellation.js +12 -168
- package/dist/context-build-budgeted.js +4 -144
- package/dist/context-ranking.js +1 -69
- package/dist/crypto.js +1 -179
- package/dist/daemon-write-endpoint.js +1 -290
- package/dist/daemon-writer.js +2 -406
- package/dist/database.js +43 -1110
- package/dist/deprecations.js +2 -162
- package/dist/design.js +13 -141
- package/dist/event-replication.js +1 -112
- package/dist/events-sse.js +7 -43
- package/dist/events.js +6 -238
- package/dist/failure-patterns.js +42 -659
- package/dist/federation.js +12 -236
- package/dist/goals.js +13 -101
- package/dist/golden.js +3 -355
- package/dist/handlers/agent.js +4 -165
- package/dist/handlers/alias-adapters.js +1 -129
- package/dist/handlers/aliases.js +1 -171
- package/dist/handlers/audit.js +1 -87
- package/dist/handlers/boundary.js +1 -221
- package/dist/handlers/capture.js +73 -1109
- package/dist/handlers/causality.js +7 -114
- package/dist/handlers/cloud.js +85 -382
- package/dist/handlers/companion.js +28 -459
- package/dist/handlers/datalake.js +7 -187
- package/dist/handlers/dispatch-context.js +0 -22
- package/dist/handlers/entity.js +25 -256
- package/dist/handlers/events.js +16 -335
- package/dist/handlers/failure.js +13 -340
- package/dist/handlers/goals.js +4 -296
- package/dist/handlers/intelligence.js +126 -674
- package/dist/handlers/invoicing.js +1 -70
- package/dist/handlers/mcpclient.js +6 -137
- package/dist/handlers/orchestration.js +40 -125
- package/dist/handlers/output-schemas.js +1 -24
- package/dist/handlers/presence.js +3 -99
- package/dist/handlers/project.js +28 -182
- package/dist/handlers/prompts.js +6 -157
- package/dist/handlers/quest.js +4 -224
- package/dist/handlers/recall.js +11 -218
- package/dist/handlers/registry.js +1 -167
- package/dist/handlers/resources.js +1 -288
- package/dist/handlers/review.js +11 -74
- package/dist/handlers/run.js +17 -487
- package/dist/handlers/search.js +15 -326
- package/dist/handlers/session.js +28 -615
- package/dist/handlers/share.js +8 -184
- package/dist/handlers/shims.js +1 -464
- package/dist/handlers/skill.js +67 -449
- package/dist/handlers/survivors.js +1 -120
- package/dist/handlers/symbols.js +8 -109
- package/dist/handlers/syncops.js +4 -302
- package/dist/handlers/types.js +1 -27
- package/dist/harvest.js +5 -191
- package/dist/hours.js +7 -156
- package/dist/http-auth.js +3 -321
- package/dist/http-fast.js +21 -1137
- package/dist/icons.js +1 -47
- package/dist/index.js +2 -924
- package/dist/indexer.js +4 -145
- package/dist/intelligence.js +31 -261
- package/dist/internal-dispatch.js +3 -212
- package/dist/keyset.js +1 -110
- package/dist/knowledge-graph.js +12 -176
- package/dist/license.d.ts +11 -0
- package/dist/license.d.ts.map +1 -1
- package/dist/license.js +2 -414
- package/dist/license.js.map +1 -1
- package/dist/logger.js +2 -199
- package/dist/maintenance.js +2 -148
- package/dist/mcp-client.js +6 -262
- package/dist/memory-artifacts.js +30 -449
- package/dist/migrate-prompt.js +2 -124
- package/dist/migrations.js +40 -655
- package/dist/performance.js +1 -228
- package/dist/presence.js +11 -140
- package/dist/priority-embed.js +5 -164
- package/dist/providers/embedding-provider.js +1 -196
- package/dist/readonly-gate.js +1 -29
- package/dist/rehydration.js +9 -157
- package/dist/reindex.js +1 -88
- package/dist/render-target.js +21 -514
- package/dist/render.js +4 -280
- package/dist/repl-guard.js +1 -173
- package/dist/replication-daemon-entrypoint.js +1 -31
- package/dist/replication-daemon.js +2 -262
- package/dist/resilience.js +1 -591
- package/dist/reverse-bridge.js +5 -360
- package/dist/security.js +1 -244
- package/dist/session-seen.js +3 -51
- package/dist/setup.js +1 -260
- package/dist/skill-author.js +5 -168
- package/dist/spec-kit.js +1 -191
- package/dist/sqlite-busy.js +1 -154
- package/dist/statusline.js +11 -315
- package/dist/sub-agent.js +13 -262
- package/dist/summarizer.js +13 -139
- package/dist/symbols.js +7 -283
- package/dist/sync.js +5 -359
- package/dist/tasks-dispatch.js +1 -84
- package/dist/tasks.js +1 -282
- package/dist/token-budget.js +1 -143
- package/dist/tool-analytics.js +7 -129
- package/dist/tool-annotations.js +1 -365
- package/dist/tool-manifest-v2.json +1 -1
- package/dist/tool-manifest.json +1 -1
- package/dist/tool-profiles.js +1 -75
- package/dist/trace-harvest.js +6 -244
- package/dist/types.js +1 -30
- package/dist/ui-dashboard.js +41 -50
- package/dist/ulid.js +1 -81
- package/dist/validate.js +1 -129
- package/dist/vault.js +1 -534
- package/dist/vectors.js +3 -184
- package/dist/version-check.js +4 -136
- package/dist/visibility.js +19 -155
- package/dist/wyrm-cli.js +98 -2451
- package/dist/wyrm-cli.js.map +1 -1
- package/dist/wyrm-guard.js +14 -424
- package/dist/wyrm-loop.js +3 -150
- package/dist/wyrm-manifest.json +1 -1
- package/dist/wyrm-statusline-daemon.js +1 -11
- package/dist/wyrm-statusline.js +4 -56
- package/dist/wyrm-ui.js +9 -77
- package/package.json +4 -2
package/dist/license.js
CHANGED
|
@@ -1,415 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
* Wyrm License System
|
|
3
|
-
* ED25519 license key generation, signing, and offline verification
|
|
4
|
-
*
|
|
5
|
-
* @copyright 2026 Ghost Protocol (Pvt) Ltd.
|
|
6
|
-
* @license AGPL-3.0-or-later — dual-licensed; commercial terms: ghosts.lk@proton.me. See LICENSE.
|
|
7
|
-
* @module license
|
|
8
|
-
* @version 3.2.0
|
|
9
|
-
*/
|
|
10
|
-
import { createPrivateKey, createPublicKey, sign, verify, generateKeyPairSync, randomBytes, } from 'crypto';
|
|
11
|
-
import { readFileSync, writeFileSync, mkdirSync, existsSync, chmodSync } from 'fs';
|
|
12
|
-
import { homedir } from 'os';
|
|
13
|
-
import { join } from 'path';
|
|
14
|
-
// ==================== CONSTANTS ====================
|
|
15
|
-
/** Base32 alphabet without visually-ambiguous characters (no I, L, O, 1) */
|
|
16
|
-
const BASE32_ALPHABET = 'ABCDEFGHJKMNPQRSTUVWXYZ234567890';
|
|
17
|
-
/** License key prefix */
|
|
18
|
-
const KEY_PREFIX = 'WRM';
|
|
19
|
-
/** Bytes of entropy per key segment (4 chars each) */
|
|
20
|
-
const KEY_SEGMENT_COUNT = 4;
|
|
21
|
-
const KEY_SEGMENT_LENGTH = 4;
|
|
22
|
-
/** License file location */
|
|
23
|
-
const WYRM_DIR = join(homedir(), '.wyrm');
|
|
24
|
-
const LICENSE_PATH = join(WYRM_DIR, 'license.json');
|
|
25
|
-
/**
|
|
26
|
-
* Feature gates per tier.
|
|
27
|
-
* Each tier inherits all features from lower tiers plus its own additions.
|
|
28
|
-
*/
|
|
29
|
-
export const TIER_FEATURES = {
|
|
30
|
-
free: ['local_storage', 'all_tools', 'fts_search', 'unlimited_projects'],
|
|
31
|
-
pro: ['cloud_backup', 'encryption', 'analytics', 'priority_support'],
|
|
32
|
-
team: ['shared_memory', 'workspaces', 'admin_dashboard', 'slack_integration'],
|
|
33
|
-
enterprise: ['unlimited_seats', 'sso_saml', 'custom_sla', 'on_premise'],
|
|
34
|
-
};
|
|
35
|
-
/** Ordered tiers for cumulative feature resolution */
|
|
36
|
-
const TIER_ORDER = ['free', 'pro', 'team', 'enterprise'];
|
|
37
|
-
/** Default device limits per tier */
|
|
38
|
-
export const TIER_DEVICE_LIMITS = {
|
|
39
|
-
free: 1,
|
|
40
|
-
pro: 1,
|
|
41
|
-
team: 25,
|
|
42
|
-
enterprise: -1,
|
|
43
|
-
};
|
|
44
|
-
/**
|
|
45
|
-
* Embedded public key for offline verification.
|
|
46
|
-
*
|
|
47
|
-
* Generated 2026-05-18 alongside the wyrm-billing signing keypair.
|
|
48
|
-
* The matching private key lives ONLY in wyrm-billing's
|
|
49
|
-
* LICENSE_SIGNING_KEY_PRIVATE_PEM_B64 env var. This public half is
|
|
50
|
-
* shipped to every Wyrm client so they can verify license JWTs
|
|
51
|
-
* offline without phoning home.
|
|
52
|
-
*
|
|
53
|
-
* Rotation: regenerate the keypair, replace the private in
|
|
54
|
-
* wyrm-billing's env, replace this constant, ship a new wyrm-mcp
|
|
55
|
-
* release. Issued licenses signed under the OLD key will reject
|
|
56
|
-
* after the new client rolls out — schedule a grace window.
|
|
57
|
-
*/
|
|
58
|
-
const WYRM_PUBLIC_KEY = `-----BEGIN PUBLIC KEY-----
|
|
1
|
+
import{createPrivateKey as S,createPublicKey as T,sign as w,verify as k,generateKeyPairSync as I,randomBytes as A}from"crypto";import{readFileSync as K,writeFileSync as h,mkdirSync as L,existsSync as m,chmodSync as b}from"fs";import{homedir as B}from"os";import{join as _}from"path";const x="ABCDEFGHJKMNPQRSTUVWXYZ234567890",N="WRM",F=4,R=4,l=_(B(),".wyrm"),c=_(l,"license.json"),n={free:["local_storage","all_tools","fts_search","unlimited_projects"],pro:["cloud_backup","encryption","analytics","priority_support"],team:["shared_memory","workspaces","admin_dashboard","slack_integration"],enterprise:["unlimited_seats","sso_saml","custom_sla","on_premise"]},d=["free","pro","team","enterprise"],M={free:1,pro:1,team:25,enterprise:-1},P=`-----BEGIN PUBLIC KEY-----
|
|
59
2
|
MCowBQYDK2VwAyEA5WkbNjI9tclD+Mps13IzEXH5FhCBnblwy4+bjYJHpOk=
|
|
60
|
-
-----END PUBLIC KEY-----`;
|
|
61
|
-
// ==================== SINGLETON STATE ====================
|
|
62
|
-
let currentLicense = null;
|
|
63
|
-
let currentTier = 'free';
|
|
64
|
-
let currentFeatures = new Set(TIER_FEATURES.free);
|
|
65
|
-
// ==================== HELPERS ====================
|
|
66
|
-
/**
|
|
67
|
-
* Resolve the cumulative feature set for a given tier.
|
|
68
|
-
* E.g. `team` gets free + pro + team features.
|
|
69
|
-
*/
|
|
70
|
-
export function resolveFeaturesForTier(tier) {
|
|
71
|
-
const idx = TIER_ORDER.indexOf(tier);
|
|
72
|
-
const features = [];
|
|
73
|
-
for (let i = 0; i <= idx; i++) {
|
|
74
|
-
features.push(...TIER_FEATURES[TIER_ORDER[i]]);
|
|
75
|
-
}
|
|
76
|
-
return [...new Set(features)];
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* Build the canonical string representation of a license for signing/verification.
|
|
80
|
-
* Field order is fixed so both signer and verifier produce identical payloads.
|
|
81
|
-
*/
|
|
82
|
-
function buildCanonicalPayload(license) {
|
|
83
|
-
return [
|
|
84
|
-
license.key,
|
|
85
|
-
license.product,
|
|
86
|
-
license.tier,
|
|
87
|
-
license.issued_to,
|
|
88
|
-
license.issued_at,
|
|
89
|
-
license.expires_at ?? 'perpetual',
|
|
90
|
-
String(license.max_devices),
|
|
91
|
-
license.features.sort().join(','),
|
|
92
|
-
license.hardware_id ?? '',
|
|
93
|
-
].join('|');
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* Encode random bytes into a Base32 string of the given length
|
|
97
|
-
* using our custom visually-unambiguous alphabet.
|
|
98
|
-
*/
|
|
99
|
-
function randomBase32(length) {
|
|
100
|
-
const bytes = randomBytes(length);
|
|
101
|
-
let result = '';
|
|
102
|
-
for (let i = 0; i < length; i++) {
|
|
103
|
-
result += BASE32_ALPHABET[bytes[i] % BASE32_ALPHABET.length];
|
|
104
|
-
}
|
|
105
|
-
return result;
|
|
106
|
-
}
|
|
107
|
-
// ==================== KEY GENERATION (SERVER-SIDE) ====================
|
|
108
|
-
/**
|
|
109
|
-
* Generate an Ed25519 key pair for license signing.
|
|
110
|
-
*
|
|
111
|
-
* **Server-side only** — the private key must never be shipped in the client.
|
|
112
|
-
*
|
|
113
|
-
* @returns PEM-encoded public and private keys
|
|
114
|
-
*/
|
|
115
|
-
export function generateKeyPair() {
|
|
116
|
-
const { publicKey, privateKey } = generateKeyPairSync('ed25519', {
|
|
117
|
-
publicKeyEncoding: { type: 'spki', format: 'pem' },
|
|
118
|
-
privateKeyEncoding: { type: 'pkcs8', format: 'pem' },
|
|
119
|
-
});
|
|
120
|
-
return { publicKey, privateKey };
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* Generate a license key in `WRM-XXXX-XXXX-XXXX-XXXX` format.
|
|
124
|
-
*
|
|
125
|
-
* Uses `crypto.randomBytes` mapped onto a Base32 alphabet that excludes
|
|
126
|
-
* visually-ambiguous characters (I, L, O, 1).
|
|
127
|
-
*
|
|
128
|
-
* **Server-side only.**
|
|
129
|
-
*/
|
|
130
|
-
export function generateLicenseKey() {
|
|
131
|
-
const segments = [];
|
|
132
|
-
for (let i = 0; i < KEY_SEGMENT_COUNT; i++) {
|
|
133
|
-
segments.push(randomBase32(KEY_SEGMENT_LENGTH));
|
|
134
|
-
}
|
|
135
|
-
return `${KEY_PREFIX}-${segments.join('-')}`;
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* Create a new {@link WyrmLicense} with sane defaults for the given tier.
|
|
139
|
-
*
|
|
140
|
-
* **Server-side only.**
|
|
141
|
-
*
|
|
142
|
-
* @param email - Licensee email
|
|
143
|
-
* @param tier - Desired tier
|
|
144
|
-
* @param options - Optional overrides (expiry, hardware binding, extra features)
|
|
145
|
-
*/
|
|
146
|
-
export function createLicense(email, tier, options = {}) {
|
|
147
|
-
const features = resolveFeaturesForTier(tier);
|
|
148
|
-
if (options.extraFeatures) {
|
|
149
|
-
for (const f of options.extraFeatures) {
|
|
150
|
-
if (!features.includes(f))
|
|
151
|
-
features.push(f);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
return {
|
|
155
|
-
key: generateLicenseKey(),
|
|
156
|
-
product: 'wyrm',
|
|
157
|
-
tier,
|
|
158
|
-
issued_to: email,
|
|
159
|
-
issued_at: new Date().toISOString(),
|
|
160
|
-
expires_at: options.expiresAt ?? null,
|
|
161
|
-
max_devices: options.maxDevices ?? TIER_DEVICE_LIMITS[tier],
|
|
162
|
-
features,
|
|
163
|
-
hardware_id: options.hardwareId,
|
|
164
|
-
};
|
|
165
|
-
}
|
|
166
|
-
/**
|
|
167
|
-
* Sign a {@link WyrmLicense} with an Ed25519 private key.
|
|
168
|
-
*
|
|
169
|
-
* **Server-side only.**
|
|
170
|
-
*
|
|
171
|
-
* @param license - The license data to sign
|
|
172
|
-
* @param privateKeyPem - PEM-encoded Ed25519 private key
|
|
173
|
-
* @returns The license bundled with its base64 signature
|
|
174
|
-
*/
|
|
175
|
-
export function signLicense(license, privateKeyPem) {
|
|
176
|
-
const payload = buildCanonicalPayload(license);
|
|
177
|
-
const key = createPrivateKey(privateKeyPem);
|
|
178
|
-
const sig = sign(null, Buffer.from(payload, 'utf-8'), key);
|
|
179
|
-
return {
|
|
180
|
-
license,
|
|
181
|
-
signature: sig.toString('base64'),
|
|
182
|
-
};
|
|
183
|
-
}
|
|
184
|
-
// ==================== VERIFICATION (CLIENT-SIDE / OFFLINE) ====================
|
|
185
|
-
/**
|
|
186
|
-
* Verify a {@link SignedLicense} against an Ed25519 public key.
|
|
187
|
-
*
|
|
188
|
-
* Performs three checks:
|
|
189
|
-
* 1. Signature validity (Ed25519)
|
|
190
|
-
* 2. Product field matches "wyrm"
|
|
191
|
-
* 3. Expiry date (if present)
|
|
192
|
-
*
|
|
193
|
-
* Works fully offline with zero external dependencies.
|
|
194
|
-
*
|
|
195
|
-
* @param signed - The signed license bundle
|
|
196
|
-
* @param publicKeyPem - Optional PEM override; defaults to the embedded key
|
|
197
|
-
*/
|
|
198
|
-
export function verifyLicense(signed, publicKeyPem) {
|
|
199
|
-
const freeFallback = {
|
|
200
|
-
valid: false,
|
|
201
|
-
tier: 'free',
|
|
202
|
-
features: [...TIER_FEATURES.free],
|
|
203
|
-
expiresAt: null,
|
|
204
|
-
};
|
|
205
|
-
try {
|
|
206
|
-
const { license, signature } = signed;
|
|
207
|
-
// Product check
|
|
208
|
-
if (license.product !== 'wyrm') {
|
|
209
|
-
return { ...freeFallback, error: 'Invalid product identifier' };
|
|
210
|
-
}
|
|
211
|
-
// Tier validity
|
|
212
|
-
if (!TIER_ORDER.includes(license.tier)) {
|
|
213
|
-
return { ...freeFallback, error: `Unknown tier: ${license.tier}` };
|
|
214
|
-
}
|
|
215
|
-
// Signature verification
|
|
216
|
-
const payload = buildCanonicalPayload(license);
|
|
217
|
-
const pem = publicKeyPem ?? WYRM_PUBLIC_KEY;
|
|
218
|
-
let key;
|
|
219
|
-
try {
|
|
220
|
-
key = createPublicKey(pem);
|
|
221
|
-
}
|
|
222
|
-
catch {
|
|
223
|
-
return { ...freeFallback, error: 'Invalid public key' };
|
|
224
|
-
}
|
|
225
|
-
const isValid = verify(null, Buffer.from(payload, 'utf-8'), key, Buffer.from(signature, 'base64'));
|
|
226
|
-
if (!isValid) {
|
|
227
|
-
return { ...freeFallback, error: 'Invalid signature — license may be tampered' };
|
|
228
|
-
}
|
|
229
|
-
// Expiry check
|
|
230
|
-
if (license.expires_at !== null) {
|
|
231
|
-
const expiry = new Date(license.expires_at);
|
|
232
|
-
if (isNaN(expiry.getTime())) {
|
|
233
|
-
return { ...freeFallback, error: 'Malformed expiry date' };
|
|
234
|
-
}
|
|
235
|
-
if (expiry.getTime() < Date.now()) {
|
|
236
|
-
return {
|
|
237
|
-
valid: false,
|
|
238
|
-
tier: license.tier,
|
|
239
|
-
features: [...TIER_FEATURES.free],
|
|
240
|
-
expiresAt: license.expires_at,
|
|
241
|
-
error: `License expired on ${license.expires_at}`,
|
|
242
|
-
};
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
return {
|
|
246
|
-
valid: true,
|
|
247
|
-
tier: license.tier,
|
|
248
|
-
features: [...license.features],
|
|
249
|
-
expiresAt: license.expires_at,
|
|
250
|
-
};
|
|
251
|
-
}
|
|
252
|
-
catch (err) {
|
|
253
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
254
|
-
return { ...freeFallback, error: `Verification failed: ${message}` };
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
// ==================== FEATURE GATES ====================
|
|
258
|
-
/**
|
|
259
|
-
* Check whether a specific feature is available in the current license.
|
|
260
|
-
*
|
|
261
|
-
* @param feature - Feature flag name (e.g. `"encryption"`, `"sso_saml"`)
|
|
262
|
-
*/
|
|
263
|
-
export function hasFeature(feature) {
|
|
264
|
-
return currentFeatures.has(feature);
|
|
265
|
-
}
|
|
266
|
-
/**
|
|
267
|
-
* Get the current active license tier.
|
|
268
|
-
* Defaults to `"free"` when no valid license is loaded.
|
|
269
|
-
*/
|
|
270
|
-
export function getTier() {
|
|
271
|
-
return currentTier;
|
|
272
|
-
}
|
|
273
|
-
/**
|
|
274
|
-
* Return a summary of the currently-loaded license state.
|
|
275
|
-
*/
|
|
276
|
-
export function getLicenseInfo() {
|
|
277
|
-
if (!currentLicense) {
|
|
278
|
-
return {
|
|
279
|
-
tier: 'free',
|
|
280
|
-
features: [...TIER_FEATURES.free],
|
|
281
|
-
expiresAt: null,
|
|
282
|
-
valid: false,
|
|
283
|
-
issuedTo: null,
|
|
284
|
-
key: null,
|
|
285
|
-
};
|
|
286
|
-
}
|
|
287
|
-
const validation = verifyLicense(currentLicense);
|
|
288
|
-
return {
|
|
289
|
-
tier: validation.tier,
|
|
290
|
-
features: validation.features,
|
|
291
|
-
expiresAt: validation.expiresAt,
|
|
292
|
-
valid: validation.valid,
|
|
293
|
-
issuedTo: currentLicense.license.issued_to,
|
|
294
|
-
key: currentLicense.license.key,
|
|
295
|
-
};
|
|
296
|
-
}
|
|
297
|
-
// ==================== PERSISTENCE ====================
|
|
298
|
-
/**
|
|
299
|
-
* Load a signed license from `~/.wyrm/license.json`.
|
|
300
|
-
*
|
|
301
|
-
* @returns The parsed {@link SignedLicense} or `null` if not found / unparseable
|
|
302
|
-
*/
|
|
303
|
-
export function loadLicense() {
|
|
304
|
-
try {
|
|
305
|
-
if (!existsSync(LICENSE_PATH))
|
|
306
|
-
return null;
|
|
307
|
-
const raw = readFileSync(LICENSE_PATH, 'utf-8');
|
|
308
|
-
const parsed = JSON.parse(raw);
|
|
309
|
-
// Basic shape check
|
|
310
|
-
if (!parsed.license || !parsed.signature)
|
|
311
|
-
return null;
|
|
312
|
-
if (!parsed.license.key || !parsed.license.tier)
|
|
313
|
-
return null;
|
|
314
|
-
return parsed;
|
|
315
|
-
}
|
|
316
|
-
catch {
|
|
317
|
-
return null;
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
/**
|
|
321
|
-
* Persist a signed license to `~/.wyrm/license.json`.
|
|
322
|
-
* File permissions are set to `0o600` (owner read/write only).
|
|
323
|
-
*
|
|
324
|
-
* @param signed - The signed license to save
|
|
325
|
-
*/
|
|
326
|
-
export function saveLicense(signed) {
|
|
327
|
-
if (!existsSync(WYRM_DIR)) {
|
|
328
|
-
mkdirSync(WYRM_DIR, { recursive: true });
|
|
329
|
-
}
|
|
330
|
-
const json = JSON.stringify(signed, null, 2);
|
|
331
|
-
writeFileSync(LICENSE_PATH, json, { encoding: 'utf-8', mode: 0o600 });
|
|
332
|
-
// Ensure permissions even if file existed previously
|
|
333
|
-
chmodSync(LICENSE_PATH, 0o600);
|
|
334
|
-
}
|
|
335
|
-
/**
|
|
336
|
-
* Activate a license from a JSON string (e.g. pasted by the user).
|
|
337
|
-
*
|
|
338
|
-
* Parses, verifies, and — if valid — persists the license and updates
|
|
339
|
-
* the in-memory singleton state.
|
|
340
|
-
*
|
|
341
|
-
* @param licenseString - JSON-encoded {@link SignedLicense}
|
|
342
|
-
* @returns Validation result
|
|
343
|
-
*/
|
|
344
|
-
export function activateLicense(licenseString) {
|
|
345
|
-
let signed;
|
|
346
|
-
try {
|
|
347
|
-
signed = JSON.parse(licenseString);
|
|
348
|
-
}
|
|
349
|
-
catch {
|
|
350
|
-
return {
|
|
351
|
-
valid: false,
|
|
352
|
-
tier: 'free',
|
|
353
|
-
features: [...TIER_FEATURES.free],
|
|
354
|
-
expiresAt: null,
|
|
355
|
-
error: 'Invalid license format — expected JSON',
|
|
356
|
-
};
|
|
357
|
-
}
|
|
358
|
-
if (!signed.license || !signed.signature) {
|
|
359
|
-
return {
|
|
360
|
-
valid: false,
|
|
361
|
-
tier: 'free',
|
|
362
|
-
features: [...TIER_FEATURES.free],
|
|
363
|
-
expiresAt: null,
|
|
364
|
-
error: 'Malformed license — missing license data or signature',
|
|
365
|
-
};
|
|
366
|
-
}
|
|
367
|
-
const validation = verifyLicense(signed);
|
|
368
|
-
if (validation.valid) {
|
|
369
|
-
saveLicense(signed);
|
|
370
|
-
currentLicense = signed;
|
|
371
|
-
currentTier = validation.tier;
|
|
372
|
-
currentFeatures = new Set(validation.features);
|
|
373
|
-
}
|
|
374
|
-
return validation;
|
|
375
|
-
}
|
|
376
|
-
// ==================== INITIALIZATION ====================
|
|
377
|
-
/**
|
|
378
|
-
* Initialize the license subsystem on startup.
|
|
379
|
-
*
|
|
380
|
-
* Attempts to load and verify `~/.wyrm/license.json`.
|
|
381
|
-
* Falls back to the free tier on any failure.
|
|
382
|
-
*
|
|
383
|
-
* Call this once during MCP server boot.
|
|
384
|
-
*/
|
|
385
|
-
export function initializeLicense() {
|
|
386
|
-
const signed = loadLicense();
|
|
387
|
-
if (!signed) {
|
|
388
|
-
currentLicense = null;
|
|
389
|
-
currentTier = 'free';
|
|
390
|
-
currentFeatures = new Set(TIER_FEATURES.free);
|
|
391
|
-
return;
|
|
392
|
-
}
|
|
393
|
-
const validation = verifyLicense(signed);
|
|
394
|
-
if (validation.valid) {
|
|
395
|
-
currentLicense = signed;
|
|
396
|
-
currentTier = validation.tier;
|
|
397
|
-
currentFeatures = new Set(validation.features);
|
|
398
|
-
}
|
|
399
|
-
else {
|
|
400
|
-
// Invalid / expired — degrade gracefully
|
|
401
|
-
currentLicense = null;
|
|
402
|
-
currentTier = 'free';
|
|
403
|
-
currentFeatures = new Set(TIER_FEATURES.free);
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
/**
|
|
407
|
-
* Reset the singleton state to free tier.
|
|
408
|
-
* Useful for testing or license deactivation.
|
|
409
|
-
*/
|
|
410
|
-
export function resetLicense() {
|
|
411
|
-
currentLicense = null;
|
|
412
|
-
currentTier = 'free';
|
|
413
|
-
currentFeatures = new Set(TIER_FEATURES.free);
|
|
414
|
-
}
|
|
415
|
-
//# sourceMappingURL=license.js.map
|
|
3
|
+
-----END PUBLIC KEY-----`;let s=null,o="free",u=new Set(n.free);function D(e){const r=d.indexOf(e),i=[];for(let t=0;t<=r;t++)i.push(...n[d[t]]);return[...new Set(i)]}function g(e){return[e.key,e.product,e.tier,e.issued_to,e.issued_at,e.expires_at??"perpetual",String(e.max_devices),e.features.sort().join(","),e.hardware_id??""].join("|")}function Y(e){const r=A(e);let i="";for(let t=0;t<e;t++)i+=x[r[t]%x.length];return i}function G(){const{publicKey:e,privateKey:r}=I("ed25519",{publicKeyEncoding:{type:"spki",format:"pem"},privateKeyEncoding:{type:"pkcs8",format:"pem"}});return{publicKey:e,privateKey:r}}function C(){const e=[];for(let r=0;r<F;r++)e.push(Y(R));return`${N}-${e.join("-")}`}function $(e,r,i={}){const t=D(r);if(i.extraFeatures)for(const a of i.extraFeatures)t.includes(a)||t.push(a);return{key:C(),product:"wyrm",tier:r,issued_to:e,issued_at:new Date().toISOString(),expires_at:i.expiresAt??null,max_devices:i.maxDevices??M[r],features:t,hardware_id:i.hardwareId}}function X(e,r){const i=g(e),t=S(r),a=w(null,Buffer.from(i,"utf-8"),t);return{license:e,signature:a.toString("base64")}}function f(e,r){const i={valid:!1,tier:"free",features:[...n.free],expiresAt:null};try{const{license:t,signature:a}=e;if(t.product!=="wyrm")return{...i,error:"Invalid product identifier"};if(!d.includes(t.tier))return{...i,error:`Unknown tier: ${t.tier}`};const v=g(t),E=r??P;let p;try{p=T(E)}catch{return{...i,error:"Invalid public key"}}if(!k(null,Buffer.from(v,"utf-8"),p,Buffer.from(a,"base64")))return{...i,error:"Invalid signature \u2014 license may be tampered"};if(t.expires_at!==null){const y=new Date(t.expires_at);if(isNaN(y.getTime()))return{...i,error:"Malformed expiry date"};if(y.getTime()<Date.now())return{valid:!1,tier:t.tier,features:[...n.free],expiresAt:t.expires_at,error:`License expired on ${t.expires_at}`}}return{valid:!0,tier:t.tier,features:[...t.features],expiresAt:t.expires_at}}catch(t){const a=t instanceof Error?t.message:String(t);return{...i,error:`Verification failed: ${a}`}}}function z(){try{const e={license:{key:"WRM-KAT0-KAT0-KAT0-KAT0",product:"wyrm",tier:"enterprise",issued_to:"integrity@selftest",issued_at:"2026-01-01T00:00:00.000Z",expires_at:null,max_devices:-1,features:[...n.enterprise]},signature:Buffer.from("integrity-self-test-not-a-valid-signature").toString("base64")};return f(e).valid?{ok:!1,reason:"verifier_accepts_forged_signature"}:{ok:!0}}catch{return{ok:!0}}}function Q(e){return u.has(e)}function Z(){return o}function q(){if(!s)return{tier:"free",features:[...n.free],expiresAt:null,valid:!1,issuedTo:null,key:null};const e=f(s);return{tier:e.tier,features:e.features,expiresAt:e.expiresAt,valid:e.valid,issuedTo:s.license.issued_to,key:s.license.key}}function j(){try{if(!m(c))return null;const e=K(c,"utf-8"),r=JSON.parse(e);return!r.license||!r.signature||!r.license.key||!r.license.tier?null:r}catch{return null}}function O(e){m(l)||L(l,{recursive:!0});const r=JSON.stringify(e,null,2);h(c,r,{encoding:"utf-8",mode:384}),b(c,384)}function ee(e){let r;try{r=JSON.parse(e)}catch{return{valid:!1,tier:"free",features:[...n.free],expiresAt:null,error:"Invalid license format \u2014 expected JSON"}}if(!r.license||!r.signature)return{valid:!1,tier:"free",features:[...n.free],expiresAt:null,error:"Malformed license \u2014 missing license data or signature"};const i=f(r);return i.valid&&(O(r),s=r,o=i.tier,u=new Set(i.features)),i}function re(){const e=j();if(!e){s=null,o="free",u=new Set(n.free);return}const r=f(e);r.valid?(s=e,o=r.tier,u=new Set(r.features)):(s=null,o="free",u=new Set(n.free))}function te(){s=null,o="free",u=new Set(n.free)}export{M as TIER_DEVICE_LIMITS,n as TIER_FEATURES,ee as activateLicense,$ as createLicense,G as generateKeyPair,C as generateLicenseKey,q as getLicenseInfo,Z as getTier,Q as hasFeature,re as initializeLicense,j as loadLicense,te as resetLicense,D as resolveFeaturesForTier,O as saveLicense,z as selfTestVerifier,X as signLicense,f as verifyLicense};
|
package/dist/license.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"license.js","sourceRoot":"","sources":["../src/license.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"license.js","sourceRoot":"","sources":["../src/license.ts"],"names":[],"mappings":"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"}
|
package/dist/logger.js
CHANGED
|
@@ -1,199 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*
|
|
4
|
-
* @copyright 2026 Ghost Protocol (Pvt) Ltd.
|
|
5
|
-
* @license AGPL-3.0-or-later — dual-licensed; commercial terms: ghosts.lk@proton.me. See LICENSE.
|
|
6
|
-
* @module logger
|
|
7
|
-
* @version 3.0.0
|
|
8
|
-
*/
|
|
9
|
-
import { appendFileSync, existsSync, mkdirSync } from 'fs';
|
|
10
|
-
import { homedir } from 'os';
|
|
11
|
-
import { join } from 'path';
|
|
12
|
-
const LOG_LEVELS = {
|
|
13
|
-
debug: 0,
|
|
14
|
-
info: 1,
|
|
15
|
-
warn: 2,
|
|
16
|
-
error: 3,
|
|
17
|
-
};
|
|
18
|
-
const LOG_COLORS = {
|
|
19
|
-
debug: '\x1b[36m', // Cyan
|
|
20
|
-
info: '\x1b[32m', // Green
|
|
21
|
-
warn: '\x1b[33m', // Yellow
|
|
22
|
-
error: '\x1b[31m', // Red
|
|
23
|
-
};
|
|
24
|
-
const RESET = '\x1b[0m';
|
|
25
|
-
const BOLD = '\x1b[1m';
|
|
26
|
-
const DIM = '\x1b[2m';
|
|
27
|
-
/**
|
|
28
|
-
* Wyrm Logger - Structured logging for the memory system
|
|
29
|
-
*/
|
|
30
|
-
export class WyrmLogger {
|
|
31
|
-
config;
|
|
32
|
-
correlationId;
|
|
33
|
-
logDir;
|
|
34
|
-
constructor(config) {
|
|
35
|
-
this.config = {
|
|
36
|
-
level: config?.level ?? 'info',
|
|
37
|
-
console: config?.console ?? true,
|
|
38
|
-
json: config?.json ?? false,
|
|
39
|
-
file: config?.file,
|
|
40
|
-
};
|
|
41
|
-
this.logDir = join(homedir(), '.wyrm', 'logs');
|
|
42
|
-
if (!existsSync(this.logDir)) {
|
|
43
|
-
mkdirSync(this.logDir, { recursive: true });
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Set correlation ID for request tracing
|
|
48
|
-
*/
|
|
49
|
-
setCorrelationId(id) {
|
|
50
|
-
this.correlationId = id;
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Generate a new correlation ID
|
|
54
|
-
*/
|
|
55
|
-
generateCorrelationId() {
|
|
56
|
-
this.correlationId = `wyrm-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
57
|
-
return this.correlationId;
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Check if a log level should be logged
|
|
61
|
-
*/
|
|
62
|
-
shouldLog(level) {
|
|
63
|
-
return LOG_LEVELS[level] >= LOG_LEVELS[this.config.level];
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* Format log entry
|
|
67
|
-
*/
|
|
68
|
-
format(entry) {
|
|
69
|
-
if (this.config.json) {
|
|
70
|
-
return JSON.stringify(entry);
|
|
71
|
-
}
|
|
72
|
-
const color = LOG_COLORS[entry.level];
|
|
73
|
-
const levelStr = entry.level.toUpperCase().padEnd(5);
|
|
74
|
-
const time = entry.timestamp.split('T')[1]?.split('.')[0] || entry.timestamp;
|
|
75
|
-
let msg = `${DIM}${time}${RESET} ${color}${BOLD}${levelStr}${RESET} ${entry.message}`;
|
|
76
|
-
if (entry.context && Object.keys(entry.context).length > 0) {
|
|
77
|
-
msg += ` ${DIM}${JSON.stringify(entry.context)}${RESET}`;
|
|
78
|
-
}
|
|
79
|
-
if (entry.correlationId) {
|
|
80
|
-
msg += ` ${DIM}[${entry.correlationId}]${RESET}`;
|
|
81
|
-
}
|
|
82
|
-
return msg;
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Write log entry
|
|
86
|
-
*/
|
|
87
|
-
log(level, message, context) {
|
|
88
|
-
if (!this.shouldLog(level))
|
|
89
|
-
return;
|
|
90
|
-
const entry = {
|
|
91
|
-
timestamp: new Date().toISOString(),
|
|
92
|
-
level,
|
|
93
|
-
message,
|
|
94
|
-
context,
|
|
95
|
-
correlationId: this.correlationId,
|
|
96
|
-
};
|
|
97
|
-
const formatted = this.format(entry);
|
|
98
|
-
if (this.config.console) {
|
|
99
|
-
// EVERY level sinks to stderr: stdout is the MCP wire when running as
|
|
100
|
-
// the stdio server, and a single console.log on the CallTool path
|
|
101
|
-
// corrupts JSON-RPC framing (F1 adversarial review: warn/info/debug
|
|
102
|
-
// used to route through console.log). Pinned by
|
|
103
|
-
// tests/hygiene-security-floor.test.ts + tests/edge-cases.test.ts.
|
|
104
|
-
console.error(formatted);
|
|
105
|
-
}
|
|
106
|
-
if (this.config.file) {
|
|
107
|
-
try {
|
|
108
|
-
const logPath = join(this.logDir, this.config.file);
|
|
109
|
-
appendFileSync(logPath, (this.config.json ? formatted : JSON.stringify(entry)) + '\n');
|
|
110
|
-
}
|
|
111
|
-
catch {
|
|
112
|
-
// Silent fail for file writes
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
// Log level methods
|
|
117
|
-
debug(message, context) {
|
|
118
|
-
this.log('debug', message, context);
|
|
119
|
-
}
|
|
120
|
-
info(message, context) {
|
|
121
|
-
this.log('info', message, context);
|
|
122
|
-
}
|
|
123
|
-
warn(message, context) {
|
|
124
|
-
this.log('warn', message, context);
|
|
125
|
-
}
|
|
126
|
-
error(message, context) {
|
|
127
|
-
this.log('error', message, context);
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* Log with timing measurement
|
|
131
|
-
*/
|
|
132
|
-
time(label, fn) {
|
|
133
|
-
const start = performance.now();
|
|
134
|
-
try {
|
|
135
|
-
const result = fn();
|
|
136
|
-
const duration = performance.now() - start;
|
|
137
|
-
this.debug(`${label} completed`, { duration: `${duration.toFixed(2)}ms` });
|
|
138
|
-
return result;
|
|
139
|
-
}
|
|
140
|
-
catch (error) {
|
|
141
|
-
const duration = performance.now() - start;
|
|
142
|
-
this.error(`${label} failed`, { duration: `${duration.toFixed(2)}ms`, error: String(error) });
|
|
143
|
-
throw error;
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
/**
|
|
147
|
-
* Async timing
|
|
148
|
-
*/
|
|
149
|
-
async timeAsync(label, fn) {
|
|
150
|
-
const start = performance.now();
|
|
151
|
-
try {
|
|
152
|
-
const result = await fn();
|
|
153
|
-
const duration = performance.now() - start;
|
|
154
|
-
this.debug(`${label} completed`, { duration: `${duration.toFixed(2)}ms` });
|
|
155
|
-
return result;
|
|
156
|
-
}
|
|
157
|
-
catch (error) {
|
|
158
|
-
const duration = performance.now() - start;
|
|
159
|
-
this.error(`${label} failed`, { duration: `${duration.toFixed(2)}ms`, error: String(error) });
|
|
160
|
-
throw error;
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
/**
|
|
164
|
-
* Create a child logger with additional context
|
|
165
|
-
*/
|
|
166
|
-
child(context) {
|
|
167
|
-
const child = new WyrmLogger(this.config);
|
|
168
|
-
child.correlationId = this.correlationId;
|
|
169
|
-
const originalLog = child.log.bind(child);
|
|
170
|
-
child.log = (level, message, ctx) => {
|
|
171
|
-
originalLog(level, message, { ...context, ...ctx });
|
|
172
|
-
};
|
|
173
|
-
return child;
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
// Default logger instance
|
|
177
|
-
let defaultLogger = null;
|
|
178
|
-
export function getLogger() {
|
|
179
|
-
if (!defaultLogger) {
|
|
180
|
-
defaultLogger = new WyrmLogger({
|
|
181
|
-
level: process.env.WYRM_LOG_LEVEL || 'info',
|
|
182
|
-
console: process.env.WYRM_LOG_CONSOLE !== 'false',
|
|
183
|
-
json: process.env.WYRM_LOG_JSON === 'true',
|
|
184
|
-
file: 'wyrm.log',
|
|
185
|
-
});
|
|
186
|
-
}
|
|
187
|
-
return defaultLogger;
|
|
188
|
-
}
|
|
189
|
-
export function createLogger(config) {
|
|
190
|
-
return new WyrmLogger(config);
|
|
191
|
-
}
|
|
192
|
-
// Convenience exports
|
|
193
|
-
export const logger = {
|
|
194
|
-
debug: (msg, ctx) => getLogger().debug(msg, ctx),
|
|
195
|
-
info: (msg, ctx) => getLogger().info(msg, ctx),
|
|
196
|
-
warn: (msg, ctx) => getLogger().warn(msg, ctx),
|
|
197
|
-
error: (msg, ctx) => getLogger().error(msg, ctx),
|
|
198
|
-
};
|
|
199
|
-
//# sourceMappingURL=logger.js.map
|
|
1
|
+
import{appendFileSync as h,existsSync as u,mkdirSync as p}from"fs";import{homedir as $}from"os";import{join as f}from"path";const m={debug:0,info:1,warn:2,error:3},w={debug:"\x1B[36m",info:"\x1B[32m",warn:"\x1B[33m",error:"\x1B[31m"},s="\x1B[0m",x="\x1B[1m",g="\x1B[2m";class l{config;correlationId;logDir;constructor(o){this.config={level:o?.level??"info",console:o?.console??!0,json:o?.json??!1,file:o?.file},this.logDir=f($(),".wyrm","logs"),u(this.logDir)||p(this.logDir,{recursive:!0})}setCorrelationId(o){this.correlationId=o}generateCorrelationId(){return this.correlationId=`wyrm-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,this.correlationId}shouldLog(o){return m[o]>=m[this.config.level]}format(o){if(this.config.json)return JSON.stringify(o);const r=w[o.level],n=o.level.toUpperCase().padEnd(5),t=o.timestamp.split("T")[1]?.split(".")[0]||o.timestamp;let e=`${g}${t}${s} ${r}${x}${n}${s} ${o.message}`;return o.context&&Object.keys(o.context).length>0&&(e+=` ${g}${JSON.stringify(o.context)}${s}`),o.correlationId&&(e+=` ${g}[${o.correlationId}]${s}`),e}log(o,r,n){if(!this.shouldLog(o))return;const t={timestamp:new Date().toISOString(),level:o,message:r,context:n,correlationId:this.correlationId},e=this.format(t);if(this.config.console&&console.error(e),this.config.file)try{const a=f(this.logDir,this.config.file);h(a,(this.config.json?e:JSON.stringify(t))+`
|
|
2
|
+
`)}catch{}}debug(o,r){this.log("debug",o,r)}info(o,r){this.log("info",o,r)}warn(o,r){this.log("warn",o,r)}error(o,r){this.log("error",o,r)}time(o,r){const n=performance.now();try{const t=r(),e=performance.now()-n;return this.debug(`${o} completed`,{duration:`${e.toFixed(2)}ms`}),t}catch(t){const e=performance.now()-n;throw this.error(`${o} failed`,{duration:`${e.toFixed(2)}ms`,error:String(t)}),t}}async timeAsync(o,r){const n=performance.now();try{const t=await r(),e=performance.now()-n;return this.debug(`${o} completed`,{duration:`${e.toFixed(2)}ms`}),t}catch(t){const e=performance.now()-n;throw this.error(`${o} failed`,{duration:`${e.toFixed(2)}ms`,error:String(t)}),t}}child(o){const r=new l(this.config);r.correlationId=this.correlationId;const n=r.log.bind(r);return r.log=(t,e,a)=>{n(t,e,{...o,...a})},r}}let d=null;function c(){return d||(d=new l({level:process.env.WYRM_LOG_LEVEL||"info",console:process.env.WYRM_LOG_CONSOLE!=="false",json:process.env.WYRM_LOG_JSON==="true",file:"wyrm.log"})),d}function b(i){return new l(i)}const I={debug:(i,o)=>c().debug(i,o),info:(i,o)=>c().info(i,o),warn:(i,o)=>c().warn(i,o),error:(i,o)=>c().error(i,o)};export{l as WyrmLogger,b as createLogger,c as getLogger,I as logger};
|