@profullstack/threatcrush 0.2.0 → 0.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../node_modules/.pnpm/@iarna+toml@2.2.5/node_modules/@iarna/toml/lib/parser.js","../../../node_modules/.pnpm/@iarna+toml@2.2.5/node_modules/@iarna/toml/lib/create-datetime.js","../../../node_modules/.pnpm/@iarna+toml@2.2.5/node_modules/@iarna/toml/lib/format-num.js","../../../node_modules/.pnpm/@iarna+toml@2.2.5/node_modules/@iarna/toml/lib/create-datetime-float.js","../../../node_modules/.pnpm/@iarna+toml@2.2.5/node_modules/@iarna/toml/lib/create-date.js","../../../node_modules/.pnpm/@iarna+toml@2.2.5/node_modules/@iarna/toml/lib/create-time.js","../../../node_modules/.pnpm/@iarna+toml@2.2.5/node_modules/@iarna/toml/lib/toml-parser.js","../../../node_modules/.pnpm/@iarna+toml@2.2.5/node_modules/@iarna/toml/parse-pretty-error.js","../../../node_modules/.pnpm/@iarna+toml@2.2.5/node_modules/@iarna/toml/parse-string.js","../../../node_modules/.pnpm/@iarna+toml@2.2.5/node_modules/@iarna/toml/parse-async.js","../../../node_modules/.pnpm/@iarna+toml@2.2.5/node_modules/@iarna/toml/parse-stream.js","../../../node_modules/.pnpm/@iarna+toml@2.2.5/node_modules/@iarna/toml/parse.js","../../../node_modules/.pnpm/@iarna+toml@2.2.5/node_modules/@iarna/toml/stringify.js","../../../node_modules/.pnpm/@iarna+toml@2.2.5/node_modules/@iarna/toml/toml.js","../src/daemon/index.ts","../src/daemon/paths.ts","../src/daemon/pidfile.ts","../src/daemon/ipc-server.ts","../src/daemon/event-bus.ts","../src/core/state.ts","../src/daemon/module-host.ts","../src/daemon/watchers/log-watcher.ts","../src/core/log-parser.ts","../src/daemon/alerts/smtp.ts","../src/daemon/alerts/index.ts","../src/core/cli-config.ts","../src/commands/scan.ts","../../../node_modules/.pnpm/chalk@5.6.2/node_modules/chalk/source/vendor/ansi-styles/index.js","../../../node_modules/.pnpm/chalk@5.6.2/node_modules/chalk/source/vendor/supports-color/index.js","../../../node_modules/.pnpm/chalk@5.6.2/node_modules/chalk/source/utilities.js","../../../node_modules/.pnpm/chalk@5.6.2/node_modules/chalk/source/index.js","../src/core/logger.ts","../src/core/run-result.ts","../src/commands/pentest.ts","../src/daemon/workers/runs-worker.ts","../src/core/config.ts","../src/core/telemetry.ts","../src/daemon-entry.ts"],"sourcesContent":["'use strict'\nconst ParserEND = 0x110000\nclass ParserError extends Error {\n /* istanbul ignore next */\n constructor (msg, filename, linenumber) {\n super('[ParserError] ' + msg, filename, linenumber)\n this.name = 'ParserError'\n this.code = 'ParserError'\n if (Error.captureStackTrace) Error.captureStackTrace(this, ParserError)\n }\n}\nclass State {\n constructor (parser) {\n this.parser = parser\n this.buf = ''\n this.returned = null\n this.result = null\n this.resultTable = null\n this.resultArr = null\n }\n}\nclass Parser {\n constructor () {\n this.pos = 0\n this.col = 0\n this.line = 0\n this.obj = {}\n this.ctx = this.obj\n this.stack = []\n this._buf = ''\n this.char = null\n this.ii = 0\n this.state = new State(this.parseStart)\n }\n\n parse (str) {\n /* istanbul ignore next */\n if (str.length === 0 || str.length == null) return\n\n this._buf = String(str)\n this.ii = -1\n this.char = -1\n let getNext\n while (getNext === false || this.nextChar()) {\n getNext = this.runOne()\n }\n this._buf = null\n }\n nextChar () {\n if (this.char === 0x0A) {\n ++this.line\n this.col = -1\n }\n ++this.ii\n this.char = this._buf.codePointAt(this.ii)\n ++this.pos\n ++this.col\n return this.haveBuffer()\n }\n haveBuffer () {\n return this.ii < this._buf.length\n }\n runOne () {\n return this.state.parser.call(this, this.state.returned)\n }\n finish () {\n this.char = ParserEND\n let last\n do {\n last = this.state.parser\n this.runOne()\n } while (this.state.parser !== last)\n\n this.ctx = null\n this.state = null\n this._buf = null\n\n return this.obj\n }\n next (fn) {\n /* istanbul ignore next */\n if (typeof fn !== 'function') throw new ParserError('Tried to set state to non-existent state: ' + JSON.stringify(fn))\n this.state.parser = fn\n }\n goto (fn) {\n this.next(fn)\n return this.runOne()\n }\n call (fn, returnWith) {\n if (returnWith) this.next(returnWith)\n this.stack.push(this.state)\n this.state = new State(fn)\n }\n callNow (fn, returnWith) {\n this.call(fn, returnWith)\n return this.runOne()\n }\n return (value) {\n /* istanbul ignore next */\n if (this.stack.length === 0) throw this.error(new ParserError('Stack underflow'))\n if (value === undefined) value = this.state.buf\n this.state = this.stack.pop()\n this.state.returned = value\n }\n returnNow (value) {\n this.return(value)\n return this.runOne()\n }\n consume () {\n /* istanbul ignore next */\n if (this.char === ParserEND) throw this.error(new ParserError('Unexpected end-of-buffer'))\n this.state.buf += this._buf[this.ii]\n }\n error (err) {\n err.line = this.line\n err.col = this.col\n err.pos = this.pos\n return err\n }\n /* istanbul ignore next */\n parseStart () {\n throw new ParserError('Must declare a parseStart method')\n }\n}\nParser.END = ParserEND\nParser.Error = ParserError\nmodule.exports = Parser\n","'use strict'\nmodule.exports = value => {\n const date = new Date(value)\n /* istanbul ignore if */\n if (isNaN(date)) {\n throw new TypeError('Invalid Datetime')\n } else {\n return date\n }\n}\n","'use strict'\nmodule.exports = (d, num) => {\n num = String(num)\n while (num.length < d) num = '0' + num\n return num\n}\n","'use strict'\nconst f = require('./format-num.js')\n\nclass FloatingDateTime extends Date {\n constructor (value) {\n super(value + 'Z')\n this.isFloating = true\n }\n toISOString () {\n const date = `${this.getUTCFullYear()}-${f(2, this.getUTCMonth() + 1)}-${f(2, this.getUTCDate())}`\n const time = `${f(2, this.getUTCHours())}:${f(2, this.getUTCMinutes())}:${f(2, this.getUTCSeconds())}.${f(3, this.getUTCMilliseconds())}`\n return `${date}T${time}`\n }\n}\n\nmodule.exports = value => {\n const date = new FloatingDateTime(value)\n /* istanbul ignore if */\n if (isNaN(date)) {\n throw new TypeError('Invalid Datetime')\n } else {\n return date\n }\n}\n","'use strict'\nconst f = require('./format-num.js')\nconst DateTime = global.Date\n\nclass Date extends DateTime {\n constructor (value) {\n super(value)\n this.isDate = true\n }\n toISOString () {\n return `${this.getUTCFullYear()}-${f(2, this.getUTCMonth() + 1)}-${f(2, this.getUTCDate())}`\n }\n}\n\nmodule.exports = value => {\n const date = new Date(value)\n /* istanbul ignore if */\n if (isNaN(date)) {\n throw new TypeError('Invalid Datetime')\n } else {\n return date\n }\n}\n","'use strict'\nconst f = require('./format-num.js')\n\nclass Time extends Date {\n constructor (value) {\n super(`0000-01-01T${value}Z`)\n this.isTime = true\n }\n toISOString () {\n return `${f(2, this.getUTCHours())}:${f(2, this.getUTCMinutes())}:${f(2, this.getUTCSeconds())}.${f(3, this.getUTCMilliseconds())}`\n }\n}\n\nmodule.exports = value => {\n const date = new Time(value)\n /* istanbul ignore if */\n if (isNaN(date)) {\n throw new TypeError('Invalid Datetime')\n } else {\n return date\n }\n}\n","'use strict'\n/* eslint-disable no-new-wrappers, no-eval, camelcase, operator-linebreak */\nmodule.exports = makeParserClass(require('./parser.js'))\nmodule.exports.makeParserClass = makeParserClass\n\nclass TomlError extends Error {\n constructor (msg) {\n super(msg)\n this.name = 'TomlError'\n /* istanbul ignore next */\n if (Error.captureStackTrace) Error.captureStackTrace(this, TomlError)\n this.fromTOML = true\n this.wrapped = null\n }\n}\nTomlError.wrap = err => {\n const terr = new TomlError(err.message)\n terr.code = err.code\n terr.wrapped = err\n return terr\n}\nmodule.exports.TomlError = TomlError\n\nconst createDateTime = require('./create-datetime.js')\nconst createDateTimeFloat = require('./create-datetime-float.js')\nconst createDate = require('./create-date.js')\nconst createTime = require('./create-time.js')\n\nconst CTRL_I = 0x09\nconst CTRL_J = 0x0A\nconst CTRL_M = 0x0D\nconst CTRL_CHAR_BOUNDARY = 0x1F // the last non-character in the latin1 region of unicode, except DEL\nconst CHAR_SP = 0x20\nconst CHAR_QUOT = 0x22\nconst CHAR_NUM = 0x23\nconst CHAR_APOS = 0x27\nconst CHAR_PLUS = 0x2B\nconst CHAR_COMMA = 0x2C\nconst CHAR_HYPHEN = 0x2D\nconst CHAR_PERIOD = 0x2E\nconst CHAR_0 = 0x30\nconst CHAR_1 = 0x31\nconst CHAR_7 = 0x37\nconst CHAR_9 = 0x39\nconst CHAR_COLON = 0x3A\nconst CHAR_EQUALS = 0x3D\nconst CHAR_A = 0x41\nconst CHAR_E = 0x45\nconst CHAR_F = 0x46\nconst CHAR_T = 0x54\nconst CHAR_U = 0x55\nconst CHAR_Z = 0x5A\nconst CHAR_LOWBAR = 0x5F\nconst CHAR_a = 0x61\nconst CHAR_b = 0x62\nconst CHAR_e = 0x65\nconst CHAR_f = 0x66\nconst CHAR_i = 0x69\nconst CHAR_l = 0x6C\nconst CHAR_n = 0x6E\nconst CHAR_o = 0x6F\nconst CHAR_r = 0x72\nconst CHAR_s = 0x73\nconst CHAR_t = 0x74\nconst CHAR_u = 0x75\nconst CHAR_x = 0x78\nconst CHAR_z = 0x7A\nconst CHAR_LCUB = 0x7B\nconst CHAR_RCUB = 0x7D\nconst CHAR_LSQB = 0x5B\nconst CHAR_BSOL = 0x5C\nconst CHAR_RSQB = 0x5D\nconst CHAR_DEL = 0x7F\nconst SURROGATE_FIRST = 0xD800\nconst SURROGATE_LAST = 0xDFFF\n\nconst escapes = {\n [CHAR_b]: '\\u0008',\n [CHAR_t]: '\\u0009',\n [CHAR_n]: '\\u000A',\n [CHAR_f]: '\\u000C',\n [CHAR_r]: '\\u000D',\n [CHAR_QUOT]: '\\u0022',\n [CHAR_BSOL]: '\\u005C'\n}\n\nfunction isDigit (cp) {\n return cp >= CHAR_0 && cp <= CHAR_9\n}\nfunction isHexit (cp) {\n return (cp >= CHAR_A && cp <= CHAR_F) || (cp >= CHAR_a && cp <= CHAR_f) || (cp >= CHAR_0 && cp <= CHAR_9)\n}\nfunction isBit (cp) {\n return cp === CHAR_1 || cp === CHAR_0\n}\nfunction isOctit (cp) {\n return (cp >= CHAR_0 && cp <= CHAR_7)\n}\nfunction isAlphaNumQuoteHyphen (cp) {\n return (cp >= CHAR_A && cp <= CHAR_Z)\n || (cp >= CHAR_a && cp <= CHAR_z)\n || (cp >= CHAR_0 && cp <= CHAR_9)\n || cp === CHAR_APOS\n || cp === CHAR_QUOT\n || cp === CHAR_LOWBAR\n || cp === CHAR_HYPHEN\n}\nfunction isAlphaNumHyphen (cp) {\n return (cp >= CHAR_A && cp <= CHAR_Z)\n || (cp >= CHAR_a && cp <= CHAR_z)\n || (cp >= CHAR_0 && cp <= CHAR_9)\n || cp === CHAR_LOWBAR\n || cp === CHAR_HYPHEN\n}\nconst _type = Symbol('type')\nconst _declared = Symbol('declared')\n\nconst hasOwnProperty = Object.prototype.hasOwnProperty\nconst defineProperty = Object.defineProperty\nconst descriptor = {configurable: true, enumerable: true, writable: true, value: undefined}\n\nfunction hasKey (obj, key) {\n if (hasOwnProperty.call(obj, key)) return true\n if (key === '__proto__') defineProperty(obj, '__proto__', descriptor)\n return false\n}\n\nconst INLINE_TABLE = Symbol('inline-table')\nfunction InlineTable () {\n return Object.defineProperties({}, {\n [_type]: {value: INLINE_TABLE}\n })\n}\nfunction isInlineTable (obj) {\n if (obj === null || typeof (obj) !== 'object') return false\n return obj[_type] === INLINE_TABLE\n}\n\nconst TABLE = Symbol('table')\nfunction Table () {\n return Object.defineProperties({}, {\n [_type]: {value: TABLE},\n [_declared]: {value: false, writable: true}\n })\n}\nfunction isTable (obj) {\n if (obj === null || typeof (obj) !== 'object') return false\n return obj[_type] === TABLE\n}\n\nconst _contentType = Symbol('content-type')\nconst INLINE_LIST = Symbol('inline-list')\nfunction InlineList (type) {\n return Object.defineProperties([], {\n [_type]: {value: INLINE_LIST},\n [_contentType]: {value: type}\n })\n}\nfunction isInlineList (obj) {\n if (obj === null || typeof (obj) !== 'object') return false\n return obj[_type] === INLINE_LIST\n}\n\nconst LIST = Symbol('list')\nfunction List () {\n return Object.defineProperties([], {\n [_type]: {value: LIST}\n })\n}\nfunction isList (obj) {\n if (obj === null || typeof (obj) !== 'object') return false\n return obj[_type] === LIST\n}\n\n// in an eval, to let bundlers not slurp in a util proxy\nlet _custom\ntry {\n const utilInspect = eval(\"require('util').inspect\")\n _custom = utilInspect.custom\n} catch (_) {\n /* eval require not available in transpiled bundle */\n}\n/* istanbul ignore next */\nconst _inspect = _custom || 'inspect'\n\nclass BoxedBigInt {\n constructor (value) {\n try {\n this.value = global.BigInt.asIntN(64, value)\n } catch (_) {\n /* istanbul ignore next */\n this.value = null\n }\n Object.defineProperty(this, _type, {value: INTEGER})\n }\n isNaN () {\n return this.value === null\n }\n /* istanbul ignore next */\n toString () {\n return String(this.value)\n }\n /* istanbul ignore next */\n [_inspect] () {\n return `[BigInt: ${this.toString()}]}`\n }\n valueOf () {\n return this.value\n }\n}\n\nconst INTEGER = Symbol('integer')\nfunction Integer (value) {\n let num = Number(value)\n // -0 is a float thing, not an int thing\n if (Object.is(num, -0)) num = 0\n /* istanbul ignore else */\n if (global.BigInt && !Number.isSafeInteger(num)) {\n return new BoxedBigInt(value)\n } else {\n /* istanbul ignore next */\n return Object.defineProperties(new Number(num), {\n isNaN: {value: function () { return isNaN(this) }},\n [_type]: {value: INTEGER},\n [_inspect]: {value: () => `[Integer: ${value}]`}\n })\n }\n}\nfunction isInteger (obj) {\n if (obj === null || typeof (obj) !== 'object') return false\n return obj[_type] === INTEGER\n}\n\nconst FLOAT = Symbol('float')\nfunction Float (value) {\n /* istanbul ignore next */\n return Object.defineProperties(new Number(value), {\n [_type]: {value: FLOAT},\n [_inspect]: {value: () => `[Float: ${value}]`}\n })\n}\nfunction isFloat (obj) {\n if (obj === null || typeof (obj) !== 'object') return false\n return obj[_type] === FLOAT\n}\n\nfunction tomlType (value) {\n const type = typeof value\n if (type === 'object') {\n /* istanbul ignore if */\n if (value === null) return 'null'\n if (value instanceof Date) return 'datetime'\n /* istanbul ignore else */\n if (_type in value) {\n switch (value[_type]) {\n case INLINE_TABLE: return 'inline-table'\n case INLINE_LIST: return 'inline-list'\n /* istanbul ignore next */\n case TABLE: return 'table'\n /* istanbul ignore next */\n case LIST: return 'list'\n case FLOAT: return 'float'\n case INTEGER: return 'integer'\n }\n }\n }\n return type\n}\n\nfunction makeParserClass (Parser) {\n class TOMLParser extends Parser {\n constructor () {\n super()\n this.ctx = this.obj = Table()\n }\n\n /* MATCH HELPER */\n atEndOfWord () {\n return this.char === CHAR_NUM || this.char === CTRL_I || this.char === CHAR_SP || this.atEndOfLine()\n }\n atEndOfLine () {\n return this.char === Parser.END || this.char === CTRL_J || this.char === CTRL_M\n }\n\n parseStart () {\n if (this.char === Parser.END) {\n return null\n } else if (this.char === CHAR_LSQB) {\n return this.call(this.parseTableOrList)\n } else if (this.char === CHAR_NUM) {\n return this.call(this.parseComment)\n } else if (this.char === CTRL_J || this.char === CHAR_SP || this.char === CTRL_I || this.char === CTRL_M) {\n return null\n } else if (isAlphaNumQuoteHyphen(this.char)) {\n return this.callNow(this.parseAssignStatement)\n } else {\n throw this.error(new TomlError(`Unknown character \"${this.char}\"`))\n }\n }\n\n // HELPER, this strips any whitespace and comments to the end of the line\n // then RETURNS. Last state in a production.\n parseWhitespaceToEOL () {\n if (this.char === CHAR_SP || this.char === CTRL_I || this.char === CTRL_M) {\n return null\n } else if (this.char === CHAR_NUM) {\n return this.goto(this.parseComment)\n } else if (this.char === Parser.END || this.char === CTRL_J) {\n return this.return()\n } else {\n throw this.error(new TomlError('Unexpected character, expected only whitespace or comments till end of line'))\n }\n }\n\n /* ASSIGNMENT: key = value */\n parseAssignStatement () {\n return this.callNow(this.parseAssign, this.recordAssignStatement)\n }\n recordAssignStatement (kv) {\n let target = this.ctx\n let finalKey = kv.key.pop()\n for (let kw of kv.key) {\n if (hasKey(target, kw) && (!isTable(target[kw]) || target[kw][_declared])) {\n throw this.error(new TomlError(\"Can't redefine existing key\"))\n }\n target = target[kw] = target[kw] || Table()\n }\n if (hasKey(target, finalKey)) {\n throw this.error(new TomlError(\"Can't redefine existing key\"))\n }\n // unbox our numbers\n if (isInteger(kv.value) || isFloat(kv.value)) {\n target[finalKey] = kv.value.valueOf()\n } else {\n target[finalKey] = kv.value\n }\n return this.goto(this.parseWhitespaceToEOL)\n }\n\n /* ASSSIGNMENT expression, key = value possibly inside an inline table */\n parseAssign () {\n return this.callNow(this.parseKeyword, this.recordAssignKeyword)\n }\n recordAssignKeyword (key) {\n if (this.state.resultTable) {\n this.state.resultTable.push(key)\n } else {\n this.state.resultTable = [key]\n }\n return this.goto(this.parseAssignKeywordPreDot)\n }\n parseAssignKeywordPreDot () {\n if (this.char === CHAR_PERIOD) {\n return this.next(this.parseAssignKeywordPostDot)\n } else if (this.char !== CHAR_SP && this.char !== CTRL_I) {\n return this.goto(this.parseAssignEqual)\n }\n }\n parseAssignKeywordPostDot () {\n if (this.char !== CHAR_SP && this.char !== CTRL_I) {\n return this.callNow(this.parseKeyword, this.recordAssignKeyword)\n }\n }\n\n parseAssignEqual () {\n if (this.char === CHAR_EQUALS) {\n return this.next(this.parseAssignPreValue)\n } else {\n throw this.error(new TomlError('Invalid character, expected \"=\"'))\n }\n }\n parseAssignPreValue () {\n if (this.char === CHAR_SP || this.char === CTRL_I) {\n return null\n } else {\n return this.callNow(this.parseValue, this.recordAssignValue)\n }\n }\n recordAssignValue (value) {\n return this.returnNow({key: this.state.resultTable, value: value})\n }\n\n /* COMMENTS: #...eol */\n parseComment () {\n do {\n if (this.char === Parser.END || this.char === CTRL_J) {\n return this.return()\n }\n } while (this.nextChar())\n }\n\n /* TABLES AND LISTS, [foo] and [[foo]] */\n parseTableOrList () {\n if (this.char === CHAR_LSQB) {\n this.next(this.parseList)\n } else {\n return this.goto(this.parseTable)\n }\n }\n\n /* TABLE [foo.bar.baz] */\n parseTable () {\n this.ctx = this.obj\n return this.goto(this.parseTableNext)\n }\n parseTableNext () {\n if (this.char === CHAR_SP || this.char === CTRL_I) {\n return null\n } else {\n return this.callNow(this.parseKeyword, this.parseTableMore)\n }\n }\n parseTableMore (keyword) {\n if (this.char === CHAR_SP || this.char === CTRL_I) {\n return null\n } else if (this.char === CHAR_RSQB) {\n if (hasKey(this.ctx, keyword) && (!isTable(this.ctx[keyword]) || this.ctx[keyword][_declared])) {\n throw this.error(new TomlError(\"Can't redefine existing key\"))\n } else {\n this.ctx = this.ctx[keyword] = this.ctx[keyword] || Table()\n this.ctx[_declared] = true\n }\n return this.next(this.parseWhitespaceToEOL)\n } else if (this.char === CHAR_PERIOD) {\n if (!hasKey(this.ctx, keyword)) {\n this.ctx = this.ctx[keyword] = Table()\n } else if (isTable(this.ctx[keyword])) {\n this.ctx = this.ctx[keyword]\n } else if (isList(this.ctx[keyword])) {\n this.ctx = this.ctx[keyword][this.ctx[keyword].length - 1]\n } else {\n throw this.error(new TomlError(\"Can't redefine existing key\"))\n }\n return this.next(this.parseTableNext)\n } else {\n throw this.error(new TomlError('Unexpected character, expected whitespace, . or ]'))\n }\n }\n\n /* LIST [[a.b.c]] */\n parseList () {\n this.ctx = this.obj\n return this.goto(this.parseListNext)\n }\n parseListNext () {\n if (this.char === CHAR_SP || this.char === CTRL_I) {\n return null\n } else {\n return this.callNow(this.parseKeyword, this.parseListMore)\n }\n }\n parseListMore (keyword) {\n if (this.char === CHAR_SP || this.char === CTRL_I) {\n return null\n } else if (this.char === CHAR_RSQB) {\n if (!hasKey(this.ctx, keyword)) {\n this.ctx[keyword] = List()\n }\n if (isInlineList(this.ctx[keyword])) {\n throw this.error(new TomlError(\"Can't extend an inline array\"))\n } else if (isList(this.ctx[keyword])) {\n const next = Table()\n this.ctx[keyword].push(next)\n this.ctx = next\n } else {\n throw this.error(new TomlError(\"Can't redefine an existing key\"))\n }\n return this.next(this.parseListEnd)\n } else if (this.char === CHAR_PERIOD) {\n if (!hasKey(this.ctx, keyword)) {\n this.ctx = this.ctx[keyword] = Table()\n } else if (isInlineList(this.ctx[keyword])) {\n throw this.error(new TomlError(\"Can't extend an inline array\"))\n } else if (isInlineTable(this.ctx[keyword])) {\n throw this.error(new TomlError(\"Can't extend an inline table\"))\n } else if (isList(this.ctx[keyword])) {\n this.ctx = this.ctx[keyword][this.ctx[keyword].length - 1]\n } else if (isTable(this.ctx[keyword])) {\n this.ctx = this.ctx[keyword]\n } else {\n throw this.error(new TomlError(\"Can't redefine an existing key\"))\n }\n return this.next(this.parseListNext)\n } else {\n throw this.error(new TomlError('Unexpected character, expected whitespace, . or ]'))\n }\n }\n parseListEnd (keyword) {\n if (this.char === CHAR_RSQB) {\n return this.next(this.parseWhitespaceToEOL)\n } else {\n throw this.error(new TomlError('Unexpected character, expected whitespace, . or ]'))\n }\n }\n\n /* VALUE string, number, boolean, inline list, inline object */\n parseValue () {\n if (this.char === Parser.END) {\n throw this.error(new TomlError('Key without value'))\n } else if (this.char === CHAR_QUOT) {\n return this.next(this.parseDoubleString)\n } if (this.char === CHAR_APOS) {\n return this.next(this.parseSingleString)\n } else if (this.char === CHAR_HYPHEN || this.char === CHAR_PLUS) {\n return this.goto(this.parseNumberSign)\n } else if (this.char === CHAR_i) {\n return this.next(this.parseInf)\n } else if (this.char === CHAR_n) {\n return this.next(this.parseNan)\n } else if (isDigit(this.char)) {\n return this.goto(this.parseNumberOrDateTime)\n } else if (this.char === CHAR_t || this.char === CHAR_f) {\n return this.goto(this.parseBoolean)\n } else if (this.char === CHAR_LSQB) {\n return this.call(this.parseInlineList, this.recordValue)\n } else if (this.char === CHAR_LCUB) {\n return this.call(this.parseInlineTable, this.recordValue)\n } else {\n throw this.error(new TomlError('Unexpected character, expecting string, number, datetime, boolean, inline array or inline table'))\n }\n }\n recordValue (value) {\n return this.returnNow(value)\n }\n\n parseInf () {\n if (this.char === CHAR_n) {\n return this.next(this.parseInf2)\n } else {\n throw this.error(new TomlError('Unexpected character, expected \"inf\", \"+inf\" or \"-inf\"'))\n }\n }\n parseInf2 () {\n if (this.char === CHAR_f) {\n if (this.state.buf === '-') {\n return this.return(-Infinity)\n } else {\n return this.return(Infinity)\n }\n } else {\n throw this.error(new TomlError('Unexpected character, expected \"inf\", \"+inf\" or \"-inf\"'))\n }\n }\n\n parseNan () {\n if (this.char === CHAR_a) {\n return this.next(this.parseNan2)\n } else {\n throw this.error(new TomlError('Unexpected character, expected \"nan\"'))\n }\n }\n parseNan2 () {\n if (this.char === CHAR_n) {\n return this.return(NaN)\n } else {\n throw this.error(new TomlError('Unexpected character, expected \"nan\"'))\n }\n }\n\n /* KEYS, barewords or basic, literal, or dotted */\n parseKeyword () {\n if (this.char === CHAR_QUOT) {\n return this.next(this.parseBasicString)\n } else if (this.char === CHAR_APOS) {\n return this.next(this.parseLiteralString)\n } else {\n return this.goto(this.parseBareKey)\n }\n }\n\n /* KEYS: barewords */\n parseBareKey () {\n do {\n if (this.char === Parser.END) {\n throw this.error(new TomlError('Key ended without value'))\n } else if (isAlphaNumHyphen(this.char)) {\n this.consume()\n } else if (this.state.buf.length === 0) {\n throw this.error(new TomlError('Empty bare keys are not allowed'))\n } else {\n return this.returnNow()\n }\n } while (this.nextChar())\n }\n\n /* STRINGS, single quoted (literal) */\n parseSingleString () {\n if (this.char === CHAR_APOS) {\n return this.next(this.parseLiteralMultiStringMaybe)\n } else {\n return this.goto(this.parseLiteralString)\n }\n }\n parseLiteralString () {\n do {\n if (this.char === CHAR_APOS) {\n return this.return()\n } else if (this.atEndOfLine()) {\n throw this.error(new TomlError('Unterminated string'))\n } else if (this.char === CHAR_DEL || (this.char <= CTRL_CHAR_BOUNDARY && this.char !== CTRL_I)) {\n throw this.errorControlCharInString()\n } else {\n this.consume()\n }\n } while (this.nextChar())\n }\n parseLiteralMultiStringMaybe () {\n if (this.char === CHAR_APOS) {\n return this.next(this.parseLiteralMultiString)\n } else {\n return this.returnNow()\n }\n }\n parseLiteralMultiString () {\n if (this.char === CTRL_M) {\n return null\n } else if (this.char === CTRL_J) {\n return this.next(this.parseLiteralMultiStringContent)\n } else {\n return this.goto(this.parseLiteralMultiStringContent)\n }\n }\n parseLiteralMultiStringContent () {\n do {\n if (this.char === CHAR_APOS) {\n return this.next(this.parseLiteralMultiEnd)\n } else if (this.char === Parser.END) {\n throw this.error(new TomlError('Unterminated multi-line string'))\n } else if (this.char === CHAR_DEL || (this.char <= CTRL_CHAR_BOUNDARY && this.char !== CTRL_I && this.char !== CTRL_J && this.char !== CTRL_M)) {\n throw this.errorControlCharInString()\n } else {\n this.consume()\n }\n } while (this.nextChar())\n }\n parseLiteralMultiEnd () {\n if (this.char === CHAR_APOS) {\n return this.next(this.parseLiteralMultiEnd2)\n } else {\n this.state.buf += \"'\"\n return this.goto(this.parseLiteralMultiStringContent)\n }\n }\n parseLiteralMultiEnd2 () {\n if (this.char === CHAR_APOS) {\n return this.return()\n } else {\n this.state.buf += \"''\"\n return this.goto(this.parseLiteralMultiStringContent)\n }\n }\n\n /* STRINGS double quoted */\n parseDoubleString () {\n if (this.char === CHAR_QUOT) {\n return this.next(this.parseMultiStringMaybe)\n } else {\n return this.goto(this.parseBasicString)\n }\n }\n parseBasicString () {\n do {\n if (this.char === CHAR_BSOL) {\n return this.call(this.parseEscape, this.recordEscapeReplacement)\n } else if (this.char === CHAR_QUOT) {\n return this.return()\n } else if (this.atEndOfLine()) {\n throw this.error(new TomlError('Unterminated string'))\n } else if (this.char === CHAR_DEL || (this.char <= CTRL_CHAR_BOUNDARY && this.char !== CTRL_I)) {\n throw this.errorControlCharInString()\n } else {\n this.consume()\n }\n } while (this.nextChar())\n }\n recordEscapeReplacement (replacement) {\n this.state.buf += replacement\n return this.goto(this.parseBasicString)\n }\n parseMultiStringMaybe () {\n if (this.char === CHAR_QUOT) {\n return this.next(this.parseMultiString)\n } else {\n return this.returnNow()\n }\n }\n parseMultiString () {\n if (this.char === CTRL_M) {\n return null\n } else if (this.char === CTRL_J) {\n return this.next(this.parseMultiStringContent)\n } else {\n return this.goto(this.parseMultiStringContent)\n }\n }\n parseMultiStringContent () {\n do {\n if (this.char === CHAR_BSOL) {\n return this.call(this.parseMultiEscape, this.recordMultiEscapeReplacement)\n } else if (this.char === CHAR_QUOT) {\n return this.next(this.parseMultiEnd)\n } else if (this.char === Parser.END) {\n throw this.error(new TomlError('Unterminated multi-line string'))\n } else if (this.char === CHAR_DEL || (this.char <= CTRL_CHAR_BOUNDARY && this.char !== CTRL_I && this.char !== CTRL_J && this.char !== CTRL_M)) {\n throw this.errorControlCharInString()\n } else {\n this.consume()\n }\n } while (this.nextChar())\n }\n errorControlCharInString () {\n let displayCode = '\\\\u00'\n if (this.char < 16) {\n displayCode += '0'\n }\n displayCode += this.char.toString(16)\n\n return this.error(new TomlError(`Control characters (codes < 0x1f and 0x7f) are not allowed in strings, use ${displayCode} instead`))\n }\n recordMultiEscapeReplacement (replacement) {\n this.state.buf += replacement\n return this.goto(this.parseMultiStringContent)\n }\n parseMultiEnd () {\n if (this.char === CHAR_QUOT) {\n return this.next(this.parseMultiEnd2)\n } else {\n this.state.buf += '\"'\n return this.goto(this.parseMultiStringContent)\n }\n }\n parseMultiEnd2 () {\n if (this.char === CHAR_QUOT) {\n return this.return()\n } else {\n this.state.buf += '\"\"'\n return this.goto(this.parseMultiStringContent)\n }\n }\n parseMultiEscape () {\n if (this.char === CTRL_M || this.char === CTRL_J) {\n return this.next(this.parseMultiTrim)\n } else if (this.char === CHAR_SP || this.char === CTRL_I) {\n return this.next(this.parsePreMultiTrim)\n } else {\n return this.goto(this.parseEscape)\n }\n }\n parsePreMultiTrim () {\n if (this.char === CHAR_SP || this.char === CTRL_I) {\n return null\n } else if (this.char === CTRL_M || this.char === CTRL_J) {\n return this.next(this.parseMultiTrim)\n } else {\n throw this.error(new TomlError(\"Can't escape whitespace\"))\n }\n }\n parseMultiTrim () {\n // explicitly whitespace here, END should follow the same path as chars\n if (this.char === CTRL_J || this.char === CHAR_SP || this.char === CTRL_I || this.char === CTRL_M) {\n return null\n } else {\n return this.returnNow()\n }\n }\n parseEscape () {\n if (this.char in escapes) {\n return this.return(escapes[this.char])\n } else if (this.char === CHAR_u) {\n return this.call(this.parseSmallUnicode, this.parseUnicodeReturn)\n } else if (this.char === CHAR_U) {\n return this.call(this.parseLargeUnicode, this.parseUnicodeReturn)\n } else {\n throw this.error(new TomlError('Unknown escape character: ' + this.char))\n }\n }\n parseUnicodeReturn (char) {\n try {\n const codePoint = parseInt(char, 16)\n if (codePoint >= SURROGATE_FIRST && codePoint <= SURROGATE_LAST) {\n throw this.error(new TomlError('Invalid unicode, character in range 0xD800 - 0xDFFF is reserved'))\n }\n return this.returnNow(String.fromCodePoint(codePoint))\n } catch (err) {\n throw this.error(TomlError.wrap(err))\n }\n }\n parseSmallUnicode () {\n if (!isHexit(this.char)) {\n throw this.error(new TomlError('Invalid character in unicode sequence, expected hex'))\n } else {\n this.consume()\n if (this.state.buf.length >= 4) return this.return()\n }\n }\n parseLargeUnicode () {\n if (!isHexit(this.char)) {\n throw this.error(new TomlError('Invalid character in unicode sequence, expected hex'))\n } else {\n this.consume()\n if (this.state.buf.length >= 8) return this.return()\n }\n }\n\n /* NUMBERS */\n parseNumberSign () {\n this.consume()\n return this.next(this.parseMaybeSignedInfOrNan)\n }\n parseMaybeSignedInfOrNan () {\n if (this.char === CHAR_i) {\n return this.next(this.parseInf)\n } else if (this.char === CHAR_n) {\n return this.next(this.parseNan)\n } else {\n return this.callNow(this.parseNoUnder, this.parseNumberIntegerStart)\n }\n }\n parseNumberIntegerStart () {\n if (this.char === CHAR_0) {\n this.consume()\n return this.next(this.parseNumberIntegerExponentOrDecimal)\n } else {\n return this.goto(this.parseNumberInteger)\n }\n }\n parseNumberIntegerExponentOrDecimal () {\n if (this.char === CHAR_PERIOD) {\n this.consume()\n return this.call(this.parseNoUnder, this.parseNumberFloat)\n } else if (this.char === CHAR_E || this.char === CHAR_e) {\n this.consume()\n return this.next(this.parseNumberExponentSign)\n } else {\n return this.returnNow(Integer(this.state.buf))\n }\n }\n parseNumberInteger () {\n if (isDigit(this.char)) {\n this.consume()\n } else if (this.char === CHAR_LOWBAR) {\n return this.call(this.parseNoUnder)\n } else if (this.char === CHAR_E || this.char === CHAR_e) {\n this.consume()\n return this.next(this.parseNumberExponentSign)\n } else if (this.char === CHAR_PERIOD) {\n this.consume()\n return this.call(this.parseNoUnder, this.parseNumberFloat)\n } else {\n const result = Integer(this.state.buf)\n /* istanbul ignore if */\n if (result.isNaN()) {\n throw this.error(new TomlError('Invalid number'))\n } else {\n return this.returnNow(result)\n }\n }\n }\n parseNoUnder () {\n if (this.char === CHAR_LOWBAR || this.char === CHAR_PERIOD || this.char === CHAR_E || this.char === CHAR_e) {\n throw this.error(new TomlError('Unexpected character, expected digit'))\n } else if (this.atEndOfWord()) {\n throw this.error(new TomlError('Incomplete number'))\n }\n return this.returnNow()\n }\n parseNoUnderHexOctBinLiteral () {\n if (this.char === CHAR_LOWBAR || this.char === CHAR_PERIOD) {\n throw this.error(new TomlError('Unexpected character, expected digit'))\n } else if (this.atEndOfWord()) {\n throw this.error(new TomlError('Incomplete number'))\n }\n return this.returnNow()\n }\n parseNumberFloat () {\n if (this.char === CHAR_LOWBAR) {\n return this.call(this.parseNoUnder, this.parseNumberFloat)\n } else if (isDigit(this.char)) {\n this.consume()\n } else if (this.char === CHAR_E || this.char === CHAR_e) {\n this.consume()\n return this.next(this.parseNumberExponentSign)\n } else {\n return this.returnNow(Float(this.state.buf))\n }\n }\n parseNumberExponentSign () {\n if (isDigit(this.char)) {\n return this.goto(this.parseNumberExponent)\n } else if (this.char === CHAR_HYPHEN || this.char === CHAR_PLUS) {\n this.consume()\n this.call(this.parseNoUnder, this.parseNumberExponent)\n } else {\n throw this.error(new TomlError('Unexpected character, expected -, + or digit'))\n }\n }\n parseNumberExponent () {\n if (isDigit(this.char)) {\n this.consume()\n } else if (this.char === CHAR_LOWBAR) {\n return this.call(this.parseNoUnder)\n } else {\n return this.returnNow(Float(this.state.buf))\n }\n }\n\n /* NUMBERS or DATETIMES */\n parseNumberOrDateTime () {\n if (this.char === CHAR_0) {\n this.consume()\n return this.next(this.parseNumberBaseOrDateTime)\n } else {\n return this.goto(this.parseNumberOrDateTimeOnly)\n }\n }\n parseNumberOrDateTimeOnly () {\n // note, if two zeros are in a row then it MUST be a date\n if (this.char === CHAR_LOWBAR) {\n return this.call(this.parseNoUnder, this.parseNumberInteger)\n } else if (isDigit(this.char)) {\n this.consume()\n if (this.state.buf.length > 4) this.next(this.parseNumberInteger)\n } else if (this.char === CHAR_E || this.char === CHAR_e) {\n this.consume()\n return this.next(this.parseNumberExponentSign)\n } else if (this.char === CHAR_PERIOD) {\n this.consume()\n return this.call(this.parseNoUnder, this.parseNumberFloat)\n } else if (this.char === CHAR_HYPHEN) {\n return this.goto(this.parseDateTime)\n } else if (this.char === CHAR_COLON) {\n return this.goto(this.parseOnlyTimeHour)\n } else {\n return this.returnNow(Integer(this.state.buf))\n }\n }\n parseDateTimeOnly () {\n if (this.state.buf.length < 4) {\n if (isDigit(this.char)) {\n return this.consume()\n } else if (this.char === CHAR_COLON) {\n return this.goto(this.parseOnlyTimeHour)\n } else {\n throw this.error(new TomlError('Expected digit while parsing year part of a date'))\n }\n } else {\n if (this.char === CHAR_HYPHEN) {\n return this.goto(this.parseDateTime)\n } else {\n throw this.error(new TomlError('Expected hyphen (-) while parsing year part of date'))\n }\n }\n }\n parseNumberBaseOrDateTime () {\n if (this.char === CHAR_b) {\n this.consume()\n return this.call(this.parseNoUnderHexOctBinLiteral, this.parseIntegerBin)\n } else if (this.char === CHAR_o) {\n this.consume()\n return this.call(this.parseNoUnderHexOctBinLiteral, this.parseIntegerOct)\n } else if (this.char === CHAR_x) {\n this.consume()\n return this.call(this.parseNoUnderHexOctBinLiteral, this.parseIntegerHex)\n } else if (this.char === CHAR_PERIOD) {\n return this.goto(this.parseNumberInteger)\n } else if (isDigit(this.char)) {\n return this.goto(this.parseDateTimeOnly)\n } else {\n return this.returnNow(Integer(this.state.buf))\n }\n }\n parseIntegerHex () {\n if (isHexit(this.char)) {\n this.consume()\n } else if (this.char === CHAR_LOWBAR) {\n return this.call(this.parseNoUnderHexOctBinLiteral)\n } else {\n const result = Integer(this.state.buf)\n /* istanbul ignore if */\n if (result.isNaN()) {\n throw this.error(new TomlError('Invalid number'))\n } else {\n return this.returnNow(result)\n }\n }\n }\n parseIntegerOct () {\n if (isOctit(this.char)) {\n this.consume()\n } else if (this.char === CHAR_LOWBAR) {\n return this.call(this.parseNoUnderHexOctBinLiteral)\n } else {\n const result = Integer(this.state.buf)\n /* istanbul ignore if */\n if (result.isNaN()) {\n throw this.error(new TomlError('Invalid number'))\n } else {\n return this.returnNow(result)\n }\n }\n }\n parseIntegerBin () {\n if (isBit(this.char)) {\n this.consume()\n } else if (this.char === CHAR_LOWBAR) {\n return this.call(this.parseNoUnderHexOctBinLiteral)\n } else {\n const result = Integer(this.state.buf)\n /* istanbul ignore if */\n if (result.isNaN()) {\n throw this.error(new TomlError('Invalid number'))\n } else {\n return this.returnNow(result)\n }\n }\n }\n\n /* DATETIME */\n parseDateTime () {\n // we enter here having just consumed the year and about to consume the hyphen\n if (this.state.buf.length < 4) {\n throw this.error(new TomlError('Years less than 1000 must be zero padded to four characters'))\n }\n this.state.result = this.state.buf\n this.state.buf = ''\n return this.next(this.parseDateMonth)\n }\n parseDateMonth () {\n if (this.char === CHAR_HYPHEN) {\n if (this.state.buf.length < 2) {\n throw this.error(new TomlError('Months less than 10 must be zero padded to two characters'))\n }\n this.state.result += '-' + this.state.buf\n this.state.buf = ''\n return this.next(this.parseDateDay)\n } else if (isDigit(this.char)) {\n this.consume()\n } else {\n throw this.error(new TomlError('Incomplete datetime'))\n }\n }\n parseDateDay () {\n if (this.char === CHAR_T || this.char === CHAR_SP) {\n if (this.state.buf.length < 2) {\n throw this.error(new TomlError('Days less than 10 must be zero padded to two characters'))\n }\n this.state.result += '-' + this.state.buf\n this.state.buf = ''\n return this.next(this.parseStartTimeHour)\n } else if (this.atEndOfWord()) {\n return this.returnNow(createDate(this.state.result + '-' + this.state.buf))\n } else if (isDigit(this.char)) {\n this.consume()\n } else {\n throw this.error(new TomlError('Incomplete datetime'))\n }\n }\n parseStartTimeHour () {\n if (this.atEndOfWord()) {\n return this.returnNow(createDate(this.state.result))\n } else {\n return this.goto(this.parseTimeHour)\n }\n }\n parseTimeHour () {\n if (this.char === CHAR_COLON) {\n if (this.state.buf.length < 2) {\n throw this.error(new TomlError('Hours less than 10 must be zero padded to two characters'))\n }\n this.state.result += 'T' + this.state.buf\n this.state.buf = ''\n return this.next(this.parseTimeMin)\n } else if (isDigit(this.char)) {\n this.consume()\n } else {\n throw this.error(new TomlError('Incomplete datetime'))\n }\n }\n parseTimeMin () {\n if (this.state.buf.length < 2 && isDigit(this.char)) {\n this.consume()\n } else if (this.state.buf.length === 2 && this.char === CHAR_COLON) {\n this.state.result += ':' + this.state.buf\n this.state.buf = ''\n return this.next(this.parseTimeSec)\n } else {\n throw this.error(new TomlError('Incomplete datetime'))\n }\n }\n parseTimeSec () {\n if (isDigit(this.char)) {\n this.consume()\n if (this.state.buf.length === 2) {\n this.state.result += ':' + this.state.buf\n this.state.buf = ''\n return this.next(this.parseTimeZoneOrFraction)\n }\n } else {\n throw this.error(new TomlError('Incomplete datetime'))\n }\n }\n\n parseOnlyTimeHour () {\n /* istanbul ignore else */\n if (this.char === CHAR_COLON) {\n if (this.state.buf.length < 2) {\n throw this.error(new TomlError('Hours less than 10 must be zero padded to two characters'))\n }\n this.state.result = this.state.buf\n this.state.buf = ''\n return this.next(this.parseOnlyTimeMin)\n } else {\n throw this.error(new TomlError('Incomplete time'))\n }\n }\n parseOnlyTimeMin () {\n if (this.state.buf.length < 2 && isDigit(this.char)) {\n this.consume()\n } else if (this.state.buf.length === 2 && this.char === CHAR_COLON) {\n this.state.result += ':' + this.state.buf\n this.state.buf = ''\n return this.next(this.parseOnlyTimeSec)\n } else {\n throw this.error(new TomlError('Incomplete time'))\n }\n }\n parseOnlyTimeSec () {\n if (isDigit(this.char)) {\n this.consume()\n if (this.state.buf.length === 2) {\n return this.next(this.parseOnlyTimeFractionMaybe)\n }\n } else {\n throw this.error(new TomlError('Incomplete time'))\n }\n }\n parseOnlyTimeFractionMaybe () {\n this.state.result += ':' + this.state.buf\n if (this.char === CHAR_PERIOD) {\n this.state.buf = ''\n this.next(this.parseOnlyTimeFraction)\n } else {\n return this.return(createTime(this.state.result))\n }\n }\n parseOnlyTimeFraction () {\n if (isDigit(this.char)) {\n this.consume()\n } else if (this.atEndOfWord()) {\n if (this.state.buf.length === 0) throw this.error(new TomlError('Expected digit in milliseconds'))\n return this.returnNow(createTime(this.state.result + '.' + this.state.buf))\n } else {\n throw this.error(new TomlError('Unexpected character in datetime, expected period (.), minus (-), plus (+) or Z'))\n }\n }\n\n parseTimeZoneOrFraction () {\n if (this.char === CHAR_PERIOD) {\n this.consume()\n this.next(this.parseDateTimeFraction)\n } else if (this.char === CHAR_HYPHEN || this.char === CHAR_PLUS) {\n this.consume()\n this.next(this.parseTimeZoneHour)\n } else if (this.char === CHAR_Z) {\n this.consume()\n return this.return(createDateTime(this.state.result + this.state.buf))\n } else if (this.atEndOfWord()) {\n return this.returnNow(createDateTimeFloat(this.state.result + this.state.buf))\n } else {\n throw this.error(new TomlError('Unexpected character in datetime, expected period (.), minus (-), plus (+) or Z'))\n }\n }\n parseDateTimeFraction () {\n if (isDigit(this.char)) {\n this.consume()\n } else if (this.state.buf.length === 1) {\n throw this.error(new TomlError('Expected digit in milliseconds'))\n } else if (this.char === CHAR_HYPHEN || this.char === CHAR_PLUS) {\n this.consume()\n this.next(this.parseTimeZoneHour)\n } else if (this.char === CHAR_Z) {\n this.consume()\n return this.return(createDateTime(this.state.result + this.state.buf))\n } else if (this.atEndOfWord()) {\n return this.returnNow(createDateTimeFloat(this.state.result + this.state.buf))\n } else {\n throw this.error(new TomlError('Unexpected character in datetime, expected period (.), minus (-), plus (+) or Z'))\n }\n }\n parseTimeZoneHour () {\n if (isDigit(this.char)) {\n this.consume()\n // FIXME: No more regexps\n if (/\\d\\d$/.test(this.state.buf)) return this.next(this.parseTimeZoneSep)\n } else {\n throw this.error(new TomlError('Unexpected character in datetime, expected digit'))\n }\n }\n parseTimeZoneSep () {\n if (this.char === CHAR_COLON) {\n this.consume()\n this.next(this.parseTimeZoneMin)\n } else {\n throw this.error(new TomlError('Unexpected character in datetime, expected colon'))\n }\n }\n parseTimeZoneMin () {\n if (isDigit(this.char)) {\n this.consume()\n if (/\\d\\d$/.test(this.state.buf)) return this.return(createDateTime(this.state.result + this.state.buf))\n } else {\n throw this.error(new TomlError('Unexpected character in datetime, expected digit'))\n }\n }\n\n /* BOOLEAN */\n parseBoolean () {\n /* istanbul ignore else */\n if (this.char === CHAR_t) {\n this.consume()\n return this.next(this.parseTrue_r)\n } else if (this.char === CHAR_f) {\n this.consume()\n return this.next(this.parseFalse_a)\n }\n }\n parseTrue_r () {\n if (this.char === CHAR_r) {\n this.consume()\n return this.next(this.parseTrue_u)\n } else {\n throw this.error(new TomlError('Invalid boolean, expected true or false'))\n }\n }\n parseTrue_u () {\n if (this.char === CHAR_u) {\n this.consume()\n return this.next(this.parseTrue_e)\n } else {\n throw this.error(new TomlError('Invalid boolean, expected true or false'))\n }\n }\n parseTrue_e () {\n if (this.char === CHAR_e) {\n return this.return(true)\n } else {\n throw this.error(new TomlError('Invalid boolean, expected true or false'))\n }\n }\n\n parseFalse_a () {\n if (this.char === CHAR_a) {\n this.consume()\n return this.next(this.parseFalse_l)\n } else {\n throw this.error(new TomlError('Invalid boolean, expected true or false'))\n }\n }\n\n parseFalse_l () {\n if (this.char === CHAR_l) {\n this.consume()\n return this.next(this.parseFalse_s)\n } else {\n throw this.error(new TomlError('Invalid boolean, expected true or false'))\n }\n }\n\n parseFalse_s () {\n if (this.char === CHAR_s) {\n this.consume()\n return this.next(this.parseFalse_e)\n } else {\n throw this.error(new TomlError('Invalid boolean, expected true or false'))\n }\n }\n\n parseFalse_e () {\n if (this.char === CHAR_e) {\n return this.return(false)\n } else {\n throw this.error(new TomlError('Invalid boolean, expected true or false'))\n }\n }\n\n /* INLINE LISTS */\n parseInlineList () {\n if (this.char === CHAR_SP || this.char === CTRL_I || this.char === CTRL_M || this.char === CTRL_J) {\n return null\n } else if (this.char === Parser.END) {\n throw this.error(new TomlError('Unterminated inline array'))\n } else if (this.char === CHAR_NUM) {\n return this.call(this.parseComment)\n } else if (this.char === CHAR_RSQB) {\n return this.return(this.state.resultArr || InlineList())\n } else {\n return this.callNow(this.parseValue, this.recordInlineListValue)\n }\n }\n recordInlineListValue (value) {\n if (this.state.resultArr) {\n const listType = this.state.resultArr[_contentType]\n const valueType = tomlType(value)\n if (listType !== valueType) {\n throw this.error(new TomlError(`Inline lists must be a single type, not a mix of ${listType} and ${valueType}`))\n }\n } else {\n this.state.resultArr = InlineList(tomlType(value))\n }\n if (isFloat(value) || isInteger(value)) {\n // unbox now that we've verified they're ok\n this.state.resultArr.push(value.valueOf())\n } else {\n this.state.resultArr.push(value)\n }\n return this.goto(this.parseInlineListNext)\n }\n parseInlineListNext () {\n if (this.char === CHAR_SP || this.char === CTRL_I || this.char === CTRL_M || this.char === CTRL_J) {\n return null\n } else if (this.char === CHAR_NUM) {\n return this.call(this.parseComment)\n } else if (this.char === CHAR_COMMA) {\n return this.next(this.parseInlineList)\n } else if (this.char === CHAR_RSQB) {\n return this.goto(this.parseInlineList)\n } else {\n throw this.error(new TomlError('Invalid character, expected whitespace, comma (,) or close bracket (])'))\n }\n }\n\n /* INLINE TABLE */\n parseInlineTable () {\n if (this.char === CHAR_SP || this.char === CTRL_I) {\n return null\n } else if (this.char === Parser.END || this.char === CHAR_NUM || this.char === CTRL_J || this.char === CTRL_M) {\n throw this.error(new TomlError('Unterminated inline array'))\n } else if (this.char === CHAR_RCUB) {\n return this.return(this.state.resultTable || InlineTable())\n } else {\n if (!this.state.resultTable) this.state.resultTable = InlineTable()\n return this.callNow(this.parseAssign, this.recordInlineTableValue)\n }\n }\n recordInlineTableValue (kv) {\n let target = this.state.resultTable\n let finalKey = kv.key.pop()\n for (let kw of kv.key) {\n if (hasKey(target, kw) && (!isTable(target[kw]) || target[kw][_declared])) {\n throw this.error(new TomlError(\"Can't redefine existing key\"))\n }\n target = target[kw] = target[kw] || Table()\n }\n if (hasKey(target, finalKey)) {\n throw this.error(new TomlError(\"Can't redefine existing key\"))\n }\n if (isInteger(kv.value) || isFloat(kv.value)) {\n target[finalKey] = kv.value.valueOf()\n } else {\n target[finalKey] = kv.value\n }\n return this.goto(this.parseInlineTableNext)\n }\n parseInlineTableNext () {\n if (this.char === CHAR_SP || this.char === CTRL_I) {\n return null\n } else if (this.char === Parser.END || this.char === CHAR_NUM || this.char === CTRL_J || this.char === CTRL_M) {\n throw this.error(new TomlError('Unterminated inline array'))\n } else if (this.char === CHAR_COMMA) {\n return this.next(this.parseInlineTable)\n } else if (this.char === CHAR_RCUB) {\n return this.goto(this.parseInlineTable)\n } else {\n throw this.error(new TomlError('Invalid character, expected whitespace, comma (,) or close bracket (])'))\n }\n }\n }\n return TOMLParser\n}\n","'use strict'\nmodule.exports = prettyError\n\nfunction prettyError (err, buf) {\n /* istanbul ignore if */\n if (err.pos == null || err.line == null) return err\n let msg = err.message\n msg += ` at row ${err.line + 1}, col ${err.col + 1}, pos ${err.pos}:\\n`\n\n /* istanbul ignore else */\n if (buf && buf.split) {\n const lines = buf.split(/\\n/)\n const lineNumWidth = String(Math.min(lines.length, err.line + 3)).length\n let linePadding = ' '\n while (linePadding.length < lineNumWidth) linePadding += ' '\n for (let ii = Math.max(0, err.line - 1); ii < Math.min(lines.length, err.line + 2); ++ii) {\n let lineNum = String(ii + 1)\n if (lineNum.length < lineNumWidth) lineNum = ' ' + lineNum\n if (err.line === ii) {\n msg += lineNum + '> ' + lines[ii] + '\\n'\n msg += linePadding + ' '\n for (let hh = 0; hh < err.col; ++hh) {\n msg += ' '\n }\n msg += '^\\n'\n } else {\n msg += lineNum + ': ' + lines[ii] + '\\n'\n }\n }\n }\n err.message = msg + '\\n'\n return err\n}\n","'use strict'\nmodule.exports = parseString\n\nconst TOMLParser = require('./lib/toml-parser.js')\nconst prettyError = require('./parse-pretty-error.js')\n\nfunction parseString (str) {\n if (global.Buffer && global.Buffer.isBuffer(str)) {\n str = str.toString('utf8')\n }\n const parser = new TOMLParser()\n try {\n parser.parse(str)\n return parser.finish()\n } catch (err) {\n throw prettyError(err, str)\n }\n}\n","'use strict'\nmodule.exports = parseAsync\n\nconst TOMLParser = require('./lib/toml-parser.js')\nconst prettyError = require('./parse-pretty-error.js')\n\nfunction parseAsync (str, opts) {\n if (!opts) opts = {}\n const index = 0\n const blocksize = opts.blocksize || 40960\n const parser = new TOMLParser()\n return new Promise((resolve, reject) => {\n setImmediate(parseAsyncNext, index, blocksize, resolve, reject)\n })\n function parseAsyncNext (index, blocksize, resolve, reject) {\n if (index >= str.length) {\n try {\n return resolve(parser.finish())\n } catch (err) {\n return reject(prettyError(err, str))\n }\n }\n try {\n parser.parse(str.slice(index, index + blocksize))\n setImmediate(parseAsyncNext, index + blocksize, blocksize, resolve, reject)\n } catch (err) {\n reject(prettyError(err, str))\n }\n }\n}\n","'use strict'\nmodule.exports = parseStream\n\nconst stream = require('stream')\nconst TOMLParser = require('./lib/toml-parser.js')\n\nfunction parseStream (stm) {\n if (stm) {\n return parseReadable(stm)\n } else {\n return parseTransform(stm)\n }\n}\n\nfunction parseReadable (stm) {\n const parser = new TOMLParser()\n stm.setEncoding('utf8')\n return new Promise((resolve, reject) => {\n let readable\n let ended = false\n let errored = false\n function finish () {\n ended = true\n if (readable) return\n try {\n resolve(parser.finish())\n } catch (err) {\n reject(err)\n }\n }\n function error (err) {\n errored = true\n reject(err)\n }\n stm.once('end', finish)\n stm.once('error', error)\n readNext()\n\n function readNext () {\n readable = true\n let data\n while ((data = stm.read()) !== null) {\n try {\n parser.parse(data)\n } catch (err) {\n return error(err)\n }\n }\n readable = false\n /* istanbul ignore if */\n if (ended) return finish()\n /* istanbul ignore if */\n if (errored) return\n stm.once('readable', readNext)\n }\n })\n}\n\nfunction parseTransform () {\n const parser = new TOMLParser()\n return new stream.Transform({\n objectMode: true,\n transform (chunk, encoding, cb) {\n try {\n parser.parse(chunk.toString(encoding))\n } catch (err) {\n this.emit('error', err)\n }\n cb()\n },\n flush (cb) {\n try {\n this.push(parser.finish())\n } catch (err) {\n this.emit('error', err)\n }\n cb()\n }\n })\n}\n","'use strict'\nmodule.exports = require('./parse-string.js')\nmodule.exports.async = require('./parse-async.js')\nmodule.exports.stream = require('./parse-stream.js')\nmodule.exports.prettyError = require('./parse-pretty-error.js')\n","'use strict'\nmodule.exports = stringify\nmodule.exports.value = stringifyInline\n\nfunction stringify (obj) {\n if (obj === null) throw typeError('null')\n if (obj === void (0)) throw typeError('undefined')\n if (typeof obj !== 'object') throw typeError(typeof obj)\n\n if (typeof obj.toJSON === 'function') obj = obj.toJSON()\n if (obj == null) return null\n const type = tomlType(obj)\n if (type !== 'table') throw typeError(type)\n return stringifyObject('', '', obj)\n}\n\nfunction typeError (type) {\n return new Error('Can only stringify objects, not ' + type)\n}\n\nfunction arrayOneTypeError () {\n return new Error(\"Array values can't have mixed types\")\n}\n\nfunction getInlineKeys (obj) {\n return Object.keys(obj).filter(key => isInline(obj[key]))\n}\nfunction getComplexKeys (obj) {\n return Object.keys(obj).filter(key => !isInline(obj[key]))\n}\n\nfunction toJSON (obj) {\n let nobj = Array.isArray(obj) ? [] : Object.prototype.hasOwnProperty.call(obj, '__proto__') ? {['__proto__']: undefined} : {}\n for (let prop of Object.keys(obj)) {\n if (obj[prop] && typeof obj[prop].toJSON === 'function' && !('toISOString' in obj[prop])) {\n nobj[prop] = obj[prop].toJSON()\n } else {\n nobj[prop] = obj[prop]\n }\n }\n return nobj\n}\n\nfunction stringifyObject (prefix, indent, obj) {\n obj = toJSON(obj)\n var inlineKeys\n var complexKeys\n inlineKeys = getInlineKeys(obj)\n complexKeys = getComplexKeys(obj)\n var result = []\n var inlineIndent = indent || ''\n inlineKeys.forEach(key => {\n var type = tomlType(obj[key])\n if (type !== 'undefined' && type !== 'null') {\n result.push(inlineIndent + stringifyKey(key) + ' = ' + stringifyAnyInline(obj[key], true))\n }\n })\n if (result.length > 0) result.push('')\n var complexIndent = prefix && inlineKeys.length > 0 ? indent + ' ' : ''\n complexKeys.forEach(key => {\n result.push(stringifyComplex(prefix, complexIndent, key, obj[key]))\n })\n return result.join('\\n')\n}\n\nfunction isInline (value) {\n switch (tomlType(value)) {\n case 'undefined':\n case 'null':\n case 'integer':\n case 'nan':\n case 'float':\n case 'boolean':\n case 'string':\n case 'datetime':\n return true\n case 'array':\n return value.length === 0 || tomlType(value[0]) !== 'table'\n case 'table':\n return Object.keys(value).length === 0\n /* istanbul ignore next */\n default:\n return false\n }\n}\n\nfunction tomlType (value) {\n if (value === undefined) {\n return 'undefined'\n } else if (value === null) {\n return 'null'\n /* eslint-disable valid-typeof */\n } else if (typeof value === 'bigint' || (Number.isInteger(value) && !Object.is(value, -0))) {\n return 'integer'\n } else if (typeof value === 'number') {\n return 'float'\n } else if (typeof value === 'boolean') {\n return 'boolean'\n } else if (typeof value === 'string') {\n return 'string'\n } else if ('toISOString' in value) {\n return isNaN(value) ? 'undefined' : 'datetime'\n } else if (Array.isArray(value)) {\n return 'array'\n } else {\n return 'table'\n }\n}\n\nfunction stringifyKey (key) {\n var keyStr = String(key)\n if (/^[-A-Za-z0-9_]+$/.test(keyStr)) {\n return keyStr\n } else {\n return stringifyBasicString(keyStr)\n }\n}\n\nfunction stringifyBasicString (str) {\n return '\"' + escapeString(str).replace(/\"/g, '\\\\\"') + '\"'\n}\n\nfunction stringifyLiteralString (str) {\n return \"'\" + str + \"'\"\n}\n\nfunction numpad (num, str) {\n while (str.length < num) str = '0' + str\n return str\n}\n\nfunction escapeString (str) {\n return str.replace(/\\\\/g, '\\\\\\\\')\n .replace(/[\\b]/g, '\\\\b')\n .replace(/\\t/g, '\\\\t')\n .replace(/\\n/g, '\\\\n')\n .replace(/\\f/g, '\\\\f')\n .replace(/\\r/g, '\\\\r')\n /* eslint-disable no-control-regex */\n .replace(/([\\u0000-\\u001f\\u007f])/, c => '\\\\u' + numpad(4, c.codePointAt(0).toString(16)))\n /* eslint-enable no-control-regex */\n}\n\nfunction stringifyMultilineString (str) {\n let escaped = str.split(/\\n/).map(str => {\n return escapeString(str).replace(/\"(?=\"\")/g, '\\\\\"')\n }).join('\\n')\n if (escaped.slice(-1) === '\"') escaped += '\\\\\\n'\n return '\"\"\"\\n' + escaped + '\"\"\"'\n}\n\nfunction stringifyAnyInline (value, multilineOk) {\n let type = tomlType(value)\n if (type === 'string') {\n if (multilineOk && /\\n/.test(value)) {\n type = 'string-multiline'\n } else if (!/[\\b\\t\\n\\f\\r']/.test(value) && /\"/.test(value)) {\n type = 'string-literal'\n }\n }\n return stringifyInline(value, type)\n}\n\nfunction stringifyInline (value, type) {\n /* istanbul ignore if */\n if (!type) type = tomlType(value)\n switch (type) {\n case 'string-multiline':\n return stringifyMultilineString(value)\n case 'string':\n return stringifyBasicString(value)\n case 'string-literal':\n return stringifyLiteralString(value)\n case 'integer':\n return stringifyInteger(value)\n case 'float':\n return stringifyFloat(value)\n case 'boolean':\n return stringifyBoolean(value)\n case 'datetime':\n return stringifyDatetime(value)\n case 'array':\n return stringifyInlineArray(value.filter(_ => tomlType(_) !== 'null' && tomlType(_) !== 'undefined' && tomlType(_) !== 'nan'))\n case 'table':\n return stringifyInlineTable(value)\n /* istanbul ignore next */\n default:\n throw typeError(type)\n }\n}\n\nfunction stringifyInteger (value) {\n /* eslint-disable security/detect-unsafe-regex */\n return String(value).replace(/\\B(?=(\\d{3})+(?!\\d))/g, '_')\n}\n\nfunction stringifyFloat (value) {\n if (value === Infinity) {\n return 'inf'\n } else if (value === -Infinity) {\n return '-inf'\n } else if (Object.is(value, NaN)) {\n return 'nan'\n } else if (Object.is(value, -0)) {\n return '-0.0'\n }\n var chunks = String(value).split('.')\n var int = chunks[0]\n var dec = chunks[1] || 0\n return stringifyInteger(int) + '.' + dec\n}\n\nfunction stringifyBoolean (value) {\n return String(value)\n}\n\nfunction stringifyDatetime (value) {\n return value.toISOString()\n}\n\nfunction isNumber (type) {\n return type === 'float' || type === 'integer'\n}\nfunction arrayType (values) {\n var contentType = tomlType(values[0])\n if (values.every(_ => tomlType(_) === contentType)) return contentType\n // mixed integer/float, emit as floats\n if (values.every(_ => isNumber(tomlType(_)))) return 'float'\n return 'mixed'\n}\nfunction validateArray (values) {\n const type = arrayType(values)\n if (type === 'mixed') {\n throw arrayOneTypeError()\n }\n return type\n}\n\nfunction stringifyInlineArray (values) {\n values = toJSON(values)\n const type = validateArray(values)\n var result = '['\n var stringified = values.map(_ => stringifyInline(_, type))\n if (stringified.join(', ').length > 60 || /\\n/.test(stringified)) {\n result += '\\n ' + stringified.join(',\\n ') + '\\n'\n } else {\n result += ' ' + stringified.join(', ') + (stringified.length > 0 ? ' ' : '')\n }\n return result + ']'\n}\n\nfunction stringifyInlineTable (value) {\n value = toJSON(value)\n var result = []\n Object.keys(value).forEach(key => {\n result.push(stringifyKey(key) + ' = ' + stringifyAnyInline(value[key], false))\n })\n return '{ ' + result.join(', ') + (result.length > 0 ? ' ' : '') + '}'\n}\n\nfunction stringifyComplex (prefix, indent, key, value) {\n var valueType = tomlType(value)\n /* istanbul ignore else */\n if (valueType === 'array') {\n return stringifyArrayOfTables(prefix, indent, key, value)\n } else if (valueType === 'table') {\n return stringifyComplexTable(prefix, indent, key, value)\n } else {\n throw typeError(valueType)\n }\n}\n\nfunction stringifyArrayOfTables (prefix, indent, key, values) {\n values = toJSON(values)\n validateArray(values)\n var firstValueType = tomlType(values[0])\n /* istanbul ignore if */\n if (firstValueType !== 'table') throw typeError(firstValueType)\n var fullKey = prefix + stringifyKey(key)\n var result = ''\n values.forEach(table => {\n if (result.length > 0) result += '\\n'\n result += indent + '[[' + fullKey + ']]\\n'\n result += stringifyObject(fullKey + '.', indent, table)\n })\n return result\n}\n\nfunction stringifyComplexTable (prefix, indent, key, value) {\n var fullKey = prefix + stringifyKey(key)\n var result = ''\n if (getInlineKeys(value).length > 0) {\n result += indent + '[' + fullKey + ']\\n'\n }\n return result + stringifyObject(fullKey + '.', indent, value)\n}\n","'use strict'\nexports.parse = require('./parse.js')\nexports.stringify = require('./stringify.js')\n","import { appendFileSync, existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { PATHS, ensureRuntimeDirs } from './paths.js';\nimport { findRunningDaemon, removePidFile, writePidFile } from './pidfile.js';\nimport { IpcServer } from './ipc-server.js';\nimport { ModuleHost } from './module-host.js';\nimport { AlertDispatcher } from './alerts/index.js';\nimport { RunsWorker } from './workers/runs-worker.js';\nimport { bus } from './event-bus.js';\nimport { initStateDB, closeDB } from '../core/state.js';\nimport { loadConfig } from '../core/config.js';\nimport { captureException, flushTelemetry, initTelemetry } from '../core/telemetry.js';\nimport type { ThreatEvent } from '../types/events.js';\n\nfunction readVersion(): string {\n try {\n const pkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8'));\n return pkg.version || '0.0.0';\n } catch {\n return '0.0.0';\n }\n}\n\nfunction logLine(line: string): void {\n try {\n appendFileSync(PATHS.logFile, `${new Date().toISOString()} ${line}\\n`);\n } catch {\n // best-effort\n }\n}\n\nexport async function runDaemon(): Promise<void> {\n if (findRunningDaemon()) {\n console.error(`threatcrushd already running (pid file at ${PATHS.pidFile}).`);\n process.exit(1);\n }\n\n ensureRuntimeDirs();\n writePidFile();\n\n await initTelemetry('daemon');\n process.on('uncaughtException', (err) => {\n logLine(`[daemon] uncaughtException: ${err.message}`);\n captureException(err);\n });\n process.on('unhandledRejection', (reason) => {\n logLine(`[daemon] unhandledRejection: ${String(reason)}`);\n captureException(reason);\n });\n\n const version = readVersion();\n logLine(`[daemon] starting threatcrushd v${version} mode=${PATHS.mode}`);\n\n try {\n initStateDB(PATHS.stateDb);\n } catch (err) {\n logLine(`[daemon] state db unavailable: ${(err as Error).message}`);\n }\n\n const config = loadConfig(existsSync(PATHS.configFile) ? PATHS.configFile : undefined);\n\n bus.on('event', (event: ThreatEvent) => {\n logLine(`[event] ${event.severity} ${event.module} ${event.message}`);\n });\n\n const moduleHost = new ModuleHost(bus);\n await moduleHost.start();\n\n new AlertDispatcher(bus, config);\n\n const runsWorker = new RunsWorker(bus);\n try {\n await runsWorker.start();\n } catch (err) {\n logLine(`[daemon] runs-worker failed to start: ${(err as Error).message}`);\n }\n\n const ipc = new IpcServer(version, moduleHost);\n await ipc.start();\n logLine(`[daemon] ipc listening on ${PATHS.socket}`);\n\n const shutdown = async (signal: string) => {\n logLine(`[daemon] received ${signal}, shutting down`);\n try { runsWorker.stop(); } catch {}\n try { await moduleHost.stop(); } catch {}\n try { await ipc.stop(); } catch {}\n try { closeDB(); } catch {}\n try { await flushTelemetry(); } catch {}\n removePidFile();\n process.exit(0);\n };\n\n process.on('SIGINT', () => { void shutdown('SIGINT'); });\n process.on('SIGTERM', () => { void shutdown('SIGTERM'); });\n process.on('SIGHUP', () => { void shutdown('SIGHUP'); });\n\n // keep-alive\n setInterval(() => {}, 1 << 30);\n}\n\n// Note: auto-boot is handled by `src/daemon-entry.ts` so that importing this\n// module from the CLI bundle never accidentally starts a daemon.\n","import { existsSync, mkdirSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nfunction canWriteSystemPaths(): boolean {\n if (process.platform !== 'linux') return false;\n if (process.getuid && process.getuid() === 0) return true;\n try {\n if (!existsSync('/etc/threatcrush')) return false;\n mkdirSync('/etc/threatcrush/.probe', { recursive: true });\n return true;\n } catch {\n return false;\n }\n}\n\nconst systemMode = canWriteSystemPaths();\nconst userBase = join(homedir(), '.threatcrush');\n\nexport const PATHS = systemMode\n ? {\n mode: 'system' as const,\n configDir: '/etc/threatcrush',\n configFile: '/etc/threatcrush/threatcrushd.conf',\n confD: '/etc/threatcrush/threatcrushd.conf.d',\n moduleDir: '/etc/threatcrush/modules',\n logDir: '/var/log/threatcrush',\n logFile: '/var/log/threatcrush/threatcrushd.log',\n stateDir: '/var/lib/threatcrush',\n stateDb: '/var/lib/threatcrush/state.db',\n runDir: '/var/run/threatcrush',\n pidFile: '/var/run/threatcrush/threatcrushd.pid',\n socket: '/var/run/threatcrush/threatcrushd.sock',\n }\n : {\n mode: 'user' as const,\n configDir: userBase,\n configFile: join(userBase, 'threatcrushd.conf'),\n confD: join(userBase, 'threatcrushd.conf.d'),\n moduleDir: join(userBase, 'modules'),\n logDir: join(userBase, 'logs'),\n logFile: join(userBase, 'logs', 'threatcrushd.log'),\n stateDir: join(userBase, 'state'),\n stateDb: join(userBase, 'state', 'state.db'),\n runDir: join(userBase, 'run'),\n pidFile: join(userBase, 'run', 'threatcrushd.pid'),\n socket: join(userBase, 'run', 'threatcrushd.sock'),\n };\n\nexport function ensureRuntimeDirs(): void {\n for (const dir of [PATHS.configDir, PATHS.confD, PATHS.moduleDir, PATHS.logDir, PATHS.stateDir, PATHS.runDir]) {\n try {\n mkdirSync(dir, { recursive: true });\n } catch {\n // best-effort\n }\n }\n}\n","import { existsSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';\nimport { PATHS, ensureRuntimeDirs } from './paths.js';\n\nexport function writePidFile(): void {\n ensureRuntimeDirs();\n writeFileSync(PATHS.pidFile, String(process.pid), 'utf-8');\n}\n\nexport function readPidFile(): number | null {\n if (!existsSync(PATHS.pidFile)) return null;\n const raw = readFileSync(PATHS.pidFile, 'utf-8').trim();\n const pid = parseInt(raw, 10);\n return Number.isFinite(pid) ? pid : null;\n}\n\nexport function removePidFile(): void {\n try {\n if (existsSync(PATHS.pidFile)) unlinkSync(PATHS.pidFile);\n } catch {\n // ignore\n }\n}\n\nexport function isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function findRunningDaemon(): number | null {\n const pid = readPidFile();\n if (pid && isProcessAlive(pid)) return pid;\n if (pid) removePidFile();\n return null;\n}\n","import { createServer, Server, Socket } from 'node:net';\nimport { existsSync, unlinkSync } from 'node:fs';\nimport type { ThreatEvent } from '../types/events.js';\nimport { PATHS } from './paths.js';\nimport { bus } from './event-bus.js';\nimport { getRecentEvents, getTopSources, getEventCount, getThreatCount } from '../core/state.js';\nimport type {\n IpcRequest,\n IpcResponse,\n IpcPush,\n DaemonStatusReply,\n} from './ipc-protocol.js';\nimport type { ModuleHost } from './module-host.js';\n\ninterface ClientState {\n id: number;\n socket: Socket;\n buffer: string;\n subscriptions: Set<'event' | 'module'>;\n}\n\nexport class IpcServer {\n private server: Server | null = null;\n private clients = new Map<number, ClientState>();\n private nextClientId = 1;\n private startedAt = new Date();\n private counters = { events: 0, threats: 0, alerts: 0 };\n\n constructor(\n private version: string,\n private moduleHost: ModuleHost,\n ) {\n bus.on('event', (event: ThreatEvent) => {\n this.counters.events++;\n if (event.severity === 'medium' || event.severity === 'high' || event.severity === 'critical') {\n this.counters.threats++;\n }\n this.broadcast({ push: 'event', payload: event }, 'event');\n });\n bus.on('alert', () => {\n this.counters.alerts++;\n });\n bus.on('module', (info) => {\n this.broadcast({ push: 'module', payload: info }, 'module');\n });\n }\n\n async start(): Promise<void> {\n if (existsSync(PATHS.socket)) {\n try { unlinkSync(PATHS.socket); } catch {}\n }\n return new Promise((resolve, reject) => {\n this.server = createServer((sock) => this.handleClient(sock));\n this.server.on('error', reject);\n this.server.listen(PATHS.socket, () => {\n try { require('node:fs').chmodSync(PATHS.socket, 0o660); } catch {}\n resolve();\n });\n });\n }\n\n async stop(): Promise<void> {\n for (const c of this.clients.values()) {\n try { c.socket.destroy(); } catch {}\n }\n this.clients.clear();\n return new Promise((resolve) => {\n if (!this.server) {\n try { if (existsSync(PATHS.socket)) unlinkSync(PATHS.socket); } catch {}\n return resolve();\n }\n this.server.close(() => {\n try { if (existsSync(PATHS.socket)) unlinkSync(PATHS.socket); } catch {}\n resolve();\n });\n });\n }\n\n private handleClient(socket: Socket): void {\n const id = this.nextClientId++;\n const state: ClientState = { id, socket, buffer: '', subscriptions: new Set() };\n this.clients.set(id, state);\n\n socket.setEncoding('utf-8');\n socket.on('data', (chunk) => {\n state.buffer += chunk.toString();\n let idx;\n while ((idx = state.buffer.indexOf('\\n')) >= 0) {\n const line = state.buffer.slice(0, idx);\n state.buffer = state.buffer.slice(idx + 1);\n if (!line.trim()) continue;\n this.handleLine(state, line).catch((err) => {\n this.send(state, { id: 0, ok: false, error: String(err?.message || err) });\n });\n }\n });\n\n socket.on('close', () => { this.clients.delete(id); });\n socket.on('error', () => { this.clients.delete(id); });\n }\n\n private async handleLine(client: ClientState, line: string): Promise<void> {\n let req: IpcRequest;\n try {\n req = JSON.parse(line) as IpcRequest;\n } catch {\n return this.send(client, { id: 0, ok: false, error: 'invalid json' });\n }\n\n switch (req.method) {\n case 'ping':\n return this.send(client, { id: req.id, ok: true, result: 'pong' });\n\n case 'status': {\n const status: DaemonStatusReply = {\n pid: process.pid,\n startedAt: this.startedAt.toISOString(),\n uptimeSeconds: Math.floor((Date.now() - this.startedAt.getTime()) / 1000),\n version: this.version,\n mode: PATHS.mode,\n paths: {\n config: PATHS.configFile,\n log: PATHS.logFile,\n state: PATHS.stateDb,\n socket: PATHS.socket,\n },\n modules: this.moduleHost.summary(),\n counters: { ...this.counters },\n };\n return this.send(client, { id: req.id, ok: true, result: status });\n }\n\n case 'recent_events': {\n const limit = req.params?.limit ?? 50;\n const events = getRecentEvents(limit);\n return this.send(client, { id: req.id, ok: true, result: events });\n }\n\n case 'top_sources': {\n const limit = req.params?.limit ?? 10;\n return this.send(client, { id: req.id, ok: true, result: getTopSources(limit) });\n }\n\n case 'counters': {\n return this.send(client, {\n id: req.id,\n ok: true,\n result: {\n total: getEventCount(),\n threats: getThreatCount(),\n last24h: getEventCount(new Date(Date.now() - 86400000)),\n threats24h: getThreatCount(new Date(Date.now() - 86400000)),\n },\n });\n }\n\n case 'module_list':\n return this.send(client, { id: req.id, ok: true, result: this.moduleHost.summary() });\n\n case 'subscribe':\n for (const ch of req.params.channels) client.subscriptions.add(ch);\n return this.send(client, { id: req.id, ok: true, result: { subscribed: [...client.subscriptions] } });\n\n case 'shutdown':\n this.send(client, { id: req.id, ok: true, result: 'shutting down' });\n setTimeout(() => process.emit('SIGTERM' as NodeJS.Signals), 50);\n return;\n }\n }\n\n private send(client: ClientState, msg: IpcResponse | IpcPush): void {\n try {\n client.socket.write(JSON.stringify(msg) + '\\n');\n } catch {\n // client gone\n }\n }\n\n private broadcast(msg: IpcPush, channel: 'event' | 'module'): void {\n for (const client of this.clients.values()) {\n if (!client.subscriptions.has(channel)) continue;\n this.send(client, msg);\n }\n }\n}\n","import { EventEmitter } from 'node:events';\nimport type { ThreatEvent } from '../types/events.js';\n\nexport interface DaemonEvents {\n event: (event: ThreatEvent) => void;\n alert: (event: ThreatEvent) => void;\n module: (info: { name: string; status: string; detail?: string }) => void;\n}\n\nexport class EventBus extends EventEmitter {\n publish(event: ThreatEvent): void {\n this.emit('event', event);\n if (event.severity === 'high' || event.severity === 'critical') {\n this.emit('alert', event);\n }\n }\n\n announceModule(name: string, status: string, detail?: string): void {\n this.emit('module', { name, status, detail });\n }\n}\n\nexport const bus = new EventBus();\nbus.setMaxListeners(50);\n","import Database from 'better-sqlite3';\nimport type { ThreatEvent } from '../types/events.js';\n\nlet db: Database.Database | null = null;\n\nexport function initStateDB(dbPath: string = '/var/lib/threatcrush/state.db'): Database.Database {\n if (db) return db;\n\n try {\n db = new Database(dbPath);\n } catch {\n // Fall back to in-memory if we can't write to the path\n db = new Database(':memory:');\n }\n\n db.pragma('journal_mode = WAL');\n\n db.exec(`\n CREATE TABLE IF NOT EXISTS events (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n timestamp TEXT NOT NULL,\n module TEXT NOT NULL,\n category TEXT NOT NULL,\n severity TEXT NOT NULL,\n message TEXT NOT NULL,\n source_ip TEXT,\n details TEXT\n );\n\n CREATE TABLE IF NOT EXISTS module_state (\n module TEXT NOT NULL,\n key TEXT NOT NULL,\n value TEXT,\n PRIMARY KEY (module, key)\n );\n\n CREATE TABLE IF NOT EXISTS stats (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_events_timestamp ON events(timestamp);\n CREATE INDEX IF NOT EXISTS idx_events_module ON events(module);\n CREATE INDEX IF NOT EXISTS idx_events_severity ON events(severity);\n CREATE INDEX IF NOT EXISTS idx_events_source_ip ON events(source_ip);\n `);\n\n return db;\n}\n\nexport function insertEvent(event: ThreatEvent): number {\n const database = db || initStateDB();\n const stmt = database.prepare(`\n INSERT INTO events (timestamp, module, category, severity, message, source_ip, details)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `);\n const result = stmt.run(\n event.timestamp.toISOString(),\n event.module,\n event.category,\n event.severity,\n event.message,\n event.source_ip || null,\n event.details ? JSON.stringify(event.details) : null,\n );\n return result.lastInsertRowid as number;\n}\n\nexport function getRecentEvents(limit: number = 50): ThreatEvent[] {\n const database = db || initStateDB();\n const rows = database.prepare(`\n SELECT * FROM events ORDER BY timestamp DESC LIMIT ?\n `).all(limit) as any[];\n return rows.map(rowToEvent);\n}\n\nexport function getEventCount(since?: Date): number {\n const database = db || initStateDB();\n if (since) {\n return (database.prepare(`SELECT COUNT(*) as count FROM events WHERE timestamp >= ?`)\n .get(since.toISOString()) as any).count;\n }\n return (database.prepare(`SELECT COUNT(*) as count FROM events`).get() as any).count;\n}\n\nexport function getThreatCount(since?: Date): number {\n const database = db || initStateDB();\n const severities = \"('medium','high','critical')\";\n if (since) {\n return (database.prepare(\n `SELECT COUNT(*) as count FROM events WHERE severity IN ${severities} AND timestamp >= ?`\n ).get(since.toISOString()) as any).count;\n }\n return (database.prepare(\n `SELECT COUNT(*) as count FROM events WHERE severity IN ${severities}`\n ).get() as any).count;\n}\n\nexport function getTopSources(limit: number = 10): Array<{ ip: string; count: number }> {\n const database = db || initStateDB();\n return database.prepare(`\n SELECT source_ip as ip, COUNT(*) as count FROM events\n WHERE source_ip IS NOT NULL\n GROUP BY source_ip ORDER BY count DESC LIMIT ?\n `).all(limit) as any[];\n}\n\nexport function getModuleState(module: string, key: string): unknown {\n const database = db || initStateDB();\n const row = database.prepare(`SELECT value FROM module_state WHERE module = ? AND key = ?`)\n .get(module, key) as any;\n if (!row) return undefined;\n try {\n return JSON.parse(row.value);\n } catch {\n return row.value;\n }\n}\n\nexport function setModuleState(module: string, key: string, value: unknown): void {\n const database = db || initStateDB();\n database.prepare(`\n INSERT OR REPLACE INTO module_state (module, key, value) VALUES (?, ?, ?)\n `).run(module, key, JSON.stringify(value));\n}\n\nfunction rowToEvent(row: any): ThreatEvent {\n return {\n id: row.id,\n timestamp: new Date(row.timestamp),\n module: row.module,\n category: row.category,\n severity: row.severity,\n message: row.message,\n source_ip: row.source_ip,\n details: row.details ? JSON.parse(row.details) : undefined,\n };\n}\n\nexport function closeDB(): void {\n if (db) {\n db.close();\n db = null;\n }\n}\n","import { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport TOML from '@iarna/toml';\nimport type { EventBus } from './event-bus.js';\nimport { PATHS } from './paths.js';\nimport { LogWatcher } from './watchers/log-watcher.js';\nimport type { ModuleManifest } from '../types/config.js';\n\ninterface HostedModule {\n name: string;\n version: string;\n source: 'builtin' | 'installed';\n status: 'running' | 'loaded' | 'error' | 'disabled';\n events: number;\n detail?: string;\n}\n\nexport class ModuleHost {\n private modules = new Map<string, HostedModule>();\n private logWatcher: LogWatcher | null = null;\n\n constructor(private bus: EventBus) {\n bus.on('event', (event) => {\n const mod = this.modules.get(event.module);\n if (mod) mod.events++;\n });\n }\n\n async start(): Promise<void> {\n this.registerBuiltins();\n this.discoverInstalled();\n\n this.logWatcher = new LogWatcher(this.bus);\n const watched = this.logWatcher.start();\n\n for (const modName of this.logWatcher.activeModules()) {\n const mod = this.modules.get(modName);\n if (mod) {\n mod.status = 'running';\n mod.detail = `watching ${watched.length} log source(s)`;\n this.bus.announceModule(modName, 'running', mod.detail);\n }\n }\n }\n\n async stop(): Promise<void> {\n this.logWatcher?.stop();\n for (const mod of this.modules.values()) {\n mod.status = 'loaded';\n this.bus.announceModule(mod.name, 'stopped');\n }\n }\n\n summary(): Array<{ name: string; status: string; events: number; detail?: string }> {\n return [...this.modules.values()].map((m) => ({\n name: m.name,\n status: m.status,\n events: m.events,\n detail: m.detail,\n }));\n }\n\n private registerBuiltins(): void {\n const builtins: HostedModule[] = [\n { name: 'log-watcher', version: '0.1.0', source: 'builtin', status: 'loaded', events: 0 },\n { name: 'ssh-guard', version: '0.1.0', source: 'builtin', status: 'loaded', events: 0 },\n ];\n for (const m of builtins) this.modules.set(m.name, m);\n }\n\n private discoverInstalled(): void {\n if (!existsSync(PATHS.moduleDir)) return;\n const entries = readdirSync(PATHS.moduleDir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const manifestPath = join(PATHS.moduleDir, entry.name, 'mod.toml');\n if (!existsSync(manifestPath)) continue;\n try {\n const manifest = TOML.parse(readFileSync(manifestPath, 'utf-8')) as unknown as ModuleManifest;\n const name = manifest.module?.name || entry.name;\n this.modules.set(name, {\n name,\n version: manifest.module?.version || '0.0.0',\n source: 'installed',\n status: 'loaded',\n events: 0,\n });\n } catch {\n // skip malformed\n }\n }\n }\n}\n","import { existsSync, statSync, createReadStream, accessSync, constants } from 'node:fs';\nimport { createInterface } from 'node:readline';\nimport type { EventBus } from '../event-bus.js';\nimport { autoDetectParser, detectAttackPattern, parseAuthLog, parseNginxLog } from '../../core/log-parser.js';\nimport { insertEvent } from '../../core/state.js';\nimport type { ThreatEvent, EventCategory, EventSeverity } from '../../types/events.js';\n\nexport interface LogSource {\n path: string;\n module: string;\n category: EventCategory;\n}\n\nexport const DEFAULT_SOURCES: LogSource[] = [\n { path: '/var/log/auth.log', module: 'ssh-guard', category: 'auth' },\n { path: '/var/log/secure', module: 'ssh-guard', category: 'auth' },\n { path: '/var/log/nginx/access.log', module: 'log-watcher', category: 'web' },\n { path: '/var/log/syslog', module: 'log-watcher', category: 'system' },\n];\n\nexport class LogWatcher {\n private timers = new Map<string, NodeJS.Timeout>();\n private positions = new Map<string, number>();\n private active = new Set<string>();\n\n constructor(private bus: EventBus, private sources: LogSource[] = DEFAULT_SOURCES) {}\n\n start(): string[] {\n const started: string[] = [];\n for (const src of this.sources) {\n if (!existsSync(src.path)) continue;\n try { accessSync(src.path, constants.R_OK); }\n catch { continue; }\n this.tail(src);\n started.push(src.path);\n }\n return started;\n }\n\n stop(): void {\n for (const t of this.timers.values()) clearInterval(t);\n this.timers.clear();\n this.positions.clear();\n this.active.clear();\n }\n\n activeModules(): string[] {\n return [...this.active];\n }\n\n private tail(src: LogSource): void {\n try {\n this.positions.set(src.path, statSync(src.path).size);\n } catch {\n this.positions.set(src.path, 0);\n }\n\n const timer = setInterval(() => this.poll(src), 1000);\n this.timers.set(src.path, timer);\n this.active.add(src.module);\n }\n\n private poll(src: LogSource): void {\n let stat;\n try { stat = statSync(src.path); } catch { return; }\n const prev = this.positions.get(src.path) ?? 0;\n\n if (stat.size < prev) {\n this.positions.set(src.path, 0); // rotated\n return;\n }\n if (stat.size === prev) return;\n\n const stream = createReadStream(src.path, { start: prev, encoding: 'utf-8' });\n stream.on('error', () => this.positions.set(src.path, stat.size));\n const rl = createInterface({ input: stream });\n rl.on('error', () => {});\n rl.on('line', (line) => {\n if (!line.trim()) return;\n this.process(line, src);\n });\n rl.on('close', () => this.positions.set(src.path, stat.size));\n }\n\n private process(line: string, src: LogSource): void {\n const parsed = autoDetectParser(line);\n if (!parsed) return;\n\n let severity: EventSeverity = 'info';\n let message = line;\n let sourceIp: string | undefined;\n\n if (parsed.source === 'auth') {\n const entry = parseAuthLog(line);\n if (!entry) return;\n sourceIp = entry.fields.ip;\n const msg = entry.fields.message;\n if (/failed password/i.test(msg)) {\n severity = 'high';\n message = `Failed SSH login for ${entry.fields.user || 'unknown'} from ${entry.fields.ip || 'unknown'}`;\n } else if (/invalid user/i.test(msg)) {\n severity = 'high';\n message = `Invalid SSH user: ${entry.fields.user || 'unknown'} from ${entry.fields.ip || 'unknown'}`;\n } else if (/accepted/i.test(msg)) {\n severity = 'info';\n message = `SSH login accepted for ${entry.fields.user || 'unknown'}`;\n } else {\n return;\n }\n } else if (parsed.source === 'nginx') {\n const entry = parseNginxLog(line);\n if (!entry) return;\n sourceIp = entry.fields.ip;\n const status = parseInt(entry.fields.status, 10);\n const attack = detectAttackPattern(entry.fields.path);\n if (attack) {\n severity = 'critical';\n message = `Attack [${attack.toUpperCase()}]: ${entry.fields.method} ${entry.fields.path}`;\n } else if (status >= 500) {\n severity = 'medium';\n message = `Server error ${status}: ${entry.fields.method} ${entry.fields.path}`;\n } else if (status >= 400) {\n severity = 'low';\n message = `Client error ${status}: ${entry.fields.method} ${entry.fields.path}`;\n } else {\n return;\n }\n } else {\n return;\n }\n\n const event: ThreatEvent = {\n timestamp: new Date(),\n module: src.module,\n category: src.category,\n severity,\n message,\n source_ip: sourceIp,\n };\n\n try { insertEvent(event); } catch { /* db optional */ }\n this.bus.publish(event);\n }\n}\n","import type { ParsedLogLine, NginxLogEntry, AuthLogEntry, SyslogEntry } from '../types/events.js';\n\n// Nginx combined log format:\n// 127.0.0.1 - - [04/Apr/2026:12:00:00 +0000] \"GET /path HTTP/1.1\" 200 1234 \"-\" \"Mozilla/5.0\"\nconst NGINX_REGEX = /^(\\S+) \\S+ \\S+ \\[([^\\]]+)\\] \"(\\S+) (\\S+) \\S+\" (\\d{3}) (\\d+) \"[^\"]*\" \"([^\"]*)\"/;\n\n// Auth.log format:\n// Apr 4 12:00:00 hostname sshd[1234]: Failed password for user from 1.2.3.4 port 22 ssh2\nconst AUTH_REGEX = /^(\\w+\\s+\\d+\\s+[\\d:]+)\\s+\\S+\\s+(\\S+?)(?:\\[\\d+\\])?:\\s+(.*)/;\n\n// Syslog format:\n// Apr 4 12:00:00 hostname process[pid]: message\nconst SYSLOG_REGEX = /^(\\w+\\s+\\d+\\s+[\\d:]+)\\s+\\S+\\s+(\\S+?)(?:\\[\\d+\\])?:\\s+(.*)/;\n\n// Extract IP from auth messages\nconst IP_REGEX = /(?:from|FROM)\\s+(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})/;\nconst USER_REGEX = /(?:for|user)\\s+(\\S+?)(?:\\s+from|\\s*$)/;\n\n// Attack pattern signatures\nexport const ATTACK_PATTERNS = {\n sqli: [\n /(?:union\\s+(?:all\\s+)?select)/i,\n /(?:select\\s+.*\\s+from\\s+)/i,\n /(?:insert\\s+into\\s+)/i,\n /(?:drop\\s+(?:table|database))/i,\n /(?:or\\s+1\\s*=\\s*1)/i,\n /(?:'\\s*(?:or|and)\\s+')/i,\n /(?:--\\s*$|;\\s*--)/,\n /(?:\\/\\*.*\\*\\/)/,\n ],\n xss: [\n /<script[^>]*>/i,\n /javascript\\s*:/i,\n /on(?:load|error|click|mouseover)\\s*=/i,\n /eval\\s*\\(/i,\n /document\\.(?:cookie|write|location)/i,\n ],\n path_traversal: [\n /\\.\\.\\//,\n /\\.\\.\\\\/, \n /etc\\/(?:passwd|shadow|hosts)/,\n /proc\\/self/,\n /windows\\/system32/i,\n ],\n rfi: [\n /(?:https?|ftp):\\/\\/.*\\?/i,\n /php:\\/\\/(?:input|filter)/i,\n /data:\\/\\//i,\n ],\n};\n\nexport function parseNginxLog(line: string): NginxLogEntry | null {\n const match = line.match(NGINX_REGEX);\n if (!match) return null;\n\n return {\n timestamp: parseNginxTimestamp(match[2]),\n raw: line,\n source: 'nginx',\n fields: {\n ip: match[1],\n method: match[3],\n path: match[4],\n status: match[5],\n size: match[6],\n user_agent: match[7],\n },\n };\n}\n\nexport function parseAuthLog(line: string): AuthLogEntry | null {\n const match = line.match(AUTH_REGEX);\n if (!match) return null;\n\n const ipMatch = match[3].match(IP_REGEX);\n const userMatch = match[3].match(USER_REGEX);\n\n return {\n timestamp: parseSyslogTimestamp(match[1]),\n raw: line,\n source: 'auth',\n fields: {\n process: match[2],\n message: match[3],\n ip: ipMatch?.[1],\n user: userMatch?.[1],\n },\n };\n}\n\nexport function parseSyslog(line: string): SyslogEntry | null {\n const match = line.match(SYSLOG_REGEX);\n if (!match) return null;\n\n return {\n timestamp: parseSyslogTimestamp(match[1]),\n raw: line,\n source: 'syslog',\n fields: {\n facility: 'syslog',\n process: match[2],\n message: match[3],\n },\n };\n}\n\nexport function detectAttackPattern(path: string): string | null {\n for (const [type, patterns] of Object.entries(ATTACK_PATTERNS)) {\n for (const pattern of patterns) {\n if (pattern.test(path)) {\n return type;\n }\n }\n }\n return null;\n}\n\nexport function autoDetectParser(line: string): ParsedLogLine | null {\n // Try nginx first (most specific format)\n const nginx = parseNginxLog(line);\n if (nginx) return nginx;\n\n // Try auth log\n const auth = parseAuthLog(line);\n if (auth) return auth;\n\n // Fall back to generic syslog\n return parseSyslog(line);\n}\n\nfunction parseNginxTimestamp(s: string): Date {\n // \"04/Apr/2026:12:00:00 +0000\"\n try {\n const cleaned = s.replace(/(\\d{2})\\/(\\w{3})\\/(\\d{4}):/, '$2 $1, $3 ');\n return new Date(cleaned);\n } catch {\n return new Date();\n }\n}\n\nfunction parseSyslogTimestamp(s: string): Date {\n // \"Apr 4 12:00:00\" — no year, assume current\n try {\n const withYear = `${s} ${new Date().getFullYear()}`;\n return new Date(withYear);\n } catch {\n return new Date();\n }\n}\n","import type { ThreatEvent } from '../../types/events.js';\n\ntype Mailer = {\n sendMail: (opts: Record<string, unknown>) => Promise<unknown>;\n};\n\nlet transporter: Mailer | null = null;\n// Lazy-load nodemailer so the CLI build doesn't pull it in when alerts are off.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet nodemailer: any = null;\n\nexport interface SmtpConfig {\n host?: string;\n port?: number;\n secure?: boolean;\n user?: string;\n pass?: string;\n from?: string;\n to?: string[] | string;\n min_severity?: 'low' | 'medium' | 'high' | 'critical';\n}\n\nconst SEVERITY_RANK: Record<string, number> = {\n info: 0,\n low: 1,\n medium: 2,\n high: 3,\n critical: 4,\n};\n\nasync function ensureTransporter(config: SmtpConfig): Promise<Mailer | null> {\n if (!config.host || !config.from) return null;\n if (transporter) return transporter;\n\n if (!nodemailer) {\n try {\n nodemailer = await import('nodemailer');\n } catch {\n return null;\n }\n }\n\n transporter = nodemailer.createTransport({\n host: config.host,\n port: config.port ?? 587,\n secure: config.secure ?? false,\n auth: config.user && config.pass ? { user: config.user, pass: config.pass } : undefined,\n });\n return transporter;\n}\n\nfunction meetsSeverity(event: ThreatEvent, min?: SmtpConfig['min_severity']): boolean {\n if (!min) return true;\n return (SEVERITY_RANK[event.severity] ?? 0) >= (SEVERITY_RANK[min] ?? 0);\n}\n\nfunction renderBody(event: ThreatEvent): { text: string; html: string } {\n const ts = event.timestamp.toISOString();\n const ip = event.source_ip ? `\\nSource IP: ${event.source_ip}` : '';\n const text =\n `[${event.severity.toUpperCase()}] ${event.module}\\n\\n` +\n `${event.message}${ip}\\n\\n` +\n `When: ${ts}\\nCategory: ${event.category}`;\n const html =\n `<div style=\"font-family:system-ui,sans-serif;line-height:1.5\">` +\n `<h2 style=\"margin:0 0 8px\">⚠ ${event.severity.toUpperCase()} — ${event.module}</h2>` +\n `<p>${event.message}</p>` +\n (event.source_ip ? `<p><strong>Source IP:</strong> <code>${event.source_ip}</code></p>` : '') +\n `<p style=\"color:#888;margin-top:16px\"><small>${ts} · ${event.category}</small></p>` +\n `</div>`;\n return { text, html };\n}\n\nexport function smtpChannel(config: SmtpConfig): (event: ThreatEvent) => Promise<void> {\n return async (event) => {\n if (!meetsSeverity(event, config.min_severity)) return;\n const t = await ensureTransporter(config);\n if (!t) return;\n\n const to = Array.isArray(config.to) ? config.to.join(', ') : config.to;\n if (!to) return;\n\n const { text, html } = renderBody(event);\n await t.sendMail({\n from: config.from,\n to,\n subject: `[ThreatCrush ${event.severity}] ${event.module} — ${event.message.slice(0, 60)}`,\n text,\n html,\n });\n };\n}\n","import type { ThreatCrushConfig, AlertChannelConfig } from '../../types/config.js';\nimport type { ThreatEvent } from '../../types/events.js';\nimport type { EventBus } from '../event-bus.js';\nimport { smtpChannel, type SmtpConfig } from './smtp.js';\n\ntype Channel = (event: ThreatEvent) => Promise<void>;\n\nexport class AlertDispatcher {\n private channels: Channel[] = [];\n\n constructor(private bus: EventBus, private config: ThreatCrushConfig) {\n this.bindChannels();\n bus.on('alert', (event) => { void this.dispatch(event); });\n }\n\n private bindChannels(): void {\n const alerts = this.config.alerts || {};\n for (const [name, raw] of Object.entries(alerts)) {\n const cfg = raw as AlertChannelConfig;\n if (!cfg.enabled) continue;\n if (name === 'webhook' && typeof cfg.url === 'string') {\n this.channels.push(webhookChannel(cfg.url, cfg.secret as string | undefined));\n }\n if (name === 'slack' && typeof cfg.webhook_url === 'string') {\n this.channels.push(slackChannel(cfg.webhook_url));\n }\n if (name === 'email' && typeof cfg.host === 'string' && typeof cfg.from === 'string') {\n this.channels.push(smtpChannel(cfg as unknown as SmtpConfig));\n }\n }\n }\n\n private async dispatch(event: ThreatEvent): Promise<void> {\n await Promise.all(this.channels.map((ch) => ch(event).catch(() => {})));\n }\n}\n\nfunction webhookChannel(url: string, secret?: string): Channel {\n return async (event) => {\n const body = JSON.stringify({ event });\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n if (secret) headers['X-Threatcrush-Signature'] = secret;\n await fetch(url, { method: 'POST', headers, body });\n };\n}\n\nfunction slackChannel(webhookUrl: string): Channel {\n return async (event) => {\n const emoji = event.severity === 'critical' ? ':rotating_light:' : ':warning:';\n const text = `${emoji} *[${event.severity.toUpperCase()}]* \\`${event.module}\\` — ${event.message}${event.source_ip ? ` (from ${event.source_ip})` : ''}`;\n await fetch(webhookUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ text }),\n });\n };\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync, chmodSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\n\nexport const CLI_CONFIG_DIR = join(homedir(), '.threatcrush');\nexport const CLI_CONFIG_PATH = join(CLI_CONFIG_DIR, 'config.json');\n\nexport interface CliConfig {\n email?: string;\n user_id?: string;\n token?: string;\n refresh_token?: string;\n expires_at?: number;\n display_name?: string;\n current_org_id?: string;\n current_org_slug?: string;\n}\n\nexport function readCliConfig(): CliConfig {\n try {\n return JSON.parse(readFileSync(CLI_CONFIG_PATH, 'utf-8')) as CliConfig;\n } catch {\n return {};\n }\n}\n\nexport function writeCliConfig(config: CliConfig): void {\n if (!existsSync(CLI_CONFIG_DIR)) mkdirSync(CLI_CONFIG_DIR, { recursive: true });\n writeFileSync(CLI_CONFIG_PATH, JSON.stringify(config, null, 2), 'utf-8');\n try { chmodSync(CLI_CONFIG_PATH, 0o600); } catch { /* non-posix */ }\n}\n\nexport function updateCliConfig(patch: Partial<CliConfig>): CliConfig {\n const current = readCliConfig();\n const next = { ...current, ...patch };\n writeCliConfig(next);\n return next;\n}\n\nexport function clearCliConfig(keys?: Array<keyof CliConfig>): void {\n const current = readCliConfig();\n if (!keys) {\n writeCliConfig({});\n return;\n }\n for (const key of keys) delete current[key];\n writeCliConfig(current);\n}\n\nexport function isLoggedIn(): boolean {\n const cfg = readCliConfig();\n if (!cfg.token) return false;\n if (cfg.expires_at && cfg.expires_at * 1000 < Date.now()) return false;\n return true;\n}\n\nexport function authHeaders(): Record<string, string> {\n const cfg = readCliConfig();\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n if (cfg.token) headers['Authorization'] = `Bearer ${cfg.token}`;\n return headers;\n}\n","import { readdirSync, readFileSync, statSync } from 'node:fs';\nimport { join, relative, extname } from 'node:path';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { banner, logger } from '../core/logger.js';\nimport type { RunResult, StructuredFinding } from '../core/run-result.js';\nimport { summarize } from '../core/run-result.js';\n\ninterface ScanFinding {\n file: string;\n line: number;\n type: string;\n severity: 'low' | 'medium' | 'high' | 'critical';\n message: string;\n snippet: string;\n}\n\n// Secret patterns\nconst SECRET_PATTERNS: Array<{\n name: string;\n pattern: RegExp;\n severity: 'medium' | 'high' | 'critical';\n}> = [\n { name: 'AWS Access Key', pattern: /(?:AKIA[0-9A-Z]{16})/g, severity: 'critical' },\n { name: 'AWS Secret Key', pattern: /(?:aws_secret_access_key|AWS_SECRET)\\s*[=:]\\s*['\"]?([A-Za-z0-9/+=]{40})['\"]?/gi, severity: 'critical' },\n { name: 'GitHub Token', pattern: /(?:ghp_[A-Za-z0-9]{36}|github_pat_[A-Za-z0-9_]{82})/g, severity: 'critical' },\n { name: 'Generic API Key', pattern: /(?:api[_-]?key|apikey)\\s*[=:]\\s*['\"]([A-Za-z0-9\\-_]{20,})['\"]?/gi, severity: 'high' },\n { name: 'Generic Secret', pattern: /(?:secret|password|passwd|pwd)\\s*[=:]\\s*['\"]([^'\"]{8,})['\"]?/gi, severity: 'high' },\n { name: 'Private Key', pattern: /-----BEGIN (?:RSA |EC |DSA )?PRIVATE KEY-----/g, severity: 'critical' },\n { name: 'JWT Token', pattern: /eyJ[A-Za-z0-9-_]+\\.eyJ[A-Za-z0-9-_]+\\.[A-Za-z0-9-_.+/=]*/g, severity: 'high' },\n { name: 'Slack Token', pattern: /xox[bpors]-[A-Za-z0-9-]{10,}/g, severity: 'critical' },\n { name: 'Stripe Key', pattern: /(?:sk_live_|pk_live_|sk_test_|pk_test_)[A-Za-z0-9]{20,}/g, severity: 'critical' },\n { name: 'Database URL', pattern: /(?:postgres|mysql|mongodb|redis):\\/\\/[^\\s'\"]+/gi, severity: 'high' },\n { name: 'Bearer Token', pattern: /Bearer\\s+[A-Za-z0-9\\-_\\.]{20,}/g, severity: 'medium' },\n { name: 'Hex Token (32+)', pattern: /(?:token|key|secret|auth)\\s*[=:]\\s*['\"]?([0-9a-f]{32,})['\"]?/gi, severity: 'medium' },\n];\n\n// File permission / misconfig checks\nconst MISCONFIG_FILES = [\n { pattern: '.env', message: '.env file found — may contain secrets' },\n { pattern: '.env.local', message: '.env.local file found — may contain secrets' },\n { pattern: '.env.production', message: '.env.production file found — may contain secrets' },\n { pattern: 'id_rsa', message: 'Private SSH key found' },\n { pattern: 'id_ed25519', message: 'Private SSH key found' },\n { pattern: '.pem', message: 'PEM certificate/key file found' },\n { pattern: '.p12', message: 'PKCS#12 keystore found' },\n { pattern: '.keystore', message: 'Keystore file found' },\n];\n\nconst SKIP_DIRS = new Set([\n 'node_modules', '.git', '.next', 'dist', 'build', '__pycache__',\n '.venv', 'vendor', '.terraform', 'coverage', '.cache',\n]);\n\nconst SCAN_EXTENSIONS = new Set([\n '.ts', '.js', '.tsx', '.jsx', '.py', '.rb', '.go', '.java',\n '.php', '.rs', '.c', '.cpp', '.h', '.yml', '.yaml', '.json',\n '.toml', '.ini', '.cfg', '.conf', '.env', '.sh', '.bash',\n '.tf', '.hcl', '.xml', '.properties', '.gradle',\n]);\n\nexport async function runScan(targetPath: string): Promise<RunResult> {\n const findings: ScanFinding[] = [];\n try {\n scanDirectory(targetPath, targetPath, findings, () => {});\n } catch (err) {\n return {\n type: 'scan',\n target: targetPath,\n findings: [],\n severity_summary: { critical: 0, high: 0, medium: 0, low: 0, info: 0 },\n summary: `Scan failed: ${(err as Error).message}`,\n error: (err as Error).message,\n };\n }\n\n const structured: StructuredFinding[] = findings.map((f) => ({\n type: f.type,\n severity: f.severity,\n message: f.message,\n location: `${f.file}:${f.line}`,\n details: { file: f.file, line: f.line, snippet: f.snippet },\n }));\n const summary = summarize(structured);\n\n return {\n type: 'scan',\n target: targetPath,\n findings: structured,\n severity_summary: summary,\n summary: findings.length === 0\n ? 'No security issues found'\n : `${findings.length} issue(s): ${summary.critical}C ${summary.high}H ${summary.medium}M ${summary.low}L`,\n };\n}\n\nexport async function scanCommand(targetPath: string): Promise<RunResult> {\n banner();\n logger.info(`Scanning ${chalk.white(targetPath)} for security issues...\\n`);\n\n const spinner = ora({ text: 'Scanning files...', color: 'green' }).start();\n const findings: ScanFinding[] = [];\n let filesScanned = 0;\n\n try {\n scanDirectory(targetPath, targetPath, findings, () => {\n filesScanned++;\n spinner.text = `Scanning files... (${filesScanned} files)`;\n });\n } catch (err) {\n spinner.fail(`Scan failed: ${(err as Error).message}`);\n return {\n type: 'scan',\n target: targetPath,\n findings: [],\n severity_summary: { critical: 0, high: 0, medium: 0, low: 0, info: 0 },\n summary: `Scan failed: ${(err as Error).message}`,\n error: (err as Error).message,\n };\n }\n\n spinner.succeed(`Scanned ${filesScanned} files\\n`);\n\n const structured: StructuredFinding[] = findings.map((f) => ({\n type: f.type,\n severity: f.severity,\n message: f.message,\n location: `${f.file}:${f.line}`,\n details: { file: f.file, line: f.line, snippet: f.snippet },\n }));\n const sevCounts = summarize(structured);\n\n // Print results\n if (findings.length === 0) {\n console.log(chalk.green.bold(' ✓ No security issues found!'));\n console.log();\n return {\n type: 'scan',\n target: targetPath,\n findings: [],\n severity_summary: sevCounts,\n summary: `No issues found across ${filesScanned} files`,\n };\n }\n\n // Group by severity\n const critical = findings.filter((f) => f.severity === 'critical');\n const high = findings.filter((f) => f.severity === 'high');\n const medium = findings.filter((f) => f.severity === 'medium');\n const low = findings.filter((f) => f.severity === 'low');\n\n console.log(chalk.white.bold(' Scan Results'));\n console.log(chalk.gray(' ' + '─'.repeat(70)));\n console.log(\n ` ${chalk.red.bold(critical.length + ' critical')} ` +\n `${chalk.red(high.length + ' high')} ` +\n `${chalk.yellow(medium.length + ' medium')} ` +\n `${chalk.gray(low.length + ' low')}`,\n );\n console.log(chalk.gray(' ' + '─'.repeat(70)));\n console.log();\n\n const allFindings = [...critical, ...high, ...medium, ...low];\n for (const finding of allFindings) {\n const sev =\n finding.severity === 'critical' ? chalk.bgRed.white.bold(` ${finding.severity.toUpperCase()} `) :\n finding.severity === 'high' ? chalk.red(`[${finding.severity.toUpperCase()}]`) :\n finding.severity === 'medium' ? chalk.yellow(`[${finding.severity.toUpperCase()}]`) :\n chalk.gray(`[${finding.severity.toUpperCase()}]`);\n\n console.log(` ${sev} ${chalk.white.bold(finding.type)}`);\n console.log(` ${chalk.gray('File:')} ${chalk.cyan(finding.file)}:${chalk.yellow(String(finding.line))}`);\n console.log(` ${chalk.gray('Info:')} ${finding.message}`);\n if (finding.snippet) {\n // Redact the actual secret value\n const redacted = finding.snippet.replace(\n /(['\"]?)([A-Za-z0-9+/=\\-_]{16,})(['\"]?)/g,\n '$1' + chalk.red('*'.repeat(16)) + '$3',\n );\n console.log(` ${chalk.gray('Code:')} ${redacted.trim()}`);\n }\n console.log();\n }\n\n console.log(chalk.gray(' ' + '─'.repeat(70)));\n console.log(` ${chalk.white.bold(`${findings.length} issue(s) found`)} across ${filesScanned} files`);\n console.log();\n\n return {\n type: 'scan',\n target: targetPath,\n findings: structured,\n severity_summary: sevCounts,\n summary: `${findings.length} issue(s): ${sevCounts.critical}C ${sevCounts.high}H ${sevCounts.medium}M ${sevCounts.low}L`,\n };\n}\n\nfunction scanDirectory(\n basePath: string,\n currentPath: string,\n findings: ScanFinding[],\n onFile: () => void,\n): void {\n let entries;\n try {\n entries = readdirSync(currentPath, { withFileTypes: true });\n } catch {\n return; // Permission denied or similar\n }\n\n for (const entry of entries) {\n const fullPath = join(currentPath, entry.name);\n\n if (entry.isDirectory()) {\n if (SKIP_DIRS.has(entry.name)) continue;\n scanDirectory(basePath, fullPath, findings, onFile);\n continue;\n }\n\n if (!entry.isFile()) continue;\n\n // Check for misconfig files\n for (const mc of MISCONFIG_FILES) {\n if (entry.name === mc.pattern || entry.name.endsWith(mc.pattern)) {\n findings.push({\n file: relative(basePath, fullPath),\n line: 0,\n type: 'Sensitive File',\n severity: 'high',\n message: mc.message,\n snippet: '',\n });\n }\n }\n\n // Only scan text files with known extensions\n const ext = extname(entry.name).toLowerCase();\n if (!SCAN_EXTENSIONS.has(ext) && !entry.name.startsWith('.env')) continue;\n\n // Skip large files\n try {\n const stat = statSync(fullPath);\n if (stat.size > 1024 * 1024) continue; // Skip >1MB\n } catch {\n continue;\n }\n\n onFile();\n\n // Scan file content\n let content: string;\n try {\n content = readFileSync(fullPath, 'utf-8');\n } catch {\n continue;\n }\n\n const lines = content.split('\\n');\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n // Skip comments\n if (line.trim().startsWith('//') && !line.includes('password') && !line.includes('secret')) continue;\n\n for (const pattern of SECRET_PATTERNS) {\n pattern.pattern.lastIndex = 0;\n if (pattern.pattern.test(line)) {\n findings.push({\n file: relative(basePath, fullPath),\n line: i + 1,\n type: pattern.name,\n severity: pattern.severity,\n message: `Possible ${pattern.name} detected`,\n snippet: line.length > 120 ? line.slice(0, 120) + '...' : line,\n });\n }\n }\n }\n }\n}\n","const ANSI_BACKGROUND_OFFSET = 10;\n\nconst wrapAnsi16 = (offset = 0) => code => `\\u001B[${code + offset}m`;\n\nconst wrapAnsi256 = (offset = 0) => code => `\\u001B[${38 + offset};5;${code}m`;\n\nconst wrapAnsi16m = (offset = 0) => (red, green, blue) => `\\u001B[${38 + offset};2;${red};${green};${blue}m`;\n\nconst styles = {\n\tmodifier: {\n\t\treset: [0, 0],\n\t\t// 21 isn't widely supported and 22 does the same thing\n\t\tbold: [1, 22],\n\t\tdim: [2, 22],\n\t\titalic: [3, 23],\n\t\tunderline: [4, 24],\n\t\toverline: [53, 55],\n\t\tinverse: [7, 27],\n\t\thidden: [8, 28],\n\t\tstrikethrough: [9, 29],\n\t},\n\tcolor: {\n\t\tblack: [30, 39],\n\t\tred: [31, 39],\n\t\tgreen: [32, 39],\n\t\tyellow: [33, 39],\n\t\tblue: [34, 39],\n\t\tmagenta: [35, 39],\n\t\tcyan: [36, 39],\n\t\twhite: [37, 39],\n\n\t\t// Bright color\n\t\tblackBright: [90, 39],\n\t\tgray: [90, 39], // Alias of `blackBright`\n\t\tgrey: [90, 39], // Alias of `blackBright`\n\t\tredBright: [91, 39],\n\t\tgreenBright: [92, 39],\n\t\tyellowBright: [93, 39],\n\t\tblueBright: [94, 39],\n\t\tmagentaBright: [95, 39],\n\t\tcyanBright: [96, 39],\n\t\twhiteBright: [97, 39],\n\t},\n\tbgColor: {\n\t\tbgBlack: [40, 49],\n\t\tbgRed: [41, 49],\n\t\tbgGreen: [42, 49],\n\t\tbgYellow: [43, 49],\n\t\tbgBlue: [44, 49],\n\t\tbgMagenta: [45, 49],\n\t\tbgCyan: [46, 49],\n\t\tbgWhite: [47, 49],\n\n\t\t// Bright color\n\t\tbgBlackBright: [100, 49],\n\t\tbgGray: [100, 49], // Alias of `bgBlackBright`\n\t\tbgGrey: [100, 49], // Alias of `bgBlackBright`\n\t\tbgRedBright: [101, 49],\n\t\tbgGreenBright: [102, 49],\n\t\tbgYellowBright: [103, 49],\n\t\tbgBlueBright: [104, 49],\n\t\tbgMagentaBright: [105, 49],\n\t\tbgCyanBright: [106, 49],\n\t\tbgWhiteBright: [107, 49],\n\t},\n};\n\nexport const modifierNames = Object.keys(styles.modifier);\nexport const foregroundColorNames = Object.keys(styles.color);\nexport const backgroundColorNames = Object.keys(styles.bgColor);\nexport const colorNames = [...foregroundColorNames, ...backgroundColorNames];\n\nfunction assembleStyles() {\n\tconst codes = new Map();\n\n\tfor (const [groupName, group] of Object.entries(styles)) {\n\t\tfor (const [styleName, style] of Object.entries(group)) {\n\t\t\tstyles[styleName] = {\n\t\t\t\topen: `\\u001B[${style[0]}m`,\n\t\t\t\tclose: `\\u001B[${style[1]}m`,\n\t\t\t};\n\n\t\t\tgroup[styleName] = styles[styleName];\n\n\t\t\tcodes.set(style[0], style[1]);\n\t\t}\n\n\t\tObject.defineProperty(styles, groupName, {\n\t\t\tvalue: group,\n\t\t\tenumerable: false,\n\t\t});\n\t}\n\n\tObject.defineProperty(styles, 'codes', {\n\t\tvalue: codes,\n\t\tenumerable: false,\n\t});\n\n\tstyles.color.close = '\\u001B[39m';\n\tstyles.bgColor.close = '\\u001B[49m';\n\n\tstyles.color.ansi = wrapAnsi16();\n\tstyles.color.ansi256 = wrapAnsi256();\n\tstyles.color.ansi16m = wrapAnsi16m();\n\tstyles.bgColor.ansi = wrapAnsi16(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi256 = wrapAnsi256(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi16m = wrapAnsi16m(ANSI_BACKGROUND_OFFSET);\n\n\t// From https://github.com/Qix-/color-convert/blob/3f0e0d4e92e235796ccb17f6e85c72094a651f49/conversions.js\n\tObject.defineProperties(styles, {\n\t\trgbToAnsi256: {\n\t\t\tvalue(red, green, blue) {\n\t\t\t\t// We use the extended greyscale palette here, with the exception of\n\t\t\t\t// black and white. normal palette only has 4 greyscale shades.\n\t\t\t\tif (red === green && green === blue) {\n\t\t\t\t\tif (red < 8) {\n\t\t\t\t\t\treturn 16;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (red > 248) {\n\t\t\t\t\t\treturn 231;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn Math.round(((red - 8) / 247) * 24) + 232;\n\t\t\t\t}\n\n\t\t\t\treturn 16\n\t\t\t\t\t+ (36 * Math.round(red / 255 * 5))\n\t\t\t\t\t+ (6 * Math.round(green / 255 * 5))\n\t\t\t\t\t+ Math.round(blue / 255 * 5);\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToRgb: {\n\t\t\tvalue(hex) {\n\t\t\t\tconst matches = /[a-f\\d]{6}|[a-f\\d]{3}/i.exec(hex.toString(16));\n\t\t\t\tif (!matches) {\n\t\t\t\t\treturn [0, 0, 0];\n\t\t\t\t}\n\n\t\t\t\tlet [colorString] = matches;\n\n\t\t\t\tif (colorString.length === 3) {\n\t\t\t\t\tcolorString = [...colorString].map(character => character + character).join('');\n\t\t\t\t}\n\n\t\t\t\tconst integer = Number.parseInt(colorString, 16);\n\n\t\t\t\treturn [\n\t\t\t\t\t/* eslint-disable no-bitwise */\n\t\t\t\t\t(integer >> 16) & 0xFF,\n\t\t\t\t\t(integer >> 8) & 0xFF,\n\t\t\t\t\tinteger & 0xFF,\n\t\t\t\t\t/* eslint-enable no-bitwise */\n\t\t\t\t];\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi256: {\n\t\t\tvalue: hex => styles.rgbToAnsi256(...styles.hexToRgb(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t\tansi256ToAnsi: {\n\t\t\tvalue(code) {\n\t\t\t\tif (code < 8) {\n\t\t\t\t\treturn 30 + code;\n\t\t\t\t}\n\n\t\t\t\tif (code < 16) {\n\t\t\t\t\treturn 90 + (code - 8);\n\t\t\t\t}\n\n\t\t\t\tlet red;\n\t\t\t\tlet green;\n\t\t\t\tlet blue;\n\n\t\t\t\tif (code >= 232) {\n\t\t\t\t\tred = (((code - 232) * 10) + 8) / 255;\n\t\t\t\t\tgreen = red;\n\t\t\t\t\tblue = red;\n\t\t\t\t} else {\n\t\t\t\t\tcode -= 16;\n\n\t\t\t\t\tconst remainder = code % 36;\n\n\t\t\t\t\tred = Math.floor(code / 36) / 5;\n\t\t\t\t\tgreen = Math.floor(remainder / 6) / 5;\n\t\t\t\t\tblue = (remainder % 6) / 5;\n\t\t\t\t}\n\n\t\t\t\tconst value = Math.max(red, green, blue) * 2;\n\n\t\t\t\tif (value === 0) {\n\t\t\t\t\treturn 30;\n\t\t\t\t}\n\n\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\tlet result = 30 + ((Math.round(blue) << 2) | (Math.round(green) << 1) | Math.round(red));\n\n\t\t\t\tif (value === 2) {\n\t\t\t\t\tresult += 60;\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\trgbToAnsi: {\n\t\t\tvalue: (red, green, blue) => styles.ansi256ToAnsi(styles.rgbToAnsi256(red, green, blue)),\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi: {\n\t\t\tvalue: hex => styles.ansi256ToAnsi(styles.hexToAnsi256(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t});\n\n\treturn styles;\n}\n\nconst ansiStyles = assembleStyles();\n\nexport default ansiStyles;\n","import process from 'node:process';\nimport os from 'node:os';\nimport tty from 'node:tty';\n\n// From: https://github.com/sindresorhus/has-flag/blob/main/index.js\n/// function hasFlag(flag, argv = globalThis.Deno?.args ?? process.argv) {\nfunction hasFlag(flag, argv = globalThis.Deno ? globalThis.Deno.args : process.argv) {\n\tconst prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');\n\tconst position = argv.indexOf(prefix + flag);\n\tconst terminatorPosition = argv.indexOf('--');\n\treturn position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);\n}\n\nconst {env} = process;\n\nlet flagForceColor;\nif (\n\thasFlag('no-color')\n\t|| hasFlag('no-colors')\n\t|| hasFlag('color=false')\n\t|| hasFlag('color=never')\n) {\n\tflagForceColor = 0;\n} else if (\n\thasFlag('color')\n\t|| hasFlag('colors')\n\t|| hasFlag('color=true')\n\t|| hasFlag('color=always')\n) {\n\tflagForceColor = 1;\n}\n\nfunction envForceColor() {\n\tif ('FORCE_COLOR' in env) {\n\t\tif (env.FORCE_COLOR === 'true') {\n\t\t\treturn 1;\n\t\t}\n\n\t\tif (env.FORCE_COLOR === 'false') {\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn env.FORCE_COLOR.length === 0 ? 1 : Math.min(Number.parseInt(env.FORCE_COLOR, 10), 3);\n\t}\n}\n\nfunction translateLevel(level) {\n\tif (level === 0) {\n\t\treturn false;\n\t}\n\n\treturn {\n\t\tlevel,\n\t\thasBasic: true,\n\t\thas256: level >= 2,\n\t\thas16m: level >= 3,\n\t};\n}\n\nfunction _supportsColor(haveStream, {streamIsTTY, sniffFlags = true} = {}) {\n\tconst noFlagForceColor = envForceColor();\n\tif (noFlagForceColor !== undefined) {\n\t\tflagForceColor = noFlagForceColor;\n\t}\n\n\tconst forceColor = sniffFlags ? flagForceColor : noFlagForceColor;\n\n\tif (forceColor === 0) {\n\t\treturn 0;\n\t}\n\n\tif (sniffFlags) {\n\t\tif (hasFlag('color=16m')\n\t\t\t|| hasFlag('color=full')\n\t\t\t|| hasFlag('color=truecolor')) {\n\t\t\treturn 3;\n\t\t}\n\n\t\tif (hasFlag('color=256')) {\n\t\t\treturn 2;\n\t\t}\n\t}\n\n\t// Check for Azure DevOps pipelines.\n\t// Has to be above the `!streamIsTTY` check.\n\tif ('TF_BUILD' in env && 'AGENT_NAME' in env) {\n\t\treturn 1;\n\t}\n\n\tif (haveStream && !streamIsTTY && forceColor === undefined) {\n\t\treturn 0;\n\t}\n\n\tconst min = forceColor || 0;\n\n\tif (env.TERM === 'dumb') {\n\t\treturn min;\n\t}\n\n\tif (process.platform === 'win32') {\n\t\t// Windows 10 build 10586 is the first Windows release that supports 256 colors.\n\t\t// Windows 10 build 14931 is the first release that supports 16m/TrueColor.\n\t\tconst osRelease = os.release().split('.');\n\t\tif (\n\t\t\tNumber(osRelease[0]) >= 10\n\t\t\t&& Number(osRelease[2]) >= 10_586\n\t\t) {\n\t\t\treturn Number(osRelease[2]) >= 14_931 ? 3 : 2;\n\t\t}\n\n\t\treturn 1;\n\t}\n\n\tif ('CI' in env) {\n\t\tif (['GITHUB_ACTIONS', 'GITEA_ACTIONS', 'CIRCLECI'].some(key => key in env)) {\n\t\t\treturn 3;\n\t\t}\n\n\t\tif (['TRAVIS', 'APPVEYOR', 'GITLAB_CI', 'BUILDKITE', 'DRONE'].some(sign => sign in env) || env.CI_NAME === 'codeship') {\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn min;\n\t}\n\n\tif ('TEAMCITY_VERSION' in env) {\n\t\treturn /^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;\n\t}\n\n\tif (env.COLORTERM === 'truecolor') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'xterm-kitty') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'xterm-ghostty') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'wezterm') {\n\t\treturn 3;\n\t}\n\n\tif ('TERM_PROGRAM' in env) {\n\t\tconst version = Number.parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);\n\n\t\tswitch (env.TERM_PROGRAM) {\n\t\t\tcase 'iTerm.app': {\n\t\t\t\treturn version >= 3 ? 3 : 2;\n\t\t\t}\n\n\t\t\tcase 'Apple_Terminal': {\n\t\t\t\treturn 2;\n\t\t\t}\n\t\t\t// No default\n\t\t}\n\t}\n\n\tif (/-256(color)?$/i.test(env.TERM)) {\n\t\treturn 2;\n\t}\n\n\tif (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {\n\t\treturn 1;\n\t}\n\n\tif ('COLORTERM' in env) {\n\t\treturn 1;\n\t}\n\n\treturn min;\n}\n\nexport function createSupportsColor(stream, options = {}) {\n\tconst level = _supportsColor(stream, {\n\t\tstreamIsTTY: stream && stream.isTTY,\n\t\t...options,\n\t});\n\n\treturn translateLevel(level);\n}\n\nconst supportsColor = {\n\tstdout: createSupportsColor({isTTY: tty.isatty(1)}),\n\tstderr: createSupportsColor({isTTY: tty.isatty(2)}),\n};\n\nexport default supportsColor;\n","// TODO: When targeting Node.js 16, use `String.prototype.replaceAll`.\nexport function stringReplaceAll(string, substring, replacer) {\n\tlet index = string.indexOf(substring);\n\tif (index === -1) {\n\t\treturn string;\n\t}\n\n\tconst substringLength = substring.length;\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\treturnValue += string.slice(endIndex, index) + substring + replacer;\n\t\tendIndex = index + substringLength;\n\t\tindex = string.indexOf(substring, endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.slice(endIndex);\n\treturn returnValue;\n}\n\nexport function stringEncaseCRLFWithFirstIndex(string, prefix, postfix, index) {\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\tconst gotCR = string[index - 1] === '\\r';\n\t\treturnValue += string.slice(endIndex, (gotCR ? index - 1 : index)) + prefix + (gotCR ? '\\r\\n' : '\\n') + postfix;\n\t\tendIndex = index + 1;\n\t\tindex = string.indexOf('\\n', endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.slice(endIndex);\n\treturn returnValue;\n}\n","import ansiStyles from '#ansi-styles';\nimport supportsColor from '#supports-color';\nimport { // eslint-disable-line import/order\n\tstringReplaceAll,\n\tstringEncaseCRLFWithFirstIndex,\n} from './utilities.js';\n\nconst {stdout: stdoutColor, stderr: stderrColor} = supportsColor;\n\nconst GENERATOR = Symbol('GENERATOR');\nconst STYLER = Symbol('STYLER');\nconst IS_EMPTY = Symbol('IS_EMPTY');\n\n// `supportsColor.level` → `ansiStyles.color[name]` mapping\nconst levelMapping = [\n\t'ansi',\n\t'ansi',\n\t'ansi256',\n\t'ansi16m',\n];\n\nconst styles = Object.create(null);\n\nconst applyOptions = (object, options = {}) => {\n\tif (options.level && !(Number.isInteger(options.level) && options.level >= 0 && options.level <= 3)) {\n\t\tthrow new Error('The `level` option should be an integer from 0 to 3');\n\t}\n\n\t// Detect level if not set manually\n\tconst colorLevel = stdoutColor ? stdoutColor.level : 0;\n\tobject.level = options.level === undefined ? colorLevel : options.level;\n};\n\nexport class Chalk {\n\tconstructor(options) {\n\t\t// eslint-disable-next-line no-constructor-return\n\t\treturn chalkFactory(options);\n\t}\n}\n\nconst chalkFactory = options => {\n\tconst chalk = (...strings) => strings.join(' ');\n\tapplyOptions(chalk, options);\n\n\tObject.setPrototypeOf(chalk, createChalk.prototype);\n\n\treturn chalk;\n};\n\nfunction createChalk(options) {\n\treturn chalkFactory(options);\n}\n\nObject.setPrototypeOf(createChalk.prototype, Function.prototype);\n\nfor (const [styleName, style] of Object.entries(ansiStyles)) {\n\tstyles[styleName] = {\n\t\tget() {\n\t\t\tconst builder = createBuilder(this, createStyler(style.open, style.close, this[STYLER]), this[IS_EMPTY]);\n\t\t\tObject.defineProperty(this, styleName, {value: builder});\n\t\t\treturn builder;\n\t\t},\n\t};\n}\n\nstyles.visible = {\n\tget() {\n\t\tconst builder = createBuilder(this, this[STYLER], true);\n\t\tObject.defineProperty(this, 'visible', {value: builder});\n\t\treturn builder;\n\t},\n};\n\nconst getModelAnsi = (model, level, type, ...arguments_) => {\n\tif (model === 'rgb') {\n\t\tif (level === 'ansi16m') {\n\t\t\treturn ansiStyles[type].ansi16m(...arguments_);\n\t\t}\n\n\t\tif (level === 'ansi256') {\n\t\t\treturn ansiStyles[type].ansi256(ansiStyles.rgbToAnsi256(...arguments_));\n\t\t}\n\n\t\treturn ansiStyles[type].ansi(ansiStyles.rgbToAnsi(...arguments_));\n\t}\n\n\tif (model === 'hex') {\n\t\treturn getModelAnsi('rgb', level, type, ...ansiStyles.hexToRgb(...arguments_));\n\t}\n\n\treturn ansiStyles[type][model](...arguments_);\n};\n\nconst usedModels = ['rgb', 'hex', 'ansi256'];\n\nfor (const model of usedModels) {\n\tstyles[model] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(getModelAnsi(model, levelMapping[level], 'color', ...arguments_), ansiStyles.color.close, this[STYLER]);\n\t\t\t\treturn createBuilder(this, styler, this[IS_EMPTY]);\n\t\t\t};\n\t\t},\n\t};\n\n\tconst bgModel = 'bg' + model[0].toUpperCase() + model.slice(1);\n\tstyles[bgModel] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(getModelAnsi(model, levelMapping[level], 'bgColor', ...arguments_), ansiStyles.bgColor.close, this[STYLER]);\n\t\t\t\treturn createBuilder(this, styler, this[IS_EMPTY]);\n\t\t\t};\n\t\t},\n\t};\n}\n\nconst proto = Object.defineProperties(() => {}, {\n\t...styles,\n\tlevel: {\n\t\tenumerable: true,\n\t\tget() {\n\t\t\treturn this[GENERATOR].level;\n\t\t},\n\t\tset(level) {\n\t\t\tthis[GENERATOR].level = level;\n\t\t},\n\t},\n});\n\nconst createStyler = (open, close, parent) => {\n\tlet openAll;\n\tlet closeAll;\n\tif (parent === undefined) {\n\t\topenAll = open;\n\t\tcloseAll = close;\n\t} else {\n\t\topenAll = parent.openAll + open;\n\t\tcloseAll = close + parent.closeAll;\n\t}\n\n\treturn {\n\t\topen,\n\t\tclose,\n\t\topenAll,\n\t\tcloseAll,\n\t\tparent,\n\t};\n};\n\nconst createBuilder = (self, _styler, _isEmpty) => {\n\t// Single argument is hot path, implicit coercion is faster than anything\n\t// eslint-disable-next-line no-implicit-coercion\n\tconst builder = (...arguments_) => applyStyle(builder, (arguments_.length === 1) ? ('' + arguments_[0]) : arguments_.join(' '));\n\n\t// We alter the prototype because we must return a function, but there is\n\t// no way to create a function with a different prototype\n\tObject.setPrototypeOf(builder, proto);\n\n\tbuilder[GENERATOR] = self;\n\tbuilder[STYLER] = _styler;\n\tbuilder[IS_EMPTY] = _isEmpty;\n\n\treturn builder;\n};\n\nconst applyStyle = (self, string) => {\n\tif (self.level <= 0 || !string) {\n\t\treturn self[IS_EMPTY] ? '' : string;\n\t}\n\n\tlet styler = self[STYLER];\n\n\tif (styler === undefined) {\n\t\treturn string;\n\t}\n\n\tconst {openAll, closeAll} = styler;\n\tif (string.includes('\\u001B')) {\n\t\twhile (styler !== undefined) {\n\t\t\t// Replace any instances already present with a re-opening code\n\t\t\t// otherwise only the part of the string until said closing code\n\t\t\t// will be colored, and the rest will simply be 'plain'.\n\t\t\tstring = stringReplaceAll(string, styler.close, styler.open);\n\n\t\t\tstyler = styler.parent;\n\t\t}\n\t}\n\n\t// We can move both next actions out of loop, because remaining actions in loop won't have\n\t// any/visible effect on parts we add here. Close the styling before a linebreak and reopen\n\t// after next line to fix a bleed issue on macOS: https://github.com/chalk/chalk/pull/92\n\tconst lfIndex = string.indexOf('\\n');\n\tif (lfIndex !== -1) {\n\t\tstring = stringEncaseCRLFWithFirstIndex(string, closeAll, openAll, lfIndex);\n\t}\n\n\treturn openAll + string + closeAll;\n};\n\nObject.defineProperties(createChalk.prototype, styles);\n\nconst chalk = createChalk();\nexport const chalkStderr = createChalk({level: stderrColor ? stderrColor.level : 0});\n\nexport {\n\tmodifierNames,\n\tforegroundColorNames,\n\tbackgroundColorNames,\n\tcolorNames,\n\n\t// TODO: Remove these aliases in the next major version\n\tmodifierNames as modifiers,\n\tforegroundColorNames as foregroundColors,\n\tbackgroundColorNames as backgroundColors,\n\tcolorNames as colors,\n} from './vendor/ansi-styles/index.js';\n\nexport {\n\tstdoutColor as supportsColor,\n\tstderrColor as supportsColorStderr,\n};\n\nexport default chalk;\n","import chalk from 'chalk';\nimport type { EventSeverity } from '../types/events.js';\n\nconst SEVERITY_COLORS: Record<EventSeverity, (s: string) => string> = {\n info: chalk.green,\n low: chalk.cyan,\n medium: chalk.yellow,\n high: chalk.red,\n critical: chalk.bgRed.white.bold,\n};\n\nconst LEVEL_COLORS: Record<string, (s: string) => string> = {\n debug: chalk.gray,\n info: chalk.green,\n warn: chalk.yellow,\n error: chalk.red,\n};\n\nexport function severityColor(severity: EventSeverity, text: string): string {\n return (SEVERITY_COLORS[severity] || chalk.white)(text);\n}\n\nexport function formatTimestamp(date: Date = new Date()): string {\n return chalk.gray(date.toISOString().replace('T', ' ').slice(0, 19));\n}\n\nexport function formatEvent(\n module: string,\n severity: EventSeverity,\n message: string,\n ip?: string,\n): string {\n const ts = formatTimestamp();\n const sev = severityColor(severity, `[${severity.toUpperCase()}]`.padEnd(10));\n const mod = chalk.cyan(`[${module}]`.padEnd(14));\n const src = ip ? chalk.magenta(` (${ip})`) : '';\n return `${ts} ${sev} ${mod} ${message}${src}`;\n}\n\nexport const logger = {\n debug: (msg: string) => console.log(`${formatTimestamp()} ${LEVEL_COLORS.debug('[DEBUG]')} ${msg}`),\n info: (msg: string) => console.log(`${formatTimestamp()} ${LEVEL_COLORS.info('[INFO]')} ${msg}`),\n warn: (msg: string) => console.log(`${formatTimestamp()} ${LEVEL_COLORS.warn('[WARN]')} ${msg}`),\n error: (msg: string) => console.error(`${formatTimestamp()} ${LEVEL_COLORS.error('[ERROR]')} ${msg}`),\n success: (msg: string) => console.log(`${formatTimestamp()} ${chalk.green('[OK]')} ${msg}`),\n threat: (msg: string, ip?: string) => {\n const src = ip ? chalk.magenta(` from ${ip}`) : '';\n console.log(`${formatTimestamp()} ${chalk.red.bold('[THREAT]')} ${chalk.red(msg)}${src}`);\n },\n};\n\nexport function banner(): void {\n console.log(chalk.green.bold(`\n ████████╗██╗ ██╗██████╗ ███████╗ █████╗ ████████╗ ██████╗██████╗ ██╗ ██╗███████╗██╗ ██╗\n ╚══██╔══╝██║ ██║██╔══██╗██╔════╝██╔══██╗╚══██╔══╝██╔════╝██╔══██╗██║ ██║██╔════╝██║ ██║\n ██║ ███████║██████╔╝█████╗ ███████║ ██║ ██║ ██████╔╝██║ ██║███████╗███████║\n ██║ ██╔══██║██╔══██╗██╔══╝ ██╔══██║ ██║ ██║ ██╔══██╗██║ ██║╚════██║██╔══██║\n ██║ ██║ ██║██║ ██║███████╗██║ ██║ ██║ ╚██████╗██║ ██║╚██████╔╝███████║██║ ██║\n ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝\n `));\n console.log(chalk.gray(' All-in-one security agent daemon — v0.1.0\\n'));\n}\n","import os from 'node:os';\n\nexport type Severity = 'critical' | 'high' | 'medium' | 'low' | 'info';\n\nexport interface StructuredFinding {\n type: string;\n severity: Severity;\n message: string;\n location?: string;\n details?: Record<string, unknown>;\n}\n\nexport interface RunResult {\n type: 'scan' | 'pentest';\n target: string;\n findings: StructuredFinding[];\n severity_summary: Record<Severity, number>;\n summary: string;\n error?: string;\n}\n\nexport function emptyCounts(): Record<Severity, number> {\n return { critical: 0, high: 0, medium: 0, low: 0, info: 0 };\n}\n\nexport function summarize(findings: StructuredFinding[]): Record<Severity, number> {\n const counts = emptyCounts();\n for (const f of findings) counts[f.severity] = (counts[f.severity] || 0) + 1;\n return counts;\n}\n\nexport function workerId(): string {\n return `${os.hostname()}/${process.pid}`;\n}\n","import { execSync } from 'node:child_process';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { banner, logger } from '../core/logger.js';\nimport type { RunResult, StructuredFinding } from '../core/run-result.js';\nimport { summarize } from '../core/run-result.js';\n\ninterface PentestResult {\n url: string;\n type: string;\n severity: 'low' | 'medium' | 'high' | 'critical';\n message: string;\n details?: string;\n}\n\n// Basic vulnerability tests\nconst PENTEST_CHECKS = [\n {\n name: 'XSS Reflected',\n test: (html: string) => /<script>alert\\(1\\)<\\/script>|<img\\s+src=x\\s+onerror=alert/i.test(html),\n severity: 'critical' as const,\n message: 'Reflected XSS payload rendered in response',\n },\n {\n name: 'Open Redirect',\n test: (url: string, body: string) => body.includes('location.href') || body.includes('window.location'),\n severity: 'medium' as const,\n message: 'Potential open redirect detected',\n },\n {\n name: 'Missing Security Headers',\n test: (_url: string, _body: string, headers: Record<string, string>) => {\n const required = ['x-content-type-options', 'x-frame-options', 'strict-transport-security'];\n const missing = required.filter(h => !headers[h.toLowerCase()]);\n return missing.length > 2;\n },\n severity: 'low' as const,\n message: 'Missing critical security headers (X-Content-Type-Options, X-Frame-Options, HSTS)',\n },\n {\n name: 'Server Version Disclosure',\n test: (_url: string, _body: string, headers: Record<string, string>) => {\n return !!(headers['server'] && /apache|nginx|iis|tomcat/i.test(headers['server']));\n },\n severity: 'low' as const,\n message: 'Server version disclosed in response header',\n },\n {\n name: 'Directory Listing',\n test: (html: string) => /Index of\\s*\\/|<title>Directory Listing/i.test(html),\n severity: 'medium' as const,\n message: 'Directory listing enabled',\n },\n {\n name: 'Error Page Information Disclosure',\n test: (html: string) => /stack trace|traceback|exception|at\\s+\\w+\\.\\w+\\(/i.test(html),\n severity: 'medium' as const,\n message: 'Error page reveals internal information',\n },\n];\n\nexport async function runPentest(rawUrl: string): Promise<RunResult> {\n const targetUrl = rawUrl.startsWith('http') ? rawUrl : `https://${rawUrl}`;\n const results = await collectPentestResults(targetUrl);\n const structured: StructuredFinding[] = results.map((r) => ({\n type: r.type,\n severity: r.severity === 'low' ? 'low' : (r.severity as StructuredFinding['severity']),\n message: r.message,\n location: r.url,\n details: r.details ? { detail: r.details } : undefined,\n }));\n const counts = summarize(structured);\n return {\n type: 'pentest',\n target: targetUrl,\n findings: structured,\n severity_summary: counts,\n summary: structured.length === 0\n ? 'No vulnerabilities detected'\n : `${structured.length} issue(s): ${counts.critical}C ${counts.high}H ${counts.medium}M ${counts.low}L`,\n };\n}\n\nasync function collectPentestResults(targetUrl: string): Promise<PentestResult[]> {\n const results: PentestResult[] = [];\n try {\n const resp = await fetch(targetUrl, { redirect: 'manual' });\n const headers: Record<string, string> = {};\n resp.headers.forEach((v, k) => { headers[k] = v; });\n const body = await resp.text();\n for (const check of PENTEST_CHECKS) {\n try {\n if (check.test(body, body, headers)) {\n results.push({ url: targetUrl, type: check.name, severity: check.severity, message: check.message });\n }\n } catch { /* skip */ }\n }\n } catch {\n return results;\n }\n\n const sqliPayloads = [\"' OR 1=1--\", \"1' UNION SELECT NULL--\", \"' AND '1'='1\"];\n for (const payload of sqliPayloads) {\n try {\n const testUrl = `${targetUrl}?id=${encodeURIComponent(payload)}`;\n const resp = await fetch(testUrl, { redirect: 'manual', signal: AbortSignal.timeout(5000) });\n const body = await resp.text();\n if (/sql\\s+(syntax|error|exception)|mysql|postgres|ORA-\\d+/i.test(body)) {\n results.push({ url: testUrl, type: 'SQL Injection', severity: 'critical', message: `SQL error with payload: ${payload}` });\n }\n } catch { /* skip */ }\n }\n\n const traversalPaths = ['../../etc/passwd', '..%2F..%2Fetc%2Fpasswd', '....//....//etc/passwd'];\n for (const path of traversalPaths) {\n try {\n const testUrl = `${targetUrl}/${path}`;\n const resp = await fetch(testUrl, { redirect: 'manual', signal: AbortSignal.timeout(5000) });\n const body = await resp.text();\n if (/root:.*:0:0:|daemon:.*:1:1:|nobody:.*:65534/i.test(body)) {\n results.push({ url: testUrl, type: 'Path Traversal', severity: 'critical', message: `Possible /etc/passwd disclosure: ${path}` });\n }\n } catch { /* skip */ }\n }\n\n const methods = ['OPTIONS', 'TRACE', 'DELETE', 'PUT'];\n for (const method of methods) {\n try {\n const resp = await fetch(targetUrl, { method, signal: AbortSignal.timeout(5000) });\n if (resp.status < 400 && method !== 'OPTIONS') {\n results.push({ url: targetUrl, type: `Unsafe HTTP Method: ${method}`, severity: 'medium', message: `${method} allowed (status ${resp.status})` });\n }\n if (method === 'OPTIONS') {\n const allow = resp.headers.get('allow');\n if (allow && /DELETE|PUT|TRACE/i.test(allow)) {\n results.push({ url: targetUrl, type: 'HTTP Methods', severity: 'low', message: `Allowed methods: ${allow}` });\n }\n }\n } catch { /* skip */ }\n }\n\n return results;\n}\n\nexport async function pentestCommand(targetUrl: string): Promise<RunResult> {\n banner();\n\n // Ensure URL has protocol\n if (!targetUrl.startsWith('http')) {\n targetUrl = `https://${targetUrl}`;\n }\n\n logger.info(`Penetration testing ${chalk.white(targetUrl)}...\\n`);\n\n const results: PentestResult[] = [];\n\n // Test 1: Basic response analysis\n const spinner = ora({ text: 'Fetching target...', color: 'green' }).start();\n try {\n const resp = await fetch(targetUrl, { redirect: 'manual' });\n const headers: Record<string, string> = {};\n resp.headers.forEach((v, k) => { headers[k] = v; });\n const body = await resp.text();\n\n spinner.succeed(`Got ${resp.status} response\\n`);\n\n // Run all checks\n for (const check of PENTEST_CHECKS) {\n try {\n if (check.test(body, body, headers)) {\n results.push({\n url: targetUrl,\n type: check.name,\n severity: check.severity,\n message: check.message,\n });\n }\n } catch {\n // Skip check on error\n }\n }\n } catch (err: any) {\n spinner.fail(`Failed to reach target: ${err.message}`);\n console.log(chalk.gray(' Check the URL and try again.\\n'));\n return;\n }\n\n // Test 2: SQL injection probe\n const sqliSpinner = ora({ text: 'Testing SQL injection vectors...', color: 'green' }).start();\n const sqliPayloads = [\"' OR 1=1--\", \"1' UNION SELECT NULL--\", \"' AND '1'='1\"];\n for (const payload of sqliPayloads) {\n try {\n const testUrl = `${targetUrl}?id=${encodeURIComponent(payload)}`;\n const resp = await fetch(testUrl, { redirect: 'manual', signal: AbortSignal.timeout(5000) });\n const body = await resp.text();\n if (/sql\\s+(syntax|error|exception)|mysql|postgres|ORA-\\d+/i.test(body)) {\n results.push({\n url: testUrl,\n type: 'SQL Injection',\n severity: 'critical',\n message: `SQL error response detected with payload: ${payload}`,\n });\n }\n } catch {\n // Skip on timeout/network error\n }\n }\n sqliSpinner.succeed('SQL injection tests complete\\n');\n\n // Test 3: Path traversal probe\n const pathSpinner = ora({ text: 'Testing path traversal...', color: 'green' }).start();\n const traversalPaths = ['../../etc/passwd', '..%2F..%2Fetc%2Fpasswd', '....//....//etc/passwd'];\n for (const path of traversalPaths) {\n try {\n const testUrl = `${targetUrl}/${path}`;\n const resp = await fetch(testUrl, { redirect: 'manual', signal: AbortSignal.timeout(5000) });\n const body = await resp.text();\n if (/root:.*:0:0:|daemon:.*:1:1:|nobody:.*:65534/i.test(body)) {\n results.push({\n url: testUrl,\n type: 'Path Traversal',\n severity: 'critical',\n message: `Possible /etc/passwd disclosure via: ${path}`,\n });\n }\n } catch {\n // Skip on timeout/network error\n }\n }\n pathSpinner.succeed('Path traversal tests complete\\n');\n\n // Test 4: HTTP methods\n const methodSpinner = ora({ text: 'Testing HTTP methods...', color: 'green' }).start();\n const methods = ['OPTIONS', 'TRACE', 'DELETE', 'PUT'];\n for (const method of methods) {\n try {\n const resp = await fetch(targetUrl, { method, signal: AbortSignal.timeout(5000) });\n if (resp.status < 400 && method !== 'OPTIONS') {\n results.push({\n url: targetUrl,\n type: `Unsafe HTTP Method: ${method}`,\n severity: 'medium',\n message: `${method} method is allowed (status ${resp.status})`,\n });\n }\n if (method === 'OPTIONS') {\n const allow = resp.headers.get('allow');\n if (allow && /DELETE|PUT|TRACE/i.test(allow)) {\n results.push({\n url: targetUrl,\n type: 'HTTP Methods',\n severity: 'low',\n message: `Allowed methods: ${allow}`,\n });\n }\n }\n } catch {\n // Skip on error\n }\n }\n methodSpinner.succeed('HTTP method tests complete\\n');\n\n const structured: StructuredFinding[] = results.map((r) => ({\n type: r.type,\n severity: r.severity as StructuredFinding['severity'],\n message: r.message,\n location: r.url,\n details: r.details ? { detail: r.details } : undefined,\n }));\n const sevCounts = summarize(structured);\n\n // Print results\n if (results.length === 0) {\n console.log(chalk.green.bold(' ✓ No vulnerabilities detected in basic scan!'));\n console.log(chalk.dim(' Note: This is a basic scan. Full pentest requires manual review.\\n'));\n return {\n type: 'pentest',\n target: targetUrl,\n findings: [],\n severity_summary: sevCounts,\n summary: 'No vulnerabilities detected',\n };\n }\n\n const critical = results.filter(r => r.severity === 'critical');\n const high = results.filter(r => r.severity === 'high');\n const medium = results.filter(r => r.severity === 'medium');\n const low = results.filter(r => r.severity === 'low');\n\n console.log(chalk.white.bold(' Penetration Test Results'));\n console.log(chalk.gray(' ' + '─'.repeat(70)));\n console.log(\n ` ${chalk.red.bold(critical.length + ' critical')} ` +\n `${chalk.red(high.length + ' high')} ` +\n `${chalk.yellow(medium.length + ' medium')} ` +\n `${chalk.gray(low.length + ' low')}`,\n );\n console.log(chalk.gray(' ' + '─'.repeat(70)));\n console.log();\n\n const sorted = [...critical, ...high, ...medium, ...low];\n for (const r of sorted) {\n const sev =\n r.severity === 'critical' ? chalk.bgRed.white.bold(` ${r.severity.toUpperCase()} `) :\n r.severity === 'high' ? chalk.red(`[${r.severity.toUpperCase()}]`) :\n r.severity === 'medium' ? chalk.yellow(`[${r.severity.toUpperCase()}]`) :\n chalk.gray(`[${r.severity.toUpperCase()}]`);\n\n console.log(` ${sev} ${chalk.white.bold(r.type)}`);\n console.log(` ${chalk.gray('URL:')} ${chalk.cyan(r.url)}`);\n console.log(` ${chalk.gray('Info:')} ${r.message}`);\n if (r.details) console.log(` ${chalk.gray('Details:')} ${r.details}`);\n console.log();\n }\n\n console.log(chalk.gray(' ' + '─'.repeat(70)));\n console.log(` ${chalk.white.bold(`${results.length} issue(s) found`)}`);\n console.log(chalk.dim(' Note: This is an automated basic scan. Manual review recommended.\\n'));\n\n return {\n type: 'pentest',\n target: targetUrl,\n findings: structured,\n severity_summary: sevCounts,\n summary: `${results.length} issue(s): ${sevCounts.critical}C ${sevCounts.high}H ${sevCounts.medium}M ${sevCounts.low}L`,\n };\n}\n","import type { EventBus } from '../event-bus.js';\nimport { readCliConfig, authHeaders, isLoggedIn } from '../../core/cli-config.js';\nimport { runScan } from '../../commands/scan.js';\nimport { runPentest } from '../../commands/pentest.js';\nimport { workerId, type RunResult } from '../../core/run-result.js';\n\nconst API_URL = process.env.THREATCRUSH_API_URL || 'https://threatcrush.com';\nconst POLL_INTERVAL_MS = 30_000;\nconst SCHEDULE_INTERVAL_MS = 120_000;\n\ninterface ClaimedRun {\n id: string;\n org_id: string;\n property_id: string;\n type: 'scan' | 'pentest';\n property: { id: string; name: string; kind: string; target: string } | null;\n}\n\n/**\n * Polls the server for queued property runs belonging to orgs the logged-in\n * user is a member of, claims them atomically, executes them locally, and\n * posts the result back.\n *\n * No-op unless `~/.threatcrush/config.json` contains a valid bearer token.\n */\nexport class RunsWorker {\n private pollTimer: NodeJS.Timeout | null = null;\n private scheduleTimer: NodeJS.Timeout | null = null;\n private running = false;\n private orgIds: string[] = [];\n\n constructor(private bus: EventBus) {}\n\n async start(): Promise<void> {\n if (!isLoggedIn()) return;\n\n try {\n await this.refreshOrgs();\n } catch {\n // First fetch may fail if the network is down; the tick loop will retry.\n }\n\n this.bus.announceModule('runs-worker', 'running', `poll ${POLL_INTERVAL_MS / 1000}s`);\n this.tick();\n this.scheduleTick();\n this.pollTimer = setInterval(() => this.tick(), POLL_INTERVAL_MS);\n this.scheduleTimer = setInterval(() => this.scheduleTick(), SCHEDULE_INTERVAL_MS);\n }\n\n stop(): void {\n if (this.pollTimer) clearInterval(this.pollTimer);\n if (this.scheduleTimer) clearInterval(this.scheduleTimer);\n this.pollTimer = null;\n this.scheduleTimer = null;\n this.bus.announceModule('runs-worker', 'stopped');\n }\n\n private async scheduleTick(): Promise<void> {\n if (!isLoggedIn()) return;\n try {\n if (this.orgIds.length === 0) await this.refreshOrgs();\n for (const orgId of this.orgIds) {\n try {\n await fetch(`${API_URL}/api/orgs/${orgId}/schedules/tick`, {\n method: 'POST',\n headers: authHeaders(),\n });\n } catch {\n // ignore transient network errors\n }\n }\n } catch {\n // swallow — retry next interval\n }\n }\n\n private async tick(): Promise<void> {\n if (this.running) return;\n if (!isLoggedIn()) return;\n\n this.running = true;\n try {\n if (this.orgIds.length === 0) await this.refreshOrgs();\n for (const orgId of this.orgIds) {\n const claimed = await this.claimOne(orgId);\n if (!claimed) continue;\n\n const result = await this.execute(claimed);\n await this.finalize(orgId, claimed, result);\n }\n } catch {\n // swallow — we'll try again on the next tick\n } finally {\n this.running = false;\n }\n }\n\n private async refreshOrgs(): Promise<void> {\n const res = await fetch(`${API_URL}/api/orgs`, { headers: authHeaders() });\n if (!res.ok) return;\n const data = await res.json() as { organizations?: Array<{ id: string }> };\n this.orgIds = (data.organizations || []).map((o) => o.id);\n }\n\n private async claimOne(orgId: string): Promise<ClaimedRun | null> {\n try {\n const res = await fetch(`${API_URL}/api/orgs/${orgId}/runs/pending`, {\n method: 'POST',\n headers: authHeaders(),\n body: JSON.stringify({ worker_id: workerId() }),\n });\n if (!res.ok) return null;\n const data = await res.json() as { run?: ClaimedRun | null };\n return data.run ?? null;\n } catch {\n return null;\n }\n }\n\n private async execute(run: ClaimedRun): Promise<RunResult> {\n const target = run.property?.target;\n if (!target) {\n return {\n type: run.type,\n target: '',\n findings: [],\n severity_summary: { critical: 0, high: 0, medium: 0, low: 0, info: 0 },\n summary: 'property target missing',\n error: 'property target missing',\n };\n }\n\n this.bus.announceModule('runs-worker', 'running', `${run.type} ${run.property?.name || target}`);\n\n try {\n if (run.type === 'scan') return await runScan(target);\n return await runPentest(target);\n } catch (err) {\n return {\n type: run.type,\n target,\n findings: [],\n severity_summary: { critical: 0, high: 0, medium: 0, low: 0, info: 0 },\n summary: `failed: ${(err as Error).message}`,\n error: (err as Error).message,\n };\n }\n }\n\n private async finalize(orgId: string, claimed: ClaimedRun, result: RunResult): Promise<void> {\n try {\n await fetch(\n `${API_URL}/api/orgs/${orgId}/properties/${claimed.property_id}/runs/${claimed.id}`,\n {\n method: 'PATCH',\n headers: authHeaders(),\n body: JSON.stringify({\n status: result.error ? 'failed' : 'succeeded',\n findings_count: result.findings.length,\n severity_summary: result.severity_summary,\n summary: result.summary,\n findings: result.findings,\n error: result.error,\n source: 'daemon',\n worker_id: workerId(),\n }),\n },\n );\n } catch {\n // best-effort\n } finally {\n this.bus.announceModule('runs-worker', 'idle');\n }\n }\n}\n","import { readFileSync, existsSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport TOML from '@iarna/toml';\nimport type { ThreatCrushConfig, ModuleConfig } from '../types/config.js';\n\nconst DEFAULT_CONFIG_PATH = '/etc/threatcrush/threatcrushd.conf';\nconst DEFAULT_CONFDIR = '/etc/threatcrush/threatcrushd.conf.d';\n\nconst DEFAULT_CONFIG: ThreatCrushConfig = {\n daemon: {\n pid_file: '/var/run/threatcrush/threatcrushd.pid',\n log_level: 'info',\n log_file: '/var/log/threatcrush/threatcrushd.log',\n state_db: '/var/lib/threatcrush/state.db',\n },\n api: {\n enabled: true,\n bind: '127.0.0.1:9393',\n tls: false,\n },\n alerts: {},\n modules: {\n auto_update: true,\n update_interval: '24h',\n module_dir: '/etc/threatcrush/modules',\n config_dir: DEFAULT_CONFDIR,\n },\n};\n\nexport function loadConfig(configPath?: string): ThreatCrushConfig {\n const path = configPath || DEFAULT_CONFIG_PATH;\n if (!existsSync(path)) {\n return { ...DEFAULT_CONFIG };\n }\n\n try {\n const raw = readFileSync(path, 'utf-8');\n const parsed = TOML.parse(raw) as unknown as Partial<ThreatCrushConfig>;\n return {\n daemon: { ...DEFAULT_CONFIG.daemon, ...parsed.daemon },\n api: { ...DEFAULT_CONFIG.api, ...parsed.api },\n alerts: parsed.alerts || {},\n modules: { ...DEFAULT_CONFIG.modules, ...parsed.modules },\n license: parsed.license,\n };\n } catch {\n return { ...DEFAULT_CONFIG };\n }\n}\n\nexport function loadModuleConfigs(confDir?: string): Map<string, ModuleConfig> {\n const dir = confDir || DEFAULT_CONFDIR;\n const configs = new Map<string, ModuleConfig>();\n\n if (!existsSync(dir)) {\n return configs;\n }\n\n const files = readdirSync(dir).filter((f) => f.endsWith('.conf'));\n for (const file of files) {\n try {\n const raw = readFileSync(join(dir, file), 'utf-8');\n const parsed = TOML.parse(raw) as Record<string, unknown>;\n for (const [name, config] of Object.entries(parsed)) {\n configs.set(name, config as ModuleConfig);\n }\n } catch {\n // skip bad configs\n }\n }\n\n return configs;\n}\n\nexport function generateDefaultConfig(detectedServices: string[]): string {\n const config: Record<string, unknown> = {\n daemon: DEFAULT_CONFIG.daemon,\n api: DEFAULT_CONFIG.api,\n modules: DEFAULT_CONFIG.modules,\n };\n\n return TOML.stringify(config as any);\n}\n\nexport function generateModuleConfig(\n moduleName: string,\n defaults: Record<string, unknown> = {},\n): string {\n const config: Record<string, unknown> = {\n [moduleName]: {\n enabled: true,\n ...defaults,\n },\n };\n return TOML.stringify(config as any);\n}\n","/**\n * Opt-in error reporting for the CLI + daemon.\n *\n * Enabled only when `SENTRY_DSN` is set in the environment. Safe to call\n * from both short-lived CLI invocations and the long-running daemon.\n */\n\nlet ready = false;\n// Keep the import lazy so the CLI doesn't pay the Sentry bundle cost when\n// reporting is disabled.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet sentry: any = null;\n\nasync function loadSentry(): Promise<void> {\n if (sentry) return;\n try {\n sentry = await import('@sentry/node');\n } catch {\n sentry = null;\n }\n}\n\nexport async function initTelemetry(context: 'cli' | 'daemon'): Promise<void> {\n if (ready) return;\n const dsn = process.env.SENTRY_DSN;\n if (!dsn) return;\n\n await loadSentry();\n if (!sentry) return;\n\n sentry.init({\n dsn,\n environment: process.env.NODE_ENV || 'production',\n release: process.env.SENTRY_RELEASE,\n serverName: context,\n tracesSampleRate: 0,\n beforeSend(event: Record<string, unknown>) {\n const req = (event as { request?: { headers?: Record<string, string> } }).request;\n if (req?.headers) {\n delete req.headers.authorization;\n delete req.headers.cookie;\n }\n return event;\n },\n });\n\n ready = true;\n}\n\nexport function captureException(err: unknown): void {\n if (!ready || !sentry) return;\n sentry.captureException(err);\n}\n\nexport async function flushTelemetry(timeoutMs = 2000): Promise<void> {\n if (!ready || !sentry) return;\n try { await sentry.flush(timeoutMs); } catch { /* ignore */ }\n}\n","#!/usr/bin/env node\nimport { runDaemon } from './daemon/index.js';\n\nrunDaemon().catch((err) => {\n console.error('threatcrushd failed to start:', err);\n process.exit(1);\n});\n"],"mappings":"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","names":["exports","module","exports","module","exports","module","exports","module","exports","module","Date","exports","module","exports","module","exports","module","exports","module","index","blocksize","exports","module","exports","module","exports","module","tomlType","str","exports","import_node_fs","import_node_path","import_node_fs","import_node_fs","Database","import_node_fs","import_node_path","import_node_fs","bus","bus","TOML","bus","import_node_fs","import_node_path","import_node_os","import_node_fs","import_node_path","import_node_os","process","os","tty","styles","chalk","styles","import_node_os","os","bus","import_node_fs","import_node_path","import_toml","TOML"]}
1
+ {"version":3,"sources":["../../../node_modules/.pnpm/@iarna+toml@2.2.5/node_modules/@iarna/toml/lib/parser.js","../../../node_modules/.pnpm/@iarna+toml@2.2.5/node_modules/@iarna/toml/lib/create-datetime.js","../../../node_modules/.pnpm/@iarna+toml@2.2.5/node_modules/@iarna/toml/lib/format-num.js","../../../node_modules/.pnpm/@iarna+toml@2.2.5/node_modules/@iarna/toml/lib/create-datetime-float.js","../../../node_modules/.pnpm/@iarna+toml@2.2.5/node_modules/@iarna/toml/lib/create-date.js","../../../node_modules/.pnpm/@iarna+toml@2.2.5/node_modules/@iarna/toml/lib/create-time.js","../../../node_modules/.pnpm/@iarna+toml@2.2.5/node_modules/@iarna/toml/lib/toml-parser.js","../../../node_modules/.pnpm/@iarna+toml@2.2.5/node_modules/@iarna/toml/parse-pretty-error.js","../../../node_modules/.pnpm/@iarna+toml@2.2.5/node_modules/@iarna/toml/parse-string.js","../../../node_modules/.pnpm/@iarna+toml@2.2.5/node_modules/@iarna/toml/parse-async.js","../../../node_modules/.pnpm/@iarna+toml@2.2.5/node_modules/@iarna/toml/parse-stream.js","../../../node_modules/.pnpm/@iarna+toml@2.2.5/node_modules/@iarna/toml/parse.js","../../../node_modules/.pnpm/@iarna+toml@2.2.5/node_modules/@iarna/toml/stringify.js","../../../node_modules/.pnpm/@iarna+toml@2.2.5/node_modules/@iarna/toml/toml.js","../src/daemon/index.ts","../src/daemon/paths.ts","../src/daemon/pidfile.ts","../src/daemon/ipc-server.ts","../src/daemon/event-bus.ts","../src/core/state.ts","../src/daemon/module-host.ts","../src/daemon/watchers/log-watcher.ts","../src/core/log-parser.ts","../src/daemon/watchers/journal-watcher.ts","../src/modules/network-monitor/index.ts","../src/modules/dns-monitor/index.ts","../src/core/config.ts","../src/daemon/alerts/smtp.ts","../src/daemon/alerts/discord.ts","../src/daemon/alerts/pagerduty.ts","../src/daemon/alerts/index.ts","../src/core/cli-config.ts","../src/commands/scan.ts","../../../node_modules/.pnpm/chalk@5.6.2/node_modules/chalk/source/vendor/ansi-styles/index.js","../../../node_modules/.pnpm/chalk@5.6.2/node_modules/chalk/source/vendor/supports-color/index.js","../../../node_modules/.pnpm/chalk@5.6.2/node_modules/chalk/source/utilities.js","../../../node_modules/.pnpm/chalk@5.6.2/node_modules/chalk/source/index.js","../src/core/logger.ts","../src/core/run-result.ts","../src/commands/pentest.ts","../src/daemon/workers/runs-worker.ts","../src/daemon/rules/engine.ts","../src/daemon/rules/loader.ts","../src/daemon/rules/default-rules.ts","../src/daemon/firewall/adapters.ts","../src/daemon/firewall/remediation.ts","../src/core/telemetry.ts","../src/daemon-entry.ts"],"sourcesContent":["'use strict'\nconst ParserEND = 0x110000\nclass ParserError extends Error {\n /* istanbul ignore next */\n constructor (msg, filename, linenumber) {\n super('[ParserError] ' + msg, filename, linenumber)\n this.name = 'ParserError'\n this.code = 'ParserError'\n if (Error.captureStackTrace) Error.captureStackTrace(this, ParserError)\n }\n}\nclass State {\n constructor (parser) {\n this.parser = parser\n this.buf = ''\n this.returned = null\n this.result = null\n this.resultTable = null\n this.resultArr = null\n }\n}\nclass Parser {\n constructor () {\n this.pos = 0\n this.col = 0\n this.line = 0\n this.obj = {}\n this.ctx = this.obj\n this.stack = []\n this._buf = ''\n this.char = null\n this.ii = 0\n this.state = new State(this.parseStart)\n }\n\n parse (str) {\n /* istanbul ignore next */\n if (str.length === 0 || str.length == null) return\n\n this._buf = String(str)\n this.ii = -1\n this.char = -1\n let getNext\n while (getNext === false || this.nextChar()) {\n getNext = this.runOne()\n }\n this._buf = null\n }\n nextChar () {\n if (this.char === 0x0A) {\n ++this.line\n this.col = -1\n }\n ++this.ii\n this.char = this._buf.codePointAt(this.ii)\n ++this.pos\n ++this.col\n return this.haveBuffer()\n }\n haveBuffer () {\n return this.ii < this._buf.length\n }\n runOne () {\n return this.state.parser.call(this, this.state.returned)\n }\n finish () {\n this.char = ParserEND\n let last\n do {\n last = this.state.parser\n this.runOne()\n } while (this.state.parser !== last)\n\n this.ctx = null\n this.state = null\n this._buf = null\n\n return this.obj\n }\n next (fn) {\n /* istanbul ignore next */\n if (typeof fn !== 'function') throw new ParserError('Tried to set state to non-existent state: ' + JSON.stringify(fn))\n this.state.parser = fn\n }\n goto (fn) {\n this.next(fn)\n return this.runOne()\n }\n call (fn, returnWith) {\n if (returnWith) this.next(returnWith)\n this.stack.push(this.state)\n this.state = new State(fn)\n }\n callNow (fn, returnWith) {\n this.call(fn, returnWith)\n return this.runOne()\n }\n return (value) {\n /* istanbul ignore next */\n if (this.stack.length === 0) throw this.error(new ParserError('Stack underflow'))\n if (value === undefined) value = this.state.buf\n this.state = this.stack.pop()\n this.state.returned = value\n }\n returnNow (value) {\n this.return(value)\n return this.runOne()\n }\n consume () {\n /* istanbul ignore next */\n if (this.char === ParserEND) throw this.error(new ParserError('Unexpected end-of-buffer'))\n this.state.buf += this._buf[this.ii]\n }\n error (err) {\n err.line = this.line\n err.col = this.col\n err.pos = this.pos\n return err\n }\n /* istanbul ignore next */\n parseStart () {\n throw new ParserError('Must declare a parseStart method')\n }\n}\nParser.END = ParserEND\nParser.Error = ParserError\nmodule.exports = Parser\n","'use strict'\nmodule.exports = value => {\n const date = new Date(value)\n /* istanbul ignore if */\n if (isNaN(date)) {\n throw new TypeError('Invalid Datetime')\n } else {\n return date\n }\n}\n","'use strict'\nmodule.exports = (d, num) => {\n num = String(num)\n while (num.length < d) num = '0' + num\n return num\n}\n","'use strict'\nconst f = require('./format-num.js')\n\nclass FloatingDateTime extends Date {\n constructor (value) {\n super(value + 'Z')\n this.isFloating = true\n }\n toISOString () {\n const date = `${this.getUTCFullYear()}-${f(2, this.getUTCMonth() + 1)}-${f(2, this.getUTCDate())}`\n const time = `${f(2, this.getUTCHours())}:${f(2, this.getUTCMinutes())}:${f(2, this.getUTCSeconds())}.${f(3, this.getUTCMilliseconds())}`\n return `${date}T${time}`\n }\n}\n\nmodule.exports = value => {\n const date = new FloatingDateTime(value)\n /* istanbul ignore if */\n if (isNaN(date)) {\n throw new TypeError('Invalid Datetime')\n } else {\n return date\n }\n}\n","'use strict'\nconst f = require('./format-num.js')\nconst DateTime = global.Date\n\nclass Date extends DateTime {\n constructor (value) {\n super(value)\n this.isDate = true\n }\n toISOString () {\n return `${this.getUTCFullYear()}-${f(2, this.getUTCMonth() + 1)}-${f(2, this.getUTCDate())}`\n }\n}\n\nmodule.exports = value => {\n const date = new Date(value)\n /* istanbul ignore if */\n if (isNaN(date)) {\n throw new TypeError('Invalid Datetime')\n } else {\n return date\n }\n}\n","'use strict'\nconst f = require('./format-num.js')\n\nclass Time extends Date {\n constructor (value) {\n super(`0000-01-01T${value}Z`)\n this.isTime = true\n }\n toISOString () {\n return `${f(2, this.getUTCHours())}:${f(2, this.getUTCMinutes())}:${f(2, this.getUTCSeconds())}.${f(3, this.getUTCMilliseconds())}`\n }\n}\n\nmodule.exports = value => {\n const date = new Time(value)\n /* istanbul ignore if */\n if (isNaN(date)) {\n throw new TypeError('Invalid Datetime')\n } else {\n return date\n }\n}\n","'use strict'\n/* eslint-disable no-new-wrappers, no-eval, camelcase, operator-linebreak */\nmodule.exports = makeParserClass(require('./parser.js'))\nmodule.exports.makeParserClass = makeParserClass\n\nclass TomlError extends Error {\n constructor (msg) {\n super(msg)\n this.name = 'TomlError'\n /* istanbul ignore next */\n if (Error.captureStackTrace) Error.captureStackTrace(this, TomlError)\n this.fromTOML = true\n this.wrapped = null\n }\n}\nTomlError.wrap = err => {\n const terr = new TomlError(err.message)\n terr.code = err.code\n terr.wrapped = err\n return terr\n}\nmodule.exports.TomlError = TomlError\n\nconst createDateTime = require('./create-datetime.js')\nconst createDateTimeFloat = require('./create-datetime-float.js')\nconst createDate = require('./create-date.js')\nconst createTime = require('./create-time.js')\n\nconst CTRL_I = 0x09\nconst CTRL_J = 0x0A\nconst CTRL_M = 0x0D\nconst CTRL_CHAR_BOUNDARY = 0x1F // the last non-character in the latin1 region of unicode, except DEL\nconst CHAR_SP = 0x20\nconst CHAR_QUOT = 0x22\nconst CHAR_NUM = 0x23\nconst CHAR_APOS = 0x27\nconst CHAR_PLUS = 0x2B\nconst CHAR_COMMA = 0x2C\nconst CHAR_HYPHEN = 0x2D\nconst CHAR_PERIOD = 0x2E\nconst CHAR_0 = 0x30\nconst CHAR_1 = 0x31\nconst CHAR_7 = 0x37\nconst CHAR_9 = 0x39\nconst CHAR_COLON = 0x3A\nconst CHAR_EQUALS = 0x3D\nconst CHAR_A = 0x41\nconst CHAR_E = 0x45\nconst CHAR_F = 0x46\nconst CHAR_T = 0x54\nconst CHAR_U = 0x55\nconst CHAR_Z = 0x5A\nconst CHAR_LOWBAR = 0x5F\nconst CHAR_a = 0x61\nconst CHAR_b = 0x62\nconst CHAR_e = 0x65\nconst CHAR_f = 0x66\nconst CHAR_i = 0x69\nconst CHAR_l = 0x6C\nconst CHAR_n = 0x6E\nconst CHAR_o = 0x6F\nconst CHAR_r = 0x72\nconst CHAR_s = 0x73\nconst CHAR_t = 0x74\nconst CHAR_u = 0x75\nconst CHAR_x = 0x78\nconst CHAR_z = 0x7A\nconst CHAR_LCUB = 0x7B\nconst CHAR_RCUB = 0x7D\nconst CHAR_LSQB = 0x5B\nconst CHAR_BSOL = 0x5C\nconst CHAR_RSQB = 0x5D\nconst CHAR_DEL = 0x7F\nconst SURROGATE_FIRST = 0xD800\nconst SURROGATE_LAST = 0xDFFF\n\nconst escapes = {\n [CHAR_b]: '\\u0008',\n [CHAR_t]: '\\u0009',\n [CHAR_n]: '\\u000A',\n [CHAR_f]: '\\u000C',\n [CHAR_r]: '\\u000D',\n [CHAR_QUOT]: '\\u0022',\n [CHAR_BSOL]: '\\u005C'\n}\n\nfunction isDigit (cp) {\n return cp >= CHAR_0 && cp <= CHAR_9\n}\nfunction isHexit (cp) {\n return (cp >= CHAR_A && cp <= CHAR_F) || (cp >= CHAR_a && cp <= CHAR_f) || (cp >= CHAR_0 && cp <= CHAR_9)\n}\nfunction isBit (cp) {\n return cp === CHAR_1 || cp === CHAR_0\n}\nfunction isOctit (cp) {\n return (cp >= CHAR_0 && cp <= CHAR_7)\n}\nfunction isAlphaNumQuoteHyphen (cp) {\n return (cp >= CHAR_A && cp <= CHAR_Z)\n || (cp >= CHAR_a && cp <= CHAR_z)\n || (cp >= CHAR_0 && cp <= CHAR_9)\n || cp === CHAR_APOS\n || cp === CHAR_QUOT\n || cp === CHAR_LOWBAR\n || cp === CHAR_HYPHEN\n}\nfunction isAlphaNumHyphen (cp) {\n return (cp >= CHAR_A && cp <= CHAR_Z)\n || (cp >= CHAR_a && cp <= CHAR_z)\n || (cp >= CHAR_0 && cp <= CHAR_9)\n || cp === CHAR_LOWBAR\n || cp === CHAR_HYPHEN\n}\nconst _type = Symbol('type')\nconst _declared = Symbol('declared')\n\nconst hasOwnProperty = Object.prototype.hasOwnProperty\nconst defineProperty = Object.defineProperty\nconst descriptor = {configurable: true, enumerable: true, writable: true, value: undefined}\n\nfunction hasKey (obj, key) {\n if (hasOwnProperty.call(obj, key)) return true\n if (key === '__proto__') defineProperty(obj, '__proto__', descriptor)\n return false\n}\n\nconst INLINE_TABLE = Symbol('inline-table')\nfunction InlineTable () {\n return Object.defineProperties({}, {\n [_type]: {value: INLINE_TABLE}\n })\n}\nfunction isInlineTable (obj) {\n if (obj === null || typeof (obj) !== 'object') return false\n return obj[_type] === INLINE_TABLE\n}\n\nconst TABLE = Symbol('table')\nfunction Table () {\n return Object.defineProperties({}, {\n [_type]: {value: TABLE},\n [_declared]: {value: false, writable: true}\n })\n}\nfunction isTable (obj) {\n if (obj === null || typeof (obj) !== 'object') return false\n return obj[_type] === TABLE\n}\n\nconst _contentType = Symbol('content-type')\nconst INLINE_LIST = Symbol('inline-list')\nfunction InlineList (type) {\n return Object.defineProperties([], {\n [_type]: {value: INLINE_LIST},\n [_contentType]: {value: type}\n })\n}\nfunction isInlineList (obj) {\n if (obj === null || typeof (obj) !== 'object') return false\n return obj[_type] === INLINE_LIST\n}\n\nconst LIST = Symbol('list')\nfunction List () {\n return Object.defineProperties([], {\n [_type]: {value: LIST}\n })\n}\nfunction isList (obj) {\n if (obj === null || typeof (obj) !== 'object') return false\n return obj[_type] === LIST\n}\n\n// in an eval, to let bundlers not slurp in a util proxy\nlet _custom\ntry {\n const utilInspect = eval(\"require('util').inspect\")\n _custom = utilInspect.custom\n} catch (_) {\n /* eval require not available in transpiled bundle */\n}\n/* istanbul ignore next */\nconst _inspect = _custom || 'inspect'\n\nclass BoxedBigInt {\n constructor (value) {\n try {\n this.value = global.BigInt.asIntN(64, value)\n } catch (_) {\n /* istanbul ignore next */\n this.value = null\n }\n Object.defineProperty(this, _type, {value: INTEGER})\n }\n isNaN () {\n return this.value === null\n }\n /* istanbul ignore next */\n toString () {\n return String(this.value)\n }\n /* istanbul ignore next */\n [_inspect] () {\n return `[BigInt: ${this.toString()}]}`\n }\n valueOf () {\n return this.value\n }\n}\n\nconst INTEGER = Symbol('integer')\nfunction Integer (value) {\n let num = Number(value)\n // -0 is a float thing, not an int thing\n if (Object.is(num, -0)) num = 0\n /* istanbul ignore else */\n if (global.BigInt && !Number.isSafeInteger(num)) {\n return new BoxedBigInt(value)\n } else {\n /* istanbul ignore next */\n return Object.defineProperties(new Number(num), {\n isNaN: {value: function () { return isNaN(this) }},\n [_type]: {value: INTEGER},\n [_inspect]: {value: () => `[Integer: ${value}]`}\n })\n }\n}\nfunction isInteger (obj) {\n if (obj === null || typeof (obj) !== 'object') return false\n return obj[_type] === INTEGER\n}\n\nconst FLOAT = Symbol('float')\nfunction Float (value) {\n /* istanbul ignore next */\n return Object.defineProperties(new Number(value), {\n [_type]: {value: FLOAT},\n [_inspect]: {value: () => `[Float: ${value}]`}\n })\n}\nfunction isFloat (obj) {\n if (obj === null || typeof (obj) !== 'object') return false\n return obj[_type] === FLOAT\n}\n\nfunction tomlType (value) {\n const type = typeof value\n if (type === 'object') {\n /* istanbul ignore if */\n if (value === null) return 'null'\n if (value instanceof Date) return 'datetime'\n /* istanbul ignore else */\n if (_type in value) {\n switch (value[_type]) {\n case INLINE_TABLE: return 'inline-table'\n case INLINE_LIST: return 'inline-list'\n /* istanbul ignore next */\n case TABLE: return 'table'\n /* istanbul ignore next */\n case LIST: return 'list'\n case FLOAT: return 'float'\n case INTEGER: return 'integer'\n }\n }\n }\n return type\n}\n\nfunction makeParserClass (Parser) {\n class TOMLParser extends Parser {\n constructor () {\n super()\n this.ctx = this.obj = Table()\n }\n\n /* MATCH HELPER */\n atEndOfWord () {\n return this.char === CHAR_NUM || this.char === CTRL_I || this.char === CHAR_SP || this.atEndOfLine()\n }\n atEndOfLine () {\n return this.char === Parser.END || this.char === CTRL_J || this.char === CTRL_M\n }\n\n parseStart () {\n if (this.char === Parser.END) {\n return null\n } else if (this.char === CHAR_LSQB) {\n return this.call(this.parseTableOrList)\n } else if (this.char === CHAR_NUM) {\n return this.call(this.parseComment)\n } else if (this.char === CTRL_J || this.char === CHAR_SP || this.char === CTRL_I || this.char === CTRL_M) {\n return null\n } else if (isAlphaNumQuoteHyphen(this.char)) {\n return this.callNow(this.parseAssignStatement)\n } else {\n throw this.error(new TomlError(`Unknown character \"${this.char}\"`))\n }\n }\n\n // HELPER, this strips any whitespace and comments to the end of the line\n // then RETURNS. Last state in a production.\n parseWhitespaceToEOL () {\n if (this.char === CHAR_SP || this.char === CTRL_I || this.char === CTRL_M) {\n return null\n } else if (this.char === CHAR_NUM) {\n return this.goto(this.parseComment)\n } else if (this.char === Parser.END || this.char === CTRL_J) {\n return this.return()\n } else {\n throw this.error(new TomlError('Unexpected character, expected only whitespace or comments till end of line'))\n }\n }\n\n /* ASSIGNMENT: key = value */\n parseAssignStatement () {\n return this.callNow(this.parseAssign, this.recordAssignStatement)\n }\n recordAssignStatement (kv) {\n let target = this.ctx\n let finalKey = kv.key.pop()\n for (let kw of kv.key) {\n if (hasKey(target, kw) && (!isTable(target[kw]) || target[kw][_declared])) {\n throw this.error(new TomlError(\"Can't redefine existing key\"))\n }\n target = target[kw] = target[kw] || Table()\n }\n if (hasKey(target, finalKey)) {\n throw this.error(new TomlError(\"Can't redefine existing key\"))\n }\n // unbox our numbers\n if (isInteger(kv.value) || isFloat(kv.value)) {\n target[finalKey] = kv.value.valueOf()\n } else {\n target[finalKey] = kv.value\n }\n return this.goto(this.parseWhitespaceToEOL)\n }\n\n /* ASSSIGNMENT expression, key = value possibly inside an inline table */\n parseAssign () {\n return this.callNow(this.parseKeyword, this.recordAssignKeyword)\n }\n recordAssignKeyword (key) {\n if (this.state.resultTable) {\n this.state.resultTable.push(key)\n } else {\n this.state.resultTable = [key]\n }\n return this.goto(this.parseAssignKeywordPreDot)\n }\n parseAssignKeywordPreDot () {\n if (this.char === CHAR_PERIOD) {\n return this.next(this.parseAssignKeywordPostDot)\n } else if (this.char !== CHAR_SP && this.char !== CTRL_I) {\n return this.goto(this.parseAssignEqual)\n }\n }\n parseAssignKeywordPostDot () {\n if (this.char !== CHAR_SP && this.char !== CTRL_I) {\n return this.callNow(this.parseKeyword, this.recordAssignKeyword)\n }\n }\n\n parseAssignEqual () {\n if (this.char === CHAR_EQUALS) {\n return this.next(this.parseAssignPreValue)\n } else {\n throw this.error(new TomlError('Invalid character, expected \"=\"'))\n }\n }\n parseAssignPreValue () {\n if (this.char === CHAR_SP || this.char === CTRL_I) {\n return null\n } else {\n return this.callNow(this.parseValue, this.recordAssignValue)\n }\n }\n recordAssignValue (value) {\n return this.returnNow({key: this.state.resultTable, value: value})\n }\n\n /* COMMENTS: #...eol */\n parseComment () {\n do {\n if (this.char === Parser.END || this.char === CTRL_J) {\n return this.return()\n }\n } while (this.nextChar())\n }\n\n /* TABLES AND LISTS, [foo] and [[foo]] */\n parseTableOrList () {\n if (this.char === CHAR_LSQB) {\n this.next(this.parseList)\n } else {\n return this.goto(this.parseTable)\n }\n }\n\n /* TABLE [foo.bar.baz] */\n parseTable () {\n this.ctx = this.obj\n return this.goto(this.parseTableNext)\n }\n parseTableNext () {\n if (this.char === CHAR_SP || this.char === CTRL_I) {\n return null\n } else {\n return this.callNow(this.parseKeyword, this.parseTableMore)\n }\n }\n parseTableMore (keyword) {\n if (this.char === CHAR_SP || this.char === CTRL_I) {\n return null\n } else if (this.char === CHAR_RSQB) {\n if (hasKey(this.ctx, keyword) && (!isTable(this.ctx[keyword]) || this.ctx[keyword][_declared])) {\n throw this.error(new TomlError(\"Can't redefine existing key\"))\n } else {\n this.ctx = this.ctx[keyword] = this.ctx[keyword] || Table()\n this.ctx[_declared] = true\n }\n return this.next(this.parseWhitespaceToEOL)\n } else if (this.char === CHAR_PERIOD) {\n if (!hasKey(this.ctx, keyword)) {\n this.ctx = this.ctx[keyword] = Table()\n } else if (isTable(this.ctx[keyword])) {\n this.ctx = this.ctx[keyword]\n } else if (isList(this.ctx[keyword])) {\n this.ctx = this.ctx[keyword][this.ctx[keyword].length - 1]\n } else {\n throw this.error(new TomlError(\"Can't redefine existing key\"))\n }\n return this.next(this.parseTableNext)\n } else {\n throw this.error(new TomlError('Unexpected character, expected whitespace, . or ]'))\n }\n }\n\n /* LIST [[a.b.c]] */\n parseList () {\n this.ctx = this.obj\n return this.goto(this.parseListNext)\n }\n parseListNext () {\n if (this.char === CHAR_SP || this.char === CTRL_I) {\n return null\n } else {\n return this.callNow(this.parseKeyword, this.parseListMore)\n }\n }\n parseListMore (keyword) {\n if (this.char === CHAR_SP || this.char === CTRL_I) {\n return null\n } else if (this.char === CHAR_RSQB) {\n if (!hasKey(this.ctx, keyword)) {\n this.ctx[keyword] = List()\n }\n if (isInlineList(this.ctx[keyword])) {\n throw this.error(new TomlError(\"Can't extend an inline array\"))\n } else if (isList(this.ctx[keyword])) {\n const next = Table()\n this.ctx[keyword].push(next)\n this.ctx = next\n } else {\n throw this.error(new TomlError(\"Can't redefine an existing key\"))\n }\n return this.next(this.parseListEnd)\n } else if (this.char === CHAR_PERIOD) {\n if (!hasKey(this.ctx, keyword)) {\n this.ctx = this.ctx[keyword] = Table()\n } else if (isInlineList(this.ctx[keyword])) {\n throw this.error(new TomlError(\"Can't extend an inline array\"))\n } else if (isInlineTable(this.ctx[keyword])) {\n throw this.error(new TomlError(\"Can't extend an inline table\"))\n } else if (isList(this.ctx[keyword])) {\n this.ctx = this.ctx[keyword][this.ctx[keyword].length - 1]\n } else if (isTable(this.ctx[keyword])) {\n this.ctx = this.ctx[keyword]\n } else {\n throw this.error(new TomlError(\"Can't redefine an existing key\"))\n }\n return this.next(this.parseListNext)\n } else {\n throw this.error(new TomlError('Unexpected character, expected whitespace, . or ]'))\n }\n }\n parseListEnd (keyword) {\n if (this.char === CHAR_RSQB) {\n return this.next(this.parseWhitespaceToEOL)\n } else {\n throw this.error(new TomlError('Unexpected character, expected whitespace, . or ]'))\n }\n }\n\n /* VALUE string, number, boolean, inline list, inline object */\n parseValue () {\n if (this.char === Parser.END) {\n throw this.error(new TomlError('Key without value'))\n } else if (this.char === CHAR_QUOT) {\n return this.next(this.parseDoubleString)\n } if (this.char === CHAR_APOS) {\n return this.next(this.parseSingleString)\n } else if (this.char === CHAR_HYPHEN || this.char === CHAR_PLUS) {\n return this.goto(this.parseNumberSign)\n } else if (this.char === CHAR_i) {\n return this.next(this.parseInf)\n } else if (this.char === CHAR_n) {\n return this.next(this.parseNan)\n } else if (isDigit(this.char)) {\n return this.goto(this.parseNumberOrDateTime)\n } else if (this.char === CHAR_t || this.char === CHAR_f) {\n return this.goto(this.parseBoolean)\n } else if (this.char === CHAR_LSQB) {\n return this.call(this.parseInlineList, this.recordValue)\n } else if (this.char === CHAR_LCUB) {\n return this.call(this.parseInlineTable, this.recordValue)\n } else {\n throw this.error(new TomlError('Unexpected character, expecting string, number, datetime, boolean, inline array or inline table'))\n }\n }\n recordValue (value) {\n return this.returnNow(value)\n }\n\n parseInf () {\n if (this.char === CHAR_n) {\n return this.next(this.parseInf2)\n } else {\n throw this.error(new TomlError('Unexpected character, expected \"inf\", \"+inf\" or \"-inf\"'))\n }\n }\n parseInf2 () {\n if (this.char === CHAR_f) {\n if (this.state.buf === '-') {\n return this.return(-Infinity)\n } else {\n return this.return(Infinity)\n }\n } else {\n throw this.error(new TomlError('Unexpected character, expected \"inf\", \"+inf\" or \"-inf\"'))\n }\n }\n\n parseNan () {\n if (this.char === CHAR_a) {\n return this.next(this.parseNan2)\n } else {\n throw this.error(new TomlError('Unexpected character, expected \"nan\"'))\n }\n }\n parseNan2 () {\n if (this.char === CHAR_n) {\n return this.return(NaN)\n } else {\n throw this.error(new TomlError('Unexpected character, expected \"nan\"'))\n }\n }\n\n /* KEYS, barewords or basic, literal, or dotted */\n parseKeyword () {\n if (this.char === CHAR_QUOT) {\n return this.next(this.parseBasicString)\n } else if (this.char === CHAR_APOS) {\n return this.next(this.parseLiteralString)\n } else {\n return this.goto(this.parseBareKey)\n }\n }\n\n /* KEYS: barewords */\n parseBareKey () {\n do {\n if (this.char === Parser.END) {\n throw this.error(new TomlError('Key ended without value'))\n } else if (isAlphaNumHyphen(this.char)) {\n this.consume()\n } else if (this.state.buf.length === 0) {\n throw this.error(new TomlError('Empty bare keys are not allowed'))\n } else {\n return this.returnNow()\n }\n } while (this.nextChar())\n }\n\n /* STRINGS, single quoted (literal) */\n parseSingleString () {\n if (this.char === CHAR_APOS) {\n return this.next(this.parseLiteralMultiStringMaybe)\n } else {\n return this.goto(this.parseLiteralString)\n }\n }\n parseLiteralString () {\n do {\n if (this.char === CHAR_APOS) {\n return this.return()\n } else if (this.atEndOfLine()) {\n throw this.error(new TomlError('Unterminated string'))\n } else if (this.char === CHAR_DEL || (this.char <= CTRL_CHAR_BOUNDARY && this.char !== CTRL_I)) {\n throw this.errorControlCharInString()\n } else {\n this.consume()\n }\n } while (this.nextChar())\n }\n parseLiteralMultiStringMaybe () {\n if (this.char === CHAR_APOS) {\n return this.next(this.parseLiteralMultiString)\n } else {\n return this.returnNow()\n }\n }\n parseLiteralMultiString () {\n if (this.char === CTRL_M) {\n return null\n } else if (this.char === CTRL_J) {\n return this.next(this.parseLiteralMultiStringContent)\n } else {\n return this.goto(this.parseLiteralMultiStringContent)\n }\n }\n parseLiteralMultiStringContent () {\n do {\n if (this.char === CHAR_APOS) {\n return this.next(this.parseLiteralMultiEnd)\n } else if (this.char === Parser.END) {\n throw this.error(new TomlError('Unterminated multi-line string'))\n } else if (this.char === CHAR_DEL || (this.char <= CTRL_CHAR_BOUNDARY && this.char !== CTRL_I && this.char !== CTRL_J && this.char !== CTRL_M)) {\n throw this.errorControlCharInString()\n } else {\n this.consume()\n }\n } while (this.nextChar())\n }\n parseLiteralMultiEnd () {\n if (this.char === CHAR_APOS) {\n return this.next(this.parseLiteralMultiEnd2)\n } else {\n this.state.buf += \"'\"\n return this.goto(this.parseLiteralMultiStringContent)\n }\n }\n parseLiteralMultiEnd2 () {\n if (this.char === CHAR_APOS) {\n return this.return()\n } else {\n this.state.buf += \"''\"\n return this.goto(this.parseLiteralMultiStringContent)\n }\n }\n\n /* STRINGS double quoted */\n parseDoubleString () {\n if (this.char === CHAR_QUOT) {\n return this.next(this.parseMultiStringMaybe)\n } else {\n return this.goto(this.parseBasicString)\n }\n }\n parseBasicString () {\n do {\n if (this.char === CHAR_BSOL) {\n return this.call(this.parseEscape, this.recordEscapeReplacement)\n } else if (this.char === CHAR_QUOT) {\n return this.return()\n } else if (this.atEndOfLine()) {\n throw this.error(new TomlError('Unterminated string'))\n } else if (this.char === CHAR_DEL || (this.char <= CTRL_CHAR_BOUNDARY && this.char !== CTRL_I)) {\n throw this.errorControlCharInString()\n } else {\n this.consume()\n }\n } while (this.nextChar())\n }\n recordEscapeReplacement (replacement) {\n this.state.buf += replacement\n return this.goto(this.parseBasicString)\n }\n parseMultiStringMaybe () {\n if (this.char === CHAR_QUOT) {\n return this.next(this.parseMultiString)\n } else {\n return this.returnNow()\n }\n }\n parseMultiString () {\n if (this.char === CTRL_M) {\n return null\n } else if (this.char === CTRL_J) {\n return this.next(this.parseMultiStringContent)\n } else {\n return this.goto(this.parseMultiStringContent)\n }\n }\n parseMultiStringContent () {\n do {\n if (this.char === CHAR_BSOL) {\n return this.call(this.parseMultiEscape, this.recordMultiEscapeReplacement)\n } else if (this.char === CHAR_QUOT) {\n return this.next(this.parseMultiEnd)\n } else if (this.char === Parser.END) {\n throw this.error(new TomlError('Unterminated multi-line string'))\n } else if (this.char === CHAR_DEL || (this.char <= CTRL_CHAR_BOUNDARY && this.char !== CTRL_I && this.char !== CTRL_J && this.char !== CTRL_M)) {\n throw this.errorControlCharInString()\n } else {\n this.consume()\n }\n } while (this.nextChar())\n }\n errorControlCharInString () {\n let displayCode = '\\\\u00'\n if (this.char < 16) {\n displayCode += '0'\n }\n displayCode += this.char.toString(16)\n\n return this.error(new TomlError(`Control characters (codes < 0x1f and 0x7f) are not allowed in strings, use ${displayCode} instead`))\n }\n recordMultiEscapeReplacement (replacement) {\n this.state.buf += replacement\n return this.goto(this.parseMultiStringContent)\n }\n parseMultiEnd () {\n if (this.char === CHAR_QUOT) {\n return this.next(this.parseMultiEnd2)\n } else {\n this.state.buf += '\"'\n return this.goto(this.parseMultiStringContent)\n }\n }\n parseMultiEnd2 () {\n if (this.char === CHAR_QUOT) {\n return this.return()\n } else {\n this.state.buf += '\"\"'\n return this.goto(this.parseMultiStringContent)\n }\n }\n parseMultiEscape () {\n if (this.char === CTRL_M || this.char === CTRL_J) {\n return this.next(this.parseMultiTrim)\n } else if (this.char === CHAR_SP || this.char === CTRL_I) {\n return this.next(this.parsePreMultiTrim)\n } else {\n return this.goto(this.parseEscape)\n }\n }\n parsePreMultiTrim () {\n if (this.char === CHAR_SP || this.char === CTRL_I) {\n return null\n } else if (this.char === CTRL_M || this.char === CTRL_J) {\n return this.next(this.parseMultiTrim)\n } else {\n throw this.error(new TomlError(\"Can't escape whitespace\"))\n }\n }\n parseMultiTrim () {\n // explicitly whitespace here, END should follow the same path as chars\n if (this.char === CTRL_J || this.char === CHAR_SP || this.char === CTRL_I || this.char === CTRL_M) {\n return null\n } else {\n return this.returnNow()\n }\n }\n parseEscape () {\n if (this.char in escapes) {\n return this.return(escapes[this.char])\n } else if (this.char === CHAR_u) {\n return this.call(this.parseSmallUnicode, this.parseUnicodeReturn)\n } else if (this.char === CHAR_U) {\n return this.call(this.parseLargeUnicode, this.parseUnicodeReturn)\n } else {\n throw this.error(new TomlError('Unknown escape character: ' + this.char))\n }\n }\n parseUnicodeReturn (char) {\n try {\n const codePoint = parseInt(char, 16)\n if (codePoint >= SURROGATE_FIRST && codePoint <= SURROGATE_LAST) {\n throw this.error(new TomlError('Invalid unicode, character in range 0xD800 - 0xDFFF is reserved'))\n }\n return this.returnNow(String.fromCodePoint(codePoint))\n } catch (err) {\n throw this.error(TomlError.wrap(err))\n }\n }\n parseSmallUnicode () {\n if (!isHexit(this.char)) {\n throw this.error(new TomlError('Invalid character in unicode sequence, expected hex'))\n } else {\n this.consume()\n if (this.state.buf.length >= 4) return this.return()\n }\n }\n parseLargeUnicode () {\n if (!isHexit(this.char)) {\n throw this.error(new TomlError('Invalid character in unicode sequence, expected hex'))\n } else {\n this.consume()\n if (this.state.buf.length >= 8) return this.return()\n }\n }\n\n /* NUMBERS */\n parseNumberSign () {\n this.consume()\n return this.next(this.parseMaybeSignedInfOrNan)\n }\n parseMaybeSignedInfOrNan () {\n if (this.char === CHAR_i) {\n return this.next(this.parseInf)\n } else if (this.char === CHAR_n) {\n return this.next(this.parseNan)\n } else {\n return this.callNow(this.parseNoUnder, this.parseNumberIntegerStart)\n }\n }\n parseNumberIntegerStart () {\n if (this.char === CHAR_0) {\n this.consume()\n return this.next(this.parseNumberIntegerExponentOrDecimal)\n } else {\n return this.goto(this.parseNumberInteger)\n }\n }\n parseNumberIntegerExponentOrDecimal () {\n if (this.char === CHAR_PERIOD) {\n this.consume()\n return this.call(this.parseNoUnder, this.parseNumberFloat)\n } else if (this.char === CHAR_E || this.char === CHAR_e) {\n this.consume()\n return this.next(this.parseNumberExponentSign)\n } else {\n return this.returnNow(Integer(this.state.buf))\n }\n }\n parseNumberInteger () {\n if (isDigit(this.char)) {\n this.consume()\n } else if (this.char === CHAR_LOWBAR) {\n return this.call(this.parseNoUnder)\n } else if (this.char === CHAR_E || this.char === CHAR_e) {\n this.consume()\n return this.next(this.parseNumberExponentSign)\n } else if (this.char === CHAR_PERIOD) {\n this.consume()\n return this.call(this.parseNoUnder, this.parseNumberFloat)\n } else {\n const result = Integer(this.state.buf)\n /* istanbul ignore if */\n if (result.isNaN()) {\n throw this.error(new TomlError('Invalid number'))\n } else {\n return this.returnNow(result)\n }\n }\n }\n parseNoUnder () {\n if (this.char === CHAR_LOWBAR || this.char === CHAR_PERIOD || this.char === CHAR_E || this.char === CHAR_e) {\n throw this.error(new TomlError('Unexpected character, expected digit'))\n } else if (this.atEndOfWord()) {\n throw this.error(new TomlError('Incomplete number'))\n }\n return this.returnNow()\n }\n parseNoUnderHexOctBinLiteral () {\n if (this.char === CHAR_LOWBAR || this.char === CHAR_PERIOD) {\n throw this.error(new TomlError('Unexpected character, expected digit'))\n } else if (this.atEndOfWord()) {\n throw this.error(new TomlError('Incomplete number'))\n }\n return this.returnNow()\n }\n parseNumberFloat () {\n if (this.char === CHAR_LOWBAR) {\n return this.call(this.parseNoUnder, this.parseNumberFloat)\n } else if (isDigit(this.char)) {\n this.consume()\n } else if (this.char === CHAR_E || this.char === CHAR_e) {\n this.consume()\n return this.next(this.parseNumberExponentSign)\n } else {\n return this.returnNow(Float(this.state.buf))\n }\n }\n parseNumberExponentSign () {\n if (isDigit(this.char)) {\n return this.goto(this.parseNumberExponent)\n } else if (this.char === CHAR_HYPHEN || this.char === CHAR_PLUS) {\n this.consume()\n this.call(this.parseNoUnder, this.parseNumberExponent)\n } else {\n throw this.error(new TomlError('Unexpected character, expected -, + or digit'))\n }\n }\n parseNumberExponent () {\n if (isDigit(this.char)) {\n this.consume()\n } else if (this.char === CHAR_LOWBAR) {\n return this.call(this.parseNoUnder)\n } else {\n return this.returnNow(Float(this.state.buf))\n }\n }\n\n /* NUMBERS or DATETIMES */\n parseNumberOrDateTime () {\n if (this.char === CHAR_0) {\n this.consume()\n return this.next(this.parseNumberBaseOrDateTime)\n } else {\n return this.goto(this.parseNumberOrDateTimeOnly)\n }\n }\n parseNumberOrDateTimeOnly () {\n // note, if two zeros are in a row then it MUST be a date\n if (this.char === CHAR_LOWBAR) {\n return this.call(this.parseNoUnder, this.parseNumberInteger)\n } else if (isDigit(this.char)) {\n this.consume()\n if (this.state.buf.length > 4) this.next(this.parseNumberInteger)\n } else if (this.char === CHAR_E || this.char === CHAR_e) {\n this.consume()\n return this.next(this.parseNumberExponentSign)\n } else if (this.char === CHAR_PERIOD) {\n this.consume()\n return this.call(this.parseNoUnder, this.parseNumberFloat)\n } else if (this.char === CHAR_HYPHEN) {\n return this.goto(this.parseDateTime)\n } else if (this.char === CHAR_COLON) {\n return this.goto(this.parseOnlyTimeHour)\n } else {\n return this.returnNow(Integer(this.state.buf))\n }\n }\n parseDateTimeOnly () {\n if (this.state.buf.length < 4) {\n if (isDigit(this.char)) {\n return this.consume()\n } else if (this.char === CHAR_COLON) {\n return this.goto(this.parseOnlyTimeHour)\n } else {\n throw this.error(new TomlError('Expected digit while parsing year part of a date'))\n }\n } else {\n if (this.char === CHAR_HYPHEN) {\n return this.goto(this.parseDateTime)\n } else {\n throw this.error(new TomlError('Expected hyphen (-) while parsing year part of date'))\n }\n }\n }\n parseNumberBaseOrDateTime () {\n if (this.char === CHAR_b) {\n this.consume()\n return this.call(this.parseNoUnderHexOctBinLiteral, this.parseIntegerBin)\n } else if (this.char === CHAR_o) {\n this.consume()\n return this.call(this.parseNoUnderHexOctBinLiteral, this.parseIntegerOct)\n } else if (this.char === CHAR_x) {\n this.consume()\n return this.call(this.parseNoUnderHexOctBinLiteral, this.parseIntegerHex)\n } else if (this.char === CHAR_PERIOD) {\n return this.goto(this.parseNumberInteger)\n } else if (isDigit(this.char)) {\n return this.goto(this.parseDateTimeOnly)\n } else {\n return this.returnNow(Integer(this.state.buf))\n }\n }\n parseIntegerHex () {\n if (isHexit(this.char)) {\n this.consume()\n } else if (this.char === CHAR_LOWBAR) {\n return this.call(this.parseNoUnderHexOctBinLiteral)\n } else {\n const result = Integer(this.state.buf)\n /* istanbul ignore if */\n if (result.isNaN()) {\n throw this.error(new TomlError('Invalid number'))\n } else {\n return this.returnNow(result)\n }\n }\n }\n parseIntegerOct () {\n if (isOctit(this.char)) {\n this.consume()\n } else if (this.char === CHAR_LOWBAR) {\n return this.call(this.parseNoUnderHexOctBinLiteral)\n } else {\n const result = Integer(this.state.buf)\n /* istanbul ignore if */\n if (result.isNaN()) {\n throw this.error(new TomlError('Invalid number'))\n } else {\n return this.returnNow(result)\n }\n }\n }\n parseIntegerBin () {\n if (isBit(this.char)) {\n this.consume()\n } else if (this.char === CHAR_LOWBAR) {\n return this.call(this.parseNoUnderHexOctBinLiteral)\n } else {\n const result = Integer(this.state.buf)\n /* istanbul ignore if */\n if (result.isNaN()) {\n throw this.error(new TomlError('Invalid number'))\n } else {\n return this.returnNow(result)\n }\n }\n }\n\n /* DATETIME */\n parseDateTime () {\n // we enter here having just consumed the year and about to consume the hyphen\n if (this.state.buf.length < 4) {\n throw this.error(new TomlError('Years less than 1000 must be zero padded to four characters'))\n }\n this.state.result = this.state.buf\n this.state.buf = ''\n return this.next(this.parseDateMonth)\n }\n parseDateMonth () {\n if (this.char === CHAR_HYPHEN) {\n if (this.state.buf.length < 2) {\n throw this.error(new TomlError('Months less than 10 must be zero padded to two characters'))\n }\n this.state.result += '-' + this.state.buf\n this.state.buf = ''\n return this.next(this.parseDateDay)\n } else if (isDigit(this.char)) {\n this.consume()\n } else {\n throw this.error(new TomlError('Incomplete datetime'))\n }\n }\n parseDateDay () {\n if (this.char === CHAR_T || this.char === CHAR_SP) {\n if (this.state.buf.length < 2) {\n throw this.error(new TomlError('Days less than 10 must be zero padded to two characters'))\n }\n this.state.result += '-' + this.state.buf\n this.state.buf = ''\n return this.next(this.parseStartTimeHour)\n } else if (this.atEndOfWord()) {\n return this.returnNow(createDate(this.state.result + '-' + this.state.buf))\n } else if (isDigit(this.char)) {\n this.consume()\n } else {\n throw this.error(new TomlError('Incomplete datetime'))\n }\n }\n parseStartTimeHour () {\n if (this.atEndOfWord()) {\n return this.returnNow(createDate(this.state.result))\n } else {\n return this.goto(this.parseTimeHour)\n }\n }\n parseTimeHour () {\n if (this.char === CHAR_COLON) {\n if (this.state.buf.length < 2) {\n throw this.error(new TomlError('Hours less than 10 must be zero padded to two characters'))\n }\n this.state.result += 'T' + this.state.buf\n this.state.buf = ''\n return this.next(this.parseTimeMin)\n } else if (isDigit(this.char)) {\n this.consume()\n } else {\n throw this.error(new TomlError('Incomplete datetime'))\n }\n }\n parseTimeMin () {\n if (this.state.buf.length < 2 && isDigit(this.char)) {\n this.consume()\n } else if (this.state.buf.length === 2 && this.char === CHAR_COLON) {\n this.state.result += ':' + this.state.buf\n this.state.buf = ''\n return this.next(this.parseTimeSec)\n } else {\n throw this.error(new TomlError('Incomplete datetime'))\n }\n }\n parseTimeSec () {\n if (isDigit(this.char)) {\n this.consume()\n if (this.state.buf.length === 2) {\n this.state.result += ':' + this.state.buf\n this.state.buf = ''\n return this.next(this.parseTimeZoneOrFraction)\n }\n } else {\n throw this.error(new TomlError('Incomplete datetime'))\n }\n }\n\n parseOnlyTimeHour () {\n /* istanbul ignore else */\n if (this.char === CHAR_COLON) {\n if (this.state.buf.length < 2) {\n throw this.error(new TomlError('Hours less than 10 must be zero padded to two characters'))\n }\n this.state.result = this.state.buf\n this.state.buf = ''\n return this.next(this.parseOnlyTimeMin)\n } else {\n throw this.error(new TomlError('Incomplete time'))\n }\n }\n parseOnlyTimeMin () {\n if (this.state.buf.length < 2 && isDigit(this.char)) {\n this.consume()\n } else if (this.state.buf.length === 2 && this.char === CHAR_COLON) {\n this.state.result += ':' + this.state.buf\n this.state.buf = ''\n return this.next(this.parseOnlyTimeSec)\n } else {\n throw this.error(new TomlError('Incomplete time'))\n }\n }\n parseOnlyTimeSec () {\n if (isDigit(this.char)) {\n this.consume()\n if (this.state.buf.length === 2) {\n return this.next(this.parseOnlyTimeFractionMaybe)\n }\n } else {\n throw this.error(new TomlError('Incomplete time'))\n }\n }\n parseOnlyTimeFractionMaybe () {\n this.state.result += ':' + this.state.buf\n if (this.char === CHAR_PERIOD) {\n this.state.buf = ''\n this.next(this.parseOnlyTimeFraction)\n } else {\n return this.return(createTime(this.state.result))\n }\n }\n parseOnlyTimeFraction () {\n if (isDigit(this.char)) {\n this.consume()\n } else if (this.atEndOfWord()) {\n if (this.state.buf.length === 0) throw this.error(new TomlError('Expected digit in milliseconds'))\n return this.returnNow(createTime(this.state.result + '.' + this.state.buf))\n } else {\n throw this.error(new TomlError('Unexpected character in datetime, expected period (.), minus (-), plus (+) or Z'))\n }\n }\n\n parseTimeZoneOrFraction () {\n if (this.char === CHAR_PERIOD) {\n this.consume()\n this.next(this.parseDateTimeFraction)\n } else if (this.char === CHAR_HYPHEN || this.char === CHAR_PLUS) {\n this.consume()\n this.next(this.parseTimeZoneHour)\n } else if (this.char === CHAR_Z) {\n this.consume()\n return this.return(createDateTime(this.state.result + this.state.buf))\n } else if (this.atEndOfWord()) {\n return this.returnNow(createDateTimeFloat(this.state.result + this.state.buf))\n } else {\n throw this.error(new TomlError('Unexpected character in datetime, expected period (.), minus (-), plus (+) or Z'))\n }\n }\n parseDateTimeFraction () {\n if (isDigit(this.char)) {\n this.consume()\n } else if (this.state.buf.length === 1) {\n throw this.error(new TomlError('Expected digit in milliseconds'))\n } else if (this.char === CHAR_HYPHEN || this.char === CHAR_PLUS) {\n this.consume()\n this.next(this.parseTimeZoneHour)\n } else if (this.char === CHAR_Z) {\n this.consume()\n return this.return(createDateTime(this.state.result + this.state.buf))\n } else if (this.atEndOfWord()) {\n return this.returnNow(createDateTimeFloat(this.state.result + this.state.buf))\n } else {\n throw this.error(new TomlError('Unexpected character in datetime, expected period (.), minus (-), plus (+) or Z'))\n }\n }\n parseTimeZoneHour () {\n if (isDigit(this.char)) {\n this.consume()\n // FIXME: No more regexps\n if (/\\d\\d$/.test(this.state.buf)) return this.next(this.parseTimeZoneSep)\n } else {\n throw this.error(new TomlError('Unexpected character in datetime, expected digit'))\n }\n }\n parseTimeZoneSep () {\n if (this.char === CHAR_COLON) {\n this.consume()\n this.next(this.parseTimeZoneMin)\n } else {\n throw this.error(new TomlError('Unexpected character in datetime, expected colon'))\n }\n }\n parseTimeZoneMin () {\n if (isDigit(this.char)) {\n this.consume()\n if (/\\d\\d$/.test(this.state.buf)) return this.return(createDateTime(this.state.result + this.state.buf))\n } else {\n throw this.error(new TomlError('Unexpected character in datetime, expected digit'))\n }\n }\n\n /* BOOLEAN */\n parseBoolean () {\n /* istanbul ignore else */\n if (this.char === CHAR_t) {\n this.consume()\n return this.next(this.parseTrue_r)\n } else if (this.char === CHAR_f) {\n this.consume()\n return this.next(this.parseFalse_a)\n }\n }\n parseTrue_r () {\n if (this.char === CHAR_r) {\n this.consume()\n return this.next(this.parseTrue_u)\n } else {\n throw this.error(new TomlError('Invalid boolean, expected true or false'))\n }\n }\n parseTrue_u () {\n if (this.char === CHAR_u) {\n this.consume()\n return this.next(this.parseTrue_e)\n } else {\n throw this.error(new TomlError('Invalid boolean, expected true or false'))\n }\n }\n parseTrue_e () {\n if (this.char === CHAR_e) {\n return this.return(true)\n } else {\n throw this.error(new TomlError('Invalid boolean, expected true or false'))\n }\n }\n\n parseFalse_a () {\n if (this.char === CHAR_a) {\n this.consume()\n return this.next(this.parseFalse_l)\n } else {\n throw this.error(new TomlError('Invalid boolean, expected true or false'))\n }\n }\n\n parseFalse_l () {\n if (this.char === CHAR_l) {\n this.consume()\n return this.next(this.parseFalse_s)\n } else {\n throw this.error(new TomlError('Invalid boolean, expected true or false'))\n }\n }\n\n parseFalse_s () {\n if (this.char === CHAR_s) {\n this.consume()\n return this.next(this.parseFalse_e)\n } else {\n throw this.error(new TomlError('Invalid boolean, expected true or false'))\n }\n }\n\n parseFalse_e () {\n if (this.char === CHAR_e) {\n return this.return(false)\n } else {\n throw this.error(new TomlError('Invalid boolean, expected true or false'))\n }\n }\n\n /* INLINE LISTS */\n parseInlineList () {\n if (this.char === CHAR_SP || this.char === CTRL_I || this.char === CTRL_M || this.char === CTRL_J) {\n return null\n } else if (this.char === Parser.END) {\n throw this.error(new TomlError('Unterminated inline array'))\n } else if (this.char === CHAR_NUM) {\n return this.call(this.parseComment)\n } else if (this.char === CHAR_RSQB) {\n return this.return(this.state.resultArr || InlineList())\n } else {\n return this.callNow(this.parseValue, this.recordInlineListValue)\n }\n }\n recordInlineListValue (value) {\n if (this.state.resultArr) {\n const listType = this.state.resultArr[_contentType]\n const valueType = tomlType(value)\n if (listType !== valueType) {\n throw this.error(new TomlError(`Inline lists must be a single type, not a mix of ${listType} and ${valueType}`))\n }\n } else {\n this.state.resultArr = InlineList(tomlType(value))\n }\n if (isFloat(value) || isInteger(value)) {\n // unbox now that we've verified they're ok\n this.state.resultArr.push(value.valueOf())\n } else {\n this.state.resultArr.push(value)\n }\n return this.goto(this.parseInlineListNext)\n }\n parseInlineListNext () {\n if (this.char === CHAR_SP || this.char === CTRL_I || this.char === CTRL_M || this.char === CTRL_J) {\n return null\n } else if (this.char === CHAR_NUM) {\n return this.call(this.parseComment)\n } else if (this.char === CHAR_COMMA) {\n return this.next(this.parseInlineList)\n } else if (this.char === CHAR_RSQB) {\n return this.goto(this.parseInlineList)\n } else {\n throw this.error(new TomlError('Invalid character, expected whitespace, comma (,) or close bracket (])'))\n }\n }\n\n /* INLINE TABLE */\n parseInlineTable () {\n if (this.char === CHAR_SP || this.char === CTRL_I) {\n return null\n } else if (this.char === Parser.END || this.char === CHAR_NUM || this.char === CTRL_J || this.char === CTRL_M) {\n throw this.error(new TomlError('Unterminated inline array'))\n } else if (this.char === CHAR_RCUB) {\n return this.return(this.state.resultTable || InlineTable())\n } else {\n if (!this.state.resultTable) this.state.resultTable = InlineTable()\n return this.callNow(this.parseAssign, this.recordInlineTableValue)\n }\n }\n recordInlineTableValue (kv) {\n let target = this.state.resultTable\n let finalKey = kv.key.pop()\n for (let kw of kv.key) {\n if (hasKey(target, kw) && (!isTable(target[kw]) || target[kw][_declared])) {\n throw this.error(new TomlError(\"Can't redefine existing key\"))\n }\n target = target[kw] = target[kw] || Table()\n }\n if (hasKey(target, finalKey)) {\n throw this.error(new TomlError(\"Can't redefine existing key\"))\n }\n if (isInteger(kv.value) || isFloat(kv.value)) {\n target[finalKey] = kv.value.valueOf()\n } else {\n target[finalKey] = kv.value\n }\n return this.goto(this.parseInlineTableNext)\n }\n parseInlineTableNext () {\n if (this.char === CHAR_SP || this.char === CTRL_I) {\n return null\n } else if (this.char === Parser.END || this.char === CHAR_NUM || this.char === CTRL_J || this.char === CTRL_M) {\n throw this.error(new TomlError('Unterminated inline array'))\n } else if (this.char === CHAR_COMMA) {\n return this.next(this.parseInlineTable)\n } else if (this.char === CHAR_RCUB) {\n return this.goto(this.parseInlineTable)\n } else {\n throw this.error(new TomlError('Invalid character, expected whitespace, comma (,) or close bracket (])'))\n }\n }\n }\n return TOMLParser\n}\n","'use strict'\nmodule.exports = prettyError\n\nfunction prettyError (err, buf) {\n /* istanbul ignore if */\n if (err.pos == null || err.line == null) return err\n let msg = err.message\n msg += ` at row ${err.line + 1}, col ${err.col + 1}, pos ${err.pos}:\\n`\n\n /* istanbul ignore else */\n if (buf && buf.split) {\n const lines = buf.split(/\\n/)\n const lineNumWidth = String(Math.min(lines.length, err.line + 3)).length\n let linePadding = ' '\n while (linePadding.length < lineNumWidth) linePadding += ' '\n for (let ii = Math.max(0, err.line - 1); ii < Math.min(lines.length, err.line + 2); ++ii) {\n let lineNum = String(ii + 1)\n if (lineNum.length < lineNumWidth) lineNum = ' ' + lineNum\n if (err.line === ii) {\n msg += lineNum + '> ' + lines[ii] + '\\n'\n msg += linePadding + ' '\n for (let hh = 0; hh < err.col; ++hh) {\n msg += ' '\n }\n msg += '^\\n'\n } else {\n msg += lineNum + ': ' + lines[ii] + '\\n'\n }\n }\n }\n err.message = msg + '\\n'\n return err\n}\n","'use strict'\nmodule.exports = parseString\n\nconst TOMLParser = require('./lib/toml-parser.js')\nconst prettyError = require('./parse-pretty-error.js')\n\nfunction parseString (str) {\n if (global.Buffer && global.Buffer.isBuffer(str)) {\n str = str.toString('utf8')\n }\n const parser = new TOMLParser()\n try {\n parser.parse(str)\n return parser.finish()\n } catch (err) {\n throw prettyError(err, str)\n }\n}\n","'use strict'\nmodule.exports = parseAsync\n\nconst TOMLParser = require('./lib/toml-parser.js')\nconst prettyError = require('./parse-pretty-error.js')\n\nfunction parseAsync (str, opts) {\n if (!opts) opts = {}\n const index = 0\n const blocksize = opts.blocksize || 40960\n const parser = new TOMLParser()\n return new Promise((resolve, reject) => {\n setImmediate(parseAsyncNext, index, blocksize, resolve, reject)\n })\n function parseAsyncNext (index, blocksize, resolve, reject) {\n if (index >= str.length) {\n try {\n return resolve(parser.finish())\n } catch (err) {\n return reject(prettyError(err, str))\n }\n }\n try {\n parser.parse(str.slice(index, index + blocksize))\n setImmediate(parseAsyncNext, index + blocksize, blocksize, resolve, reject)\n } catch (err) {\n reject(prettyError(err, str))\n }\n }\n}\n","'use strict'\nmodule.exports = parseStream\n\nconst stream = require('stream')\nconst TOMLParser = require('./lib/toml-parser.js')\n\nfunction parseStream (stm) {\n if (stm) {\n return parseReadable(stm)\n } else {\n return parseTransform(stm)\n }\n}\n\nfunction parseReadable (stm) {\n const parser = new TOMLParser()\n stm.setEncoding('utf8')\n return new Promise((resolve, reject) => {\n let readable\n let ended = false\n let errored = false\n function finish () {\n ended = true\n if (readable) return\n try {\n resolve(parser.finish())\n } catch (err) {\n reject(err)\n }\n }\n function error (err) {\n errored = true\n reject(err)\n }\n stm.once('end', finish)\n stm.once('error', error)\n readNext()\n\n function readNext () {\n readable = true\n let data\n while ((data = stm.read()) !== null) {\n try {\n parser.parse(data)\n } catch (err) {\n return error(err)\n }\n }\n readable = false\n /* istanbul ignore if */\n if (ended) return finish()\n /* istanbul ignore if */\n if (errored) return\n stm.once('readable', readNext)\n }\n })\n}\n\nfunction parseTransform () {\n const parser = new TOMLParser()\n return new stream.Transform({\n objectMode: true,\n transform (chunk, encoding, cb) {\n try {\n parser.parse(chunk.toString(encoding))\n } catch (err) {\n this.emit('error', err)\n }\n cb()\n },\n flush (cb) {\n try {\n this.push(parser.finish())\n } catch (err) {\n this.emit('error', err)\n }\n cb()\n }\n })\n}\n","'use strict'\nmodule.exports = require('./parse-string.js')\nmodule.exports.async = require('./parse-async.js')\nmodule.exports.stream = require('./parse-stream.js')\nmodule.exports.prettyError = require('./parse-pretty-error.js')\n","'use strict'\nmodule.exports = stringify\nmodule.exports.value = stringifyInline\n\nfunction stringify (obj) {\n if (obj === null) throw typeError('null')\n if (obj === void (0)) throw typeError('undefined')\n if (typeof obj !== 'object') throw typeError(typeof obj)\n\n if (typeof obj.toJSON === 'function') obj = obj.toJSON()\n if (obj == null) return null\n const type = tomlType(obj)\n if (type !== 'table') throw typeError(type)\n return stringifyObject('', '', obj)\n}\n\nfunction typeError (type) {\n return new Error('Can only stringify objects, not ' + type)\n}\n\nfunction arrayOneTypeError () {\n return new Error(\"Array values can't have mixed types\")\n}\n\nfunction getInlineKeys (obj) {\n return Object.keys(obj).filter(key => isInline(obj[key]))\n}\nfunction getComplexKeys (obj) {\n return Object.keys(obj).filter(key => !isInline(obj[key]))\n}\n\nfunction toJSON (obj) {\n let nobj = Array.isArray(obj) ? [] : Object.prototype.hasOwnProperty.call(obj, '__proto__') ? {['__proto__']: undefined} : {}\n for (let prop of Object.keys(obj)) {\n if (obj[prop] && typeof obj[prop].toJSON === 'function' && !('toISOString' in obj[prop])) {\n nobj[prop] = obj[prop].toJSON()\n } else {\n nobj[prop] = obj[prop]\n }\n }\n return nobj\n}\n\nfunction stringifyObject (prefix, indent, obj) {\n obj = toJSON(obj)\n var inlineKeys\n var complexKeys\n inlineKeys = getInlineKeys(obj)\n complexKeys = getComplexKeys(obj)\n var result = []\n var inlineIndent = indent || ''\n inlineKeys.forEach(key => {\n var type = tomlType(obj[key])\n if (type !== 'undefined' && type !== 'null') {\n result.push(inlineIndent + stringifyKey(key) + ' = ' + stringifyAnyInline(obj[key], true))\n }\n })\n if (result.length > 0) result.push('')\n var complexIndent = prefix && inlineKeys.length > 0 ? indent + ' ' : ''\n complexKeys.forEach(key => {\n result.push(stringifyComplex(prefix, complexIndent, key, obj[key]))\n })\n return result.join('\\n')\n}\n\nfunction isInline (value) {\n switch (tomlType(value)) {\n case 'undefined':\n case 'null':\n case 'integer':\n case 'nan':\n case 'float':\n case 'boolean':\n case 'string':\n case 'datetime':\n return true\n case 'array':\n return value.length === 0 || tomlType(value[0]) !== 'table'\n case 'table':\n return Object.keys(value).length === 0\n /* istanbul ignore next */\n default:\n return false\n }\n}\n\nfunction tomlType (value) {\n if (value === undefined) {\n return 'undefined'\n } else if (value === null) {\n return 'null'\n /* eslint-disable valid-typeof */\n } else if (typeof value === 'bigint' || (Number.isInteger(value) && !Object.is(value, -0))) {\n return 'integer'\n } else if (typeof value === 'number') {\n return 'float'\n } else if (typeof value === 'boolean') {\n return 'boolean'\n } else if (typeof value === 'string') {\n return 'string'\n } else if ('toISOString' in value) {\n return isNaN(value) ? 'undefined' : 'datetime'\n } else if (Array.isArray(value)) {\n return 'array'\n } else {\n return 'table'\n }\n}\n\nfunction stringifyKey (key) {\n var keyStr = String(key)\n if (/^[-A-Za-z0-9_]+$/.test(keyStr)) {\n return keyStr\n } else {\n return stringifyBasicString(keyStr)\n }\n}\n\nfunction stringifyBasicString (str) {\n return '\"' + escapeString(str).replace(/\"/g, '\\\\\"') + '\"'\n}\n\nfunction stringifyLiteralString (str) {\n return \"'\" + str + \"'\"\n}\n\nfunction numpad (num, str) {\n while (str.length < num) str = '0' + str\n return str\n}\n\nfunction escapeString (str) {\n return str.replace(/\\\\/g, '\\\\\\\\')\n .replace(/[\\b]/g, '\\\\b')\n .replace(/\\t/g, '\\\\t')\n .replace(/\\n/g, '\\\\n')\n .replace(/\\f/g, '\\\\f')\n .replace(/\\r/g, '\\\\r')\n /* eslint-disable no-control-regex */\n .replace(/([\\u0000-\\u001f\\u007f])/, c => '\\\\u' + numpad(4, c.codePointAt(0).toString(16)))\n /* eslint-enable no-control-regex */\n}\n\nfunction stringifyMultilineString (str) {\n let escaped = str.split(/\\n/).map(str => {\n return escapeString(str).replace(/\"(?=\"\")/g, '\\\\\"')\n }).join('\\n')\n if (escaped.slice(-1) === '\"') escaped += '\\\\\\n'\n return '\"\"\"\\n' + escaped + '\"\"\"'\n}\n\nfunction stringifyAnyInline (value, multilineOk) {\n let type = tomlType(value)\n if (type === 'string') {\n if (multilineOk && /\\n/.test(value)) {\n type = 'string-multiline'\n } else if (!/[\\b\\t\\n\\f\\r']/.test(value) && /\"/.test(value)) {\n type = 'string-literal'\n }\n }\n return stringifyInline(value, type)\n}\n\nfunction stringifyInline (value, type) {\n /* istanbul ignore if */\n if (!type) type = tomlType(value)\n switch (type) {\n case 'string-multiline':\n return stringifyMultilineString(value)\n case 'string':\n return stringifyBasicString(value)\n case 'string-literal':\n return stringifyLiteralString(value)\n case 'integer':\n return stringifyInteger(value)\n case 'float':\n return stringifyFloat(value)\n case 'boolean':\n return stringifyBoolean(value)\n case 'datetime':\n return stringifyDatetime(value)\n case 'array':\n return stringifyInlineArray(value.filter(_ => tomlType(_) !== 'null' && tomlType(_) !== 'undefined' && tomlType(_) !== 'nan'))\n case 'table':\n return stringifyInlineTable(value)\n /* istanbul ignore next */\n default:\n throw typeError(type)\n }\n}\n\nfunction stringifyInteger (value) {\n /* eslint-disable security/detect-unsafe-regex */\n return String(value).replace(/\\B(?=(\\d{3})+(?!\\d))/g, '_')\n}\n\nfunction stringifyFloat (value) {\n if (value === Infinity) {\n return 'inf'\n } else if (value === -Infinity) {\n return '-inf'\n } else if (Object.is(value, NaN)) {\n return 'nan'\n } else if (Object.is(value, -0)) {\n return '-0.0'\n }\n var chunks = String(value).split('.')\n var int = chunks[0]\n var dec = chunks[1] || 0\n return stringifyInteger(int) + '.' + dec\n}\n\nfunction stringifyBoolean (value) {\n return String(value)\n}\n\nfunction stringifyDatetime (value) {\n return value.toISOString()\n}\n\nfunction isNumber (type) {\n return type === 'float' || type === 'integer'\n}\nfunction arrayType (values) {\n var contentType = tomlType(values[0])\n if (values.every(_ => tomlType(_) === contentType)) return contentType\n // mixed integer/float, emit as floats\n if (values.every(_ => isNumber(tomlType(_)))) return 'float'\n return 'mixed'\n}\nfunction validateArray (values) {\n const type = arrayType(values)\n if (type === 'mixed') {\n throw arrayOneTypeError()\n }\n return type\n}\n\nfunction stringifyInlineArray (values) {\n values = toJSON(values)\n const type = validateArray(values)\n var result = '['\n var stringified = values.map(_ => stringifyInline(_, type))\n if (stringified.join(', ').length > 60 || /\\n/.test(stringified)) {\n result += '\\n ' + stringified.join(',\\n ') + '\\n'\n } else {\n result += ' ' + stringified.join(', ') + (stringified.length > 0 ? ' ' : '')\n }\n return result + ']'\n}\n\nfunction stringifyInlineTable (value) {\n value = toJSON(value)\n var result = []\n Object.keys(value).forEach(key => {\n result.push(stringifyKey(key) + ' = ' + stringifyAnyInline(value[key], false))\n })\n return '{ ' + result.join(', ') + (result.length > 0 ? ' ' : '') + '}'\n}\n\nfunction stringifyComplex (prefix, indent, key, value) {\n var valueType = tomlType(value)\n /* istanbul ignore else */\n if (valueType === 'array') {\n return stringifyArrayOfTables(prefix, indent, key, value)\n } else if (valueType === 'table') {\n return stringifyComplexTable(prefix, indent, key, value)\n } else {\n throw typeError(valueType)\n }\n}\n\nfunction stringifyArrayOfTables (prefix, indent, key, values) {\n values = toJSON(values)\n validateArray(values)\n var firstValueType = tomlType(values[0])\n /* istanbul ignore if */\n if (firstValueType !== 'table') throw typeError(firstValueType)\n var fullKey = prefix + stringifyKey(key)\n var result = ''\n values.forEach(table => {\n if (result.length > 0) result += '\\n'\n result += indent + '[[' + fullKey + ']]\\n'\n result += stringifyObject(fullKey + '.', indent, table)\n })\n return result\n}\n\nfunction stringifyComplexTable (prefix, indent, key, value) {\n var fullKey = prefix + stringifyKey(key)\n var result = ''\n if (getInlineKeys(value).length > 0) {\n result += indent + '[' + fullKey + ']\\n'\n }\n return result + stringifyObject(fullKey + '.', indent, value)\n}\n","'use strict'\nexports.parse = require('./parse.js')\nexports.stringify = require('./stringify.js')\n","import { appendFileSync, existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { PATHS, ensureRuntimeDirs } from './paths.js';\nimport { findRunningDaemon, removePidFile, writePidFile } from './pidfile.js';\nimport { IpcServer } from './ipc-server.js';\nimport { ModuleHost } from './module-host.js';\nimport { AlertDispatcher } from './alerts/index.js';\nimport { RunsWorker } from './workers/runs-worker.js';\nimport { RuleEngine } from './rules/engine.js';\nimport { loadAllRules } from './rules/loader.js';\nimport { detectFirewallAdapter } from './firewall/adapters.js';\nimport { RemediationManager } from './firewall/remediation.js';\nimport { bus } from './event-bus.js';\nimport { initStateDB, closeDB } from '../core/state.js';\nimport { loadConfig } from '../core/config.js';\nimport { captureException, flushTelemetry, initTelemetry } from '../core/telemetry.js';\nimport type { ThreatEvent } from '../types/events.js';\n\nfunction readVersion(): string {\n try {\n const pkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8'));\n return pkg.version || '0.0.0';\n } catch {\n return '0.0.0';\n }\n}\n\nfunction logLine(line: string): void {\n try {\n appendFileSync(PATHS.logFile, `${new Date().toISOString()} ${line}\\n`);\n } catch {\n // best-effort\n }\n}\n\nexport async function runDaemon(): Promise<void> {\n if (findRunningDaemon()) {\n console.error(`threatcrushd already running (pid file at ${PATHS.pidFile}).`);\n process.exit(1);\n }\n\n ensureRuntimeDirs();\n writePidFile();\n\n await initTelemetry('daemon');\n process.on('uncaughtException', (err) => {\n logLine(`[daemon] uncaughtException: ${err.message}`);\n captureException(err);\n });\n process.on('unhandledRejection', (reason) => {\n logLine(`[daemon] unhandledRejection: ${String(reason)}`);\n captureException(reason);\n });\n\n const version = readVersion();\n logLine(`[daemon] starting threatcrushd v${version} mode=${PATHS.mode}`);\n\n try {\n initStateDB(PATHS.stateDb);\n } catch (err) {\n logLine(`[daemon] state db unavailable: ${(err as Error).message}`);\n }\n\n const config = loadConfig(existsSync(PATHS.configFile) ? PATHS.configFile : undefined);\n\n bus.on('event', (event: ThreatEvent) => {\n logLine(`[event] ${event.severity} ${event.module} ${event.message}`);\n });\n\n const moduleHost = new ModuleHost(bus);\n await moduleHost.start();\n\n // Detection rule engine (PRD 01)\n const ruleEngine = new RuleEngine((detection) => {\n const event: ThreatEvent = {\n timestamp: new Date(),\n module: 'rule-engine',\n category: (detection.raw_metadata?.category as any) || 'system',\n severity: detection.severity,\n message: `[DETECTION] ${detection.title}`,\n source_ip: detection.source_ip,\n details: {\n rule_id: detection.rule_id,\n username: detection.username,\n ...detection.raw_metadata,\n },\n };\n bus.publish(event);\n });\n ruleEngine.loadRules(loadAllRules());\n bus.on('event', (event) => {\n if (event.module !== 'rule-engine') ruleEngine.evaluate(event);\n });\n logLine(`[daemon] rule engine loaded ${ruleEngine.getRules().length} rules`);\n setInterval(() => ruleEngine.cleanup(), 300_000);\n\n // Firewall auto-remediation (PRD 02)\n const firewallAdapter = detectFirewallAdapter();\n const remediation = new RemediationManager(firewallAdapter, bus, (config as any).remediation);\n bus.on('event', (event) => {\n if (event.module !== 'firewall-rules') {\n void remediation.handleDetection(event);\n }\n });\n logLine(`[daemon] firewall remediation active (backend=${firewallAdapter.name}, dry_run=${(config as any).remediation?.dry_run ?? true})`);\n\n new AlertDispatcher(bus, config);\n\n const runsWorker = new RunsWorker(bus);\n try {\n await runsWorker.start();\n } catch (err) {\n logLine(`[daemon] runs-worker failed to start: ${(err as Error).message}`);\n }\n\n const ipc = new IpcServer(version, moduleHost);\n await ipc.start();\n logLine(`[daemon] ipc listening on ${PATHS.socket}`);\n\n const shutdown = async (signal: string) => {\n logLine(`[daemon] received ${signal}, shutting down`);\n try { remediation.stop(); } catch {}\n try { runsWorker.stop(); } catch {}\n try { await moduleHost.stop(); } catch {}\n try { await ipc.stop(); } catch {}\n try { closeDB(); } catch {}\n try { await flushTelemetry(); } catch {}\n removePidFile();\n process.exit(0);\n };\n\n process.on('SIGINT', () => { void shutdown('SIGINT'); });\n process.on('SIGTERM', () => { void shutdown('SIGTERM'); });\n process.on('SIGHUP', () => { void shutdown('SIGHUP'); });\n\n // keep-alive\n setInterval(() => {}, 1 << 30);\n}\n\n// Note: auto-boot is handled by `src/daemon-entry.ts` so that importing this\n// module from the CLI bundle never accidentally starts a daemon.\n","import { existsSync, mkdirSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nfunction isRoot(): boolean {\n return (\n process.platform === 'linux' &&\n typeof process.getuid === 'function' &&\n process.getuid() === 0\n );\n}\n\nconst userBase = join(homedir(), '.threatcrush');\n\nconst SYSTEM_PATHS = {\n mode: 'system' as const,\n configDir: '/etc/threatcrush',\n configFile: '/etc/threatcrush/threatcrushd.conf',\n confD: '/etc/threatcrush/threatcrushd.conf.d',\n moduleDir: '/etc/threatcrush/modules',\n logDir: '/var/log/threatcrush',\n logFile: '/var/log/threatcrush/threatcrushd.log',\n stateDir: '/var/lib/threatcrush',\n stateDb: '/var/lib/threatcrush/state.db',\n runDir: '/var/run/threatcrush',\n pidFile: '/var/run/threatcrush/threatcrushd.pid',\n socket: '/var/run/threatcrush/threatcrushd.sock',\n};\n\nconst USER_PATHS = {\n mode: 'user' as const,\n configDir: userBase,\n configFile: join(userBase, 'threatcrushd.conf'),\n confD: join(userBase, 'threatcrushd.conf.d'),\n moduleDir: join(userBase, 'modules'),\n logDir: join(userBase, 'logs'),\n logFile: join(userBase, 'logs', 'threatcrushd.log'),\n stateDir: join(userBase, 'state'),\n stateDb: join(userBase, 'state', 'state.db'),\n runDir: join(userBase, 'run'),\n pidFile: join(userBase, 'run', 'threatcrushd.pid'),\n socket: join(userBase, 'run', 'threatcrushd.sock'),\n};\n\n// System paths (config/log/state/run under /etc and /var) are root-owned, so we\n// only run in system mode when actually root. Choosing system mode because\n// /etc/threatcrush happened to be writable, or because a stale system socket\n// existed, made `threatcrush start` as a normal user crash with EACCES trying\n// to open /var/log/threatcrush/threatcrushd.log. A non-root user always runs a\n// self-contained daemon under ~/.threatcrush instead.\nexport const PATHS = isRoot() ? SYSTEM_PATHS : USER_PATHS;\n\n// A non-root client command (status/stop/logs/tail) should still be able to\n// reach a daemon that root started. Prefer this process's own socket, but fall\n// back to the other mode's socket when only that one is present.\nexport function resolveClientSocket(): string {\n if (existsSync(PATHS.socket)) return PATHS.socket;\n const other = PATHS.mode === 'system' ? USER_PATHS.socket : SYSTEM_PATHS.socket;\n if (existsSync(other)) return other;\n return PATHS.socket;\n}\n\nexport function ensureRuntimeDirs(): void {\n for (const dir of [PATHS.configDir, PATHS.confD, PATHS.moduleDir, PATHS.logDir, PATHS.stateDir, PATHS.runDir]) {\n try {\n mkdirSync(dir, { recursive: true });\n } catch {\n // best-effort\n }\n }\n}\n","import { existsSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';\nimport { PATHS, ensureRuntimeDirs } from './paths.js';\n\nexport function writePidFile(): void {\n ensureRuntimeDirs();\n writeFileSync(PATHS.pidFile, String(process.pid), 'utf-8');\n}\n\nexport function readPidFile(): number | null {\n if (!existsSync(PATHS.pidFile)) return null;\n const raw = readFileSync(PATHS.pidFile, 'utf-8').trim();\n const pid = parseInt(raw, 10);\n return Number.isFinite(pid) ? pid : null;\n}\n\nexport function removePidFile(): void {\n try {\n if (existsSync(PATHS.pidFile)) unlinkSync(PATHS.pidFile);\n } catch {\n // ignore\n }\n}\n\nexport function isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (err) {\n // EPERM means the process exists but the current user can't signal it\n // (common: a non-root client checking on a system-mode daemon running as\n // root). Only ESRCH means the process is actually gone.\n const code = (err as NodeJS.ErrnoException).code;\n return code === 'EPERM';\n }\n}\n\nexport function findRunningDaemon(): number | null {\n const pid = readPidFile();\n if (pid && isProcessAlive(pid)) return pid;\n if (pid) removePidFile();\n return null;\n}\n","import { createServer, Server, Socket } from 'node:net';\nimport { existsSync, unlinkSync } from 'node:fs';\nimport type { ThreatEvent } from '../types/events.js';\nimport { PATHS } from './paths.js';\nimport { bus } from './event-bus.js';\nimport { getRecentEvents, getTopSources, getEventCount, getThreatCount } from '../core/state.js';\nimport type {\n IpcRequest,\n IpcResponse,\n IpcPush,\n DaemonStatusReply,\n} from './ipc-protocol.js';\nimport type { ModuleHost } from './module-host.js';\n\ninterface ClientState {\n id: number;\n socket: Socket;\n buffer: string;\n subscriptions: Set<'event' | 'module'>;\n}\n\nexport class IpcServer {\n private server: Server | null = null;\n private clients = new Map<number, ClientState>();\n private nextClientId = 1;\n private startedAt = new Date();\n private counters = { events: 0, threats: 0, alerts: 0 };\n\n constructor(\n private version: string,\n private moduleHost: ModuleHost,\n ) {\n bus.on('event', (event: ThreatEvent) => {\n this.counters.events++;\n if (event.severity === 'medium' || event.severity === 'high' || event.severity === 'critical') {\n this.counters.threats++;\n }\n this.broadcast({ push: 'event', payload: event }, 'event');\n });\n bus.on('alert', () => {\n this.counters.alerts++;\n });\n bus.on('module', (info) => {\n this.broadcast({ push: 'module', payload: info }, 'module');\n });\n }\n\n async start(): Promise<void> {\n if (existsSync(PATHS.socket)) {\n try { unlinkSync(PATHS.socket); } catch {}\n }\n return new Promise((resolve, reject) => {\n this.server = createServer((sock) => this.handleClient(sock));\n this.server.on('error', reject);\n this.server.listen(PATHS.socket, () => {\n const nodeFs = require('node:fs') as typeof import('node:fs');\n try { nodeFs.chmodSync(PATHS.socket, 0o660); } catch {}\n // When the daemon runs as root (system mode under systemd), regroup\n // the socket to `adm` so users in that group can talk to the daemon\n // without sudo. We use this group because it's the same one that\n // already governs read access to /var/log/{auth,syslog,nginx} — the\n // intent is \"people who can already inspect logs can talk to the\n // agent that watches them.\"\n const isRoot = process.platform === 'linux'\n && typeof process.getuid === 'function'\n && process.getuid() === 0;\n if (isRoot) {\n try {\n const { gid } = nodeFs.statSync('/var/log/auth.log');\n nodeFs.chownSync(PATHS.socket, 0, gid);\n } catch {\n // adm group not present, or /var/log/auth.log missing — leave as root:root\n }\n }\n resolve();\n });\n });\n }\n\n async stop(): Promise<void> {\n for (const c of this.clients.values()) {\n try { c.socket.destroy(); } catch {}\n }\n this.clients.clear();\n return new Promise((resolve) => {\n if (!this.server) {\n try { if (existsSync(PATHS.socket)) unlinkSync(PATHS.socket); } catch {}\n return resolve();\n }\n this.server.close(() => {\n try { if (existsSync(PATHS.socket)) unlinkSync(PATHS.socket); } catch {}\n resolve();\n });\n });\n }\n\n private handleClient(socket: Socket): void {\n const id = this.nextClientId++;\n const state: ClientState = { id, socket, buffer: '', subscriptions: new Set() };\n this.clients.set(id, state);\n\n socket.setEncoding('utf-8');\n socket.on('data', (chunk) => {\n state.buffer += chunk.toString();\n let idx;\n while ((idx = state.buffer.indexOf('\\n')) >= 0) {\n const line = state.buffer.slice(0, idx);\n state.buffer = state.buffer.slice(idx + 1);\n if (!line.trim()) continue;\n this.handleLine(state, line).catch((err) => {\n this.send(state, { id: 0, ok: false, error: String(err?.message || err) });\n });\n }\n });\n\n socket.on('close', () => { this.clients.delete(id); });\n socket.on('error', () => { this.clients.delete(id); });\n }\n\n private async handleLine(client: ClientState, line: string): Promise<void> {\n let req: IpcRequest;\n try {\n req = JSON.parse(line) as IpcRequest;\n } catch {\n return this.send(client, { id: 0, ok: false, error: 'invalid json' });\n }\n\n switch (req.method) {\n case 'ping':\n return this.send(client, { id: req.id, ok: true, result: 'pong' });\n\n case 'status': {\n const status: DaemonStatusReply = {\n pid: process.pid,\n startedAt: this.startedAt.toISOString(),\n uptimeSeconds: Math.floor((Date.now() - this.startedAt.getTime()) / 1000),\n version: this.version,\n mode: PATHS.mode,\n paths: {\n config: PATHS.configFile,\n log: PATHS.logFile,\n state: PATHS.stateDb,\n socket: PATHS.socket,\n },\n modules: this.moduleHost.summary(),\n counters: { ...this.counters },\n };\n return this.send(client, { id: req.id, ok: true, result: status });\n }\n\n case 'recent_events': {\n const limit = req.params?.limit ?? 50;\n const events = getRecentEvents(limit);\n return this.send(client, { id: req.id, ok: true, result: events });\n }\n\n case 'top_sources': {\n const limit = req.params?.limit ?? 10;\n return this.send(client, { id: req.id, ok: true, result: getTopSources(limit) });\n }\n\n case 'counters': {\n return this.send(client, {\n id: req.id,\n ok: true,\n result: {\n total: getEventCount(),\n threats: getThreatCount(),\n last24h: getEventCount(new Date(Date.now() - 86400000)),\n threats24h: getThreatCount(new Date(Date.now() - 86400000)),\n },\n });\n }\n\n case 'module_list':\n return this.send(client, { id: req.id, ok: true, result: this.moduleHost.summary() });\n\n case 'subscribe':\n for (const ch of req.params.channels) client.subscriptions.add(ch);\n return this.send(client, { id: req.id, ok: true, result: { subscribed: [...client.subscriptions] } });\n\n case 'shutdown':\n this.send(client, { id: req.id, ok: true, result: 'shutting down' });\n setTimeout(() => process.emit('SIGTERM' as NodeJS.Signals), 50);\n return;\n }\n }\n\n private send(client: ClientState, msg: IpcResponse | IpcPush): void {\n try {\n client.socket.write(JSON.stringify(msg) + '\\n');\n } catch {\n // client gone\n }\n }\n\n private broadcast(msg: IpcPush, channel: 'event' | 'module'): void {\n for (const client of this.clients.values()) {\n if (!client.subscriptions.has(channel)) continue;\n this.send(client, msg);\n }\n }\n}\n","import { EventEmitter } from 'node:events';\nimport type { ThreatEvent } from '../types/events.js';\n\nexport interface DaemonEvents {\n event: (event: ThreatEvent) => void;\n alert: (event: ThreatEvent) => void;\n module: (info: { name: string; status: string; detail?: string }) => void;\n}\n\nexport class EventBus extends EventEmitter {\n publish(event: ThreatEvent): void {\n this.emit('event', event);\n if (event.severity === 'high' || event.severity === 'critical') {\n this.emit('alert', event);\n }\n }\n\n announceModule(name: string, status: string, detail?: string): void {\n this.emit('module', { name, status, detail });\n }\n}\n\nexport const bus = new EventBus();\nbus.setMaxListeners(50);\n","import Database from 'better-sqlite3';\nimport type { ThreatEvent } from '../types/events.js';\n\nlet db: Database.Database | null = null;\nlet dbUnavailable = false;\n\nexport function isStateDbAvailable(): boolean {\n return db !== null;\n}\n\nexport function initStateDB(dbPath: string = '/var/lib/threatcrush/state.db'): Database.Database {\n if (db) return db;\n if (dbUnavailable) {\n throw new Error('state db unavailable (previous init failed)');\n }\n\n try {\n try {\n db = new Database(dbPath);\n } catch {\n // Fall back to in-memory if we can't write to the path\n db = new Database(':memory:');\n }\n } catch (err) {\n // Native binding missing or unloadable — mark DB unavailable so callers\n // can degrade gracefully instead of throwing on every IPC request.\n dbUnavailable = true;\n throw err;\n }\n\n db.pragma('journal_mode = WAL');\n\n db.exec(`\n CREATE TABLE IF NOT EXISTS events (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n timestamp TEXT NOT NULL,\n module TEXT NOT NULL,\n category TEXT NOT NULL,\n severity TEXT NOT NULL,\n message TEXT NOT NULL,\n source_ip TEXT,\n details TEXT\n );\n\n CREATE TABLE IF NOT EXISTS module_state (\n module TEXT NOT NULL,\n key TEXT NOT NULL,\n value TEXT,\n PRIMARY KEY (module, key)\n );\n\n CREATE TABLE IF NOT EXISTS stats (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_events_timestamp ON events(timestamp);\n CREATE INDEX IF NOT EXISTS idx_events_module ON events(module);\n CREATE INDEX IF NOT EXISTS idx_events_severity ON events(severity);\n CREATE INDEX IF NOT EXISTS idx_events_source_ip ON events(source_ip);\n `);\n\n return db;\n}\n\nexport function insertEvent(event: ThreatEvent): number {\n const database = tryDb();\n if (!database) return -1;\n const stmt = database.prepare(`\n INSERT INTO events (timestamp, module, category, severity, message, source_ip, details)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `);\n const result = stmt.run(\n event.timestamp.toISOString(),\n event.module,\n event.category,\n event.severity,\n event.message,\n event.source_ip || null,\n event.details ? JSON.stringify(event.details) : null,\n );\n return result.lastInsertRowid as number;\n}\n\nfunction tryDb(): Database.Database | null {\n if (db) return db;\n if (dbUnavailable) return null;\n try {\n return initStateDB();\n } catch {\n return null;\n }\n}\n\nexport function getRecentEvents(limit: number = 50): ThreatEvent[] {\n const database = tryDb();\n if (!database) return [];\n const rows = database.prepare(`\n SELECT * FROM events ORDER BY timestamp DESC LIMIT ?\n `).all(limit) as any[];\n return rows.map(rowToEvent);\n}\n\nexport function getEventCount(since?: Date): number {\n const database = tryDb();\n if (!database) return 0;\n if (since) {\n return (database.prepare(`SELECT COUNT(*) as count FROM events WHERE timestamp >= ?`)\n .get(since.toISOString()) as any).count;\n }\n return (database.prepare(`SELECT COUNT(*) as count FROM events`).get() as any).count;\n}\n\nexport function getThreatCount(since?: Date): number {\n const database = tryDb();\n if (!database) return 0;\n const severities = \"('medium','high','critical')\";\n if (since) {\n return (database.prepare(\n `SELECT COUNT(*) as count FROM events WHERE severity IN ${severities} AND timestamp >= ?`\n ).get(since.toISOString()) as any).count;\n }\n return (database.prepare(\n `SELECT COUNT(*) as count FROM events WHERE severity IN ${severities}`\n ).get() as any).count;\n}\n\nexport function getTopSources(limit: number = 10): Array<{ ip: string; count: number }> {\n const database = tryDb();\n if (!database) return [];\n return database.prepare(`\n SELECT source_ip as ip, COUNT(*) as count FROM events\n WHERE source_ip IS NOT NULL\n GROUP BY source_ip ORDER BY count DESC LIMIT ?\n `).all(limit) as any[];\n}\n\nexport function getModuleState(module: string, key: string): unknown {\n const database = db || initStateDB();\n const row = database.prepare(`SELECT value FROM module_state WHERE module = ? AND key = ?`)\n .get(module, key) as any;\n if (!row) return undefined;\n try {\n return JSON.parse(row.value);\n } catch {\n return row.value;\n }\n}\n\nexport function setModuleState(module: string, key: string, value: unknown): void {\n const database = db || initStateDB();\n database.prepare(`\n INSERT OR REPLACE INTO module_state (module, key, value) VALUES (?, ?, ?)\n `).run(module, key, JSON.stringify(value));\n}\n\nfunction rowToEvent(row: any): ThreatEvent {\n return {\n id: row.id,\n timestamp: new Date(row.timestamp),\n module: row.module,\n category: row.category,\n severity: row.severity,\n message: row.message,\n source_ip: row.source_ip,\n details: row.details ? JSON.parse(row.details) : undefined,\n };\n}\n\nexport function closeDB(): void {\n if (db) {\n db.close();\n db = null;\n }\n}\n","import { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport TOML from '@iarna/toml';\nimport type { EventBus } from './event-bus.js';\nimport { PATHS } from './paths.js';\nimport { LogWatcher } from './watchers/log-watcher.js';\nimport { JournalWatcher } from './watchers/journal-watcher.js';\nimport { NetworkMonitor } from '../modules/network-monitor/index.js';\nimport { DnsMonitor } from '../modules/dns-monitor/index.js';\nimport { loadModuleConfigs } from '../core/config.js';\nimport { getModuleState, setModuleState } from '../core/state.js';\nimport type { ModuleConfig, ModuleManifest } from '../types/config.js';\nimport type { ThreatEvent } from '../types/events.js';\nimport type { ModuleAlert, ThreatCrushModule } from '../types/module.js';\n\ninterface HostedModule {\n name: string;\n version: string;\n source: 'builtin' | 'installed';\n status: 'running' | 'loaded' | 'error' | 'disabled';\n events: number;\n detail?: string;\n path?: string;\n config?: ModuleConfig;\n instance?: ThreatCrushModule;\n}\n\nexport class ModuleHost {\n private modules = new Map<string, HostedModule>();\n private logWatcher: LogWatcher | null = null;\n private journalWatcher: JournalWatcher | null = null;\n private networkMonitor: NetworkMonitor | null = null;\n private dnsMonitor: DnsMonitor | null = null;\n\n constructor(private bus: EventBus) {\n bus.on('event', (event) => {\n const mod = this.modules.get(event.module);\n if (mod) mod.events++;\n for (const hosted of this.modules.values()) {\n if (hosted.status !== 'running' || !hosted.instance?.onEvent) continue;\n void hosted.instance.onEvent(event).catch((err) => {\n hosted.status = 'error';\n hosted.detail = `onEvent failed: ${String((err as Error).message || err)}`;\n this.bus.announceModule(hosted.name, 'error', hosted.detail);\n });\n }\n });\n }\n\n async start(): Promise<void> {\n this.registerBuiltins();\n await this.discoverAndStartInstalled();\n\n this.logWatcher = new LogWatcher(this.bus);\n const watched = this.logWatcher.start();\n\n for (const modName of this.logWatcher.activeModules()) {\n const mod = this.modules.get(modName);\n if (mod) {\n mod.status = 'running';\n mod.detail = `watching ${watched.length} log source(s)`;\n this.bus.announceModule(modName, 'running', mod.detail);\n }\n }\n\n this.journalWatcher = new JournalWatcher(this.bus);\n if (this.journalWatcher.start()) {\n const mod = this.modules.get('user-journal');\n if (mod) {\n mod.status = 'running';\n mod.detail = `tailing ${JournalWatcher.scopeArgs().includes('--user') ? 'user journal' : 'system journal'}`;\n this.bus.announceModule('user-journal', 'running', mod.detail);\n }\n }\n\n // Network monitor (PRD 04)\n this.networkMonitor = new NetworkMonitor(this.bus);\n if (this.networkMonitor.start()) {\n const nmod = this.modules.get('network-monitor');\n if (nmod) {\n nmod.status = 'running';\n nmod.detail = 'monitoring connections via conntrack/ss';\n this.bus.announceModule('network-monitor', 'running', nmod.detail);\n }\n }\n\n // DNS monitor (PRD 05)\n this.dnsMonitor = new DnsMonitor(this.bus);\n if (this.dnsMonitor.start()) {\n const dmod = this.modules.get('dns-monitor');\n if (dmod) {\n dmod.status = 'running';\n dmod.detail = 'monitoring DNS queries';\n this.bus.announceModule('dns-monitor', 'running', dmod.detail);\n }\n }\n }\n\n async stop(): Promise<void> {\n this.logWatcher?.stop();\n this.journalWatcher?.stop();\n this.networkMonitor?.stop();\n this.dnsMonitor?.stop();\n for (const mod of this.modules.values()) {\n try {\n if (mod.instance && mod.status === 'running') {\n await mod.instance.stop();\n }\n } catch (err) {\n mod.status = 'error';\n mod.detail = `stop failed: ${String((err as Error).message || err)}`;\n this.bus.announceModule(mod.name, 'error', mod.detail);\n continue;\n }\n mod.status = 'loaded';\n this.bus.announceModule(mod.name, 'stopped');\n }\n }\n\n summary(): Array<{ name: string; status: string; events: number; detail?: string }> {\n return [...this.modules.values()].map((m) => ({\n name: m.name,\n status: m.status,\n events: m.events,\n detail: m.detail,\n }));\n }\n\n private registerBuiltins(): void {\n const builtins: HostedModule[] = [\n { name: 'log-watcher', version: '0.1.0', source: 'builtin', status: 'loaded', events: 0 },\n { name: 'ssh-guard', version: '0.1.0', source: 'builtin', status: 'loaded', events: 0 },\n { name: 'user-journal', version: '0.1.0', source: 'builtin', status: 'loaded', events: 0 },\n { name: 'network-monitor', version: '0.1.0', source: 'builtin', status: 'loaded', events: 0 },\n { name: 'dns-monitor', version: '0.1.0', source: 'builtin', status: 'loaded', events: 0 },\n ];\n for (const m of builtins) this.modules.set(m.name, m);\n }\n\n private async discoverAndStartInstalled(): Promise<void> {\n if (!existsSync(PATHS.moduleDir)) return;\n const configs = loadModuleConfigs(PATHS.confD);\n const entries = readdirSync(PATHS.moduleDir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const manifestPath = join(PATHS.moduleDir, entry.name, 'mod.toml');\n if (!existsSync(manifestPath)) continue;\n try {\n const manifest = TOML.parse(readFileSync(manifestPath, 'utf-8')) as unknown as ModuleManifest;\n const name = manifest.module?.name || entry.name;\n const defaults = manifest.module?.config?.defaults || {};\n const config = {\n enabled: true,\n ...defaults,\n ...(configs.get(name) || {}),\n } as ModuleConfig;\n const hosted: HostedModule = {\n name,\n version: manifest.module?.version || '0.0.0',\n source: 'installed',\n status: config.enabled === false ? 'disabled' : 'loaded',\n events: 0,\n path: join(PATHS.moduleDir, entry.name),\n config,\n };\n this.modules.set(name, hosted);\n if (config.enabled === false) continue;\n await this.startInstalled(hosted);\n } catch (err) {\n const name = entry.name;\n this.modules.set(name, {\n name,\n version: '0.0.0',\n source: 'installed',\n status: 'error',\n events: 0,\n detail: `manifest load failed: ${String((err as Error).message || err)}`,\n path: join(PATHS.moduleDir, entry.name),\n });\n }\n }\n }\n\n private async startInstalled(hosted: HostedModule): Promise<void> {\n const entrypoint = this.installedEntrypoint(hosted.path!);\n if (!entrypoint) {\n hosted.status = 'loaded';\n hosted.detail = 'no built entrypoint found; run npm install && npm run build in the module directory';\n return;\n }\n\n try {\n const imported = await import(pathToFileURL(entrypoint).href);\n const exported = imported.default || imported.module || imported;\n const instance = typeof exported === 'function' ? new exported() : exported;\n if (!this.isThreatCrushModule(instance)) {\n throw new Error('entrypoint does not export a ThreatCrush module');\n }\n\n hosted.instance = instance;\n await instance.init(this.contextFor(hosted));\n await instance.start();\n hosted.status = 'running';\n hosted.detail = `started from ${entrypoint}`;\n this.bus.announceModule(hosted.name, 'running', hosted.detail);\n } catch (err) {\n hosted.status = 'error';\n hosted.detail = String((err as Error).message || err);\n this.bus.announceModule(hosted.name, 'error', hosted.detail);\n }\n }\n\n private installedEntrypoint(modulePath: string): string | null {\n const packageJson = join(modulePath, 'package.json');\n const candidates: string[] = [];\n if (existsSync(packageJson)) {\n try {\n const pkg = JSON.parse(readFileSync(packageJson, 'utf-8')) as { main?: string };\n if (pkg.main) candidates.push(join(modulePath, pkg.main));\n } catch {\n // fall through to conventional paths\n }\n }\n candidates.push(join(modulePath, 'dist', 'index.js'), join(modulePath, 'index.js'));\n return candidates.find((candidate) => existsSync(candidate)) || null;\n }\n\n private isThreatCrushModule(value: unknown): value is ThreatCrushModule {\n return Boolean(\n value &&\n typeof value === 'object' &&\n typeof (value as ThreatCrushModule).init === 'function' &&\n typeof (value as ThreatCrushModule).start === 'function' &&\n typeof (value as ThreatCrushModule).stop === 'function',\n );\n }\n\n private contextFor(hosted: HostedModule) {\n return {\n config: hosted.config || { enabled: true },\n logger: this.loggerFor(hosted.name),\n emit: (event: ThreatEvent) => this.bus.publish(event),\n subscribe: (eventType: string, handler: (event: ThreatEvent) => void) => {\n this.bus.on('event', (event) => {\n if (event.category === eventType || event.module === eventType) handler(event);\n });\n },\n alert: (alert: ModuleAlert) => {\n this.bus.emit('alert', alert.event || {\n timestamp: new Date(),\n module: hosted.name,\n category: 'system',\n severity: alert.severity,\n message: alert.title,\n details: alert.body ? { body: alert.body } : undefined,\n });\n },\n getState: (key: string) => getModuleState(hosted.name, key),\n setState: (key: string, value: unknown) => setModuleState(hosted.name, key, value),\n };\n }\n\n private loggerFor(moduleName: string) {\n return {\n debug: (msg: string, ...args: unknown[]) => console.debug(`[${moduleName}] ${msg}`, ...args),\n info: (msg: string, ...args: unknown[]) => console.info(`[${moduleName}] ${msg}`, ...args),\n warn: (msg: string, ...args: unknown[]) => console.warn(`[${moduleName}] ${msg}`, ...args),\n error: (msg: string, ...args: unknown[]) => console.error(`[${moduleName}] ${msg}`, ...args),\n };\n }\n}\n","import { existsSync, statSync, createReadStream, accessSync, constants } from 'node:fs';\nimport { createInterface } from 'node:readline';\nimport type { EventBus } from '../event-bus.js';\nimport { autoDetectParser, detectAttackPattern, parseAuthLog, parseNginxLog } from '../../core/log-parser.js';\nimport { insertEvent } from '../../core/state.js';\nimport type { ThreatEvent, EventCategory, EventSeverity } from '../../types/events.js';\n\nexport interface LogSource {\n path: string;\n module: string;\n category: EventCategory;\n}\n\nexport const DEFAULT_SOURCES: LogSource[] = [\n { path: '/var/log/auth.log', module: 'ssh-guard', category: 'auth' },\n { path: '/var/log/secure', module: 'ssh-guard', category: 'auth' },\n { path: '/var/log/nginx/access.log', module: 'log-watcher', category: 'web' },\n { path: '/var/log/syslog', module: 'log-watcher', category: 'system' },\n];\n\nexport class LogWatcher {\n private timers = new Map<string, NodeJS.Timeout>();\n private positions = new Map<string, number>();\n private active = new Set<string>();\n\n constructor(private bus: EventBus, private sources: LogSource[] = DEFAULT_SOURCES) {}\n\n start(): string[] {\n const started: string[] = [];\n for (const src of this.sources) {\n if (!existsSync(src.path)) continue;\n try { accessSync(src.path, constants.R_OK); }\n catch { continue; }\n this.tail(src);\n started.push(src.path);\n }\n return started;\n }\n\n stop(): void {\n for (const t of this.timers.values()) clearInterval(t);\n this.timers.clear();\n this.positions.clear();\n this.active.clear();\n }\n\n activeModules(): string[] {\n return [...this.active];\n }\n\n private tail(src: LogSource): void {\n try {\n this.positions.set(src.path, statSync(src.path).size);\n } catch {\n this.positions.set(src.path, 0);\n }\n\n const timer = setInterval(() => this.poll(src), 1000);\n this.timers.set(src.path, timer);\n this.active.add(src.module);\n }\n\n private poll(src: LogSource): void {\n let stat;\n try { stat = statSync(src.path); } catch { return; }\n const prev = this.positions.get(src.path) ?? 0;\n\n if (stat.size < prev) {\n this.positions.set(src.path, 0); // rotated\n return;\n }\n if (stat.size === prev) return;\n\n const stream = createReadStream(src.path, { start: prev, encoding: 'utf-8' });\n stream.on('error', () => this.positions.set(src.path, stat.size));\n const rl = createInterface({ input: stream });\n rl.on('error', () => {});\n rl.on('line', (line) => {\n if (!line.trim()) return;\n this.process(line, src);\n });\n rl.on('close', () => this.positions.set(src.path, stat.size));\n }\n\n private process(line: string, src: LogSource): void {\n const parsed = autoDetectParser(line);\n if (!parsed) return;\n\n let severity: EventSeverity = 'info';\n let message = line;\n let sourceIp: string | undefined;\n\n if (parsed.source === 'auth') {\n const entry = parseAuthLog(line);\n if (!entry) return;\n sourceIp = entry.fields.ip;\n const msg = entry.fields.message;\n if (/failed password/i.test(msg)) {\n severity = 'high';\n message = `Failed SSH login for ${entry.fields.user || 'unknown'} from ${entry.fields.ip || 'unknown'}`;\n } else if (/invalid user/i.test(msg)) {\n severity = 'high';\n message = `Invalid SSH user: ${entry.fields.user || 'unknown'} from ${entry.fields.ip || 'unknown'}`;\n } else if (/accepted/i.test(msg)) {\n severity = 'info';\n message = `SSH login accepted for ${entry.fields.user || 'unknown'}`;\n } else {\n return;\n }\n } else if (parsed.source === 'nginx') {\n const entry = parseNginxLog(line);\n if (!entry) return;\n sourceIp = entry.fields.ip;\n const status = parseInt(entry.fields.status, 10);\n const attack = detectAttackPattern(entry.fields.path);\n if (attack) {\n severity = 'critical';\n message = `Attack [${attack.toUpperCase()}]: ${entry.fields.method} ${entry.fields.path}`;\n } else if (status >= 500) {\n severity = 'medium';\n message = `Server error ${status}: ${entry.fields.method} ${entry.fields.path}`;\n } else if (status >= 400) {\n severity = 'low';\n message = `Client error ${status}: ${entry.fields.method} ${entry.fields.path}`;\n } else {\n return;\n }\n } else {\n return;\n }\n\n const event: ThreatEvent = {\n timestamp: new Date(),\n module: src.module,\n category: src.category,\n severity,\n message,\n source_ip: sourceIp,\n };\n\n try { insertEvent(event); } catch { /* db optional */ }\n this.bus.publish(event);\n }\n}\n","import type { ParsedLogLine, NginxLogEntry, AuthLogEntry, SyslogEntry } from '../types/events.js';\n\n// Nginx combined log format:\n// 127.0.0.1 - - [04/Apr/2026:12:00:00 +0000] \"GET /path HTTP/1.1\" 200 1234 \"-\" \"Mozilla/5.0\"\nconst NGINX_REGEX = /^(\\S+) \\S+ \\S+ \\[([^\\]]+)\\] \"(\\S+) (\\S+) \\S+\" (\\d{3}) (\\d+) \"[^\"]*\" \"([^\"]*)\"/;\n\n// Auth.log format:\n// Apr 4 12:00:00 hostname sshd[1234]: Failed password for user from 1.2.3.4 port 22 ssh2\nconst AUTH_REGEX = /^(\\w+\\s+\\d+\\s+[\\d:]+)\\s+\\S+\\s+(\\S+?)(?:\\[\\d+\\])?:\\s+(.*)/;\n\n// Syslog format:\n// Apr 4 12:00:00 hostname process[pid]: message\nconst SYSLOG_REGEX = /^(\\w+\\s+\\d+\\s+[\\d:]+)\\s+\\S+\\s+(\\S+?)(?:\\[\\d+\\])?:\\s+(.*)/;\n\n// Extract IP from auth messages\nconst IP_REGEX = /(?:from|FROM)\\s+(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})/;\nconst USER_REGEX = /(?:for|user)\\s+(\\S+?)(?:\\s+from|\\s*$)/;\n\n// Attack pattern signatures\nexport const ATTACK_PATTERNS = {\n sqli: [\n /(?:union\\s+(?:all\\s+)?select)/i,\n /(?:select\\s+.*\\s+from\\s+)/i,\n /(?:insert\\s+into\\s+)/i,\n /(?:drop\\s+(?:table|database))/i,\n /(?:or\\s+1\\s*=\\s*1)/i,\n /(?:'\\s*(?:or|and)\\s+')/i,\n /(?:--\\s*$|;\\s*--)/,\n /(?:\\/\\*.*\\*\\/)/,\n ],\n xss: [\n /<script[^>]*>/i,\n /javascript\\s*:/i,\n /on(?:load|error|click|mouseover)\\s*=/i,\n /eval\\s*\\(/i,\n /document\\.(?:cookie|write|location)/i,\n ],\n path_traversal: [\n /\\.\\.\\//,\n /\\.\\.\\\\/, \n /etc\\/(?:passwd|shadow|hosts)/,\n /proc\\/self/,\n /windows\\/system32/i,\n ],\n rfi: [\n /(?:https?|ftp):\\/\\/.*\\?/i,\n /php:\\/\\/(?:input|filter)/i,\n /data:\\/\\//i,\n ],\n};\n\nexport function parseNginxLog(line: string): NginxLogEntry | null {\n const match = line.match(NGINX_REGEX);\n if (!match) return null;\n\n return {\n timestamp: parseNginxTimestamp(match[2]),\n raw: line,\n source: 'nginx',\n fields: {\n ip: match[1],\n method: match[3],\n path: match[4],\n status: match[5],\n size: match[6],\n user_agent: match[7],\n },\n };\n}\n\nexport function parseAuthLog(line: string): AuthLogEntry | null {\n const match = line.match(AUTH_REGEX);\n if (!match) return null;\n\n const ipMatch = match[3].match(IP_REGEX);\n const userMatch = match[3].match(USER_REGEX);\n\n return {\n timestamp: parseSyslogTimestamp(match[1]),\n raw: line,\n source: 'auth',\n fields: {\n process: match[2],\n message: match[3],\n ip: ipMatch?.[1],\n user: userMatch?.[1],\n },\n };\n}\n\nexport function parseSyslog(line: string): SyslogEntry | null {\n const match = line.match(SYSLOG_REGEX);\n if (!match) return null;\n\n return {\n timestamp: parseSyslogTimestamp(match[1]),\n raw: line,\n source: 'syslog',\n fields: {\n facility: 'syslog',\n process: match[2],\n message: match[3],\n },\n };\n}\n\nexport function detectAttackPattern(path: string): string | null {\n for (const [type, patterns] of Object.entries(ATTACK_PATTERNS)) {\n for (const pattern of patterns) {\n if (pattern.test(path)) {\n return type;\n }\n }\n }\n return null;\n}\n\nexport function autoDetectParser(line: string): ParsedLogLine | null {\n // Try nginx first (most specific format)\n const nginx = parseNginxLog(line);\n if (nginx) return nginx;\n\n // Try auth log\n const auth = parseAuthLog(line);\n if (auth) return auth;\n\n // Fall back to generic syslog\n return parseSyslog(line);\n}\n\nfunction parseNginxTimestamp(s: string): Date {\n // \"04/Apr/2026:12:00:00 +0000\"\n try {\n const cleaned = s.replace(/(\\d{2})\\/(\\w{3})\\/(\\d{4}):/, '$2 $1, $3 ');\n return new Date(cleaned);\n } catch {\n return new Date();\n }\n}\n\nfunction parseSyslogTimestamp(s: string): Date {\n // \"Apr 4 12:00:00\" — no year, assume current\n try {\n const withYear = `${s} ${new Date().getFullYear()}`;\n return new Date(withYear);\n } catch {\n return new Date();\n }\n}\n","import { spawn, type ChildProcess, spawnSync } from 'node:child_process';\nimport type { EventBus } from '../event-bus.js';\nimport { insertEvent } from '../../core/state.js';\nimport type { ThreatEvent, EventSeverity } from '../../types/events.js';\n\n// Wraps `journalctl --user -o json -f` so threatcrushd can pick up user-session\n// events without needing to belong to the `adm` or `systemd-journal` group.\n// On systems without journalctl this watcher is a no-op.\nexport class JournalWatcher {\n private proc: ChildProcess | null = null;\n private buffer = '';\n private moduleName = 'user-journal';\n private active = false;\n\n constructor(private bus: EventBus) {}\n\n // When the daemon runs as root (system mode), tail the SYSTEM journal so\n // we pick up sshd / sudo / kernel / UFW events. Falling back to --user\n // would give us root's mostly-empty per-user journal. Otherwise we use\n // --user so the daemon can run unprivileged on a workstation.\n static scopeArgs(): string[] {\n const isRoot = process.platform === 'linux'\n && typeof process.getuid === 'function'\n && process.getuid() === 0;\n return isRoot ? [] : ['--user'];\n }\n\n static isAvailable(): boolean {\n const probe = spawnSync('journalctl', [...this.scopeArgs(), '-n', '0', '--no-pager'], {\n stdio: ['ignore', 'ignore', 'ignore'],\n });\n return probe.status === 0;\n }\n\n start(): boolean {\n if (!JournalWatcher.isAvailable()) return false;\n\n const child = spawn(\n 'journalctl',\n [...JournalWatcher.scopeArgs(), '-o', 'json', '-f', '--since', 'now'],\n { stdio: ['ignore', 'pipe', 'pipe'] },\n );\n if (!child.stdout) return false;\n child.stdout.setEncoding('utf-8');\n child.stdout.on('data', (chunk: string) => this.onData(chunk));\n child.on('exit', () => {\n this.proc = null;\n this.active = false;\n });\n this.proc = child;\n\n this.active = true;\n return true;\n }\n\n stop(): void {\n if (this.proc) {\n try { this.proc.kill('SIGTERM'); } catch {}\n this.proc = null;\n }\n this.active = false;\n }\n\n isActive(): boolean {\n return this.active;\n }\n\n moduleNameValue(): string {\n return this.moduleName;\n }\n\n private onData(chunk: string): void {\n this.buffer += chunk;\n let idx;\n while ((idx = this.buffer.indexOf('\\n')) >= 0) {\n const line = this.buffer.slice(0, idx);\n this.buffer = this.buffer.slice(idx + 1);\n if (!line.trim()) continue;\n this.handleLine(line);\n }\n }\n\n private handleLine(line: string): void {\n let entry: Record<string, string>;\n try {\n entry = JSON.parse(line) as Record<string, string>;\n } catch {\n return;\n }\n\n const message = entry.MESSAGE;\n if (!message) return;\n\n const priority = parseInt(entry.PRIORITY ?? '6', 10);\n const severity = priorityToSeverity(priority);\n\n // Surface a couple of common suspicious-looking sources at a higher\n // severity even if the kernel disagrees with us.\n const ident = entry.SYSLOG_IDENTIFIER || entry._COMM || 'journal';\n const bumpedSeverity = bumpForIdent(ident, message, severity);\n\n const event: ThreatEvent = {\n timestamp: realtimeToDate(entry.__REALTIME_TIMESTAMP) || new Date(),\n module: this.moduleName,\n category: 'system',\n severity: bumpedSeverity,\n message: `[${ident}] ${message}`.slice(0, 500),\n };\n\n try { insertEvent(event); } catch { /* db optional */ }\n this.bus.publish(event);\n }\n}\n\nfunction priorityToSeverity(priority: number): EventSeverity {\n // syslog priorities: 0 emerg, 1 alert, 2 crit, 3 err, 4 warning, 5 notice, 6 info, 7 debug\n if (priority <= 2) return 'critical';\n if (priority === 3) return 'high';\n if (priority === 4) return 'medium';\n if (priority === 5) return 'low';\n return 'info';\n}\n\nfunction bumpForIdent(ident: string, message: string, base: EventSeverity): EventSeverity {\n if (/sudo/i.test(ident) && /authentication failure|incorrect password|FAILED/i.test(message)) {\n return 'high';\n }\n if (/sshd/i.test(ident) && /failed|invalid user|break-in/i.test(message)) {\n return 'high';\n }\n return base;\n}\n\nfunction realtimeToDate(rt: string | undefined): Date | null {\n if (!rt) return null;\n const us = parseInt(rt, 10);\n if (!Number.isFinite(us)) return null;\n return new Date(Math.floor(us / 1000));\n}\n","/**\n * Network Monitor Module (PRD 04)\n *\n * Observes TCP/UDP connections via conntrack / ss / /proc/net.\n * Detects port scans and SYN-flood-style patterns.\n * Emits detections through the event bus for the rule engine.\n */\n\nimport { spawnSync } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport type { EventBus } from '../../daemon/event-bus.js';\nimport { insertEvent } from '../../core/state.js';\nimport type { ThreatEvent, EventSeverity } from '../../types/events.js';\n\ninterface ConnectionRecord {\n source_ip: string;\n dest_port: number;\n timestamp: number;\n}\n\ninterface ScanTracker {\n ports: Set<number>;\n firstSeen: number;\n lastSeen: number;\n count: number;\n}\n\nexport class NetworkMonitor {\n private active = false;\n private pollTimer: NodeJS.Timeout | null = null;\n private scanTrackers = new Map<string, ScanTracker>();\n private halfOpenTrackers = new Map<string, { count: number; firstSeen: number }>();\n private lastConnections = new Set<string>();\n\n // Config\n private pollIntervalMs = 5000;\n private portScanThreshold = 10; // unique ports in window\n private portScanWindowMs = 30_000;\n private synFloodThreshold = 50; // half-open connections\n private synFloodWindowMs = 10_000;\n\n constructor(private bus: EventBus) {}\n\n start(): boolean {\n if (!this.hasConntrackOrSs()) {\n return false;\n }\n this.active = true;\n this.pollTimer = setInterval(() => this.poll(), this.pollIntervalMs);\n return true;\n }\n\n stop(): void {\n if (this.pollTimer) clearInterval(this.pollTimer);\n this.pollTimer = null;\n this.active = false;\n }\n\n isActive(): boolean { return this.active; }\n\n private hasConntrackOrSs(): boolean {\n const ss = spawnSync('ss', ['--version'], { stdio: 'pipe' });\n if (ss.status === 0) return true;\n // Try /proc/net/tcp\n return existsSync('/proc/net/tcp');\n }\n\n private poll(): void {\n try {\n const connections = this.getConnections();\n this.analyzePortScans(connections);\n this.analyzeSynFlood(connections);\n this.cleanupTrackers();\n } catch {\n // Graceful degradation\n }\n }\n\n private getConnections(): ConnectionRecord[] {\n const records: ConnectionRecord[] = [];\n const now = Date.now();\n\n try {\n // Try conntrack first\n const ct = spawnSync('conntrack', ['-L', '-p', 'tcp', '-o', 'extended'], {\n encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'], timeout: 3000,\n });\n if (ct.status === 0 && ct.stdout) {\n for (const line of ct.stdout.split('\\n')) {\n const srcMatch = line.match(/src=(\\d+\\.\\d+\\.\\d+\\.\\d+)/);\n const dportMatch = line.match(/dport=(\\d+)/);\n if (srcMatch && dportMatch) {\n records.push({ source_ip: srcMatch[1], dest_port: parseInt(dportMatch[1]), timestamp: now });\n }\n }\n if (records.length > 0) return records;\n }\n } catch { /* fallthrough */ }\n\n try {\n // Fallback to ss\n const ss = spawnSync('ss', ['-tnp', '-H'], {\n encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'], timeout: 3000,\n });\n if (ss.status === 0 && ss.stdout) {\n for (const line of ss.stdout.split('\\n')) {\n // ss output: State Recv-Q Send-Q Local:Port Peer:Port Process\n const parts = line.trim().split(/\\s+/);\n if (parts.length < 5) continue;\n const peerParts = parts[4].split(':');\n const localParts = parts[3].split(':');\n if (peerParts.length >= 2 && localParts.length >= 2) {\n const sourceIp = peerParts.slice(0, -1).join(':');\n const destPort = parseInt(localParts[localParts.length - 1]);\n if (sourceIp && !isNaN(destPort) && !this.isLocalIp(sourceIp)) {\n records.push({ source_ip: sourceIp, dest_port: destPort, timestamp: now });\n }\n }\n }\n }\n } catch { /* fallthrough */ }\n\n return records;\n }\n\n private analyzePortScans(connections: ConnectionRecord[]): void {\n const now = Date.now();\n\n for (const conn of connections) {\n const key = conn.source_ip;\n let tracker = this.scanTrackers.get(key);\n\n if (!tracker) {\n tracker = { ports: new Set(), firstSeen: now, lastSeen: now, count: 0 };\n this.scanTrackers.set(key, tracker);\n }\n\n tracker.ports.add(conn.dest_port);\n tracker.lastSeen = now;\n tracker.count++;\n\n // Check threshold within window\n if (tracker.ports.size >= this.portScanThreshold &&\n (now - tracker.firstSeen) <= this.portScanWindowMs) {\n this.emitEvent(\n 'high',\n `Port scan detected: ${conn.source_ip} probed ${tracker.ports.size} ports in ${Math.round((now - tracker.firstSeen) / 1000)}s`,\n conn.source_ip,\n { ports_scanned: tracker.ports.size, window_seconds: Math.round((now - tracker.firstSeen) / 1000) },\n );\n // Reset tracker after alert\n this.scanTrackers.delete(key);\n }\n }\n }\n\n private analyzeSynFlood(connections: ConnectionRecord[]): void {\n // Count SYN_RECV (half-open) states via ss\n try {\n const ss = spawnSync('ss', ['-tn', 'state', 'syn-recv', '-H'], {\n encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'], timeout: 3000,\n });\n if (ss.status !== 0 || !ss.stdout) return;\n\n const perSource = new Map<string, number>();\n\n for (const line of ss.stdout.split('\\n')) {\n const parts = line.trim().split(/\\s+/);\n if (parts.length < 5) continue;\n const peer = parts[4].split(':');\n const ip = peer.slice(0, -1).join(':');\n if (ip) perSource.set(ip, (perSource.get(ip) || 0) + 1);\n }\n\n for (const [ip, count] of perSource) {\n if (count >= this.synFloodThreshold) {\n this.emitEvent(\n 'critical',\n `SYN flood indicators: ${count} half-open connections from ${ip}`,\n ip,\n { half_open_count: count },\n );\n }\n }\n } catch { /* graceful */ }\n }\n\n private emitEvent(severity: EventSeverity, message: string, sourceIp?: string, details?: Record<string, unknown>): void {\n const event: ThreatEvent = {\n timestamp: new Date(),\n module: 'network-monitor',\n category: 'network',\n severity,\n message,\n source_ip: sourceIp,\n details,\n };\n try { insertEvent(event); } catch { /* db optional */ }\n this.bus.publish(event);\n }\n\n private cleanupTrackers(): void {\n const now = Date.now();\n for (const [key, tracker] of this.scanTrackers) {\n if (now - tracker.lastSeen > this.portScanWindowMs * 2) {\n this.scanTrackers.delete(key);\n }\n }\n }\n\n private isLocalIp(ip: string): boolean {\n return ip === '127.0.0.1' || ip === '::1' || ip === '0.0.0.0' || ip.startsWith('::ffff:127.');\n }\n}\n","/**\n * DNS Monitor Module (PRD 05)\n *\n * Observes DNS query activity for tunneling and DGA indicators.\n * Sources: resolver logs, systemd-resolved, dnsmasq logs, passive :53 observation.\n */\n\nimport { existsSync, statSync, createReadStream, accessSync, constants } from 'node:fs';\nimport { createInterface } from 'node:readline';\nimport type { EventBus } from '../../daemon/event-bus.js';\nimport { insertEvent } from '../../core/state.js';\nimport type { ThreatEvent, EventSeverity } from '../../types/events.js';\n\ninterface DnsQuery {\n domain: string;\n type: string;\n source_ip?: string;\n timestamp: number;\n}\n\nconst DNS_LOG_SOURCES = [\n '/var/log/syslog', // systemd-resolved logs here\n '/var/log/dnsmasq.log', // dnsmasq\n '/var/log/named/queries.log', // bind9\n '/var/log/pihole.log', // Pi-hole\n];\n\nexport class DnsMonitor {\n private active = false;\n private timers = new Map<string, NodeJS.Timeout>();\n private positions = new Map<string, number>();\n\n // Tracking windows\n private txtQueryCounts = new Map<string, { count: number; firstSeen: number }>();\n private domainBuffer: DnsQuery[] = [];\n\n // Config\n private txtRateThreshold = 20; // TXT queries per source per window\n private txtWindowMs = 60_000;\n private dgaBurstThreshold = 15; // unique high-entropy domains per window\n private dgaWindowMs = 60_000;\n private entropyThreshold = 3.5; // Shannon entropy threshold for DGA\n\n constructor(private bus: EventBus) {}\n\n start(): boolean {\n const sources = DNS_LOG_SOURCES.filter(p => {\n if (!existsSync(p)) return false;\n try { accessSync(p, constants.R_OK); return true; }\n catch { return false; }\n });\n\n if (sources.length === 0) return false;\n\n this.active = true;\n for (const src of sources) {\n this.tailLog(src);\n }\n\n // Periodic analysis\n setInterval(() => this.analyzeBuffer(), 10_000);\n return true;\n }\n\n stop(): void {\n for (const t of this.timers.values()) clearInterval(t);\n this.timers.clear();\n this.active = false;\n }\n\n isActive(): boolean { return this.active; }\n\n private tailLog(path: string): void {\n try {\n this.positions.set(path, statSync(path).size);\n } catch {\n this.positions.set(path, 0);\n }\n\n const timer = setInterval(() => this.pollLog(path), 2000);\n this.timers.set(path, timer);\n }\n\n private pollLog(path: string): void {\n let stat;\n try { stat = statSync(path); } catch { return; }\n const prev = this.positions.get(path) ?? 0;\n\n if (stat.size < prev) { this.positions.set(path, 0); return; }\n if (stat.size === prev) return;\n\n const stream = createReadStream(path, { start: prev, encoding: 'utf-8' });\n stream.on('error', () => this.positions.set(path, stat.size));\n const rl = createInterface({ input: stream });\n rl.on('line', (line) => this.parseDnsLine(line));\n rl.on('close', () => this.positions.set(path, stat.size));\n }\n\n private parseDnsLine(line: string): void {\n // systemd-resolved pattern: \"query[TXT] suspicious.domain.com from 192.168.1.1\"\n const resolvedMatch = line.match(/query\\[(\\w+)\\]\\s+(\\S+)\\s+from\\s+(\\S+)/i);\n if (resolvedMatch) {\n this.domainBuffer.push({\n type: resolvedMatch[1],\n domain: resolvedMatch[2],\n source_ip: resolvedMatch[3],\n timestamp: Date.now(),\n });\n return;\n }\n\n // dnsmasq pattern: \"query[TXT] suspicious.domain.com from 192.168.1.1\"\n const dnsmasqMatch = line.match(/query\\[(\\w+)\\]\\s+(\\S+)\\s+from\\s+(\\S+)/i);\n if (dnsmasqMatch) {\n this.domainBuffer.push({\n type: dnsmasqMatch[1],\n domain: dnsmasqMatch[2],\n source_ip: dnsmasqMatch[3],\n timestamp: Date.now(),\n });\n return;\n }\n\n // Generic DNS query log pattern\n const genericMatch = line.match(/(?:query|lookup|resolve)[:\\s]+(\\S+)/i);\n if (genericMatch) {\n const typeMatch = line.match(/type[:\\s]+(\\w+)/i);\n this.domainBuffer.push({\n type: typeMatch?.[1] || 'A',\n domain: genericMatch[1],\n timestamp: Date.now(),\n });\n }\n }\n\n private analyzeBuffer(): void {\n const now = Date.now();\n const cutoff = now - this.txtWindowMs;\n\n // Prune old entries\n this.domainBuffer = this.domainBuffer.filter(q => q.timestamp > cutoff);\n\n this.detectTunneling();\n this.detectDga();\n }\n\n private detectTunneling(): void {\n // Check for high TXT query volume from single source\n const txtBySource = new Map<string, number>();\n const longLabelDomains: string[] = [];\n\n for (const q of this.domainBuffer) {\n if (q.type === 'TXT') {\n const key = q.source_ip || 'unknown';\n txtBySource.set(key, (txtBySource.get(key) || 0) + 1);\n }\n\n // DNS tunneling uses abnormally long subdomain labels\n const labels = q.domain.split('.');\n const maxLabel = Math.max(...labels.map(l => l.length));\n if (maxLabel > 50) {\n longLabelDomains.push(q.domain);\n }\n }\n\n for (const [source, count] of txtBySource) {\n if (count >= this.txtRateThreshold) {\n this.emitEvent(\n 'high',\n `DNS tunneling indicators: ${count} TXT queries from ${source} in ${this.txtWindowMs / 1000}s`,\n source !== 'unknown' ? source : undefined,\n { txt_query_count: count, type: 'tunneling' },\n );\n }\n }\n\n if (longLabelDomains.length >= 5) {\n this.emitEvent(\n 'high',\n `DNS tunneling: ${longLabelDomains.length} queries with abnormally long labels detected`,\n undefined,\n { domains: longLabelDomains.slice(0, 5), type: 'tunneling-labels' },\n );\n }\n }\n\n private detectDga(): void {\n // Find domains with high entropy (DGA-like)\n const highEntropyDomains: string[] = [];\n\n for (const q of this.domainBuffer) {\n const domain = q.domain.toLowerCase();\n // Extract the second-level domain\n const parts = domain.split('.');\n if (parts.length < 2) continue;\n const sld = parts[parts.length - 2];\n\n if (sld.length >= 8 && this.shannonEntropy(sld) >= this.entropyThreshold) {\n highEntropyDomains.push(domain);\n }\n }\n\n // Deduplicate\n const unique = [...new Set(highEntropyDomains)];\n if (unique.length >= this.dgaBurstThreshold) {\n this.emitEvent(\n 'critical',\n `DGA-like domain burst: ${unique.length} unique high-entropy domains detected`,\n undefined,\n { sample_domains: unique.slice(0, 10), type: 'dga', unique_count: unique.length },\n );\n }\n }\n\n private shannonEntropy(str: string): number {\n const freq = new Map<string, number>();\n for (const ch of str) {\n freq.set(ch, (freq.get(ch) || 0) + 1);\n }\n let entropy = 0;\n for (const count of freq.values()) {\n const p = count / str.length;\n if (p > 0) entropy -= p * Math.log2(p);\n }\n return entropy;\n }\n\n private emitEvent(severity: EventSeverity, message: string, sourceIp?: string, details?: Record<string, unknown>): void {\n const event: ThreatEvent = {\n timestamp: new Date(),\n module: 'dns-monitor',\n category: 'network',\n severity,\n message,\n source_ip: sourceIp,\n details,\n };\n try { insertEvent(event); } catch { /* db optional */ }\n this.bus.publish(event);\n }\n}\n","import { readFileSync, existsSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport TOML from '@iarna/toml';\nimport type { ThreatCrushConfig, ModuleConfig } from '../types/config.js';\n\nconst DEFAULT_CONFIG_PATH = '/etc/threatcrush/threatcrushd.conf';\nconst DEFAULT_CONFDIR = '/etc/threatcrush/threatcrushd.conf.d';\n\nconst DEFAULT_CONFIG: ThreatCrushConfig = {\n daemon: {\n pid_file: '/var/run/threatcrush/threatcrushd.pid',\n log_level: 'info',\n log_file: '/var/log/threatcrush/threatcrushd.log',\n state_db: '/var/lib/threatcrush/state.db',\n },\n api: {\n enabled: true,\n bind: '127.0.0.1:9393',\n tls: false,\n },\n alerts: {},\n modules: {\n auto_update: true,\n update_interval: '24h',\n module_dir: '/etc/threatcrush/modules',\n config_dir: DEFAULT_CONFDIR,\n },\n};\n\nexport function loadConfig(configPath?: string): ThreatCrushConfig {\n const path = configPath || DEFAULT_CONFIG_PATH;\n if (!existsSync(path)) {\n return { ...DEFAULT_CONFIG };\n }\n\n try {\n const raw = readFileSync(path, 'utf-8');\n const parsed = TOML.parse(raw) as unknown as Partial<ThreatCrushConfig>;\n return {\n daemon: { ...DEFAULT_CONFIG.daemon, ...parsed.daemon },\n api: { ...DEFAULT_CONFIG.api, ...parsed.api },\n alerts: parsed.alerts || {},\n modules: { ...DEFAULT_CONFIG.modules, ...parsed.modules },\n license: parsed.license,\n };\n } catch {\n return { ...DEFAULT_CONFIG };\n }\n}\n\nexport function loadModuleConfigs(confDir?: string): Map<string, ModuleConfig> {\n const dir = confDir || DEFAULT_CONFDIR;\n const configs = new Map<string, ModuleConfig>();\n\n if (!existsSync(dir)) {\n return configs;\n }\n\n const files = readdirSync(dir).filter((f) => f.endsWith('.conf'));\n for (const file of files) {\n try {\n const raw = readFileSync(join(dir, file), 'utf-8');\n const parsed = TOML.parse(raw) as Record<string, unknown>;\n for (const [name, config] of Object.entries(parsed)) {\n configs.set(name, config as ModuleConfig);\n }\n } catch {\n // skip bad configs\n }\n }\n\n return configs;\n}\n\nexport function generateDefaultConfig(detectedServices: string[]): string {\n const config: Record<string, unknown> = {\n daemon: DEFAULT_CONFIG.daemon,\n api: DEFAULT_CONFIG.api,\n modules: DEFAULT_CONFIG.modules,\n };\n\n return TOML.stringify(config as any);\n}\n\nexport function generateModuleConfig(\n moduleName: string,\n defaults: Record<string, unknown> = {},\n): string {\n const config: Record<string, unknown> = {\n [moduleName]: {\n enabled: true,\n ...defaults,\n },\n };\n return TOML.stringify(config as any);\n}\n","import type { ThreatEvent } from '../../types/events.js';\n\ntype Mailer = {\n sendMail: (opts: Record<string, unknown>) => Promise<unknown>;\n};\n\nlet transporter: Mailer | null = null;\n// Lazy-load nodemailer so the CLI build doesn't pull it in when alerts are off.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet nodemailer: any = null;\n\nexport interface SmtpConfig {\n host?: string;\n port?: number;\n secure?: boolean;\n user?: string;\n pass?: string;\n from?: string;\n to?: string[] | string;\n min_severity?: 'low' | 'medium' | 'high' | 'critical';\n}\n\nconst SEVERITY_RANK: Record<string, number> = {\n info: 0,\n low: 1,\n medium: 2,\n high: 3,\n critical: 4,\n};\n\nasync function ensureTransporter(config: SmtpConfig): Promise<Mailer | null> {\n if (!config.host || !config.from) return null;\n if (transporter) return transporter;\n\n if (!nodemailer) {\n try {\n nodemailer = await import('nodemailer');\n } catch {\n return null;\n }\n }\n\n transporter = nodemailer.createTransport({\n host: config.host,\n port: config.port ?? 587,\n secure: config.secure ?? false,\n auth: config.user && config.pass ? { user: config.user, pass: config.pass } : undefined,\n });\n return transporter;\n}\n\nfunction meetsSeverity(event: ThreatEvent, min?: SmtpConfig['min_severity']): boolean {\n if (!min) return true;\n return (SEVERITY_RANK[event.severity] ?? 0) >= (SEVERITY_RANK[min] ?? 0);\n}\n\nfunction renderBody(event: ThreatEvent): { text: string; html: string } {\n const ts = event.timestamp.toISOString();\n const ip = event.source_ip ? `\\nSource IP: ${event.source_ip}` : '';\n const text =\n `[${event.severity.toUpperCase()}] ${event.module}\\n\\n` +\n `${event.message}${ip}\\n\\n` +\n `When: ${ts}\\nCategory: ${event.category}`;\n const html =\n `<div style=\"font-family:system-ui,sans-serif;line-height:1.5\">` +\n `<h2 style=\"margin:0 0 8px\">⚠ ${event.severity.toUpperCase()} — ${event.module}</h2>` +\n `<p>${event.message}</p>` +\n (event.source_ip ? `<p><strong>Source IP:</strong> <code>${event.source_ip}</code></p>` : '') +\n `<p style=\"color:#888;margin-top:16px\"><small>${ts} · ${event.category}</small></p>` +\n `</div>`;\n return { text, html };\n}\n\nexport function smtpChannel(config: SmtpConfig): (event: ThreatEvent) => Promise<void> {\n return async (event) => {\n if (!meetsSeverity(event, config.min_severity)) return;\n const t = await ensureTransporter(config);\n if (!t) return;\n\n const to = Array.isArray(config.to) ? config.to.join(', ') : config.to;\n if (!to) return;\n\n const { text, html } = renderBody(event);\n await t.sendMail({\n from: config.from,\n to,\n subject: `[ThreatCrush ${event.severity}] ${event.module} — ${event.message.slice(0, 60)}`,\n text,\n html,\n });\n };\n}\n","import type { ThreatEvent } from '../../types/events.js';\n\nexport interface DiscordConfig {\n webhook_url: string;\n min_severity?: 'low' | 'medium' | 'high' | 'critical';\n}\n\nconst SEVERITY_RANK: Record<string, number> = {\n info: 0, low: 1, medium: 2, high: 3, critical: 4,\n};\n\nconst SEVERITY_COLORS: Record<string, number> = {\n info: 0x2ecc71, // green\n low: 0x3498db, // blue\n medium: 0xf39c12, // orange\n high: 0xe74c3c, // red\n critical: 0x9b59b6, // purple\n};\n\nexport function discordChannel(config: DiscordConfig): (event: ThreatEvent) => Promise<void> {\n return async (event) => {\n if (config.min_severity) {\n const eventRank = SEVERITY_RANK[event.severity] ?? 0;\n const minRank = SEVERITY_RANK[config.min_severity] ?? 0;\n if (eventRank < minRank) return;\n }\n\n const embed = {\n title: `${event.severity === 'critical' ? '🚨' : '⚠️'} [${event.severity.toUpperCase()}] ${event.module}`,\n description: event.message,\n color: SEVERITY_COLORS[event.severity] ?? 0xffffff,\n fields: [\n ...(event.source_ip ? [{ name: 'Source IP', value: `\\`${event.source_ip}\\``, inline: true }] : []),\n { name: 'Category', value: event.category, inline: true },\n { name: 'Time', value: event.timestamp.toISOString(), inline: true },\n ],\n footer: { text: 'ThreatCrush Security Alert' },\n };\n\n await fetch(config.webhook_url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ embeds: [embed] }),\n });\n };\n}\n","import type { ThreatEvent } from '../../types/events.js';\n\nexport interface PagerDutyConfig {\n routing_key: string;\n min_severity?: 'low' | 'medium' | 'high' | 'critical';\n}\n\nconst SEVERITY_RANK: Record<string, number> = {\n info: 0, low: 1, medium: 2, high: 3, critical: 4,\n};\n\n// Map ThreatCrush severity to PagerDuty severity\nconst PD_SEVERITY: Record<string, string> = {\n info: 'info',\n low: 'info',\n medium: 'warning',\n high: 'error',\n critical: 'critical',\n};\n\nexport function pagerdutyChannel(config: PagerDutyConfig): (event: ThreatEvent) => Promise<void> {\n return async (event) => {\n if (config.min_severity) {\n const eventRank = SEVERITY_RANK[event.severity] ?? 0;\n const minRank = SEVERITY_RANK[config.min_severity] ?? 0;\n if (eventRank < minRank) return;\n }\n\n const payload = {\n routing_key: config.routing_key,\n event_action: 'trigger',\n payload: {\n summary: `[${event.severity.toUpperCase()}] ${event.module}: ${event.message}`,\n source: 'threatcrush',\n severity: PD_SEVERITY[event.severity] || 'warning',\n timestamp: event.timestamp.toISOString(),\n custom_details: {\n module: event.module,\n category: event.category,\n source_ip: event.source_ip,\n details: event.details,\n },\n },\n };\n\n await fetch('https://events.pagerduty.com/v2/enqueue', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n });\n };\n}\n","import type { ThreatCrushConfig, AlertChannelConfig } from '../../types/config.js';\nimport type { ThreatEvent } from '../../types/events.js';\nimport type { EventBus } from '../event-bus.js';\nimport { smtpChannel, type SmtpConfig } from './smtp.js';\nimport { discordChannel, type DiscordConfig } from './discord.js';\nimport { pagerdutyChannel, type PagerDutyConfig } from './pagerduty.js';\n\ntype Channel = (event: ThreatEvent) => Promise<void>;\n\nexport class AlertDispatcher {\n private channels: Channel[] = [];\n private rateLimits = new Map<string, number[]>();\n\n constructor(private bus: EventBus, private config: ThreatCrushConfig) {\n this.bindChannels();\n bus.on('alert', (event) => { void this.dispatch(event); });\n }\n\n private bindChannels(): void {\n const alerts = this.config.alerts || {};\n for (const [name, raw] of Object.entries(alerts)) {\n const cfg = raw as AlertChannelConfig;\n if (!cfg.enabled) continue;\n if (name === 'webhook' && typeof cfg.url === 'string') {\n this.channels.push(webhookChannel(cfg.url, cfg.secret as string | undefined));\n }\n if (name === 'slack' && typeof cfg.webhook_url === 'string') {\n this.channels.push(slackChannel(cfg.webhook_url));\n }\n if (name === 'email' && typeof cfg.host === 'string' && typeof cfg.from === 'string') {\n this.channels.push(smtpChannel(cfg as unknown as SmtpConfig));\n }\n if (name === 'discord' && typeof cfg.webhook_url === 'string') {\n this.channels.push(discordChannel(cfg as unknown as DiscordConfig));\n }\n if (name === 'pagerduty' && typeof cfg.routing_key === 'string') {\n this.channels.push(pagerdutyChannel(cfg as unknown as PagerDutyConfig));\n }\n }\n }\n\n private checkRateLimit(channelIdx: number, maxPerHour: number = 60): boolean {\n const key = String(channelIdx);\n const now = Date.now();\n const hour = 3600_000;\n let timestamps = this.rateLimits.get(key) || [];\n timestamps = timestamps.filter(t => t > now - hour);\n if (timestamps.length >= maxPerHour) return false;\n timestamps.push(now);\n this.rateLimits.set(key, timestamps);\n return true;\n }\n\n private async dispatch(event: ThreatEvent): Promise<void> {\n await Promise.all(this.channels.map((ch, idx) => {\n if (!this.checkRateLimit(idx)) return Promise.resolve();\n return ch(event).catch(() => {});\n }));\n }\n}\n\nfunction webhookChannel(url: string, secret?: string): Channel {\n return async (event) => {\n const body = JSON.stringify({ event });\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n if (secret) headers['X-Threatcrush-Signature'] = secret;\n await fetch(url, { method: 'POST', headers, body });\n };\n}\n\nfunction slackChannel(webhookUrl: string): Channel {\n return async (event) => {\n const emoji = event.severity === 'critical' ? ':rotating_light:' : ':warning:';\n const text = `${emoji} *[${event.severity.toUpperCase()}]* \\`${event.module}\\` — ${event.message}${event.source_ip ? ` (from ${event.source_ip})` : ''}`;\n await fetch(webhookUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ text }),\n });\n };\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync, chmodSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\n\nexport const CLI_CONFIG_DIR = join(homedir(), '.threatcrush');\nexport const CLI_CONFIG_PATH = join(CLI_CONFIG_DIR, 'config.json');\n\nexport interface CliConfig {\n email?: string;\n user_id?: string;\n token?: string;\n refresh_token?: string;\n expires_at?: number;\n display_name?: string;\n current_org_id?: string;\n current_org_slug?: string;\n}\n\nexport function readCliConfig(): CliConfig {\n try {\n return JSON.parse(readFileSync(CLI_CONFIG_PATH, 'utf-8')) as CliConfig;\n } catch {\n return {};\n }\n}\n\nexport function writeCliConfig(config: CliConfig): void {\n if (!existsSync(CLI_CONFIG_DIR)) mkdirSync(CLI_CONFIG_DIR, { recursive: true });\n writeFileSync(CLI_CONFIG_PATH, JSON.stringify(config, null, 2), 'utf-8');\n try { chmodSync(CLI_CONFIG_PATH, 0o600); } catch { /* non-posix */ }\n}\n\nexport function updateCliConfig(patch: Partial<CliConfig>): CliConfig {\n const current = readCliConfig();\n const next = { ...current, ...patch };\n writeCliConfig(next);\n return next;\n}\n\nexport function clearCliConfig(keys?: Array<keyof CliConfig>): void {\n const current = readCliConfig();\n if (!keys) {\n writeCliConfig({});\n return;\n }\n for (const key of keys) delete current[key];\n writeCliConfig(current);\n}\n\nexport function isLoggedIn(): boolean {\n const cfg = readCliConfig();\n if (!cfg.token) return false;\n if (cfg.expires_at && cfg.expires_at * 1000 < Date.now()) return false;\n return true;\n}\n\nexport function authHeaders(): Record<string, string> {\n const cfg = readCliConfig();\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n if (cfg.token) headers['Authorization'] = `Bearer ${cfg.token}`;\n return headers;\n}\n","import { readdirSync, readFileSync, statSync, existsSync } from 'node:fs';\nimport { join, relative, extname } from 'node:path';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { banner, logger } from '../core/logger.js';\nimport type { RunResult, StructuredFinding } from '../core/run-result.js';\nimport { summarize } from '../core/run-result.js';\n\ninterface ScanFinding {\n file: string;\n line: number;\n type: string;\n severity: 'low' | 'medium' | 'high' | 'critical';\n message: string;\n snippet: string;\n}\n\n// Secret patterns\nconst SECRET_PATTERNS: Array<{\n name: string;\n pattern: RegExp;\n severity: 'medium' | 'high' | 'critical';\n}> = [\n { name: 'AWS Access Key', pattern: /(?:AKIA[0-9A-Z]{16})/g, severity: 'critical' },\n { name: 'AWS Secret Key', pattern: /(?:aws_secret_access_key|AWS_SECRET)\\s*[=:]\\s*['\"]?([A-Za-z0-9/+=]{40})['\"]?/gi, severity: 'critical' },\n { name: 'GitHub Token', pattern: /(?:ghp_[A-Za-z0-9]{36}|github_pat_[A-Za-z0-9_]{82})/g, severity: 'critical' },\n { name: 'Generic API Key', pattern: /(?:api[_-]?key|apikey)\\s*[=:]\\s*['\"]([A-Za-z0-9\\-_]{20,})['\"]?/gi, severity: 'high' },\n { name: 'Generic Secret', pattern: /(?:secret|password|passwd|pwd)\\s*[=:]\\s*['\"]([^'\"]{8,})['\"]?/gi, severity: 'high' },\n { name: 'Private Key', pattern: /-----BEGIN (?:RSA |EC |DSA )?PRIVATE KEY-----/g, severity: 'critical' },\n { name: 'JWT Token', pattern: /eyJ[A-Za-z0-9-_]+\\.eyJ[A-Za-z0-9-_]+\\.[A-Za-z0-9-_.+/=]*/g, severity: 'high' },\n { name: 'Slack Token', pattern: /xox[bpors]-[A-Za-z0-9-]{10,}/g, severity: 'critical' },\n { name: 'Stripe Key', pattern: /(?:sk_live_|pk_live_|sk_test_|pk_test_)[A-Za-z0-9]{20,}/g, severity: 'critical' },\n { name: 'Database URL', pattern: /(?:postgres|mysql|mongodb|redis):\\/\\/[^\\s'\"]+/gi, severity: 'high' },\n { name: 'Bearer Token', pattern: /Bearer\\s+[A-Za-z0-9\\-_\\.]{20,}/g, severity: 'medium' },\n { name: 'Hex Token (32+)', pattern: /(?:token|key|secret|auth)\\s*[=:]\\s*['\"]?([0-9a-f]{32,})['\"]?/gi, severity: 'medium' },\n];\n\n// File permission / misconfig checks\nconst MISCONFIG_FILES = [\n { pattern: '.env', message: '.env file found — may contain secrets' },\n { pattern: '.env.local', message: '.env.local file found — may contain secrets' },\n { pattern: '.env.production', message: '.env.production file found — may contain secrets' },\n { pattern: 'id_rsa', message: 'Private SSH key found' },\n { pattern: 'id_ed25519', message: 'Private SSH key found' },\n { pattern: '.pem', message: 'PEM certificate/key file found' },\n { pattern: '.p12', message: 'PKCS#12 keystore found' },\n { pattern: '.keystore', message: 'Keystore file found' },\n];\n\nconst SKIP_DIRS = new Set([\n 'node_modules', '.git', '.next', 'dist', 'build', '__pycache__',\n '.venv', 'vendor', '.terraform', 'coverage', '.cache',\n]);\n\nconst SCAN_EXTENSIONS = new Set([\n '.ts', '.js', '.tsx', '.jsx', '.py', '.rb', '.go', '.java',\n '.php', '.rs', '.c', '.cpp', '.h', '.yml', '.yaml', '.json',\n '.toml', '.ini', '.cfg', '.conf', '.env', '.sh', '.bash',\n '.tf', '.hcl', '.xml', '.properties', '.gradle',\n]);\n\nexport async function runScan(targetPath: string): Promise<RunResult> {\n const findings: ScanFinding[] = [];\n try {\n scanDirectory(targetPath, targetPath, findings, () => {});\n // Dependency CVE scan (PRD 06)\n const depFindings = await scanDependencies(targetPath);\n findings.push(...depFindings);\n } catch (err) {\n return {\n type: 'scan',\n target: targetPath,\n findings: [],\n severity_summary: { critical: 0, high: 0, medium: 0, low: 0, info: 0 },\n summary: `Scan failed: ${(err as Error).message}`,\n error: (err as Error).message,\n };\n }\n\n const structured: StructuredFinding[] = findings.map((f) => ({\n type: f.type,\n severity: f.severity,\n message: f.message,\n location: `${f.file}:${f.line}`,\n details: { file: f.file, line: f.line, snippet: f.snippet },\n }));\n const summary = summarize(structured);\n\n return {\n type: 'scan',\n target: targetPath,\n findings: structured,\n severity_summary: summary,\n summary: findings.length === 0\n ? 'No security issues found'\n : `${findings.length} issue(s): ${summary.critical}C ${summary.high}H ${summary.medium}M ${summary.low}L`,\n };\n}\n\nexport async function scanCommand(targetPath: string): Promise<RunResult> {\n banner();\n logger.info(`Scanning ${chalk.white(targetPath)} for security issues...\\n`);\n\n const spinner = ora({ text: 'Scanning files...', color: 'green' }).start();\n const findings: ScanFinding[] = [];\n let filesScanned = 0;\n\n try {\n scanDirectory(targetPath, targetPath, findings, () => {\n filesScanned++;\n spinner.text = `Scanning files... (${filesScanned} files)`;\n });\n } catch (err) {\n spinner.fail(`Scan failed: ${(err as Error).message}`);\n return {\n type: 'scan',\n target: targetPath,\n findings: [],\n severity_summary: { critical: 0, high: 0, medium: 0, low: 0, info: 0 },\n summary: `Scan failed: ${(err as Error).message}`,\n error: (err as Error).message,\n };\n }\n\n spinner.succeed(`Scanned ${filesScanned} files\\n`);\n\n const structured: StructuredFinding[] = findings.map((f) => ({\n type: f.type,\n severity: f.severity,\n message: f.message,\n location: `${f.file}:${f.line}`,\n details: { file: f.file, line: f.line, snippet: f.snippet },\n }));\n const sevCounts = summarize(structured);\n\n // Print results\n if (findings.length === 0) {\n console.log(chalk.green.bold(' ✓ No security issues found!'));\n console.log();\n return {\n type: 'scan',\n target: targetPath,\n findings: [],\n severity_summary: sevCounts,\n summary: `No issues found across ${filesScanned} files`,\n };\n }\n\n // Group by severity\n const critical = findings.filter((f) => f.severity === 'critical');\n const high = findings.filter((f) => f.severity === 'high');\n const medium = findings.filter((f) => f.severity === 'medium');\n const low = findings.filter((f) => f.severity === 'low');\n\n console.log(chalk.white.bold(' Scan Results'));\n console.log(chalk.gray(' ' + '─'.repeat(70)));\n console.log(\n ` ${chalk.red.bold(critical.length + ' critical')} ` +\n `${chalk.red(high.length + ' high')} ` +\n `${chalk.yellow(medium.length + ' medium')} ` +\n `${chalk.gray(low.length + ' low')}`,\n );\n console.log(chalk.gray(' ' + '─'.repeat(70)));\n console.log();\n\n const allFindings = [...critical, ...high, ...medium, ...low];\n for (const finding of allFindings) {\n const sev =\n finding.severity === 'critical' ? chalk.bgRed.white.bold(` ${finding.severity.toUpperCase()} `) :\n finding.severity === 'high' ? chalk.red(`[${finding.severity.toUpperCase()}]`) :\n finding.severity === 'medium' ? chalk.yellow(`[${finding.severity.toUpperCase()}]`) :\n chalk.gray(`[${finding.severity.toUpperCase()}]`);\n\n console.log(` ${sev} ${chalk.white.bold(finding.type)}`);\n console.log(` ${chalk.gray('File:')} ${chalk.cyan(finding.file)}:${chalk.yellow(String(finding.line))}`);\n console.log(` ${chalk.gray('Info:')} ${finding.message}`);\n if (finding.snippet) {\n // Redact the actual secret value\n const redacted = finding.snippet.replace(\n /(['\"]?)([A-Za-z0-9+/=\\-_]{16,})(['\"]?)/g,\n '$1' + chalk.red('*'.repeat(16)) + '$3',\n );\n console.log(` ${chalk.gray('Code:')} ${redacted.trim()}`);\n }\n console.log();\n }\n\n console.log(chalk.gray(' ' + '─'.repeat(70)));\n console.log(` ${chalk.white.bold(`${findings.length} issue(s) found`)} across ${filesScanned} files`);\n console.log();\n\n return {\n type: 'scan',\n target: targetPath,\n findings: structured,\n severity_summary: sevCounts,\n summary: `${findings.length} issue(s): ${sevCounts.critical}C ${sevCounts.high}H ${sevCounts.medium}M ${sevCounts.low}L`,\n };\n}\n\nfunction scanDirectory(\n basePath: string,\n currentPath: string,\n findings: ScanFinding[],\n onFile: () => void,\n): void {\n let entries;\n try {\n entries = readdirSync(currentPath, { withFileTypes: true });\n } catch {\n return; // Permission denied or similar\n }\n\n for (const entry of entries) {\n const fullPath = join(currentPath, entry.name);\n\n if (entry.isDirectory()) {\n if (SKIP_DIRS.has(entry.name)) continue;\n scanDirectory(basePath, fullPath, findings, onFile);\n continue;\n }\n\n if (!entry.isFile()) continue;\n\n // Check for misconfig files\n for (const mc of MISCONFIG_FILES) {\n if (entry.name === mc.pattern || entry.name.endsWith(mc.pattern)) {\n findings.push({\n file: relative(basePath, fullPath),\n line: 0,\n type: 'Sensitive File',\n severity: 'high',\n message: mc.message,\n snippet: '',\n });\n }\n }\n\n // Only scan text files with known extensions\n const ext = extname(entry.name).toLowerCase();\n if (!SCAN_EXTENSIONS.has(ext) && !entry.name.startsWith('.env')) continue;\n\n // Skip large files\n try {\n const stat = statSync(fullPath);\n if (stat.size > 1024 * 1024) continue; // Skip >1MB\n } catch {\n continue;\n }\n\n onFile();\n\n // Scan file content\n let content: string;\n try {\n content = readFileSync(fullPath, 'utf-8');\n } catch {\n continue;\n }\n\n const lines = content.split('\\n');\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n // Skip comments\n if (line.trim().startsWith('//') && !line.includes('password') && !line.includes('secret')) continue;\n\n for (const pattern of SECRET_PATTERNS) {\n pattern.pattern.lastIndex = 0;\n if (pattern.pattern.test(line)) {\n findings.push({\n file: relative(basePath, fullPath),\n line: i + 1,\n type: pattern.name,\n severity: pattern.severity,\n message: `Possible ${pattern.name} detected`,\n snippet: line.length > 120 ? line.slice(0, 120) + '...' : line,\n });\n }\n }\n }\n }\n}\n\n// ─── Dependency CVE Scanner (PRD 06) ───\n\ninterface OsvVulnerability {\n id: string;\n summary: string;\n details?: string;\n severity?: Array<{ type: string; score: string }>;\n affected?: Array<{ package: { name: string; ecosystem: string }; ranges?: Array<{ events: Array<{ introduced?: string; fixed?: string }> }> }>;\n}\n\nasync function scanDependencies(targetPath: string): Promise<ScanFinding[]> {\n const findings: ScanFinding[] = [];\n\n // Check for package-lock.json or package.json\n const lockfiles = [\n { file: 'package-lock.json', ecosystem: 'npm' },\n { file: 'pnpm-lock.yaml', ecosystem: 'npm' },\n { file: 'yarn.lock', ecosystem: 'npm' },\n { file: 'requirements.txt', ecosystem: 'PyPI' },\n { file: 'Pipfile.lock', ecosystem: 'PyPI' },\n ];\n\n for (const { file, ecosystem } of lockfiles) {\n const lockPath = join(targetPath, file);\n if (!existsSync(lockPath)) continue;\n\n try {\n const deps = parseDependencies(lockPath, file, ecosystem);\n for (const dep of deps.slice(0, 50)) { // Limit to 50 deps to avoid API flooding\n try {\n const vulns = await queryOsv(dep.name, dep.version, ecosystem);\n for (const vuln of vulns) {\n const cvssScore = vuln.severity?.find(s => s.type === 'CVSS_V3')?.score;\n const severity: ScanFinding['severity'] = cvssScore\n ? (parseFloat(cvssScore) >= 9 ? 'critical' : parseFloat(cvssScore) >= 7 ? 'high' : parseFloat(cvssScore) >= 4 ? 'medium' : 'low')\n : 'medium';\n\n findings.push({\n file: file,\n line: 0,\n type: 'Dependency CVE',\n severity,\n message: `${dep.name}@${dep.version}: ${vuln.summary || vuln.id}`,\n snippet: `${vuln.id}${cvssScore ? ` (CVSS: ${cvssScore})` : ''}`,\n });\n }\n } catch {\n // Skip individual dep query failures\n }\n }\n } catch {\n // Skip lockfile parse failures\n }\n }\n\n return findings;\n}\n\nfunction parseDependencies(lockPath: string, filename: string, ecosystem: string): Array<{ name: string; version: string }> {\n const deps: Array<{ name: string; version: string }> = [];\n\n if (filename === 'package-lock.json') {\n try {\n const lock = JSON.parse(readFileSync(lockPath, 'utf-8'));\n const packages = lock.packages || lock.dependencies || {};\n for (const [key, value] of Object.entries(packages)) {\n const name = key.replace(/^node_modules\\//, '');\n const version = (value as any).version;\n if (name && version && !name.startsWith('.')) {\n deps.push({ name, version });\n }\n }\n } catch { /* skip */ }\n } else if (filename === 'requirements.txt') {\n try {\n const content = readFileSync(lockPath, 'utf-8');\n for (const line of content.split('\\n')) {\n const match = line.match(/^([a-zA-Z0-9_.-]+)==([0-9.]+)/);\n if (match) deps.push({ name: match[1], version: match[2] });\n }\n } catch { /* skip */ }\n }\n\n return deps;\n}\n\n// Validate package name to prevent injection in OSV API queries\nfunction isValidPackageName(name: string): boolean {\n return /^[@a-zA-Z0-9_.\\-/]{1,214}$/.test(name);\n}\n\nfunction isValidVersion(version: string): boolean {\n return /^[0-9a-zA-Z._\\-+]{1,50}$/.test(version);\n}\n\nasync function queryOsv(name: string, version: string, ecosystem: string): Promise<OsvVulnerability[]> {\n // Sanitize inputs before sending to external API\n if (!isValidPackageName(name) || !isValidVersion(version)) return [];\n\n try {\n const res = await fetch('https://api.osv.dev/v1/query', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ package: { name, ecosystem }, version }),\n signal: AbortSignal.timeout(5000),\n });\n if (!res.ok) return [];\n const data = await res.json() as { vulns?: OsvVulnerability[] };\n return data.vulns || [];\n } catch {\n return [];\n }\n}\n","const ANSI_BACKGROUND_OFFSET = 10;\n\nconst wrapAnsi16 = (offset = 0) => code => `\\u001B[${code + offset}m`;\n\nconst wrapAnsi256 = (offset = 0) => code => `\\u001B[${38 + offset};5;${code}m`;\n\nconst wrapAnsi16m = (offset = 0) => (red, green, blue) => `\\u001B[${38 + offset};2;${red};${green};${blue}m`;\n\nconst styles = {\n\tmodifier: {\n\t\treset: [0, 0],\n\t\t// 21 isn't widely supported and 22 does the same thing\n\t\tbold: [1, 22],\n\t\tdim: [2, 22],\n\t\titalic: [3, 23],\n\t\tunderline: [4, 24],\n\t\toverline: [53, 55],\n\t\tinverse: [7, 27],\n\t\thidden: [8, 28],\n\t\tstrikethrough: [9, 29],\n\t},\n\tcolor: {\n\t\tblack: [30, 39],\n\t\tred: [31, 39],\n\t\tgreen: [32, 39],\n\t\tyellow: [33, 39],\n\t\tblue: [34, 39],\n\t\tmagenta: [35, 39],\n\t\tcyan: [36, 39],\n\t\twhite: [37, 39],\n\n\t\t// Bright color\n\t\tblackBright: [90, 39],\n\t\tgray: [90, 39], // Alias of `blackBright`\n\t\tgrey: [90, 39], // Alias of `blackBright`\n\t\tredBright: [91, 39],\n\t\tgreenBright: [92, 39],\n\t\tyellowBright: [93, 39],\n\t\tblueBright: [94, 39],\n\t\tmagentaBright: [95, 39],\n\t\tcyanBright: [96, 39],\n\t\twhiteBright: [97, 39],\n\t},\n\tbgColor: {\n\t\tbgBlack: [40, 49],\n\t\tbgRed: [41, 49],\n\t\tbgGreen: [42, 49],\n\t\tbgYellow: [43, 49],\n\t\tbgBlue: [44, 49],\n\t\tbgMagenta: [45, 49],\n\t\tbgCyan: [46, 49],\n\t\tbgWhite: [47, 49],\n\n\t\t// Bright color\n\t\tbgBlackBright: [100, 49],\n\t\tbgGray: [100, 49], // Alias of `bgBlackBright`\n\t\tbgGrey: [100, 49], // Alias of `bgBlackBright`\n\t\tbgRedBright: [101, 49],\n\t\tbgGreenBright: [102, 49],\n\t\tbgYellowBright: [103, 49],\n\t\tbgBlueBright: [104, 49],\n\t\tbgMagentaBright: [105, 49],\n\t\tbgCyanBright: [106, 49],\n\t\tbgWhiteBright: [107, 49],\n\t},\n};\n\nexport const modifierNames = Object.keys(styles.modifier);\nexport const foregroundColorNames = Object.keys(styles.color);\nexport const backgroundColorNames = Object.keys(styles.bgColor);\nexport const colorNames = [...foregroundColorNames, ...backgroundColorNames];\n\nfunction assembleStyles() {\n\tconst codes = new Map();\n\n\tfor (const [groupName, group] of Object.entries(styles)) {\n\t\tfor (const [styleName, style] of Object.entries(group)) {\n\t\t\tstyles[styleName] = {\n\t\t\t\topen: `\\u001B[${style[0]}m`,\n\t\t\t\tclose: `\\u001B[${style[1]}m`,\n\t\t\t};\n\n\t\t\tgroup[styleName] = styles[styleName];\n\n\t\t\tcodes.set(style[0], style[1]);\n\t\t}\n\n\t\tObject.defineProperty(styles, groupName, {\n\t\t\tvalue: group,\n\t\t\tenumerable: false,\n\t\t});\n\t}\n\n\tObject.defineProperty(styles, 'codes', {\n\t\tvalue: codes,\n\t\tenumerable: false,\n\t});\n\n\tstyles.color.close = '\\u001B[39m';\n\tstyles.bgColor.close = '\\u001B[49m';\n\n\tstyles.color.ansi = wrapAnsi16();\n\tstyles.color.ansi256 = wrapAnsi256();\n\tstyles.color.ansi16m = wrapAnsi16m();\n\tstyles.bgColor.ansi = wrapAnsi16(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi256 = wrapAnsi256(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi16m = wrapAnsi16m(ANSI_BACKGROUND_OFFSET);\n\n\t// From https://github.com/Qix-/color-convert/blob/3f0e0d4e92e235796ccb17f6e85c72094a651f49/conversions.js\n\tObject.defineProperties(styles, {\n\t\trgbToAnsi256: {\n\t\t\tvalue(red, green, blue) {\n\t\t\t\t// We use the extended greyscale palette here, with the exception of\n\t\t\t\t// black and white. normal palette only has 4 greyscale shades.\n\t\t\t\tif (red === green && green === blue) {\n\t\t\t\t\tif (red < 8) {\n\t\t\t\t\t\treturn 16;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (red > 248) {\n\t\t\t\t\t\treturn 231;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn Math.round(((red - 8) / 247) * 24) + 232;\n\t\t\t\t}\n\n\t\t\t\treturn 16\n\t\t\t\t\t+ (36 * Math.round(red / 255 * 5))\n\t\t\t\t\t+ (6 * Math.round(green / 255 * 5))\n\t\t\t\t\t+ Math.round(blue / 255 * 5);\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToRgb: {\n\t\t\tvalue(hex) {\n\t\t\t\tconst matches = /[a-f\\d]{6}|[a-f\\d]{3}/i.exec(hex.toString(16));\n\t\t\t\tif (!matches) {\n\t\t\t\t\treturn [0, 0, 0];\n\t\t\t\t}\n\n\t\t\t\tlet [colorString] = matches;\n\n\t\t\t\tif (colorString.length === 3) {\n\t\t\t\t\tcolorString = [...colorString].map(character => character + character).join('');\n\t\t\t\t}\n\n\t\t\t\tconst integer = Number.parseInt(colorString, 16);\n\n\t\t\t\treturn [\n\t\t\t\t\t/* eslint-disable no-bitwise */\n\t\t\t\t\t(integer >> 16) & 0xFF,\n\t\t\t\t\t(integer >> 8) & 0xFF,\n\t\t\t\t\tinteger & 0xFF,\n\t\t\t\t\t/* eslint-enable no-bitwise */\n\t\t\t\t];\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi256: {\n\t\t\tvalue: hex => styles.rgbToAnsi256(...styles.hexToRgb(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t\tansi256ToAnsi: {\n\t\t\tvalue(code) {\n\t\t\t\tif (code < 8) {\n\t\t\t\t\treturn 30 + code;\n\t\t\t\t}\n\n\t\t\t\tif (code < 16) {\n\t\t\t\t\treturn 90 + (code - 8);\n\t\t\t\t}\n\n\t\t\t\tlet red;\n\t\t\t\tlet green;\n\t\t\t\tlet blue;\n\n\t\t\t\tif (code >= 232) {\n\t\t\t\t\tred = (((code - 232) * 10) + 8) / 255;\n\t\t\t\t\tgreen = red;\n\t\t\t\t\tblue = red;\n\t\t\t\t} else {\n\t\t\t\t\tcode -= 16;\n\n\t\t\t\t\tconst remainder = code % 36;\n\n\t\t\t\t\tred = Math.floor(code / 36) / 5;\n\t\t\t\t\tgreen = Math.floor(remainder / 6) / 5;\n\t\t\t\t\tblue = (remainder % 6) / 5;\n\t\t\t\t}\n\n\t\t\t\tconst value = Math.max(red, green, blue) * 2;\n\n\t\t\t\tif (value === 0) {\n\t\t\t\t\treturn 30;\n\t\t\t\t}\n\n\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\tlet result = 30 + ((Math.round(blue) << 2) | (Math.round(green) << 1) | Math.round(red));\n\n\t\t\t\tif (value === 2) {\n\t\t\t\t\tresult += 60;\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\trgbToAnsi: {\n\t\t\tvalue: (red, green, blue) => styles.ansi256ToAnsi(styles.rgbToAnsi256(red, green, blue)),\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi: {\n\t\t\tvalue: hex => styles.ansi256ToAnsi(styles.hexToAnsi256(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t});\n\n\treturn styles;\n}\n\nconst ansiStyles = assembleStyles();\n\nexport default ansiStyles;\n","import process from 'node:process';\nimport os from 'node:os';\nimport tty from 'node:tty';\n\n// From: https://github.com/sindresorhus/has-flag/blob/main/index.js\n/// function hasFlag(flag, argv = globalThis.Deno?.args ?? process.argv) {\nfunction hasFlag(flag, argv = globalThis.Deno ? globalThis.Deno.args : process.argv) {\n\tconst prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');\n\tconst position = argv.indexOf(prefix + flag);\n\tconst terminatorPosition = argv.indexOf('--');\n\treturn position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);\n}\n\nconst {env} = process;\n\nlet flagForceColor;\nif (\n\thasFlag('no-color')\n\t|| hasFlag('no-colors')\n\t|| hasFlag('color=false')\n\t|| hasFlag('color=never')\n) {\n\tflagForceColor = 0;\n} else if (\n\thasFlag('color')\n\t|| hasFlag('colors')\n\t|| hasFlag('color=true')\n\t|| hasFlag('color=always')\n) {\n\tflagForceColor = 1;\n}\n\nfunction envForceColor() {\n\tif ('FORCE_COLOR' in env) {\n\t\tif (env.FORCE_COLOR === 'true') {\n\t\t\treturn 1;\n\t\t}\n\n\t\tif (env.FORCE_COLOR === 'false') {\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn env.FORCE_COLOR.length === 0 ? 1 : Math.min(Number.parseInt(env.FORCE_COLOR, 10), 3);\n\t}\n}\n\nfunction translateLevel(level) {\n\tif (level === 0) {\n\t\treturn false;\n\t}\n\n\treturn {\n\t\tlevel,\n\t\thasBasic: true,\n\t\thas256: level >= 2,\n\t\thas16m: level >= 3,\n\t};\n}\n\nfunction _supportsColor(haveStream, {streamIsTTY, sniffFlags = true} = {}) {\n\tconst noFlagForceColor = envForceColor();\n\tif (noFlagForceColor !== undefined) {\n\t\tflagForceColor = noFlagForceColor;\n\t}\n\n\tconst forceColor = sniffFlags ? flagForceColor : noFlagForceColor;\n\n\tif (forceColor === 0) {\n\t\treturn 0;\n\t}\n\n\tif (sniffFlags) {\n\t\tif (hasFlag('color=16m')\n\t\t\t|| hasFlag('color=full')\n\t\t\t|| hasFlag('color=truecolor')) {\n\t\t\treturn 3;\n\t\t}\n\n\t\tif (hasFlag('color=256')) {\n\t\t\treturn 2;\n\t\t}\n\t}\n\n\t// Check for Azure DevOps pipelines.\n\t// Has to be above the `!streamIsTTY` check.\n\tif ('TF_BUILD' in env && 'AGENT_NAME' in env) {\n\t\treturn 1;\n\t}\n\n\tif (haveStream && !streamIsTTY && forceColor === undefined) {\n\t\treturn 0;\n\t}\n\n\tconst min = forceColor || 0;\n\n\tif (env.TERM === 'dumb') {\n\t\treturn min;\n\t}\n\n\tif (process.platform === 'win32') {\n\t\t// Windows 10 build 10586 is the first Windows release that supports 256 colors.\n\t\t// Windows 10 build 14931 is the first release that supports 16m/TrueColor.\n\t\tconst osRelease = os.release().split('.');\n\t\tif (\n\t\t\tNumber(osRelease[0]) >= 10\n\t\t\t&& Number(osRelease[2]) >= 10_586\n\t\t) {\n\t\t\treturn Number(osRelease[2]) >= 14_931 ? 3 : 2;\n\t\t}\n\n\t\treturn 1;\n\t}\n\n\tif ('CI' in env) {\n\t\tif (['GITHUB_ACTIONS', 'GITEA_ACTIONS', 'CIRCLECI'].some(key => key in env)) {\n\t\t\treturn 3;\n\t\t}\n\n\t\tif (['TRAVIS', 'APPVEYOR', 'GITLAB_CI', 'BUILDKITE', 'DRONE'].some(sign => sign in env) || env.CI_NAME === 'codeship') {\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn min;\n\t}\n\n\tif ('TEAMCITY_VERSION' in env) {\n\t\treturn /^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;\n\t}\n\n\tif (env.COLORTERM === 'truecolor') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'xterm-kitty') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'xterm-ghostty') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'wezterm') {\n\t\treturn 3;\n\t}\n\n\tif ('TERM_PROGRAM' in env) {\n\t\tconst version = Number.parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);\n\n\t\tswitch (env.TERM_PROGRAM) {\n\t\t\tcase 'iTerm.app': {\n\t\t\t\treturn version >= 3 ? 3 : 2;\n\t\t\t}\n\n\t\t\tcase 'Apple_Terminal': {\n\t\t\t\treturn 2;\n\t\t\t}\n\t\t\t// No default\n\t\t}\n\t}\n\n\tif (/-256(color)?$/i.test(env.TERM)) {\n\t\treturn 2;\n\t}\n\n\tif (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {\n\t\treturn 1;\n\t}\n\n\tif ('COLORTERM' in env) {\n\t\treturn 1;\n\t}\n\n\treturn min;\n}\n\nexport function createSupportsColor(stream, options = {}) {\n\tconst level = _supportsColor(stream, {\n\t\tstreamIsTTY: stream && stream.isTTY,\n\t\t...options,\n\t});\n\n\treturn translateLevel(level);\n}\n\nconst supportsColor = {\n\tstdout: createSupportsColor({isTTY: tty.isatty(1)}),\n\tstderr: createSupportsColor({isTTY: tty.isatty(2)}),\n};\n\nexport default supportsColor;\n","// TODO: When targeting Node.js 16, use `String.prototype.replaceAll`.\nexport function stringReplaceAll(string, substring, replacer) {\n\tlet index = string.indexOf(substring);\n\tif (index === -1) {\n\t\treturn string;\n\t}\n\n\tconst substringLength = substring.length;\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\treturnValue += string.slice(endIndex, index) + substring + replacer;\n\t\tendIndex = index + substringLength;\n\t\tindex = string.indexOf(substring, endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.slice(endIndex);\n\treturn returnValue;\n}\n\nexport function stringEncaseCRLFWithFirstIndex(string, prefix, postfix, index) {\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\tconst gotCR = string[index - 1] === '\\r';\n\t\treturnValue += string.slice(endIndex, (gotCR ? index - 1 : index)) + prefix + (gotCR ? '\\r\\n' : '\\n') + postfix;\n\t\tendIndex = index + 1;\n\t\tindex = string.indexOf('\\n', endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.slice(endIndex);\n\treturn returnValue;\n}\n","import ansiStyles from '#ansi-styles';\nimport supportsColor from '#supports-color';\nimport { // eslint-disable-line import/order\n\tstringReplaceAll,\n\tstringEncaseCRLFWithFirstIndex,\n} from './utilities.js';\n\nconst {stdout: stdoutColor, stderr: stderrColor} = supportsColor;\n\nconst GENERATOR = Symbol('GENERATOR');\nconst STYLER = Symbol('STYLER');\nconst IS_EMPTY = Symbol('IS_EMPTY');\n\n// `supportsColor.level` → `ansiStyles.color[name]` mapping\nconst levelMapping = [\n\t'ansi',\n\t'ansi',\n\t'ansi256',\n\t'ansi16m',\n];\n\nconst styles = Object.create(null);\n\nconst applyOptions = (object, options = {}) => {\n\tif (options.level && !(Number.isInteger(options.level) && options.level >= 0 && options.level <= 3)) {\n\t\tthrow new Error('The `level` option should be an integer from 0 to 3');\n\t}\n\n\t// Detect level if not set manually\n\tconst colorLevel = stdoutColor ? stdoutColor.level : 0;\n\tobject.level = options.level === undefined ? colorLevel : options.level;\n};\n\nexport class Chalk {\n\tconstructor(options) {\n\t\t// eslint-disable-next-line no-constructor-return\n\t\treturn chalkFactory(options);\n\t}\n}\n\nconst chalkFactory = options => {\n\tconst chalk = (...strings) => strings.join(' ');\n\tapplyOptions(chalk, options);\n\n\tObject.setPrototypeOf(chalk, createChalk.prototype);\n\n\treturn chalk;\n};\n\nfunction createChalk(options) {\n\treturn chalkFactory(options);\n}\n\nObject.setPrototypeOf(createChalk.prototype, Function.prototype);\n\nfor (const [styleName, style] of Object.entries(ansiStyles)) {\n\tstyles[styleName] = {\n\t\tget() {\n\t\t\tconst builder = createBuilder(this, createStyler(style.open, style.close, this[STYLER]), this[IS_EMPTY]);\n\t\t\tObject.defineProperty(this, styleName, {value: builder});\n\t\t\treturn builder;\n\t\t},\n\t};\n}\n\nstyles.visible = {\n\tget() {\n\t\tconst builder = createBuilder(this, this[STYLER], true);\n\t\tObject.defineProperty(this, 'visible', {value: builder});\n\t\treturn builder;\n\t},\n};\n\nconst getModelAnsi = (model, level, type, ...arguments_) => {\n\tif (model === 'rgb') {\n\t\tif (level === 'ansi16m') {\n\t\t\treturn ansiStyles[type].ansi16m(...arguments_);\n\t\t}\n\n\t\tif (level === 'ansi256') {\n\t\t\treturn ansiStyles[type].ansi256(ansiStyles.rgbToAnsi256(...arguments_));\n\t\t}\n\n\t\treturn ansiStyles[type].ansi(ansiStyles.rgbToAnsi(...arguments_));\n\t}\n\n\tif (model === 'hex') {\n\t\treturn getModelAnsi('rgb', level, type, ...ansiStyles.hexToRgb(...arguments_));\n\t}\n\n\treturn ansiStyles[type][model](...arguments_);\n};\n\nconst usedModels = ['rgb', 'hex', 'ansi256'];\n\nfor (const model of usedModels) {\n\tstyles[model] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(getModelAnsi(model, levelMapping[level], 'color', ...arguments_), ansiStyles.color.close, this[STYLER]);\n\t\t\t\treturn createBuilder(this, styler, this[IS_EMPTY]);\n\t\t\t};\n\t\t},\n\t};\n\n\tconst bgModel = 'bg' + model[0].toUpperCase() + model.slice(1);\n\tstyles[bgModel] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(getModelAnsi(model, levelMapping[level], 'bgColor', ...arguments_), ansiStyles.bgColor.close, this[STYLER]);\n\t\t\t\treturn createBuilder(this, styler, this[IS_EMPTY]);\n\t\t\t};\n\t\t},\n\t};\n}\n\nconst proto = Object.defineProperties(() => {}, {\n\t...styles,\n\tlevel: {\n\t\tenumerable: true,\n\t\tget() {\n\t\t\treturn this[GENERATOR].level;\n\t\t},\n\t\tset(level) {\n\t\t\tthis[GENERATOR].level = level;\n\t\t},\n\t},\n});\n\nconst createStyler = (open, close, parent) => {\n\tlet openAll;\n\tlet closeAll;\n\tif (parent === undefined) {\n\t\topenAll = open;\n\t\tcloseAll = close;\n\t} else {\n\t\topenAll = parent.openAll + open;\n\t\tcloseAll = close + parent.closeAll;\n\t}\n\n\treturn {\n\t\topen,\n\t\tclose,\n\t\topenAll,\n\t\tcloseAll,\n\t\tparent,\n\t};\n};\n\nconst createBuilder = (self, _styler, _isEmpty) => {\n\t// Single argument is hot path, implicit coercion is faster than anything\n\t// eslint-disable-next-line no-implicit-coercion\n\tconst builder = (...arguments_) => applyStyle(builder, (arguments_.length === 1) ? ('' + arguments_[0]) : arguments_.join(' '));\n\n\t// We alter the prototype because we must return a function, but there is\n\t// no way to create a function with a different prototype\n\tObject.setPrototypeOf(builder, proto);\n\n\tbuilder[GENERATOR] = self;\n\tbuilder[STYLER] = _styler;\n\tbuilder[IS_EMPTY] = _isEmpty;\n\n\treturn builder;\n};\n\nconst applyStyle = (self, string) => {\n\tif (self.level <= 0 || !string) {\n\t\treturn self[IS_EMPTY] ? '' : string;\n\t}\n\n\tlet styler = self[STYLER];\n\n\tif (styler === undefined) {\n\t\treturn string;\n\t}\n\n\tconst {openAll, closeAll} = styler;\n\tif (string.includes('\\u001B')) {\n\t\twhile (styler !== undefined) {\n\t\t\t// Replace any instances already present with a re-opening code\n\t\t\t// otherwise only the part of the string until said closing code\n\t\t\t// will be colored, and the rest will simply be 'plain'.\n\t\t\tstring = stringReplaceAll(string, styler.close, styler.open);\n\n\t\t\tstyler = styler.parent;\n\t\t}\n\t}\n\n\t// We can move both next actions out of loop, because remaining actions in loop won't have\n\t// any/visible effect on parts we add here. Close the styling before a linebreak and reopen\n\t// after next line to fix a bleed issue on macOS: https://github.com/chalk/chalk/pull/92\n\tconst lfIndex = string.indexOf('\\n');\n\tif (lfIndex !== -1) {\n\t\tstring = stringEncaseCRLFWithFirstIndex(string, closeAll, openAll, lfIndex);\n\t}\n\n\treturn openAll + string + closeAll;\n};\n\nObject.defineProperties(createChalk.prototype, styles);\n\nconst chalk = createChalk();\nexport const chalkStderr = createChalk({level: stderrColor ? stderrColor.level : 0});\n\nexport {\n\tmodifierNames,\n\tforegroundColorNames,\n\tbackgroundColorNames,\n\tcolorNames,\n\n\t// TODO: Remove these aliases in the next major version\n\tmodifierNames as modifiers,\n\tforegroundColorNames as foregroundColors,\n\tbackgroundColorNames as backgroundColors,\n\tcolorNames as colors,\n} from './vendor/ansi-styles/index.js';\n\nexport {\n\tstdoutColor as supportsColor,\n\tstderrColor as supportsColorStderr,\n};\n\nexport default chalk;\n","import chalk from 'chalk';\nimport type { EventSeverity } from '../types/events.js';\n\nconst SEVERITY_COLORS: Record<EventSeverity, (s: string) => string> = {\n info: chalk.green,\n low: chalk.cyan,\n medium: chalk.yellow,\n high: chalk.red,\n critical: chalk.bgRed.white.bold,\n};\n\nconst LEVEL_COLORS: Record<string, (s: string) => string> = {\n debug: chalk.gray,\n info: chalk.green,\n warn: chalk.yellow,\n error: chalk.red,\n};\n\nexport function severityColor(severity: EventSeverity, text: string): string {\n return (SEVERITY_COLORS[severity] || chalk.white)(text);\n}\n\nexport function formatTimestamp(date: Date = new Date()): string {\n return chalk.gray(date.toISOString().replace('T', ' ').slice(0, 19));\n}\n\nexport function formatEvent(\n module: string,\n severity: EventSeverity,\n message: string,\n ip?: string,\n): string {\n const ts = formatTimestamp();\n const sev = severityColor(severity, `[${severity.toUpperCase()}]`.padEnd(10));\n const mod = chalk.cyan(`[${module}]`.padEnd(14));\n const src = ip ? chalk.magenta(` (${ip})`) : '';\n return `${ts} ${sev} ${mod} ${message}${src}`;\n}\n\nexport const logger = {\n debug: (msg: string) => console.log(`${formatTimestamp()} ${LEVEL_COLORS.debug('[DEBUG]')} ${msg}`),\n info: (msg: string) => console.log(`${formatTimestamp()} ${LEVEL_COLORS.info('[INFO]')} ${msg}`),\n warn: (msg: string) => console.log(`${formatTimestamp()} ${LEVEL_COLORS.warn('[WARN]')} ${msg}`),\n error: (msg: string) => console.error(`${formatTimestamp()} ${LEVEL_COLORS.error('[ERROR]')} ${msg}`),\n success: (msg: string) => console.log(`${formatTimestamp()} ${chalk.green('[OK]')} ${msg}`),\n threat: (msg: string, ip?: string) => {\n const src = ip ? chalk.magenta(` from ${ip}`) : '';\n console.log(`${formatTimestamp()} ${chalk.red.bold('[THREAT]')} ${chalk.red(msg)}${src}`);\n },\n};\n\nexport function banner(): void {\n console.log(chalk.green.bold(`\n ████████╗██╗ ██╗██████╗ ███████╗ █████╗ ████████╗ ██████╗██████╗ ██╗ ██╗███████╗██╗ ██╗\n ╚══██╔══╝██║ ██║██╔══██╗██╔════╝██╔══██╗╚══██╔══╝██╔════╝██╔══██╗██║ ██║██╔════╝██║ ██║\n ██║ ███████║██████╔╝█████╗ ███████║ ██║ ██║ ██████╔╝██║ ██║███████╗███████║\n ██║ ██╔══██║██╔══██╗██╔══╝ ██╔══██║ ██║ ██║ ██╔══██╗██║ ██║╚════██║██╔══██║\n ██║ ██║ ██║██║ ██║███████╗██║ ██║ ██║ ╚██████╗██║ ██║╚██████╔╝███████║██║ ██║\n ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝\n `));\n console.log(chalk.gray(' All-in-one security agent daemon — v0.1.0\\n'));\n}\n","import os from 'node:os';\n\nexport type Severity = 'critical' | 'high' | 'medium' | 'low' | 'info';\n\nexport interface StructuredFinding {\n type: string;\n severity: Severity;\n message: string;\n location?: string;\n details?: Record<string, unknown>;\n}\n\nexport interface RunResult {\n type: 'scan' | 'pentest';\n target: string;\n findings: StructuredFinding[];\n severity_summary: Record<Severity, number>;\n summary: string;\n error?: string;\n}\n\nexport function emptyCounts(): Record<Severity, number> {\n return { critical: 0, high: 0, medium: 0, low: 0, info: 0 };\n}\n\nexport function summarize(findings: StructuredFinding[]): Record<Severity, number> {\n const counts = emptyCounts();\n for (const f of findings) counts[f.severity] = (counts[f.severity] || 0) + 1;\n return counts;\n}\n\nexport function workerId(): string {\n return `${os.hostname()}/${process.pid}`;\n}\n","import { execSync } from 'node:child_process';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { banner, logger } from '../core/logger.js';\nimport type { RunResult, StructuredFinding } from '../core/run-result.js';\nimport { summarize } from '../core/run-result.js';\n\ninterface PentestResult {\n url: string;\n type: string;\n severity: 'low' | 'medium' | 'high' | 'critical';\n message: string;\n details?: string;\n}\n\n// Basic vulnerability tests\nconst PENTEST_CHECKS = [\n {\n name: 'XSS Reflected',\n test: (html: string) => /<script>alert\\(1\\)<\\/script>|<img\\s+src=x\\s+onerror=alert/i.test(html),\n severity: 'critical' as const,\n message: 'Reflected XSS payload rendered in response',\n },\n {\n name: 'Open Redirect',\n test: (url: string, body: string) => body.includes('location.href') || body.includes('window.location'),\n severity: 'medium' as const,\n message: 'Potential open redirect detected',\n },\n {\n name: 'Missing Security Headers',\n test: (_url: string, _body: string, headers: Record<string, string>) => {\n const required = ['x-content-type-options', 'x-frame-options', 'strict-transport-security'];\n const missing = required.filter(h => !headers[h.toLowerCase()]);\n return missing.length > 2;\n },\n severity: 'low' as const,\n message: 'Missing critical security headers (X-Content-Type-Options, X-Frame-Options, HSTS)',\n },\n {\n name: 'Server Version Disclosure',\n test: (_url: string, _body: string, headers: Record<string, string>) => {\n return !!(headers['server'] && /apache|nginx|iis|tomcat/i.test(headers['server']));\n },\n severity: 'low' as const,\n message: 'Server version disclosed in response header',\n },\n {\n name: 'Directory Listing',\n test: (html: string) => /Index of\\s*\\/|<title>Directory Listing/i.test(html),\n severity: 'medium' as const,\n message: 'Directory listing enabled',\n },\n {\n name: 'Error Page Information Disclosure',\n test: (html: string) => /stack trace|traceback|exception|at\\s+\\w+\\.\\w+\\(/i.test(html),\n severity: 'medium' as const,\n message: 'Error page reveals internal information',\n },\n // PRD 07: Additional checks\n {\n name: 'CORS Misconfiguration',\n test: (_url: string, _body: string, headers: Record<string, string>) => {\n const acao = headers['access-control-allow-origin'];\n return acao === '*' || acao === 'null';\n },\n severity: 'medium' as const,\n message: 'CORS allows any origin (Access-Control-Allow-Origin: *)',\n },\n {\n name: 'Cookie Security',\n test: (_url: string, _body: string, headers: Record<string, string>) => {\n const setCookie = headers['set-cookie'] || '';\n return setCookie.length > 0 && (!setCookie.includes('HttpOnly') || !setCookie.includes('Secure'));\n },\n severity: 'medium' as const,\n message: 'Cookies missing HttpOnly or Secure flags',\n },\n {\n name: 'Content Security Policy',\n test: (_url: string, _body: string, headers: Record<string, string>) => {\n return !headers['content-security-policy'];\n },\n severity: 'low' as const,\n message: 'No Content-Security-Policy header set',\n },\n {\n name: 'Sensitive Path Exposure',\n test: (html: string) => /\\.env|wp-admin|phpinfo|\\.git\\/config|server-status/i.test(html),\n severity: 'high' as const,\n message: 'Response references sensitive paths or admin endpoints',\n },\n];\n\nexport async function runPentest(rawUrl: string): Promise<RunResult> {\n const targetUrl = rawUrl.startsWith('http') ? rawUrl : `https://${rawUrl}`;\n const results = await collectPentestResults(targetUrl);\n const structured: StructuredFinding[] = results.map((r) => ({\n type: r.type,\n severity: r.severity === 'low' ? 'low' : (r.severity as StructuredFinding['severity']),\n message: r.message,\n location: r.url,\n details: r.details ? { detail: r.details } : undefined,\n }));\n const counts = summarize(structured);\n return {\n type: 'pentest',\n target: targetUrl,\n findings: structured,\n severity_summary: counts,\n summary: structured.length === 0\n ? 'No vulnerabilities detected'\n : `${structured.length} issue(s): ${counts.critical}C ${counts.high}H ${counts.medium}M ${counts.low}L`,\n };\n}\n\nasync function collectPentestResults(targetUrl: string): Promise<PentestResult[]> {\n const results: PentestResult[] = [];\n try {\n const resp = await fetch(targetUrl, { redirect: 'manual' });\n const headers: Record<string, string> = {};\n resp.headers.forEach((v, k) => { headers[k] = v; });\n const body = await resp.text();\n for (const check of PENTEST_CHECKS) {\n try {\n if (check.test(body, body, headers)) {\n results.push({ url: targetUrl, type: check.name, severity: check.severity, message: check.message });\n }\n } catch { /* skip */ }\n }\n } catch {\n return results;\n }\n\n const sqliPayloads = [\"' OR 1=1--\", \"1' UNION SELECT NULL--\", \"' AND '1'='1\"];\n for (const payload of sqliPayloads) {\n try {\n const testUrl = `${targetUrl}?id=${encodeURIComponent(payload)}`;\n const resp = await fetch(testUrl, { redirect: 'manual', signal: AbortSignal.timeout(5000) });\n const body = await resp.text();\n if (/sql\\s+(syntax|error|exception)|mysql|postgres|ORA-\\d+/i.test(body)) {\n results.push({ url: testUrl, type: 'SQL Injection', severity: 'critical', message: `SQL error with payload: ${payload}` });\n }\n } catch { /* skip */ }\n }\n\n const traversalPaths = ['../../etc/passwd', '..%2F..%2Fetc%2Fpasswd', '....//....//etc/passwd'];\n for (const path of traversalPaths) {\n try {\n const testUrl = `${targetUrl}/${path}`;\n const resp = await fetch(testUrl, { redirect: 'manual', signal: AbortSignal.timeout(5000) });\n const body = await resp.text();\n if (/root:.*:0:0:|daemon:.*:1:1:|nobody:.*:65534/i.test(body)) {\n results.push({ url: testUrl, type: 'Path Traversal', severity: 'critical', message: `Possible /etc/passwd disclosure: ${path}` });\n }\n } catch { /* skip */ }\n }\n\n const methods = ['OPTIONS', 'TRACE', 'DELETE', 'PUT'];\n for (const method of methods) {\n try {\n const resp = await fetch(targetUrl, { method, signal: AbortSignal.timeout(5000) });\n if (resp.status < 400 && method !== 'OPTIONS') {\n results.push({ url: targetUrl, type: `Unsafe HTTP Method: ${method}`, severity: 'medium', message: `${method} allowed (status ${resp.status})` });\n }\n if (method === 'OPTIONS') {\n const allow = resp.headers.get('allow');\n if (allow && /DELETE|PUT|TRACE/i.test(allow)) {\n results.push({ url: targetUrl, type: 'HTTP Methods', severity: 'low', message: `Allowed methods: ${allow}` });\n }\n }\n } catch { /* skip */ }\n }\n\n return results;\n}\n\nexport async function pentestCommand(targetUrl: string): Promise<RunResult> {\n banner();\n\n // Ensure URL has protocol\n if (!targetUrl.startsWith('http')) {\n targetUrl = `https://${targetUrl}`;\n }\n\n logger.info(`Penetration testing ${chalk.white(targetUrl)}...\\n`);\n\n const results: PentestResult[] = [];\n\n // Test 1: Basic response analysis\n const spinner = ora({ text: 'Fetching target...', color: 'green' }).start();\n try {\n const resp = await fetch(targetUrl, { redirect: 'manual' });\n const headers: Record<string, string> = {};\n resp.headers.forEach((v, k) => { headers[k] = v; });\n const body = await resp.text();\n\n spinner.succeed(`Got ${resp.status} response\\n`);\n\n // Run all checks\n for (const check of PENTEST_CHECKS) {\n try {\n if (check.test(body, body, headers)) {\n results.push({\n url: targetUrl,\n type: check.name,\n severity: check.severity,\n message: check.message,\n });\n }\n } catch {\n // Skip check on error\n }\n }\n } catch (err) {\n spinner.fail(`Failed to reach target: ${(err as Error).message}`);\n console.log(chalk.gray(' Check the URL and try again.\\n'));\n return {\n type: 'pentest',\n target: targetUrl,\n findings: [],\n severity_summary: { critical: 0, high: 0, medium: 0, low: 0, info: 0 },\n summary: `Failed to reach target: ${(err as Error).message}`,\n error: (err as Error).message,\n };\n }\n\n // Test 2: SQL injection probe\n const sqliSpinner = ora({ text: 'Testing SQL injection vectors...', color: 'green' }).start();\n const sqliPayloads = [\"' OR 1=1--\", \"1' UNION SELECT NULL--\", \"' AND '1'='1\"];\n for (const payload of sqliPayloads) {\n try {\n const testUrl = `${targetUrl}?id=${encodeURIComponent(payload)}`;\n const resp = await fetch(testUrl, { redirect: 'manual', signal: AbortSignal.timeout(5000) });\n const body = await resp.text();\n if (/sql\\s+(syntax|error|exception)|mysql|postgres|ORA-\\d+/i.test(body)) {\n results.push({\n url: testUrl,\n type: 'SQL Injection',\n severity: 'critical',\n message: `SQL error response detected with payload: ${payload}`,\n });\n }\n } catch {\n // Skip on timeout/network error\n }\n }\n sqliSpinner.succeed('SQL injection tests complete\\n');\n\n // Test 3: Path traversal probe\n const pathSpinner = ora({ text: 'Testing path traversal...', color: 'green' }).start();\n const traversalPaths = ['../../etc/passwd', '..%2F..%2Fetc%2Fpasswd', '....//....//etc/passwd'];\n for (const path of traversalPaths) {\n try {\n const testUrl = `${targetUrl}/${path}`;\n const resp = await fetch(testUrl, { redirect: 'manual', signal: AbortSignal.timeout(5000) });\n const body = await resp.text();\n if (/root:.*:0:0:|daemon:.*:1:1:|nobody:.*:65534/i.test(body)) {\n results.push({\n url: testUrl,\n type: 'Path Traversal',\n severity: 'critical',\n message: `Possible /etc/passwd disclosure via: ${path}`,\n });\n }\n } catch {\n // Skip on timeout/network error\n }\n }\n pathSpinner.succeed('Path traversal tests complete\\n');\n\n // Test 4: HTTP methods\n const methodSpinner = ora({ text: 'Testing HTTP methods...', color: 'green' }).start();\n const methods = ['OPTIONS', 'TRACE', 'DELETE', 'PUT'];\n for (const method of methods) {\n try {\n const resp = await fetch(targetUrl, { method, signal: AbortSignal.timeout(5000) });\n if (resp.status < 400 && method !== 'OPTIONS') {\n results.push({\n url: targetUrl,\n type: `Unsafe HTTP Method: ${method}`,\n severity: 'medium',\n message: `${method} method is allowed (status ${resp.status})`,\n });\n }\n if (method === 'OPTIONS') {\n const allow = resp.headers.get('allow');\n if (allow && /DELETE|PUT|TRACE/i.test(allow)) {\n results.push({\n url: targetUrl,\n type: 'HTTP Methods',\n severity: 'low',\n message: `Allowed methods: ${allow}`,\n });\n }\n }\n } catch {\n // Skip on error\n }\n }\n methodSpinner.succeed('HTTP method tests complete\\n');\n\n const structured: StructuredFinding[] = results.map((r) => ({\n type: r.type,\n severity: r.severity as StructuredFinding['severity'],\n message: r.message,\n location: r.url,\n details: r.details ? { detail: r.details } : undefined,\n }));\n const sevCounts = summarize(structured);\n\n // Print results\n if (results.length === 0) {\n console.log(chalk.green.bold(' ✓ No vulnerabilities detected in basic scan!'));\n console.log(chalk.dim(' Note: This is a basic scan. Full pentest requires manual review.\\n'));\n return {\n type: 'pentest',\n target: targetUrl,\n findings: [],\n severity_summary: sevCounts,\n summary: 'No vulnerabilities detected',\n };\n }\n\n const critical = results.filter(r => r.severity === 'critical');\n const high = results.filter(r => r.severity === 'high');\n const medium = results.filter(r => r.severity === 'medium');\n const low = results.filter(r => r.severity === 'low');\n\n console.log(chalk.white.bold(' Penetration Test Results'));\n console.log(chalk.gray(' ' + '─'.repeat(70)));\n console.log(\n ` ${chalk.red.bold(critical.length + ' critical')} ` +\n `${chalk.red(high.length + ' high')} ` +\n `${chalk.yellow(medium.length + ' medium')} ` +\n `${chalk.gray(low.length + ' low')}`,\n );\n console.log(chalk.gray(' ' + '─'.repeat(70)));\n console.log();\n\n const sorted = [...critical, ...high, ...medium, ...low];\n for (const r of sorted) {\n const sev =\n r.severity === 'critical' ? chalk.bgRed.white.bold(` ${r.severity.toUpperCase()} `) :\n r.severity === 'high' ? chalk.red(`[${r.severity.toUpperCase()}]`) :\n r.severity === 'medium' ? chalk.yellow(`[${r.severity.toUpperCase()}]`) :\n chalk.gray(`[${r.severity.toUpperCase()}]`);\n\n console.log(` ${sev} ${chalk.white.bold(r.type)}`);\n console.log(` ${chalk.gray('URL:')} ${chalk.cyan(r.url)}`);\n console.log(` ${chalk.gray('Info:')} ${r.message}`);\n if (r.details) console.log(` ${chalk.gray('Details:')} ${r.details}`);\n console.log();\n }\n\n console.log(chalk.gray(' ' + '─'.repeat(70)));\n console.log(` ${chalk.white.bold(`${results.length} issue(s) found`)}`);\n console.log(chalk.dim(' Note: This is an automated basic scan. Manual review recommended.\\n'));\n\n return {\n type: 'pentest',\n target: targetUrl,\n findings: structured,\n severity_summary: sevCounts,\n summary: `${results.length} issue(s): ${sevCounts.critical}C ${sevCounts.high}H ${sevCounts.medium}M ${sevCounts.low}L`,\n };\n}\n","import type { EventBus } from '../event-bus.js';\nimport { readCliConfig, authHeaders, isLoggedIn } from '../../core/cli-config.js';\nimport { runScan } from '../../commands/scan.js';\nimport { runPentest } from '../../commands/pentest.js';\nimport { workerId, type RunResult } from '../../core/run-result.js';\n\nconst API_URL = process.env.THREATCRUSH_API_URL || 'https://threatcrush.com';\nconst POLL_INTERVAL_MS = 30_000;\nconst SCHEDULE_INTERVAL_MS = 120_000;\n\ninterface ClaimedRun {\n id: string;\n org_id: string;\n property_id: string;\n type: 'scan' | 'pentest';\n property: { id: string; name: string; kind: string; target: string } | null;\n}\n\n/**\n * Polls the server for queued property runs belonging to orgs the logged-in\n * user is a member of, claims them atomically, executes them locally, and\n * posts the result back.\n *\n * No-op unless `~/.threatcrush/config.json` contains a valid bearer token.\n */\nexport class RunsWorker {\n private pollTimer: NodeJS.Timeout | null = null;\n private scheduleTimer: NodeJS.Timeout | null = null;\n private running = false;\n private orgIds: string[] = [];\n\n constructor(private bus: EventBus) {}\n\n async start(): Promise<void> {\n if (!isLoggedIn()) return;\n\n try {\n await this.refreshOrgs();\n } catch {\n // First fetch may fail if the network is down; the tick loop will retry.\n }\n\n this.bus.announceModule('runs-worker', 'running', `poll ${POLL_INTERVAL_MS / 1000}s`);\n this.tick();\n this.scheduleTick();\n this.pollTimer = setInterval(() => this.tick(), POLL_INTERVAL_MS);\n this.scheduleTimer = setInterval(() => this.scheduleTick(), SCHEDULE_INTERVAL_MS);\n }\n\n stop(): void {\n if (this.pollTimer) clearInterval(this.pollTimer);\n if (this.scheduleTimer) clearInterval(this.scheduleTimer);\n this.pollTimer = null;\n this.scheduleTimer = null;\n this.bus.announceModule('runs-worker', 'stopped');\n }\n\n private async scheduleTick(): Promise<void> {\n if (!isLoggedIn()) return;\n try {\n if (this.orgIds.length === 0) await this.refreshOrgs();\n for (const orgId of this.orgIds) {\n try {\n await fetch(`${API_URL}/api/orgs/${orgId}/schedules/tick`, {\n method: 'POST',\n headers: authHeaders(),\n });\n } catch {\n // ignore transient network errors\n }\n }\n } catch {\n // swallow — retry next interval\n }\n }\n\n private async tick(): Promise<void> {\n if (this.running) return;\n if (!isLoggedIn()) return;\n\n this.running = true;\n try {\n if (this.orgIds.length === 0) await this.refreshOrgs();\n for (const orgId of this.orgIds) {\n const claimed = await this.claimOne(orgId);\n if (!claimed) continue;\n\n const result = await this.execute(claimed);\n await this.finalize(orgId, claimed, result);\n }\n } catch {\n // swallow — we'll try again on the next tick\n } finally {\n this.running = false;\n }\n }\n\n private async refreshOrgs(): Promise<void> {\n const res = await fetch(`${API_URL}/api/orgs`, { headers: authHeaders() });\n if (!res.ok) return;\n const data = await res.json() as { organizations?: Array<{ id: string }> };\n this.orgIds = (data.organizations || []).map((o) => o.id);\n }\n\n private async claimOne(orgId: string): Promise<ClaimedRun | null> {\n try {\n const res = await fetch(`${API_URL}/api/orgs/${orgId}/runs/pending`, {\n method: 'POST',\n headers: authHeaders(),\n body: JSON.stringify({ worker_id: workerId() }),\n });\n if (!res.ok) return null;\n const data = await res.json() as { run?: ClaimedRun | null };\n return data.run ?? null;\n } catch {\n return null;\n }\n }\n\n private async execute(run: ClaimedRun): Promise<RunResult> {\n const target = run.property?.target;\n if (!target) {\n return {\n type: run.type,\n target: '',\n findings: [],\n severity_summary: { critical: 0, high: 0, medium: 0, low: 0, info: 0 },\n summary: 'property target missing',\n error: 'property target missing',\n };\n }\n\n this.bus.announceModule('runs-worker', 'running', `${run.type} ${run.property?.name || target}`);\n\n try {\n if (run.type === 'scan') return await runScan(target);\n return await runPentest(target);\n } catch (err) {\n return {\n type: run.type,\n target,\n findings: [],\n severity_summary: { critical: 0, high: 0, medium: 0, low: 0, info: 0 },\n summary: `failed: ${(err as Error).message}`,\n error: (err as Error).message,\n };\n }\n }\n\n private async finalize(orgId: string, claimed: ClaimedRun, result: RunResult): Promise<void> {\n try {\n await fetch(\n `${API_URL}/api/orgs/${orgId}/properties/${claimed.property_id}/runs/${claimed.id}`,\n {\n method: 'PATCH',\n headers: authHeaders(),\n body: JSON.stringify({\n status: result.error ? 'failed' : 'succeeded',\n findings_count: result.findings.length,\n severity_summary: result.severity_summary,\n summary: result.summary,\n findings: result.findings,\n error: result.error,\n source: 'daemon',\n worker_id: workerId(),\n }),\n },\n );\n } catch {\n // best-effort\n } finally {\n this.bus.announceModule('runs-worker', 'idle');\n }\n }\n}\n","import type { ThreatEvent, EventSeverity } from '../../types/events.js';\n\nexport interface DetectionRule {\n id: string;\n title: string;\n description: string;\n version: string;\n category: string;\n severity: EventSeverity;\n source_types: string[];\n match: RuleMatch;\n threshold: number;\n window_seconds: number;\n cooldown_seconds: number;\n tags: string[];\n remediation?: {\n action?: string;\n ttl_seconds?: number;\n description?: string;\n };\n enabled: boolean;\n}\n\nexport interface RuleMatch {\n field: string;\n operator: 'contains' | 'regex' | 'equals' | 'starts_with' | 'ends_with';\n value: string;\n and?: RuleMatch[];\n or?: RuleMatch[];\n}\n\ninterface EventWindow {\n events: Array<{ timestamp: number; event: ThreatEvent }>;\n lastAlert: number;\n}\n\nexport class RuleEngine {\n private rules: DetectionRule[] = [];\n private windows = new Map<string, EventWindow>();\n\n constructor(private onDetection: (detection: {\n rule_id: string;\n severity: EventSeverity;\n title: string;\n description: string;\n source_ip?: string;\n username?: string;\n raw_metadata?: Record<string, unknown>;\n }) => void) {}\n\n loadRules(rules: DetectionRule[]): void {\n this.rules = rules.filter(r => r.enabled !== false);\n }\n\n getRules(): DetectionRule[] {\n return [...this.rules];\n }\n\n evaluate(event: ThreatEvent): void {\n const now = Date.now();\n\n for (const rule of this.rules) {\n // Check source type match\n if (rule.source_types.length > 0 && !rule.source_types.includes(event.module) && !rule.source_types.includes(event.category)) {\n continue;\n }\n\n // Check match conditions\n if (!this.matchesCondition(event, rule.match)) continue;\n\n // Window key: rule_id + source_ip (or 'global')\n const windowKey = `${rule.id}:${event.source_ip || 'global'}`;\n let window = this.windows.get(windowKey);\n if (!window) {\n window = { events: [], lastAlert: 0 };\n this.windows.set(windowKey, window);\n }\n\n // Add event to window\n window.events.push({ timestamp: now, event });\n\n // Prune old events outside window\n const cutoff = now - (rule.window_seconds * 1000);\n window.events = window.events.filter(e => e.timestamp >= cutoff);\n\n // Check threshold\n if (window.events.length < rule.threshold) continue;\n\n // Check cooldown\n if (window.lastAlert > 0 && (now - window.lastAlert) < (rule.cooldown_seconds * 1000)) continue;\n\n // Fire detection\n window.lastAlert = now;\n window.events = []; // Reset window after detection\n\n this.onDetection({\n rule_id: rule.id,\n severity: rule.severity,\n title: rule.title,\n description: `${rule.description} (${rule.threshold} events in ${rule.window_seconds}s)`,\n source_ip: event.source_ip,\n username: event.details?.user as string || undefined,\n raw_metadata: {\n rule_version: rule.version,\n tags: rule.tags,\n category: rule.category,\n remediation: rule.remediation,\n },\n });\n }\n }\n\n private matchesCondition(event: ThreatEvent, match: RuleMatch): boolean {\n const fieldValue = this.getFieldValue(event, match.field);\n if (fieldValue === undefined) return false;\n\n const strValue = String(fieldValue);\n let result = false;\n\n switch (match.operator) {\n case 'contains':\n result = strValue.toLowerCase().includes(String(match.value).toLowerCase());\n break;\n case 'regex':\n try { result = new RegExp(String(match.value), 'i').test(strValue); } catch { result = false; }\n break;\n case 'equals':\n result = strValue === String(match.value);\n break;\n case 'starts_with':\n result = strValue.startsWith(String(match.value));\n break;\n case 'ends_with':\n result = strValue.endsWith(String(match.value));\n break;\n }\n\n // AND conditions\n if (result && match.and) {\n result = match.and.every(m => this.matchesCondition(event, m));\n }\n\n // OR conditions\n if (!result && match.or) {\n result = match.or.some(m => this.matchesCondition(event, m));\n }\n\n return result;\n }\n\n private getFieldValue(event: ThreatEvent, field: string): unknown {\n switch (field) {\n case 'message': return event.message;\n case 'severity': return event.severity;\n case 'module': return event.module;\n case 'category': return event.category;\n case 'source_ip': return event.source_ip;\n default:\n return event.details?.[field];\n }\n }\n\n // Periodic cleanup of stale windows\n cleanup(): void {\n const now = Date.now();\n for (const [key, window] of this.windows.entries()) {\n if (window.events.length === 0 && (now - window.lastAlert) > 3600_000) {\n this.windows.delete(key);\n }\n }\n }\n}\n","import { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { DetectionRule } from './engine.js';\nimport { DEFAULT_RULES } from './default-rules.js';\n\nconst RULES_DIR = '/etc/threatcrush/rules.d';\n\nexport function loadAllRules(customDir?: string): DetectionRule[] {\n const rules = [...DEFAULT_RULES];\n const dir = customDir || RULES_DIR;\n\n if (existsSync(dir)) {\n const files = readdirSync(dir).filter(f => f.endsWith('.json'));\n for (const file of files) {\n try {\n const raw = readFileSync(join(dir, file), 'utf-8');\n const parsed = JSON.parse(raw);\n const customRules: DetectionRule[] = Array.isArray(parsed) ? parsed : [parsed];\n for (const rule of customRules) {\n if (!rule.id || !rule.title || !rule.match) {\n console.warn(`[rules] skipping invalid rule in ${file}: missing required fields`);\n continue;\n }\n const existingIdx = rules.findIndex(r => r.id === rule.id);\n if (existingIdx >= 0) {\n rules[existingIdx] = { ...rules[existingIdx], ...rule };\n } else {\n rules.push(rule);\n }\n }\n } catch (err) {\n console.warn(`[rules] failed to load ${file}: ${(err as Error).message}`);\n }\n }\n }\n\n return rules;\n}\n","import type { DetectionRule } from './engine.js';\n\nexport const DEFAULT_RULES: DetectionRule[] = [\n {\n id: 'ssh-brute-force',\n title: 'SSH Brute Force Detected',\n description: 'Multiple failed SSH login attempts from the same source',\n version: '1.0.0',\n category: 'auth',\n severity: 'high',\n source_types: ['ssh-guard', 'auth'],\n match: {\n field: 'message',\n operator: 'regex',\n value: 'failed ssh login|invalid ssh user',\n },\n threshold: 5,\n window_seconds: 300,\n cooldown_seconds: 600,\n tags: ['ssh', 'brute-force', 'credential-stuffing'],\n remediation: {\n action: 'block',\n ttl_seconds: 3600,\n description: 'Block source IP for 1 hour',\n },\n enabled: true,\n },\n {\n id: 'ssh-success-after-failures',\n title: 'SSH Login After Failed Attempts',\n description: 'Successful SSH login from an IP that had recent failures',\n version: '1.0.0',\n category: 'auth',\n severity: 'critical',\n source_types: ['ssh-guard', 'auth'],\n match: {\n field: 'message',\n operator: 'contains',\n value: 'SSH login accepted',\n },\n threshold: 1,\n window_seconds: 60,\n cooldown_seconds: 300,\n tags: ['ssh', 'compromise-indicator'],\n enabled: true,\n },\n {\n id: 'ssh-root-login',\n title: 'Root SSH Login Attempt',\n description: 'Direct root login via SSH detected',\n version: '1.0.0',\n category: 'auth',\n severity: 'high',\n source_types: ['ssh-guard', 'auth'],\n match: {\n field: 'message',\n operator: 'regex',\n value: '(failed|accepted).*\\\\broot\\\\b',\n },\n threshold: 1,\n window_seconds: 60,\n cooldown_seconds: 300,\n tags: ['ssh', 'root-access'],\n remediation: {\n action: 'block',\n ttl_seconds: 7200,\n description: 'Block source IP attempting root login',\n },\n enabled: true,\n },\n {\n id: 'ssh-user-enumeration',\n title: 'SSH User Enumeration',\n description: 'Multiple SSH attempts with different usernames from same source',\n version: '1.0.0',\n category: 'auth',\n severity: 'high',\n source_types: ['ssh-guard', 'auth'],\n match: {\n field: 'message',\n operator: 'contains',\n value: 'Invalid SSH user',\n },\n threshold: 3,\n window_seconds: 120,\n cooldown_seconds: 600,\n tags: ['ssh', 'enumeration', 'reconnaissance'],\n remediation: {\n action: 'block',\n ttl_seconds: 3600,\n description: 'Block source IP performing user enumeration',\n },\n enabled: true,\n },\n {\n id: 'sudo-abuse',\n title: 'Sudo Authentication Failure',\n description: 'Repeated sudo authentication failures',\n version: '1.0.0',\n category: 'auth',\n severity: 'high',\n source_types: ['user-journal', 'system'],\n match: {\n field: 'message',\n operator: 'regex',\n value: 'sudo.*authentication failure|sudo.*incorrect password|sudo.*FAILED',\n },\n threshold: 3,\n window_seconds: 300,\n cooldown_seconds: 600,\n tags: ['sudo', 'privilege-escalation'],\n enabled: true,\n },\n {\n id: 'web-sqli-attack',\n title: 'SQL Injection Attack Detected',\n description: 'HTTP request with SQL injection patterns',\n version: '1.0.0',\n category: 'web',\n severity: 'critical',\n source_types: ['log-watcher', 'web'],\n match: {\n field: 'message',\n operator: 'contains',\n value: 'Attack detected [SQLI]',\n },\n threshold: 1,\n window_seconds: 60,\n cooldown_seconds: 300,\n tags: ['web', 'sqli', 'injection'],\n remediation: {\n action: 'block',\n ttl_seconds: 3600,\n description: 'Block source IP performing SQL injection',\n },\n enabled: true,\n },\n {\n id: 'web-path-traversal',\n title: 'Path Traversal Attack Detected',\n description: 'HTTP request with path traversal patterns',\n version: '1.0.0',\n category: 'web',\n severity: 'critical',\n source_types: ['log-watcher', 'web'],\n match: {\n field: 'message',\n operator: 'contains',\n value: 'Attack detected [PATH_TRAVERSAL]',\n },\n threshold: 1,\n window_seconds: 60,\n cooldown_seconds: 300,\n tags: ['web', 'path-traversal', 'lfi'],\n remediation: {\n action: 'block',\n ttl_seconds: 3600,\n description: 'Block source IP performing path traversal',\n },\n enabled: true,\n },\n {\n id: 'web-xss-attack',\n title: 'XSS Attack Detected',\n description: 'HTTP request with cross-site scripting patterns',\n version: '1.0.0',\n category: 'web',\n severity: 'high',\n source_types: ['log-watcher', 'web'],\n match: {\n field: 'message',\n operator: 'regex',\n value: 'Attack detected \\\\[XSS\\\\]',\n },\n threshold: 1,\n window_seconds: 60,\n cooldown_seconds: 300,\n tags: ['web', 'xss', 'injection'],\n remediation: {\n action: 'block',\n ttl_seconds: 3600,\n description: 'Block source IP performing XSS attack',\n },\n enabled: true,\n },\n {\n id: 'web-scanner-detection',\n title: 'Web Vulnerability Scanner Detected',\n description: 'High volume of 4xx errors suggesting automated scanning',\n version: '1.0.0',\n category: 'web',\n severity: 'medium',\n source_types: ['log-watcher', 'web'],\n match: {\n field: 'message',\n operator: 'regex',\n value: 'Client error 4\\\\d{2}:',\n },\n threshold: 20,\n window_seconds: 60,\n cooldown_seconds: 600,\n tags: ['web', 'scanner', 'reconnaissance'],\n remediation: {\n action: 'block',\n ttl_seconds: 1800,\n description: 'Block automated scanner',\n },\n enabled: true,\n },\n {\n id: 'port-scan-indicator',\n title: 'Port Scan Indicators',\n description: 'Connection attempts to many ports from a single source',\n version: '1.0.0',\n category: 'network',\n severity: 'medium',\n source_types: ['network-monitor', 'network'],\n match: {\n field: 'message',\n operator: 'contains',\n value: 'port scan',\n },\n threshold: 1,\n window_seconds: 60,\n cooldown_seconds: 300,\n tags: ['network', 'port-scan', 'reconnaissance'],\n remediation: {\n action: 'block',\n ttl_seconds: 3600,\n description: 'Block port scanner',\n },\n enabled: true,\n },\n {\n id: 'system-critical-error',\n title: 'Critical System Error',\n description: 'Critical or emergency level system log message',\n version: '1.0.0',\n category: 'system',\n severity: 'critical',\n source_types: ['user-journal', 'system'],\n match: {\n field: 'severity',\n operator: 'equals',\n value: 'critical',\n },\n threshold: 1,\n window_seconds: 60,\n cooldown_seconds: 300,\n tags: ['system', 'critical'],\n enabled: true,\n },\n {\n id: 'exploit-probe-pattern',\n title: 'Exploit Probe Pattern',\n description: 'HTTP requests matching common exploit probe patterns',\n version: '1.0.0',\n category: 'web',\n severity: 'high',\n source_types: ['log-watcher', 'web'],\n match: {\n field: 'message',\n operator: 'regex',\n value: 'Attack detected \\\\[(CMD_INJECTION|RCE|SSRF|XXE)\\\\]',\n },\n threshold: 1,\n window_seconds: 60,\n cooldown_seconds: 300,\n tags: ['web', 'exploit', 'probe'],\n remediation: {\n action: 'block',\n ttl_seconds: 7200,\n description: 'Block source IP performing exploit probes',\n },\n enabled: true,\n },\n];\n","import { execSync, spawnSync } from 'node:child_process';\n\nexport interface FirewallAdapter {\n name: string;\n isAvailable(): boolean;\n block(ip: string): Promise<void>;\n unblock(ip: string): Promise<void>;\n isBlocked(ip: string): Promise<boolean>;\n listBlocked(): Promise<string[]>;\n}\n\nexport class NftablesAdapter implements FirewallAdapter {\n name = 'nftables';\n private table = 'threatcrush';\n private set = 'blocklist';\n\n isAvailable(): boolean {\n const result = spawnSync('nft', ['--version'], { stdio: 'pipe' });\n return result.status === 0;\n }\n\n private ensureSetup(): void {\n try {\n execSync(`nft list table inet ${this.table} 2>/dev/null`, { stdio: 'pipe' });\n } catch {\n execSync(`nft add table inet ${this.table}`);\n execSync(`nft add set inet ${this.table} ${this.set} '{ type ipv4_addr; flags timeout; }'`);\n execSync(`nft add chain inet ${this.table} input '{ type filter hook input priority -1; policy accept; }'`);\n execSync(`nft add rule inet ${this.table} input ip saddr @${this.set} drop`);\n }\n }\n\n async block(ip: string): Promise<void> {\n this.ensureSetup();\n execSync(`nft add element inet ${this.table} ${this.set} '{ ${ip} }'`);\n }\n\n async unblock(ip: string): Promise<void> {\n try {\n execSync(`nft delete element inet ${this.table} ${this.set} '{ ${ip} }'`);\n } catch { /* element may not exist */ }\n }\n\n async isBlocked(ip: string): Promise<boolean> {\n try {\n const output = execSync(`nft list set inet ${this.table} ${this.set}`, { encoding: 'utf-8' });\n return output.includes(ip);\n } catch { return false; }\n }\n\n async listBlocked(): Promise<string[]> {\n try {\n const output = execSync(`nft list set inet ${this.table} ${this.set}`, { encoding: 'utf-8' });\n const match = output.match(/elements\\s*=\\s*\\{([^}]*)\\}/);\n if (!match) return [];\n return match[1].split(',').map(s => s.trim().split(/\\s/)[0]).filter(Boolean);\n } catch { return []; }\n }\n}\n\nexport class IptablesAdapter implements FirewallAdapter {\n name = 'iptables';\n private chain = 'THREATCRUSH';\n\n isAvailable(): boolean {\n const result = spawnSync('iptables', ['--version'], { stdio: 'pipe' });\n return result.status === 0;\n }\n\n private ensureChain(): void {\n try {\n execSync(`iptables -n -L ${this.chain} 2>/dev/null`, { stdio: 'pipe' });\n } catch {\n execSync(`iptables -N ${this.chain}`);\n execSync(`iptables -I INPUT 1 -j ${this.chain}`);\n }\n }\n\n async block(ip: string): Promise<void> {\n this.ensureChain();\n if (await this.isBlocked(ip)) return;\n execSync(`iptables -A ${this.chain} -s ${ip} -j DROP`);\n }\n\n async unblock(ip: string): Promise<void> {\n try { execSync(`iptables -D ${this.chain} -s ${ip} -j DROP`); }\n catch { /* rule may not exist */ }\n }\n\n async isBlocked(ip: string): Promise<boolean> {\n try {\n const output = execSync(`iptables -n -L ${this.chain}`, { encoding: 'utf-8' });\n return output.includes(ip);\n } catch { return false; }\n }\n\n async listBlocked(): Promise<string[]> {\n try {\n const output = execSync(`iptables -n -L ${this.chain}`, { encoding: 'utf-8' });\n const ips: string[] = [];\n for (const line of output.split('\\n')) {\n const match = line.match(/DROP\\s+all\\s+--\\s+(\\d+\\.\\d+\\.\\d+\\.\\d+)/);\n if (match) ips.push(match[1]);\n }\n return ips;\n } catch { return []; }\n }\n}\n\nexport class DryRunAdapter implements FirewallAdapter {\n name = 'dry-run';\n private blocked = new Set<string>();\n\n isAvailable(): boolean { return true; }\n async block(ip: string): Promise<void> { this.blocked.add(ip); }\n async unblock(ip: string): Promise<void> { this.blocked.delete(ip); }\n async isBlocked(ip: string): Promise<boolean> { return this.blocked.has(ip); }\n async listBlocked(): Promise<string[]> { return [...this.blocked]; }\n}\n\nexport function detectFirewallAdapter(): FirewallAdapter {\n const nft = new NftablesAdapter();\n if (nft.isAvailable()) return nft;\n const ipt = new IptablesAdapter();\n if (ipt.isAvailable()) return ipt;\n return new DryRunAdapter();\n}\n","import { appendFileSync } from 'node:fs';\nimport type { FirewallAdapter } from './adapters.js';\nimport type { EventBus } from '../event-bus.js';\nimport { getModuleState, setModuleState } from '../../core/state.js';\nimport { PATHS } from '../paths.js';\nimport type { ThreatEvent } from '../../types/events.js';\n\ninterface BlockEntry {\n ip: string;\n reason: string;\n rule_id?: string;\n blocked_at: number;\n expires_at?: number;\n dry_run: boolean;\n}\n\ninterface RemediationConfig {\n enabled: boolean;\n dry_run: boolean;\n default_ttl_seconds: number;\n min_severity: string;\n allowlist: string[];\n}\n\nconst DEFAULT_CONFIG: RemediationConfig = {\n enabled: true,\n dry_run: true,\n default_ttl_seconds: 3600,\n min_severity: 'high',\n allowlist: ['127.0.0.1', '::1'],\n};\n\nconst SEVERITY_RANK: Record<string, number> = {\n info: 0, low: 1, medium: 2, high: 3, critical: 4,\n};\n\nexport class RemediationManager {\n private config: RemediationConfig;\n private blocklist: BlockEntry[] = [];\n private expiryTimer: NodeJS.Timeout | null = null;\n\n constructor(\n private adapter: FirewallAdapter,\n private bus: EventBus,\n config?: Partial<RemediationConfig>,\n ) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.loadState();\n this.startExpiryWorker();\n }\n\n async handleDetection(event: ThreatEvent): Promise<void> {\n if (!this.config.enabled) return;\n\n const eventRank = SEVERITY_RANK[event.severity] ?? 0;\n const minRank = SEVERITY_RANK[this.config.min_severity] ?? 3;\n if (eventRank < minRank) return;\n\n const ip = event.source_ip;\n if (!ip) return;\n if (this.isAllowlisted(ip)) return;\n if (this.blocklist.some(b => b.ip === ip)) return;\n\n const ruleRemediation = event.details?.remediation as Record<string, unknown> | undefined;\n const ttl = (ruleRemediation?.ttl_seconds as number) || this.config.default_ttl_seconds;\n const ruleId = event.details?.rule_id as string | undefined;\n\n await this.blockIp(ip, event.message, ruleId, ttl);\n }\n\n async blockIp(ip: string, reason: string, ruleId?: string, ttlSeconds?: number): Promise<boolean> {\n if (this.isAllowlisted(ip)) return false;\n\n const entry: BlockEntry = {\n ip,\n reason,\n rule_id: ruleId,\n blocked_at: Date.now(),\n expires_at: ttlSeconds ? Date.now() + (ttlSeconds * 1000) : undefined,\n dry_run: this.config.dry_run,\n };\n\n if (!this.config.dry_run) {\n try {\n await this.adapter.block(ip);\n } catch (err) {\n this.logLine(`[firewall] EACCES or error blocking ${ip}: ${(err as Error).message}`);\n this.bus.publish({\n timestamp: new Date(),\n module: 'firewall-rules',\n category: 'system',\n severity: 'medium',\n message: `Failed to block ${ip}: ${(err as Error).message}. Ensure daemon has CAP_NET_ADMIN.`,\n });\n return false;\n }\n }\n\n this.blocklist.push(entry);\n this.saveState();\n\n const mode = this.config.dry_run ? '[DRY-RUN] ' : '';\n const expiryMsg = ttlSeconds ? ` (expires in ${ttlSeconds}s)` : ' (permanent)';\n this.logLine(`[firewall] ${mode}Blocked ${ip}: ${reason}${expiryMsg}`);\n\n this.bus.publish({\n timestamp: new Date(),\n module: 'firewall-rules',\n category: 'system',\n severity: 'info',\n message: `${mode}Blocked ${ip}: ${reason}${expiryMsg}`,\n source_ip: ip,\n details: { action: 'block', rule_id: ruleId, dry_run: this.config.dry_run, ttl_seconds: ttlSeconds },\n });\n\n return true;\n }\n\n async unblockIp(ip: string): Promise<boolean> {\n const idx = this.blocklist.findIndex(b => b.ip === ip);\n if (idx < 0) return false;\n\n const entry = this.blocklist[idx];\n if (!entry.dry_run) {\n try {\n await this.adapter.unblock(ip);\n } catch (err) {\n this.logLine(`[firewall] Error unblocking ${ip}: ${(err as Error).message}`);\n return false;\n }\n }\n\n this.blocklist.splice(idx, 1);\n this.saveState();\n\n this.logLine(`[firewall] Unblocked ${ip}`);\n this.bus.publish({\n timestamp: new Date(),\n module: 'firewall-rules',\n category: 'system',\n severity: 'info',\n message: `Unblocked ${ip}`,\n source_ip: ip,\n details: { action: 'unblock' },\n });\n\n return true;\n }\n\n isAllowlisted(ip: string): boolean {\n return this.config.allowlist.includes(ip);\n }\n\n addToAllowlist(ip: string): void {\n if (!this.config.allowlist.includes(ip)) {\n this.config.allowlist.push(ip);\n }\n }\n\n removeFromAllowlist(ip: string): void {\n this.config.allowlist = this.config.allowlist.filter(a => a !== ip);\n }\n\n getBlocklist(): BlockEntry[] { return [...this.blocklist]; }\n getAllowlist(): string[] { return [...this.config.allowlist]; }\n\n stop(): void {\n if (this.expiryTimer) clearInterval(this.expiryTimer);\n this.expiryTimer = null;\n }\n\n private startExpiryWorker(): void {\n this.expiryTimer = setInterval(() => void this.processExpiries(), 30_000);\n }\n\n private async processExpiries(): Promise<void> {\n const now = Date.now();\n const expired = this.blocklist.filter(b => b.expires_at && b.expires_at <= now);\n for (const entry of expired) {\n await this.unblockIp(entry.ip);\n }\n }\n\n private loadState(): void {\n try {\n const saved = getModuleState('firewall-rules', 'blocklist') as BlockEntry[] | undefined;\n if (Array.isArray(saved)) this.blocklist = saved;\n } catch { /* State DB may not be available */ }\n }\n\n private saveState(): void {\n try { setModuleState('firewall-rules', 'blocklist', this.blocklist); }\n catch { /* State DB may not be available */ }\n }\n\n private logLine(line: string): void {\n try { appendFileSync(PATHS.logFile, `${new Date().toISOString()} ${line}\\n`); }\n catch { /* best-effort */ }\n }\n}\n","/**\n * Opt-in error reporting for the CLI + daemon.\n *\n * Enabled only when `SENTRY_DSN` is set in the environment. Safe to call\n * from both short-lived CLI invocations and the long-running daemon.\n */\n\nlet ready = false;\n// Keep the import lazy so the CLI doesn't pay the Sentry bundle cost when\n// reporting is disabled.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet sentry: any = null;\n\nasync function loadSentry(): Promise<void> {\n if (sentry) return;\n try {\n sentry = await import('@sentry/node');\n } catch {\n sentry = null;\n }\n}\n\nexport async function initTelemetry(context: 'cli' | 'daemon'): Promise<void> {\n if (ready) return;\n const dsn = process.env.SENTRY_DSN;\n if (!dsn) return;\n\n await loadSentry();\n if (!sentry) return;\n\n sentry.init({\n dsn,\n environment: process.env.NODE_ENV || 'production',\n release: process.env.SENTRY_RELEASE,\n serverName: context,\n tracesSampleRate: 0,\n beforeSend(event: Record<string, unknown>) {\n const req = (event as { request?: { headers?: Record<string, string> } }).request;\n if (req?.headers) {\n delete req.headers.authorization;\n delete req.headers.cookie;\n }\n return event;\n },\n });\n\n ready = true;\n}\n\nexport function captureException(err: unknown): void {\n if (!ready || !sentry) return;\n sentry.captureException(err);\n}\n\nexport async function flushTelemetry(timeoutMs = 2000): Promise<void> {\n if (!ready || !sentry) return;\n try { await sentry.flush(timeoutMs); } catch { /* ignore */ }\n}\n","#!/usr/bin/env node\nimport { runDaemon } from './daemon/index.js';\n\nrunDaemon().catch((err) => {\n console.error('threatcrushd failed to start:', err);\n process.exit(1);\n});\n"],"mappings":"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","names":["exports","module","exports","module","exports","module","exports","module","exports","module","Date","exports","module","exports","module","exports","module","exports","module","index","blocksize","exports","module","exports","module","exports","module","tomlType","str","exports","import_node_fs","import_node_path","import_node_fs","import_node_fs","Database","module","isRoot","import_node_fs","import_node_path","import_toml","import_node_fs","bus","bus","isRoot","import_node_child_process","import_node_fs","bus","import_node_fs","import_node_readline","bus","import_node_fs","import_node_path","TOML","bus","TOML","SEVERITY_RANK","SEVERITY_RANK","bus","import_node_fs","import_node_path","import_node_os","import_node_fs","import_node_path","import_node_os","process","os","tty","styles","chalk","styles","SEVERITY_COLORS","import_node_os","os","bus","import_node_fs","import_node_path","import_node_child_process","import_node_fs","DEFAULT_CONFIG","SEVERITY_RANK","bus"]}