{"_id":"@sigil0/looking-glass","_rev":"30-a2ebc9df9c87c6e97351def9dd76f1cb","name":"@sigil0/looking-glass","dist-tags":{"latest":"0.14.1"},"versions":{"0.1.0":{"name":"@sigil0/looking-glass","version":"0.1.0","license":"MIT","_id":"@sigil0/looking-glass@0.1.0","maintainers":[{"name":"sigil0","email":"3ojos666@gmail.com"}],"homepage":"https://github.com/S1gil0/lookingglass","bugs":{"url":"https://github.com/S1gil0/lookingglass/issues"},"os":["linux"],"bin":{"glass":"dist/cli.js"},"dist":{"shasum":"9a4adc32bb8d633cc59704732afc3ddc77fee07a","tarball":"https://registry.npmjs.org/@sigil0/looking-glass/-/looking-glass-0.1.0.tgz","fileCount":151,"integrity":"sha512-F8zE/s7GNO1Vad8K/m3IYz6CUwAXiokA1RDo0awli9zPijPd5I2jIgxR1elVlQdMqWEDfwdjT9ist/098F9Ueg==","signatures":[{"sig":"MEUCIFRSlCkK/4ljasKDB6iOeu+xAHJ3bAP3jn8lqqotcPv5AiEAs6G22HMIR3loShb6E6OjfSyBC1wgwA0nCU0Sl/r2th8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":858785},"type":"module","engines":{"node":">=22"},"gitHead":"5d71b60b9916f18ac09d60174bf5597e8b94d51a","scripts":{"dev":"tsx src/cli.ts","test":"node --import tsx --test test/**/*.test.ts","build":"npm run clean && tsc -p tsconfig.build.json && chmod +x dist/cli.js","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\"","start":"node dist/cli.js","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sigil0","email":"3ojos666@gmail.com"},"repository":{"url":"git+https://github.com/S1gil0/lookingglass.git","type":"git"},"_npmVersion":"10.9.8","description":"A lean local coding harness for OpenAI-compatible gateways and LM Studio","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ajv":"8.20.0","croner":"10.0.1","openai":"6.48.0","jsonc-parser":"3.3.1","better-sqlite3":"12.11.1","@earendil-works/pi-tui":"0.80.10"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.6","typescript":"5.9.3","@types/node":"22.19.11","@types/better-sqlite3":"7.6.13"},"_npmOperationalInternal":{"tmp":"tmp/looking-glass_0.1.0_1784624915023_0.7726586825952335","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@sigil0/looking-glass","version":"0.2.0","license":"MIT","_id":"@sigil0/looking-glass@0.2.0","maintainers":[{"name":"sigil0","email":"3ojos666@gmail.com"}],"homepage":"https://github.com/S1gil0/lookingglass","bugs":{"url":"https://github.com/S1gil0/lookingglass/issues"},"os":["linux","win32"],"bin":{"glass":"dist/cli.js"},"dist":{"shasum":"94f8185fd9eb2ba8e0931ec186b8999ac921d61e","tarball":"https://registry.npmjs.org/@sigil0/looking-glass/-/looking-glass-0.2.0.tgz","fileCount":168,"integrity":"sha512-Mtt4ig5fRg71CfQxhVpqVtefNJTN8pIMMVYEos10SDaEhP8Rw20o54VJovxcTRwtzzhBxEfq10zTF9GgYzjXeQ==","signatures":[{"sig":"MEYCIQCKxV+l//TjEOq0hWT5rqmVDs9HNx9nxCVAy+bc0ItDdwIhAL5jrwLAuJfDjzv42Q6hZH12EwUxsVVRCRyxVsYqX116","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":968075},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"4f8fe0862da17f9450d1cb243184078487a9580d","scripts":{"dev":"tsx src/cli.ts","test":"node --import tsx --test test/**/*.test.ts","build":"npm run clean && tsc -p tsconfig.build.json && node -e \"if (process.platform !== 'win32') require('node:fs').chmodSync('dist/cli.js', 0o755)\"","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\"","start":"node dist/cli.js","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sigil0","email":"3ojos666@gmail.com"},"repository":{"url":"git+https://github.com/S1gil0/lookingglass.git","type":"git"},"_npmVersion":"10.9.8","description":"A lean local coding harness for OpenAI-compatible gateways and LM Studio","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ajv":"8.20.0","croner":"10.0.1","openai":"6.48.0","jsonc-parser":"3.3.1","better-sqlite3":"12.11.1","@earendil-works/pi-tui":"0.80.10"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.6","typescript":"5.9.3","@types/node":"22.19.11","@types/better-sqlite3":"7.6.13"},"_npmOperationalInternal":{"tmp":"tmp/looking-glass_0.2.0_1784673767072_0.3565595699219235","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@sigil0/looking-glass","version":"0.2.1","license":"MIT","_id":"@sigil0/looking-glass@0.2.1","maintainers":[{"name":"sigil0","email":"3ojos666@gmail.com"}],"homepage":"https://github.com/S1gil0/lookingglass","bugs":{"url":"https://github.com/S1gil0/lookingglass/issues"},"os":["linux","win32"],"bin":{"glass":"dist/cli.js"},"dist":{"shasum":"be1bcac360fcc6a6f6f09e12a133eab23b394107","tarball":"https://registry.npmjs.org/@sigil0/looking-glass/-/looking-glass-0.2.1.tgz","fileCount":172,"integrity":"sha512-0K/oB61jvVu+7ADgQE03U2aTodzmHTz3amIDugu4PPJFrx/GGJX6NhantxJeJblnEFcYrItOi5xFgMVhcmC0JQ==","signatures":[{"sig":"MEQCIGfdCUICbyKDcWMBRi0kUOT8Ttm1xwmxnXjfXt2C7bOUAiAq6t+IrKKfMkzdTPXxbJbXrmbvSGuIH+4q++eDEokeWQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":970026},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"a31a521f321d315d573b85fabfec7ef372a8686d","scripts":{"dev":"tsx src/cli.ts","test":"node --import tsx --test test/**/*.test.ts","build":"npm run clean && tsc -p tsconfig.build.json && node -e \"if (process.platform !== 'win32') require('node:fs').chmodSync('dist/cli.js', 0o755)\"","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\"","start":"node dist/cli.js","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sigil0","email":"3ojos666@gmail.com"},"repository":{"url":"git+https://github.com/S1gil0/lookingglass.git","type":"git"},"_npmVersion":"10.9.8","description":"A lean local coding harness for OpenAI-compatible gateways and LM Studio","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ajv":"8.20.0","croner":"10.0.1","openai":"6.48.0","jsonc-parser":"3.3.1","better-sqlite3":"12.11.1","@earendil-works/pi-tui":"0.80.10"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.6","typescript":"5.9.3","@types/node":"22.19.11","@types/better-sqlite3":"7.6.13"},"_npmOperationalInternal":{"tmp":"tmp/looking-glass_0.2.1_1784675280837_0.3067836675423161","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@sigil0/looking-glass","version":"0.2.2","license":"MIT","_id":"@sigil0/looking-glass@0.2.2","maintainers":[{"name":"sigil0","email":"3ojos666@gmail.com"}],"homepage":"https://github.com/S1gil0/lookingglass","bugs":{"url":"https://github.com/S1gil0/lookingglass/issues"},"os":["linux","win32"],"bin":{"glass":"dist/cli.js"},"dist":{"shasum":"e7cc8a122735c058f5db650626237bb0980ceb28","tarball":"https://registry.npmjs.org/@sigil0/looking-glass/-/looking-glass-0.2.2.tgz","fileCount":172,"integrity":"sha512-L8tFah8QmsSbc5F6dpEAc4MdZfQ6CE05y/j1Ear9li9vpVqetEL9kTIK7yBHhG8kHtizY4IL/GYMmHl5oan6Yg==","signatures":[{"sig":"MEYCIQDjZk6q3nq1Y2cibizvn4Op+cqMXtlT8C0yRoNZxmT/HgIhAKWQGDkf4WIjv2SS90uf1AyilxQUFAuvZpwSpUjyhBgb","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1009371},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"61d1a9dae33d0c145f2ed368242396e243a8b8bb","scripts":{"dev":"tsx src/cli.ts","test":"node --import tsx --test test/**/*.test.ts","build":"npm run clean && tsc -p tsconfig.build.json && node -e \"if (process.platform !== 'win32') require('node:fs').chmodSync('dist/cli.js', 0o755)\"","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\"","start":"node dist/cli.js","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sigil0","email":"3ojos666@gmail.com"},"repository":{"url":"git+https://github.com/S1gil0/lookingglass.git","type":"git"},"_npmVersion":"10.9.8","description":"A lean local coding harness for OpenAI-compatible gateways and LM Studio","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ajv":"8.20.0","croner":"10.0.1","openai":"6.48.0","jsonc-parser":"3.3.1","better-sqlite3":"12.11.1","@earendil-works/pi-tui":"0.80.10"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.6","typescript":"5.9.3","@types/node":"22.19.11","@types/better-sqlite3":"7.6.13"},"_npmOperationalInternal":{"tmp":"tmp/looking-glass_0.2.2_1784848139354_0.9595567422596842","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@sigil0/looking-glass","version":"0.2.3","license":"MIT","_id":"@sigil0/looking-glass@0.2.3","maintainers":[{"name":"sigil0","email":"3ojos666@gmail.com"}],"homepage":"https://github.com/S1gil0/lookingglass","bugs":{"url":"https://github.com/S1gil0/lookingglass/issues"},"os":["linux","win32"],"bin":{"glass":"dist/cli.js"},"dist":{"shasum":"8d277072726b2d09b2cca81df41e9eb2a37da22b","tarball":"https://registry.npmjs.org/@sigil0/looking-glass/-/looking-glass-0.2.3.tgz","fileCount":172,"integrity":"sha512-Hpl9l1KA9XNVxUR2s8/0zt1ad9u5r2fFNf0q5BlBq7k9zjTXju+BbcaX0PGsJrChYWFHrEwyctUVuPaLgMPVDA==","signatures":[{"sig":"MEUCIDxwq1gxyppH/TBF9IXni4u7VWDm9qUwZUi09CjeSQnqAiEA1nhdMsIQWV7gF6mMUgVgpS2d8A+axYvTKb+L0PRL8A4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1972173},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"ff049c016a8806f3dad49caaa3c1400a199df05c","scripts":{"dev":"tsx src/cli.ts","test":"node --import tsx --test test/**/*.test.ts","build":"npm run clean && tsc -p tsconfig.build.json && node -e \"if (process.platform !== 'win32') require('node:fs').chmodSync('dist/cli.js', 0o755)\"","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\"","start":"node dist/cli.js","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sigil0","email":"3ojos666@gmail.com"},"repository":{"url":"git+https://github.com/S1gil0/lookingglass.git","type":"git"},"_npmVersion":"10.9.8","description":"A lean local coding harness for OpenAI-compatible gateways and LM Studio","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ajv":"8.20.0","croner":"10.0.1","openai":"6.48.0","jsonc-parser":"3.3.1","better-sqlite3":"12.11.1","@earendil-works/pi-tui":"0.80.10"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.6","typescript":"5.9.3","@types/node":"22.19.11","@types/better-sqlite3":"7.6.13"},"_npmOperationalInternal":{"tmp":"tmp/looking-glass_0.2.3_1784849243832_0.5178646426597882","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"@sigil0/looking-glass","version":"0.2.4","license":"MIT","_id":"@sigil0/looking-glass@0.2.4","maintainers":[{"name":"sigil0","email":"3ojos666@gmail.com"}],"homepage":"https://github.com/S1gil0/lookingglass","bugs":{"url":"https://github.com/S1gil0/lookingglass/issues"},"os":["linux","win32"],"bin":{"glass":"dist/cli.js"},"dist":{"shasum":"1737e306fb5809b64c824c074a316868949cd8c7","tarball":"https://registry.npmjs.org/@sigil0/looking-glass/-/looking-glass-0.2.4.tgz","fileCount":173,"integrity":"sha512-8cgtNAXkbECSkd4836UdgbUE+xJDCGZ4FUPGYbEeESUNx7mKuUXAQT1jUP/jD7+ZBFLJ9QFSO5sFDgk/3ULmEQ==","signatures":[{"sig":"MEUCIQCYiUTF0v6foy9KIOl5Fy/KoOu5//Q5bRCWFQ4JgyYwoAIgKZwLnxTjLhfCcjfiULT25vlKIWUh2y2v8YQ+j9BbyS0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":971177},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"86e177fdea887ca9e8da371f45b929384da1d9fd","scripts":{"dev":"tsx src/cli.ts","test":"node --import tsx --test test/**/*.test.ts","build":"npm run clean && tsc -p tsconfig.build.json && node -e \"if (process.platform !== 'win32') require('node:fs').chmodSync('dist/cli.js', 0o755)\"","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\"","start":"node dist/cli.js","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sigil0","email":"3ojos666@gmail.com"},"repository":{"url":"git+https://github.com/S1gil0/lookingglass.git","type":"git"},"_npmVersion":"10.9.8","description":"A lean local coding harness for OpenAI-compatible gateways and LM Studio","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ajv":"8.20.0","croner":"10.0.1","openai":"6.48.0","jsonc-parser":"3.3.1","better-sqlite3":"12.11.1","@earendil-works/pi-tui":"0.80.10"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.6","typescript":"5.9.3","@types/node":"22.19.11","@types/better-sqlite3":"7.6.13"},"_npmOperationalInternal":{"tmp":"tmp/looking-glass_0.2.4_1784850243111_0.7012289805804006","host":"s3://npm-registry-packages-npm-production"}},"0.2.5":{"name":"@sigil0/looking-glass","version":"0.2.5","license":"MIT","_id":"@sigil0/looking-glass@0.2.5","maintainers":[{"name":"sigil0","email":"3ojos666@gmail.com"}],"homepage":"https://github.com/S1gil0/lookingglass","bugs":{"url":"https://github.com/S1gil0/lookingglass/issues"},"os":["linux","win32"],"bin":{"glass":"dist/cli.js"},"dist":{"shasum":"73a8c5a7b26b73c845ece81db7dd44b1f14babdb","tarball":"https://registry.npmjs.org/@sigil0/looking-glass/-/looking-glass-0.2.5.tgz","fileCount":173,"integrity":"sha512-jl3LYrawQ66lxjstzlFpUXUhGVPdqu1QERMipLazuTIH6cNK9t9Ggfop7MWaWTe8Eq2ghAbekb21slg4mslgbg==","signatures":[{"sig":"MEQCIGzls+vrTQe7cWU7ntDBC9p6yTurxDZVUhJFTV3o3W5OAiBCYYVReCgm0vxIwB6y8EAPjhCnWxI/s3bqNmptZqk/Kw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":973244},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"119da1879ca744dc00c61ba6e7bdcfcf7ad2ede3","scripts":{"dev":"tsx src/cli.ts","test":"node --import tsx --test test/**/*.test.ts","build":"npm run clean && tsc -p tsconfig.build.json && node -e \"if (process.platform !== 'win32') require('node:fs').chmodSync('dist/cli.js', 0o755)\"","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\"","start":"node dist/cli.js","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sigil0","email":"3ojos666@gmail.com"},"repository":{"url":"git+https://github.com/S1gil0/lookingglass.git","type":"git"},"_npmVersion":"10.9.8","description":"A lean local coding harness for OpenAI-compatible gateways and LM Studio","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ajv":"8.20.0","croner":"10.0.1","openai":"6.48.0","jsonc-parser":"3.3.1","better-sqlite3":"12.11.1","@earendil-works/pi-tui":"0.80.10"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.6","typescript":"5.9.3","@types/node":"22.19.11","@types/better-sqlite3":"7.6.13"},"_npmOperationalInternal":{"tmp":"tmp/looking-glass_0.2.5_1784905385649_0.4808317793442074","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@sigil0/looking-glass","version":"0.3.0","license":"MIT","_id":"@sigil0/looking-glass@0.3.0","maintainers":[{"name":"sigil0","email":"3ojos666@gmail.com"}],"homepage":"https://github.com/S1gil0/lookingglass","bugs":{"url":"https://github.com/S1gil0/lookingglass/issues"},"os":["linux","win32"],"bin":{"glass":"dist/cli.js"},"dist":{"shasum":"09a423a56f2b214ab35519e8a8096ad70f598f06","tarball":"https://registry.npmjs.org/@sigil0/looking-glass/-/looking-glass-0.3.0.tgz","fileCount":177,"integrity":"sha512-sE0p0siemmXUJS2xdyqAGqtj7zX2sYPx3gqu4EXzIhN4p95GDq+3G+CoA6p7NyBQT794rp2P6bIN35moDIOa0Q==","signatures":[{"sig":"MEQCIGKxLXOfdEDq96RJs7vCKJnIt2WlS7qnplkogP/hW/duAiA+gAhEYD/Ap7qQ2iH678CSIlpelejDm7ldN6Ua2+MAUw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1060578},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"fbf508a75da664c4d0248dd3f80d531da3b815a2","scripts":{"dev":"tsx src/cli.ts","test":"node --import tsx --test test/**/*.test.ts","build":"npm run clean && tsc -p tsconfig.build.json && node -e \"if (process.platform !== 'win32') require('node:fs').chmodSync('dist/cli.js', 0o755)\"","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\"","start":"node dist/cli.js","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sigil0","email":"3ojos666@gmail.com"},"repository":{"url":"git+https://github.com/S1gil0/lookingglass.git","type":"git"},"_npmVersion":"10.9.8","description":"A local coding CLI with persistent automation, agents, LM Studio, and OpenRouter","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ajv":"8.20.0","croner":"10.0.1","openai":"6.48.0","jsonc-parser":"3.3.1","better-sqlite3":"12.11.1","@earendil-works/pi-tui":"0.80.10"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.6","typescript":"5.9.3","@types/node":"22.19.11","@types/better-sqlite3":"7.6.13"},"_npmOperationalInternal":{"tmp":"tmp/looking-glass_0.3.0_1784922539824_0.31968617875161187","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@sigil0/looking-glass","version":"0.3.1","license":"MIT","_id":"@sigil0/looking-glass@0.3.1","maintainers":[{"name":"sigil0","email":"3ojos666@gmail.com"}],"homepage":"https://github.com/S1gil0/lookingglass","bugs":{"url":"https://github.com/S1gil0/lookingglass/issues"},"os":["linux","win32"],"bin":{"glass":"dist/cli.js"},"dist":{"shasum":"b0554d78087be7b60d378c7164dbabb69f75e8cf","tarball":"https://registry.npmjs.org/@sigil0/looking-glass/-/looking-glass-0.3.1.tgz","fileCount":177,"integrity":"sha512-7TbzC5JWQE9vxjDDCazQ/C7iun+qojM4YMTvu/fEbG1hoQ/LG0lJWjjezQp91Kkr22McEdTfPuKJvMlwPYEayg==","signatures":[{"sig":"MEYCIQCvQhjVsm1/QJ1VvO5Mf6kZlGV7aPQTGuvsbdKhSsAH3AIhAPOMT0a/Fkizx9XNIwgQQruIRxFeqj7Y1oF4X9f6agVi","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1061875},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"edb9fda698bb92dc40f0ebd3088eb1324b3826b6","scripts":{"dev":"tsx src/cli.ts","test":"node --import tsx --test test/**/*.test.ts","build":"npm run clean && tsc -p tsconfig.build.json && node -e \"if (process.platform !== 'win32') require('node:fs').chmodSync('dist/cli.js', 0o755)\"","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\"","start":"node dist/cli.js","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sigil0","email":"3ojos666@gmail.com"},"repository":{"url":"git+https://github.com/S1gil0/lookingglass.git","type":"git"},"_npmVersion":"10.9.8","description":"A local coding CLI with persistent automation, agents, LM Studio, and OpenRouter","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ajv":"8.20.0","croner":"10.0.1","openai":"6.48.0","jsonc-parser":"3.3.1","better-sqlite3":"12.11.1","@earendil-works/pi-tui":"0.80.10"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.6","typescript":"5.9.3","@types/node":"22.19.11","@types/better-sqlite3":"7.6.13"},"_npmOperationalInternal":{"tmp":"tmp/looking-glass_0.3.1_1784981243551_0.23702351593432502","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@sigil0/looking-glass","version":"0.3.2","license":"MIT","_id":"@sigil0/looking-glass@0.3.2","maintainers":[{"name":"sigil0","email":"3ojos666@gmail.com"}],"homepage":"https://github.com/S1gil0/lookingglass","bugs":{"url":"https://github.com/S1gil0/lookingglass/issues"},"os":["linux","win32"],"bin":{"glass":"dist/cli.js"},"dist":{"shasum":"08a03e846fb575ac126d85a1cc649e19dcc511bd","tarball":"https://registry.npmjs.org/@sigil0/looking-glass/-/looking-glass-0.3.2.tgz","fileCount":177,"integrity":"sha512-oj8gA90VBYJAV5mjnMeDlzLH/Igi09d61M/JjrqGjJqrDpuPiVUJ3vuOkWOtOeAVWCYaZ0WYXa2lg6GlBJEONA==","signatures":[{"sig":"MEYCIQCvCT8VcMh+5RqQTdiTS19mNqmgNBHMYTy1zmCqzDvEiAIhAJlJinEmIiDDJ49P5HHrhJRsCfz9fo7JlZnAsGLANLAy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1065201},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"612941ae587e158fa6a60bd536399c0df4a7a726","scripts":{"dev":"tsx src/cli.ts","test":"node --import tsx --test test/**/*.test.ts","build":"npm run clean && tsc -p tsconfig.build.json && node -e \"if (process.platform !== 'win32') require('node:fs').chmodSync('dist/cli.js', 0o755)\"","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\"","start":"node dist/cli.js","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sigil0","email":"3ojos666@gmail.com"},"repository":{"url":"git+https://github.com/S1gil0/lookingglass.git","type":"git"},"_npmVersion":"10.9.8","description":"A local coding CLI with persistent automation, agents, LM Studio, and OpenRouter","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ajv":"8.20.0","croner":"10.0.1","openai":"6.48.0","jsonc-parser":"3.3.1","better-sqlite3":"12.11.1","@earendil-works/pi-tui":"0.80.10"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.6","typescript":"5.9.3","@types/node":"22.19.11","@types/better-sqlite3":"7.6.13"},"_npmOperationalInternal":{"tmp":"tmp/looking-glass_0.3.2_1785018799017_0.6063446047934846","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@sigil0/looking-glass","version":"0.4.0","license":"MIT","_id":"@sigil0/looking-glass@0.4.0","maintainers":[{"name":"sigil0","email":"3ojos666@gmail.com"}],"homepage":"https://github.com/S1gil0/lookingglass","bugs":{"url":"https://github.com/S1gil0/lookingglass/issues"},"os":["linux","win32"],"bin":{"glass":"dist/cli.js"},"dist":{"shasum":"314d92de41b8c68494e3c700a45e83d3f82fe297","tarball":"https://registry.npmjs.org/@sigil0/looking-glass/-/looking-glass-0.4.0.tgz","fileCount":177,"integrity":"sha512-KpjldXRp/ZFIgJuVTeOyacjA8tdO8GRXcJzAd9014W1uwQi+a3rTWlKLODwOEpc/7g8In/CRoVIvGd71OyFeiQ==","signatures":[{"sig":"MEQCICs0/B0Zw76C6fUPIJP1rUptfP03+iDRoTl/IiaR6WQYAiBfGK+UqVt+sTKLhEXrClDPNh6kjJSmWLwALioZocO/MA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1072824},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"0383025cfcd099798f1a8aad8e33cd0b6fd35d48","scripts":{"dev":"tsx src/cli.ts","test":"node --import tsx --test test/**/*.test.ts","build":"npm run clean && tsc -p tsconfig.build.json && node -e \"if (process.platform !== 'win32') require('node:fs').chmodSync('dist/cli.js', 0o755)\"","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\"","start":"node dist/cli.js","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sigil0","email":"3ojos666@gmail.com"},"repository":{"url":"git+https://github.com/S1gil0/lookingglass.git","type":"git"},"_npmVersion":"10.9.8","description":"A local coding CLI with persistent automation, agents, LM Studio, and OpenRouter","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ajv":"8.20.0","croner":"10.0.1","openai":"6.48.0","jsonc-parser":"3.3.1","better-sqlite3":"12.11.1","@earendil-works/pi-tui":"0.80.10"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.6","typescript":"5.9.3","@types/node":"22.19.11","@types/better-sqlite3":"7.6.13"},"_npmOperationalInternal":{"tmp":"tmp/looking-glass_0.4.0_1785061345243_0.6887769603431728","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@sigil0/looking-glass","version":"0.5.0","license":"MIT","_id":"@sigil0/looking-glass@0.5.0","maintainers":[{"name":"sigil0","email":"3ojos666@gmail.com"}],"homepage":"https://github.com/S1gil0/lookingglass","bugs":{"url":"https://github.com/S1gil0/lookingglass/issues"},"os":["linux","win32"],"bin":{"glass":"dist/cli.js"},"dist":{"shasum":"29fd8b7a122ddd6b5ffc4887b3f601a8271a8891","tarball":"https://registry.npmjs.org/@sigil0/looking-glass/-/looking-glass-0.5.0.tgz","fileCount":177,"integrity":"sha512-jSqENj789nel0uvSdfQySc10QbwUlhJr7fhs1j2JQWy+fZ6Lxk7sizT17zeHOZThw/b98wSmWGQY2h5CHsGbDw==","signatures":[{"sig":"MEYCIQDiPsoJuKRWoNb8I2Eg5IjrKqD3VU9PoPoPH98NWWr0CwIhAPTghsyn3gL2iQTNBVOOAccBjyZRsMFBMUbIMsso8wM2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1138430},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"26683aaf767be352dabf49251a5a57bf85ad1569","scripts":{"dev":"tsx src/cli.ts","test":"node --import tsx --test test/**/*.test.ts","build":"npm run clean && tsc -p tsconfig.build.json && node -e \"if (process.platform !== 'win32') require('node:fs').chmodSync('dist/cli.js', 0o755)\"","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\"","start":"node dist/cli.js","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sigil0","email":"3ojos666@gmail.com"},"repository":{"url":"git+https://github.com/S1gil0/lookingglass.git","type":"git"},"_npmVersion":"10.9.8","description":"A local coding CLI with persistent automation, agents, and OpenAI-compatible gateways","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ajv":"8.20.0","croner":"10.0.1","openai":"6.48.0","jsonc-parser":"3.3.1","better-sqlite3":"12.11.1","@earendil-works/pi-tui":"0.80.10"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.6","typescript":"5.9.3","@types/node":"22.19.11","@types/better-sqlite3":"7.6.13"},"_npmOperationalInternal":{"tmp":"tmp/looking-glass_0.5.0_1785073513545_0.7025395638083163","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@sigil0/looking-glass","version":"0.5.1","license":"MIT","_id":"@sigil0/looking-glass@0.5.1","maintainers":[{"name":"sigil0","email":"3ojos666@gmail.com"}],"homepage":"https://github.com/S1gil0/lookingglass","bugs":{"url":"https://github.com/S1gil0/lookingglass/issues"},"os":["linux","win32"],"bin":{"glass":"dist/cli.js"},"dist":{"shasum":"0ab8fd55a8ab158fe4203fb799543bcd322535d7","tarball":"https://registry.npmjs.org/@sigil0/looking-glass/-/looking-glass-0.5.1.tgz","fileCount":181,"integrity":"sha512-1wyyurYtI1sPYw9lCKvibKwT8XjhDTs4UP/1aAOITcpLWQjG+bfB+oei8QGbjK3q1DiTRgIYCp2xAJdHbPSTZQ==","signatures":[{"sig":"MEYCIQCtkdYbSsWoYe0OdagOFw3/Bu4weO2pvp1irLCjV+kY7AIhAM5ArufVq+R9bxerppmXR+Sq9ATyg8o8Q6ru7aF1s3fJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1176439},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"75cdb40a7ba4c3cadcfc82718f0a405a8d843d80","scripts":{"dev":"tsx src/cli.ts","test":"node --import tsx --test test/**/*.test.ts","build":"npm run clean && tsc -p tsconfig.build.json && node -e \"if (process.platform !== 'win32') require('node:fs').chmodSync('dist/cli.js', 0o755)\"","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\"","start":"node dist/cli.js","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sigil0","email":"3ojos666@gmail.com"},"repository":{"url":"git+https://github.com/S1gil0/lookingglass.git","type":"git"},"_npmVersion":"10.9.8","description":"A local coding CLI with persistent automation, agents, and OpenAI-compatible gateways","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ajv":"8.20.0","croner":"10.0.1","openai":"6.48.0","jsonc-parser":"3.3.1","better-sqlite3":"12.11.1","@earendil-works/pi-tui":"0.80.10"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.6","typescript":"5.9.3","@types/node":"22.19.11","@types/better-sqlite3":"7.6.13"},"_npmOperationalInternal":{"tmp":"tmp/looking-glass_0.5.1_1785089585991_0.05959359829016275","host":"s3://npm-registry-packages-npm-production"}},"0.5.2":{"name":"@sigil0/looking-glass","version":"0.5.2","license":"MIT","_id":"@sigil0/looking-glass@0.5.2","maintainers":[{"name":"sigil0","email":"3ojos666@gmail.com"}],"homepage":"https://github.com/S1gil0/lookingglass","bugs":{"url":"https://github.com/S1gil0/lookingglass/issues"},"os":["linux","win32"],"bin":{"glass":"dist/cli.js"},"dist":{"shasum":"36b5a3296e6bf1cdb0d3e8214ee99b58d82751ed","tarball":"https://registry.npmjs.org/@sigil0/looking-glass/-/looking-glass-0.5.2.tgz","fileCount":189,"integrity":"sha512-kn8rmr5Bsv3I9LubijyNlB8pzHJoHWu9/i0Wce5Sga6faccQq7kvxIGB0sTwjnCQaMCvqIjgwhaZsTPGCsqOrQ==","signatures":[{"sig":"MEUCIB0wOnpcC68B+mR9bqxGmNNSPerfHwyk1hlD1NMiTuWpAiEA/i4hpjcndkG6rHz4p3wo3gfkEXHwGKeMiMATD2qcH2M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1209605},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"cce1737c96ff0598cd04588471361da22db9fe05","scripts":{"dev":"tsx src/cli.ts","test":"node --import tsx --test test/**/*.test.ts","build":"npm run clean && tsc -p tsconfig.build.json && node -e \"if (process.platform !== 'win32') require('node:fs').chmodSync('dist/cli.js', 0o755)\"","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\"","start":"node dist/cli.js","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sigil0","email":"3ojos666@gmail.com"},"repository":{"url":"git+https://github.com/S1gil0/lookingglass.git","type":"git"},"_npmVersion":"10.9.8","description":"A local coding CLI with persistent automation, agents, and OpenAI-compatible gateways","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ajv":"8.20.0","croner":"10.0.1","openai":"6.48.0","undici":"6.27.0","jsonc-parser":"3.3.1","better-sqlite3":"12.11.1","@earendil-works/pi-tui":"0.80.10"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.6","typescript":"5.9.3","@types/node":"22.19.11","@types/better-sqlite3":"7.6.13"},"_npmOperationalInternal":{"tmp":"tmp/looking-glass_0.5.2_1785174782853_0.49413589803652425","host":"s3://npm-registry-packages-npm-production"}},"0.5.3":{"name":"@sigil0/looking-glass","version":"0.5.3","license":"MIT","_id":"@sigil0/looking-glass@0.5.3","maintainers":[{"name":"sigil0","email":"3ojos666@gmail.com"}],"homepage":"https://github.com/S1gil0/lookingglass","bugs":{"url":"https://github.com/S1gil0/lookingglass/issues"},"os":["linux","win32"],"bin":{"glass":"dist/cli.js"},"dist":{"shasum":"a804ce9544143f8a9a7f4fb6a9d996d5b32aed92","tarball":"https://registry.npmjs.org/@sigil0/looking-glass/-/looking-glass-0.5.3.tgz","fileCount":189,"integrity":"sha512-VvK2nVGArUsD/m6AdSZxNGQT4ErHbDsf5521uUDB44eVSTHhUcdqr8rbPkQMLf1ctJI/7XJKBYgUIYTRY4s7cg==","signatures":[{"sig":"MEUCIQCPCmbLGTCXzNSaY8FSxVIrMNxmWUdPMlWxi5W80oePIwIgRwO7tDEqiyZCBe/EH4kPN+62kWWHvN7yHKUuuva7f5Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1215786},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"dcbccc5189cb37d19509fd67725de1c95f0c6233","scripts":{"dev":"tsx src/cli.ts","test":"node --import tsx --test test/**/*.test.ts","build":"npm run clean && tsc -p tsconfig.build.json && node -e \"if (process.platform !== 'win32') require('node:fs').chmodSync('dist/cli.js', 0o755)\"","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\"","start":"node dist/cli.js","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sigil0","email":"3ojos666@gmail.com"},"repository":{"url":"git+https://github.com/S1gil0/lookingglass.git","type":"git"},"_npmVersion":"10.9.8","description":"A local coding CLI with persistent automation, agents, and OpenAI-compatible gateways","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ajv":"8.20.0","croner":"10.0.1","openai":"6.48.0","undici":"6.27.0","jsonc-parser":"3.3.1","better-sqlite3":"12.11.1","@earendil-works/pi-tui":"0.80.10"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.6","typescript":"5.9.3","@types/node":"22.19.11","@types/better-sqlite3":"7.6.13"},"_npmOperationalInternal":{"tmp":"tmp/looking-glass_0.5.3_1785275394976_0.5110992840092821","host":"s3://npm-registry-packages-npm-production"}},"0.5.4":{"name":"@sigil0/looking-glass","version":"0.5.4","license":"MIT","_id":"@sigil0/looking-glass@0.5.4","maintainers":[{"name":"sigil0","email":"3ojos666@gmail.com"}],"homepage":"https://github.com/S1gil0/lookingglass","bugs":{"url":"https://github.com/S1gil0/lookingglass/issues"},"os":["linux","win32"],"bin":{"glass":"dist/cli.js"},"dist":{"shasum":"dfd854284a3e44018c443252f63ad57625bcac12","tarball":"https://registry.npmjs.org/@sigil0/looking-glass/-/looking-glass-0.5.4.tgz","fileCount":189,"integrity":"sha512-esFx0511Q+PzTR+ObFoB52j6CYXHIMuBd9V3bZBnbKXneSHQOhik346FQfc/Ui+WklPgxf4faevwZGC74LbLiw==","signatures":[{"sig":"MEQCIDCYpit5pa93bgR9Mk/yBTzSuI45quIYnX6MPyyudfWPAiBzj6Kz2Wm2G4l6Oxud06SXKUbDKFnyPfvFhPATPtpD/g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1215785},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"f82485d7babcc702d4c570e7e9b008fe9abe3982","scripts":{"dev":"tsx src/cli.ts","test":"node --import tsx --test test/**/*.test.ts","build":"npm run clean && tsc -p tsconfig.build.json && node -e \"if (process.platform !== 'win32') require('node:fs').chmodSync('dist/cli.js', 0o755)\"","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\"","start":"node dist/cli.js","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sigil0","email":"3ojos666@gmail.com"},"repository":{"url":"git+https://github.com/S1gil0/lookingglass.git","type":"git"},"_npmVersion":"10.9.8","description":"A local coding CLI with persistent automation, agents, and OpenAI-compatible gateways","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ajv":"8.20.0","croner":"10.0.1","openai":"6.48.0","undici":"6.27.0","jsonc-parser":"3.3.1","better-sqlite3":"12.11.1","@earendil-works/pi-tui":"0.80.10"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.6","typescript":"5.9.3","@types/node":"22.19.11","@types/better-sqlite3":"7.6.13"},"_npmOperationalInternal":{"tmp":"tmp/looking-glass_0.5.4_1785432483748_0.12982617188239254","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@sigil0/looking-glass","version":"0.6.0","license":"MIT","_id":"@sigil0/looking-glass@0.6.0","maintainers":[{"name":"sigil0","email":"3ojos666@gmail.com"}],"homepage":"https://github.com/S1gil0/lookingglass","bugs":{"url":"https://github.com/S1gil0/lookingglass/issues"},"os":["linux","win32"],"bin":{"glass":"dist/cli.js"},"dist":{"shasum":"b59bfb2c3ff5949168bcd78d005125d7e47a1d74","tarball":"https://registry.npmjs.org/@sigil0/looking-glass/-/looking-glass-0.6.0.tgz","fileCount":196,"integrity":"sha512-XvqmyweOELXcsqTnPFdz3sy1imks2C8A2Irusrn8ejhKNKzAw3ovOvtc1ujw2jEw/mgZpI9JK9FV5WmX4V7lHw==","signatures":[{"sig":"MEYCIQDlnwB6mfuKNjpfP8C1/KEZJptXpKxU+us9LFQFMVTkMAIhAMDvNlOqW8ENvxRpyyQNX3b4mAOBBVhhHoZia1YApoN7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5289910},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"05f1b960ae0b03aeccb01cb1bbbde2036ccfa6b5","scripts":{"dev":"tsx src/cli.ts","test":"node --import tsx --test test/**/*.test.ts","build":"npm run clean && tsc -p tsconfig.build.json && node -e \"if (process.platform !== 'win32') require('node:fs').chmodSync('dist/cli.js', 0o755)\"","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\"","start":"node dist/cli.js","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sigil0","email":"3ojos666@gmail.com"},"repository":{"url":"git+https://github.com/S1gil0/lookingglass.git","type":"git"},"_npmVersion":"10.9.8","description":"A local coding CLI with persistent automation, agents, and OpenAI-compatible gateways","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ajv":"8.20.0","croner":"10.0.1","openai":"6.48.0","undici":"6.27.0","jsonc-parser":"3.3.1","better-sqlite3":"12.11.1","@earendil-works/pi-tui":"0.80.10"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.6","typescript":"5.9.3","@types/node":"22.19.11","@types/better-sqlite3":"7.6.13"},"_npmOperationalInternal":{"tmp":"tmp/looking-glass_0.6.0_1785530164534_0.6241102713513111","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@sigil0/looking-glass","version":"0.7.0","license":"MIT","_id":"@sigil0/looking-glass@0.7.0","maintainers":[{"name":"sigil0","email":"3ojos666@gmail.com"}],"homepage":"https://github.com/S1gil0/lookingglass","bugs":{"url":"https://github.com/S1gil0/lookingglass/issues"},"os":["linux","win32"],"bin":{"glass":"dist/cli.js"},"dist":{"shasum":"ffee54a6c9652cab7b1757e76948410424af8791","tarball":"https://registry.npmjs.org/@sigil0/looking-glass/-/looking-glass-0.7.0.tgz","fileCount":204,"integrity":"sha512-PAwHxw8YZAIVLGiFjihofFFoVpQA7XTDqYYKC8CuvrGO0G0SYytrAzCZEYQXdR/b0W4HmIQOyXXJf+DS1GbjkA==","signatures":[{"sig":"MEUCIEoCIg6YV4lXlSUhqrh7UAd3RSxLhiZ06nk46zKocOoMAiEAmHVoDtn4zNvHIoNfo6AWXossrQ8iXX5WIC7IBzbpNf4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5573329},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"bd95ea680bc6f6bda2a01113727891f977ce0bd7","scripts":{"dev":"tsx src/cli.ts","test":"node --import tsx --test test/**/*.test.ts","build":"npm run clean && tsc -p tsconfig.build.json && node -e \"if (process.platform !== 'win32') require('node:fs').chmodSync('dist/cli.js', 0o755)\"","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\"","start":"node dist/cli.js","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sigil0","email":"3ojos666@gmail.com"},"repository":{"url":"git+https://github.com/S1gil0/lookingglass.git","type":"git"},"_npmVersion":"10.9.8","description":"A local coding CLI with persistent automation, agents, and OpenAI-compatible gateways","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ajv":"8.20.0","croner":"10.0.1","openai":"6.48.0","undici":"6.28.0","jsonc-parser":"3.3.1","better-sqlite3":"12.11.1","@earendil-works/pi-tui":"0.80.10"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.6","typescript":"5.9.3","@types/node":"22.19.11","@types/better-sqlite3":"7.6.13"},"_npmOperationalInternal":{"tmp":"tmp/looking-glass_0.7.0_1785790569128_0.4745989903488752","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@sigil0/looking-glass","version":"0.8.0","license":"MIT","_id":"@sigil0/looking-glass@0.8.0","maintainers":[{"name":"sigil0","email":"3ojos666@gmail.com"}],"homepage":"https://github.com/S1gil0/lookingglass","bugs":{"url":"https://github.com/S1gil0/lookingglass/issues"},"os":["linux","win32"],"bin":{"glass":"dist/cli.js"},"dist":{"shasum":"54b995ade5a870a518ee7afb161b44c2ee600d2f","tarball":"https://registry.npmjs.org/@sigil0/looking-glass/-/looking-glass-0.8.0.tgz","fileCount":216,"integrity":"sha512-OZyUKvBaJ3LYdAdeMoglXQicit20p5zlcRmJpf5fbULbRAceuUljhXlWpSo/3MpGUW29xWAdZ5TolZYwolFVrA==","signatures":[{"sig":"MEUCIQCbAGrRvlWskpVeecBppzoZws/Kf8cNehzRJ+bsm3vF2wIgepFjz4aPoCxKftjvaRNuG0BbZrIkdsRupBhtX1SjCVc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5642378},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"bb4c2a97e5dc5718853a80502605bcf8d1bfcf04","scripts":{"dev":"tsx src/cli.ts","test":"node --import tsx --test test/**/*.test.ts","build":"npm run clean && tsc -p tsconfig.build.json && node -e \"if (process.platform !== 'win32') require('node:fs').chmodSync('dist/cli.js', 0o755)\"","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\"","start":"node dist/cli.js","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sigil0","email":"3ojos666@gmail.com"},"repository":{"url":"git+https://github.com/S1gil0/lookingglass.git","type":"git"},"_npmVersion":"10.9.8","description":"A local coding CLI with persistent automation, agents, and OpenAI-compatible gateways","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ajv":"8.20.0","croner":"10.0.1","openai":"6.48.0","undici":"6.28.0","jsonc-parser":"3.3.1","better-sqlite3":"12.11.1","@earendil-works/pi-tui":"0.80.10"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.6","typescript":"5.9.3","@types/node":"22.19.11","@types/better-sqlite3":"7.6.13"},"_npmOperationalInternal":{"tmp":"tmp/looking-glass_0.8.0_1785886346548_0.2936698651467018","host":"s3://npm-registry-packages-npm-production"}},"0.8.1":{"name":"@sigil0/looking-glass","version":"0.8.1","license":"MIT","_id":"@sigil0/looking-glass@0.8.1","maintainers":[{"name":"sigil0","email":"3ojos666@gmail.com"}],"homepage":"https://github.com/S1gil0/lookingglass","bugs":{"url":"https://github.com/S1gil0/lookingglass/issues"},"os":["linux","win32"],"bin":{"glass":"dist/cli.js"},"dist":{"shasum":"16a3ce401f81aa91fd164665a598dda9c7b9d754","tarball":"https://registry.npmjs.org/@sigil0/looking-glass/-/looking-glass-0.8.1.tgz","fileCount":217,"integrity":"sha512-LfnTeskFSvrKPeX7DHlXSILvsbYKB8fXosiKfpOuqdOibRF47j9lR5Ny4NGDlSOwIKwwQ9+sEslv8jiajZjuoQ==","signatures":[{"sig":"MEQCIAZsQdsM6dzYL7KKia/IHu+cZnWtJcZPe3vEFtZd4qnwAiAvdmiaJJTtAXHqGq2G5a77VY3+MoxBfQysWhjIb1GUvw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5654055},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"4c0954497cda1838becd43bf33a3142b10ab41f3","scripts":{"dev":"tsx src/cli.ts","test":"node --import tsx --test test/**/*.test.ts","build":"npm run clean && tsc -p tsconfig.build.json && node -e \"if (process.platform !== 'win32') require('node:fs').chmodSync('dist/cli.js', 0o755)\"","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\"","start":"node dist/cli.js","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sigil0","email":"3ojos666@gmail.com"},"repository":{"url":"git+https://github.com/S1gil0/lookingglass.git","type":"git"},"_npmVersion":"10.9.8","description":"A local coding CLI with persistent automation, agents, and OpenAI-compatible gateways","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ajv":"8.20.0","croner":"10.0.1","openai":"6.48.0","undici":"6.28.0","jsonc-parser":"3.3.1","better-sqlite3":"12.11.1","@earendil-works/pi-tui":"0.80.10"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.6","typescript":"5.9.3","@types/node":"22.19.11","@types/better-sqlite3":"7.6.13"},"_npmOperationalInternal":{"tmp":"tmp/looking-glass_0.8.1_1785922546615_0.5271573393767099","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@sigil0/looking-glass","version":"0.9.0","license":"MIT","_id":"@sigil0/looking-glass@0.9.0","maintainers":[{"name":"sigil0","email":"3ojos666@gmail.com"}],"homepage":"https://github.com/S1gil0/lookingglass","bugs":{"url":"https://github.com/S1gil0/lookingglass/issues"},"os":["linux","win32"],"bin":{"glass":"dist/cli.js"},"dist":{"shasum":"a6e942184bb9e66cfdcff120105e3d7333fd84e2","tarball":"https://registry.npmjs.org/@sigil0/looking-glass/-/looking-glass-0.9.0.tgz","fileCount":225,"integrity":"sha512-4uVuoYmvWdPasUWZHqmJe/xmF9PdtrdBuOOLt5WlLfjZX2uC+sTxUHqMF+xdohFIUNbgtRVWTGZA01+VBIGZzQ==","signatures":[{"sig":"MEUCIQDLBeIa2oBWh7S8gwZfY62Kk0s15V9U8/d0+ePmzYDJ2gIgRmrHreUApdpBH1VvL+39CkuClSEHJxKPd8pGZUAAvKw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5782352},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"4a3c8901844bc6cd0257fe6034e100705bb08970","scripts":{"dev":"tsx src/cli.ts","test":"node --import tsx --test test/**/*.test.ts","build":"npm run clean && tsc -p tsconfig.build.json && node -e \"if (process.platform !== 'win32') require('node:fs').chmodSync('dist/cli.js', 0o755)\"","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\"","start":"node dist/cli.js","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sigil0","email":"3ojos666@gmail.com"},"repository":{"url":"git+https://github.com/S1gil0/lookingglass.git","type":"git"},"_npmVersion":"10.9.8","description":"A local coding CLI with persistent automation, agents, and OpenAI-compatible gateways","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ajv":"8.20.0","croner":"10.0.1","openai":"6.48.0","undici":"6.28.0","jsonc-parser":"3.3.1","better-sqlite3":"12.11.1","@earendil-works/pi-tui":"0.80.10"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.6","typescript":"5.9.3","@types/node":"22.19.11","@types/better-sqlite3":"7.6.13"},"_npmOperationalInternal":{"tmp":"tmp/looking-glass_0.9.0_1786059472411_0.49136429173217344","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"@sigil0/looking-glass","version":"0.10.0","license":"MIT","_id":"@sigil0/looking-glass@0.10.0","maintainers":[{"name":"sigil0","email":"3ojos666@gmail.com"}],"homepage":"https://github.com/S1gil0/lookingglass","bugs":{"url":"https://github.com/S1gil0/lookingglass/issues"},"os":["linux","win32"],"bin":{"glass":"dist/cli.js"},"dist":{"shasum":"ad13a77d56b7e6d9fc58fd8bc59804f75358804b","tarball":"https://registry.npmjs.org/@sigil0/looking-glass/-/looking-glass-0.10.0.tgz","fileCount":225,"integrity":"sha512-gqlSZ1QPoWEQY3eFwHfZ+XfvWmLMe5Tc+Z83pmNUgA4nu7JZQGEx+OwXliX2RIoo5YUuSljejBxm/VZgYOMvxg==","signatures":[{"sig":"MEUCICXt2x3xajQX+M033MRf7GOXpd+xwqJTlGhJ5aJBJhHYAiEAjUWpUjo4Nh9gYp5uTbyjjMTMZuUPk3oHWcZiT64JWA4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5817484},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"5e9ef1582fa5d2c28601ba6dbf50691141d5f62c","scripts":{"dev":"tsx src/cli.ts","test":"node --import tsx --test test/**/*.test.ts","build":"npm run clean && tsc -p tsconfig.build.json && node -e \"if (process.platform !== 'win32') require('node:fs').chmodSync('dist/cli.js', 0o755)\"","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\"","start":"node dist/cli.js","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sigil0","email":"3ojos666@gmail.com"},"repository":{"url":"git+https://github.com/S1gil0/lookingglass.git","type":"git"},"_npmVersion":"10.9.8","description":"A local coding CLI with persistent automation, agents, and OpenAI-compatible gateways","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ajv":"8.20.0","croner":"10.0.1","openai":"6.48.0","undici":"6.28.0","jsonc-parser":"3.3.1","better-sqlite3":"12.11.1","@earendil-works/pi-tui":"0.80.10"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.6","typescript":"5.9.3","@types/node":"22.19.11","@types/better-sqlite3":"7.6.13"},"_npmOperationalInternal":{"tmp":"tmp/looking-glass_0.10.0_1786514312032_0.13746328602723024","host":"s3://npm-registry-packages-npm-production"}},"0.11.0":{"name":"@sigil0/looking-glass","version":"0.11.0","license":"MIT","_id":"@sigil0/looking-glass@0.11.0","maintainers":[{"name":"sigil0","email":"3ojos666@gmail.com"}],"homepage":"https://github.com/S1gil0/lookingglass","bugs":{"url":"https://github.com/S1gil0/lookingglass/issues"},"os":["linux","darwin","win32"],"bin":{"glass":"dist/cli.js"},"dist":{"shasum":"ea7e1890fde019ce076eb68966dcde26a6e15c4b","tarball":"https://registry.npmjs.org/@sigil0/looking-glass/-/looking-glass-0.11.0.tgz","fileCount":233,"integrity":"sha512-9aq1xtfU+O/ZMfaEzulX40gweoJaM5hVjEUUtIG/0Ct+lpXYsl1nRsTdc71aSBe3zfUFwbWBtaOcsov/nbXlmw==","signatures":[{"sig":"MEQCIH3aVy1WmARv3n36zQaFm++agg8iZjAuMzSXc8THVaaWAiB/N3LvAgpR2DrXtRQ9G3kMykg2EqVP0GnWIS7D5G6QPg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5869687},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"fba89bb12158c8c8336f359c944b0a4e67582a1e","scripts":{"dev":"tsx src/cli.ts","test":"node --import tsx --test test/**/*.test.ts","build":"npm run clean && tsc -p tsconfig.build.json && node -e \"if (process.platform !== 'win32') require('node:fs').chmodSync('dist/cli.js', 0o755)\"","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\"","start":"node dist/cli.js","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sigil0","email":"3ojos666@gmail.com"},"repository":{"url":"git+https://github.com/S1gil0/lookingglass.git","type":"git"},"_npmVersion":"10.9.8","description":"A local coding CLI with persistent automation, agents, and OpenAI-compatible gateways","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ajv":"8.20.0","croner":"10.0.1","openai":"6.48.0","undici":"6.28.0","jsonc-parser":"3.3.1","better-sqlite3":"12.11.1","@earendil-works/pi-tui":"0.80.10"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.6","typescript":"5.9.3","@types/node":"22.19.11","@types/better-sqlite3":"7.6.13"},"_npmOperationalInternal":{"tmp":"tmp/looking-glass_0.11.0_1786533748650_0.794664401804452","host":"s3://npm-registry-packages-npm-production"}},"0.11.1":{"name":"@sigil0/looking-glass","version":"0.11.1","license":"MIT","_id":"@sigil0/looking-glass@0.11.1","maintainers":[{"name":"sigil0","email":"3ojos666@gmail.com"}],"homepage":"https://github.com/S1gil0/lookingglass","bugs":{"url":"https://github.com/S1gil0/lookingglass/issues"},"os":["linux","darwin","win32"],"bin":{"glass":"dist/cli.js"},"dist":{"shasum":"87958dd3da29c7aa771bf08b673ab8974d5bb147","tarball":"https://registry.npmjs.org/@sigil0/looking-glass/-/looking-glass-0.11.1.tgz","fileCount":233,"integrity":"sha512-FZStCKpVCBK+xqIwAutWk66jFxEIpinYGMcK6Ax9nWrwFVXLepMDbS0GnH2myS037wIDNBtwfNe8vSstc/iNgQ==","signatures":[{"sig":"MEUCIQDVZNqmE0z4iBgdldVu13Jn0hhstHmdkqxuKHLxuXKo2AIgVizMxrmDAr4k6mE6ma/oHfOIdGvGwVDn5RI3IZoanhI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5872217},"type":"module","_from":"file:sigil0-looking-glass-0.11.1.tgz","engines":{"node":">=22.19.0"},"scripts":{"dev":"tsx src/cli.ts","test":"node --import tsx --test test/**/*.test.ts","build":"npm run clean && tsc -p tsconfig.build.json && node -e \"if (process.platform !== 'win32') require('node:fs').chmodSync('dist/cli.js', 0o755)\"","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\"","start":"node dist/cli.js","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sigil0","email":"3ojos666@gmail.com"},"_resolved":"/root/looking-glass-public/sigil0-looking-glass-0.11.1.tgz","_integrity":"sha512-FZStCKpVCBK+xqIwAutWk66jFxEIpinYGMcK6Ax9nWrwFVXLepMDbS0GnH2myS037wIDNBtwfNe8vSstc/iNgQ==","repository":{"url":"git+https://github.com/S1gil0/lookingglass.git","type":"git"},"_npmVersion":"10.9.8","description":"A local coding CLI with persistent automation, agents, and OpenAI-compatible gateways","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ajv":"8.20.0","croner":"10.0.1","openai":"6.48.0","undici":"6.28.0","jsonc-parser":"3.3.1","better-sqlite3":"12.11.1","@earendil-works/pi-tui":"0.80.10"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.6","typescript":"5.9.3","@types/node":"22.19.11","@types/better-sqlite3":"7.6.13"},"_npmOperationalInternal":{"tmp":"tmp/looking-glass_0.11.1_1786561601284_0.11388291116974791","host":"s3://npm-registry-packages-npm-production"}},"0.11.2":{"name":"@sigil0/looking-glass","version":"0.11.2","license":"MIT","_id":"@sigil0/looking-glass@0.11.2","maintainers":[{"name":"sigil0","email":"3ojos666@gmail.com"}],"homepage":"https://github.com/S1gil0/lookingglass","bugs":{"url":"https://github.com/S1gil0/lookingglass/issues"},"os":["linux","darwin","win32"],"bin":{"glass":"dist/cli.js"},"dist":{"shasum":"5682f794119741b67bcf9585631f3ac1c26e9933","tarball":"https://registry.npmjs.org/@sigil0/looking-glass/-/looking-glass-0.11.2.tgz","fileCount":233,"integrity":"sha512-C/hm8Rmnmt33ZAmUD2w9BC/fivfpCQ0ZJL5Xtjvle3/iddEZy0l1z1HayS2X6e+YTaH0KqQM5Ck5g26aDQ3Nqg==","signatures":[{"sig":"MEYCIQC86lNPEF+aFukJOsCfB3daUjaVB3Z8Esa3VbGbDY/2IgIhAL7rsOvTnXwn8jhOLZEpUSPgQpwWmiKUlBQQVWABqONF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5883898},"type":"module","engines":{"node":">=22.19.0"},"gitHead":"2c6b3e160be2a858fd07848c9eb428e1dbe36e4d","scripts":{"dev":"tsx src/cli.ts","test":"node --import tsx --test test/**/*.test.ts","build":"npm run clean && tsc -p tsconfig.build.json && node -e \"if (process.platform !== 'win32') require('node:fs').chmodSync('dist/cli.js', 0o755)\"","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\"","start":"node dist/cli.js","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sigil0","email":"3ojos666@gmail.com"},"repository":{"url":"git+https://github.com/S1gil0/lookingglass.git","type":"git"},"_npmVersion":"10.9.8","description":"A local coding CLI with persistent automation, agents, and OpenAI-compatible gateways","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ajv":"8.20.0","croner":"10.0.1","openai":"6.48.0","undici":"6.28.0","jsonc-parser":"3.3.1","better-sqlite3":"12.11.1","@earendil-works/pi-tui":"0.80.10"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.6","typescript":"5.9.3","@types/node":"22.19.11","@types/better-sqlite3":"7.6.13"},"_npmOperationalInternal":{"tmp":"tmp/looking-glass_0.11.2_1786778859336_0.12008041704253825","host":"s3://npm-registry-packages-npm-production"}},"0.12.0":{"name":"@sigil0/looking-glass","version":"0.12.0","license":"MIT","_id":"@sigil0/looking-glass@0.12.0","maintainers":[{"name":"sigil0","email":"3ojos666@gmail.com"}],"homepage":"https://github.com/S1gil0/lookingglass","bugs":{"url":"https://github.com/S1gil0/lookingglass/issues"},"os":["linux","darwin","win32"],"bin":{"glass":"dist/cli.js"},"dist":{"shasum":"73307f089d936337f86657039041dc1f3c7829d5","tarball":"https://registry.npmjs.org/@sigil0/looking-glass/-/looking-glass-0.12.0.tgz","fileCount":249,"integrity":"sha512-1vZJeaMZVePTSuyyu2CFi6b87r0rdxpj3bcwo8CUujmcaf4+mQAjAqNEfy9IdxLYPQIK53otVtFQ7fGDhzkxGA==","signatures":[{"sig":"MEYCIQDQNnull72GeGsYgIU/i4Fu209HGx9fPifY1ku6FQQQqQIhAM5j8Ibzs5VcA5/7V/ttdOACzxdQBhoa1KM4dgGJPU5o","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6071736},"type":"module","engines":{"node":">=22.19.0"},"scripts":{"dev":"tsx src/cli.ts","test":"node --import tsx --test test/**/*.test.ts","build":"npm run clean && tsc -p tsconfig.build.json && node -e \"if (process.platform !== 'win32') require('node:fs').chmodSync('dist/cli.js', 0o755)\"","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\"","start":"node dist/cli.js","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sigil0","email":"3ojos666@gmail.com"},"repository":{"url":"git+https://github.com/S1gil0/lookingglass.git","type":"git"},"_npmVersion":"10.9.8","description":"A local coding CLI with persistent automation, agents, and OpenAI-compatible gateways","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ajv":"8.20.0","croner":"10.0.1","openai":"6.48.0","undici":"6.28.0","jsonc-parser":"3.3.1","better-sqlite3":"12.11.1","@earendil-works/pi-tui":"0.80.10"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.6","typescript":"5.9.3","@types/node":"22.19.11","@types/better-sqlite3":"7.6.13"},"_npmOperationalInternal":{"tmp":"tmp/looking-glass_0.12.0_1787203415935_0.9614112100983436","host":"s3://npm-registry-packages-npm-production"}},"0.13.0":{"name":"@sigil0/looking-glass","version":"0.13.0","license":"MIT","_id":"@sigil0/looking-glass@0.13.0","maintainers":[{"name":"sigil0","email":"3ojos666@gmail.com"}],"homepage":"https://github.com/S1gil0/lookingglass","bugs":{"url":"https://github.com/S1gil0/lookingglass/issues"},"os":["linux","darwin","win32"],"bin":{"glass":"dist/cli.js"},"dist":{"shasum":"c7864152a60e15528c3f4893c58c56a521429cd0","tarball":"https://registry.npmjs.org/@sigil0/looking-glass/-/looking-glass-0.13.0.tgz","fileCount":249,"integrity":"sha512-XzThjZnixJV0rfcMjV/M6/iVhNzo54ccxSZS1w1EegvJ+h2BYL5GWdR0NNw8mJxRWmYbAfUnqKvy9CGuX4UAKw==","signatures":[{"sig":"MEUCIQDccm3XSZI3eMJe/iANaxPZk4sL+kzlIksQqWQJhojUiwIgOg6SL4fx/Knhw706SYai/Tr006sqoqg5ScRJMNuLOpM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6077162},"type":"module","engines":{"node":">=22.19.0"},"scripts":{"dev":"tsx src/cli.ts","test":"node --import tsx --test test/**/*.test.ts","build":"npm run clean && tsc -p tsconfig.build.json && node -e \"if (process.platform !== 'win32') require('node:fs').chmodSync('dist/cli.js', 0o755)\"","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\"","start":"node dist/cli.js","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sigil0","email":"3ojos666@gmail.com"},"repository":{"url":"git+https://github.com/S1gil0/lookingglass.git","type":"git"},"_npmVersion":"10.9.8","description":"A local coding CLI with persistent automation, agents, and OpenAI-compatible gateways","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ajv":"8.20.0","croner":"10.0.1","openai":"6.48.0","undici":"6.28.0","jsonc-parser":"3.3.1","better-sqlite3":"12.11.1","@earendil-works/pi-tui":"0.80.10"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.6","typescript":"5.9.3","@types/node":"22.19.11","@types/better-sqlite3":"7.6.13"},"_npmOperationalInternal":{"tmp":"tmp/looking-glass_0.13.0_1787874035532_0.45404239544829594","host":"s3://npm-registry-packages-npm-production"}},"0.13.1":{"name":"@sigil0/looking-glass","version":"0.13.1","license":"MIT","_id":"@sigil0/looking-glass@0.13.1","maintainers":[{"name":"sigil0","email":"3ojos666@gmail.com"}],"homepage":"https://github.com/S1gil0/lookingglass","bugs":{"url":"https://github.com/S1gil0/lookingglass/issues"},"os":["linux","darwin","win32"],"bin":{"glass":"dist/cli.js"},"dist":{"shasum":"42390553af56c01ad2c80ca021ea8eaa929fc082","tarball":"https://registry.npmjs.org/@sigil0/looking-glass/-/looking-glass-0.13.1.tgz","fileCount":249,"integrity":"sha512-4ieARDBSY8XbBx3rKobakNdQ6OSNFcakTZTptbYDOuDhnMPhWv9dF+bfEV+plYyv/I1mV0jhmv/e3bgloYWOTA==","signatures":[{"sig":"MEUCIEIGIduWEzlXPAdXvJd72PMDl+D0tNUdF+fXWU0DqOQwAiEAyN5LszoXDJCgFMtscjYv7fGT5ATnvtUlZxl9IHrA4nQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQD5uRRPas0JvwtEUAh0AEf5Qubizm+4DixtwSbw8juQaAIgR6ooaGq442ILXlGDxDwJuTC5tqE1oLL6V92n6zOImbM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6081055},"type":"module","engines":{"node":">=22.19.0"},"scripts":{"dev":"tsx src/cli.ts","test":"node --import tsx --test test/**/*.test.ts","build":"npm run clean && tsc -p tsconfig.build.json && node -e \"if (process.platform !== 'win32') require('node:fs').chmodSync('dist/cli.js', 0o755)\"","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\"","start":"node dist/cli.js","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sigil0","email":"3ojos666@gmail.com"},"repository":{"url":"git+https://github.com/S1gil0/lookingglass.git","type":"git"},"_npmVersion":"10.9.8","description":"A local coding CLI with persistent automation, agents, and OpenAI-compatible gateways","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ajv":"8.20.0","croner":"10.0.1","openai":"6.48.0","undici":"6.28.0","jsonc-parser":"3.3.1","better-sqlite3":"12.11.1","@earendil-works/pi-tui":"0.80.10"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.6","typescript":"5.9.3","@types/node":"22.19.11","@types/better-sqlite3":"7.6.13"},"_npmOperationalInternal":{"tmp":"tmp/looking-glass_0.13.1_1789064931390_0.31392385307015136","host":"s3://npm-registry-packages-npm-production"}},"0.14.0":{"name":"@sigil0/looking-glass","version":"0.14.0","license":"MIT","_id":"@sigil0/looking-glass@0.14.0","maintainers":[{"name":"sigil0","email":"3ojos666@gmail.com"}],"homepage":"https://github.com/S1gil0/lookingglass","bugs":{"url":"https://github.com/S1gil0/lookingglass/issues"},"os":["linux","darwin","win32"],"bin":{"glass":"dist/cli.js"},"dist":{"shasum":"3495302e643cbeda5c35ae291be17ff1c271d760","tarball":"https://registry.npmjs.org/@sigil0/looking-glass/-/looking-glass-0.14.0.tgz","fileCount":257,"integrity":"sha512-0wl/MaUdah+3HGoXn89Zl0jFRvCBmHyr2EEyQ0npj26fKL0RSd7WtxsNYfIhbbQgQfKBe3TkPKJAZWnHb0+/Rg==","signatures":[{"sig":"MEUCIQDrCGouBLYxvfy03Ss1vHkR8E8PYSI34D4JWRQOfjGEKQIgfuR9I+jDlklrKIu3z+CmXPgRzNrISYvIk+xWN4VLu8Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDjSpZPyRRSsESlWY9FvEqFNhokiCDIny2o//H7+ANLfgIgfWcdWwPtecWMCvvvFFwAIriKs2m9R25B6Zr5s0pE1Vg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6162096},"type":"module","_from":"file:sigil0-looking-glass-0.14.0.tgz","engines":{"node":">=22.19.0"},"scripts":{"dev":"tsx src/cli.ts","test":"node --import tsx --test test/**/*.test.ts","build":"npm run clean && tsc -p tsconfig.build.json && node -e \"if (process.platform !== 'win32') require('node:fs').chmodSync('dist/cli.js', 0o755)\"","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\"","start":"node dist/cli.js","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"sigil0","email":"3ojos666@gmail.com"},"_resolved":"/root/looking-glass-public/sigil0-looking-glass-0.14.0.tgz","_integrity":"sha512-0wl/MaUdah+3HGoXn89Zl0jFRvCBmHyr2EEyQ0npj26fKL0RSd7WtxsNYfIhbbQgQfKBe3TkPKJAZWnHb0+/Rg==","repository":{"url":"git+https://github.com/S1gil0/lookingglass.git","type":"git"},"_npmVersion":"10.9.8","description":"A local coding CLI with persistent automation, agents, and OpenAI-compatible gateways","directories":{},"_nodeVersion":"22.23.1","dependencies":{"ajv":"8.20.0","croner":"10.0.1","openai":"6.48.0","undici":"6.28.0","jsonc-parser":"3.3.1","better-sqlite3":"12.11.1","@earendil-works/pi-tui":"0.80.10"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.6","typescript":"5.9.3","@types/node":"22.19.11","@types/better-sqlite3":"7.6.13"},"_npmOperationalInternal":{"tmp":"tmp/looking-glass_0.14.0_1789752562670_0.22832025834851155","host":"s3://npm-registry-packages-npm-production"}},"0.14.1":{"os":["linux","darwin","win32"],"_id":"@sigil0/looking-glass@0.14.1","bin":{"glass":"dist/cli.js"},"bugs":{"url":"https://github.com/S1gil0/lookingglass/issues"},"dist":{"shasum":"975b66317ac8449b66767d281afd843df1fc9708","tarball":"https://registry.npmjs.org/@sigil0/looking-glass/-/looking-glass-0.14.1.tgz","fileCount":257,"integrity":"sha512-rJllQ1fqUSTonOiLbnZRu87F640JFTdWAMmexSzLsRm72ilpz0OYJj+XkgNP217GrHOSldr2OvaVArVbclApZw==","signatures":[{"sig":"MEQCIAvKbHlyrbZLmw0fJiqkwwwSRgi8tCjpBQ9n0vOyyLy4AiA8COrkUSdIw92px3RSptonz5EZM0Ri+zmL8GiOOd7jJQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIAweUbzwF+Kft8k5JPDZ+sDrlETIQReuX2CW98YV3w/AAiARQ7xcZKdZuFgfJInxrQcJbq6DEqZ1tn2Me9EXF/797g=="}],"unpackedSize":6162155},"name":"@sigil0/looking-glass","type":"module","_from":"file:/root/looking-glass-release-0.14.1-a3fZZ2/sigil0-looking-glass-0.14.1.tgz","engines":{"node":">=22.19.0"},"license":"MIT","scripts":{"dev":"tsx src/cli.ts","test":"node --import tsx --test test/**/*.test.ts","build":"npm run clean && tsc -p tsconfig.build.json && node -e \"if (process.platform !== 'win32') require('node:fs').chmodSync('dist/cli.js', 0o755)\"","clean":"node --input-type=module -e \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\"","start":"node dist/cli.js","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run build"},"version":"0.14.1","_npmUser":{"name":"sigil0","email":"3ojos666@gmail.com"},"homepage":"https://github.com/S1gil0/lookingglass","_resolved":"/root/looking-glass-release-0.14.1-a3fZZ2/sigil0-looking-glass-0.14.1.tgz","_integrity":"sha512-rJllQ1fqUSTonOiLbnZRu87F640JFTdWAMmexSzLsRm72ilpz0OYJj+XkgNP217GrHOSldr2OvaVArVbclApZw==","repository":{"url":"git+https://github.com/S1gil0/lookingglass.git","type":"git"},"_npmVersion":"10.9.8","description":"A local coding CLI with persistent automation, agents, and OpenAI-compatible gateways","directories":{},"maintainers":[{"name":"sigil0","email":"3ojos666@gmail.com"}],"_nodeVersion":"22.23.1","dependencies":{"ajv":"8.20.0","croner":"10.0.1","openai":"6.48.0","undici":"6.28.0","jsonc-parser":"3.3.1","better-sqlite3":"12.11.1","@earendil-works/pi-tui":"0.80.10"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.20.6","typescript":"5.9.3","@types/node":"22.19.11","@types/better-sqlite3":"7.6.13"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/looking-glass_0.14.1_1790492626043_0.8572759135759067"}}},"time":{"created":"2026-07-21T09:08:34.924Z","modified":"2026-09-27T07:03:46.391Z","0.1.0":"2026-07-21T09:08:35.201Z","0.2.0":"2026-07-21T22:42:47.227Z","0.2.1":"2026-07-21T23:08:01.079Z","0.2.2":"2026-07-23T23:08:59.542Z","0.2.3":"2026-07-23T23:27:24.055Z","0.2.4":"2026-07-23T23:44:03.264Z","0.2.5":"2026-07-24T15:03:05.813Z","0.3.0":"2026-07-24T19:49:00.054Z","0.3.1":"2026-07-25T12:07:23.716Z","0.3.2":"2026-07-25T22:33:19.214Z","0.4.0":"2026-07-26T10:22:25.383Z","0.5.0":"2026-07-26T13:45:13.708Z","0.5.1":"2026-07-26T18:13:06.142Z","0.5.2":"2026-07-27T17:53:03.028Z","0.5.3":"2026-07-28T21:49:55.153Z","0.5.4":"2026-07-30T17:28:03.923Z","0.6.0":"2026-07-31T20:36:04.802Z","0.7.0":"2026-08-03T20:56:09.394Z","0.8.0":"2026-08-04T23:32:26.770Z","0.8.1":"2026-08-05T09:35:46.821Z","0.9.0":"2026-08-06T23:37:52.738Z","0.10.0":"2026-08-12T05:58:32.242Z","0.11.0":"2026-08-12T11:22:28.921Z","0.11.1":"2026-08-12T19:06:41.563Z","0.11.2":"2026-08-15T07:27:39.553Z","0.12.0":"2026-08-20T05:23:36.178Z","0.13.0":"2026-08-27T23:40:35.753Z","0.13.1":"2026-09-10T18:28:51.975Z","0.14.0":"2026-09-18T17:29:22.864Z","0.14.1":"2026-09-27T07:03:46.218Z"},"bugs":{"url":"https://github.com/S1gil0/lookingglass/issues"},"license":"MIT","homepage":"https://github.com/S1gil0/lookingglass","repository":{"url":"git+https://github.com/S1gil0/lookingglass.git","type":"git"},"description":"A local coding CLI with persistent automation, agents, and OpenAI-compatible gateways","maintainers":[{"name":"sigil0","email":"3ojos666@gmail.com"}],"readme":"<p align=\"center\">\n  <img src=\"./img/lg.png\" alt=\"Looking Glass — Persistent AI Automation\">\n</p>\n\nLooking Glass is an open-source local AI coding CLI that lets one model orchestrate while concurrent worker agents use another—with an independent provider, model, and reasoning level for each role. A hosted model can coordinate the session while faster, cheaper, or local models handle parallel work, or the arrangement can be reversed.\n\nIt combines this multi-model orchestration with interactive terminal chat, complete development tools, persistent sessions, durable SQLite state, and a scheduler that can run future model turns after the terminal closes.\n\n## Mix Models and Providers for Orchestration\n\nThe primary model owns the conversation, plans the work, and decides when to delegate. Worker agents run isolated discovery, implementation, or review tasks concurrently using their own shared agent configuration. The two roles can use the same gateway or completely different providers—for example, an OpenRouter model as coordinator and an LM Studio model for local worker agents.\n\nProvider, model, and reasoning effort are selected independently for the primary and agent roles and stored with the session. Scheduled turns resume with the same choices. Configure them from the interactive model pickers or directly with slash commands:\n\n```text\n/model openrouter:<main-model-id>\n/reasoning high\n/agentmodel lm-studio:<worker-model-id>\n/agentreasoning medium\n/agents on\n```\n\nThis makes it practical to reserve a stronger model for architecture and coordination while distributing parallel tasks to lower-latency or lower-cost models without leaving the session.\n\n## Persistent Sessions and Scheduled Turns\n\nThe key idea is **a session is more than a chat window**. A persistent session can survive after the terminal closes. The scheduler can later reopen the original workspace and trigger another AI turn inside that same session, retaining its:\n\n- Conversation, tool history, response continuity, and compaction checkpoints.\n- Workspace, provider, primary model, reasoning settings, and persistence state.\n- Approval mode, remembered approvals, worker-agent configuration, and schedules.\n- Scheduler results, inbox records, and durable tool-output artifacts.\n\nScheduled prompts are not separate stateless jobs or fresh chats. Future turns can inspect files and logs that changed in the meantime, run tests or other commands, modify code, and write their results back into the session. This enables workflows such as:\n\n- Start a deployment or long-running task, then schedule the same session to check the result.\n- Follow up on test output and fix failures automatically.\n- Run recurring project reviews that read the current codebase, execute tests, and report or resolve issues.\n- Continue debugging after external processes produce new logs or artifacts.\n- Keep a session working through scheduled turns while the interactive terminal is closed.\n- Combine exact scheduled shell commands with context-aware AI follow-ups.\n\n## What It Provides\n\n- **Interactive TUI and one-shot CLI prompts** for complete day-to-day development work.\n- **Workspace tools** for reading, searching, patching, and bounded host-shell execution.\n- **Persistent approval modes** for interactive and automated turns, including remembered approvals.\n- **Scheduled AI prompts, reminders, and deterministic shell commands.**\n- **Concurrent worker agents** with independently selected models and reasoning settings.\n- **Configured gateway providers** including codex-lb, LM Studio, OpenCode Go, OpenRouter, and a custom OpenAI-compatible profile.\n- **SQLite-backed sessions, scheduler state, and artifacts** with context recovery and compaction.\n- **A user-level scheduler** that runs independently of the interactive terminal (systemd on Linux, launchd on macOS, and Task Scheduler on Windows).\n\nLooking Glass is designed for one local operator. It is not a hosted service, multi-user system, or replacement for operating-system isolation.\n\n## Screenshots\n\n### Development workflow\n\n![Looking Glass reading project files, applying a patch, running tests, and tracking a task plan](./img/ex3.png)\n\n### Persistent session automation\n\n![Looking Glass scheduling work and resuming the same persistent session later](./img/ex2.png)\n\n### Concurrent worker agents\n\n![Looking Glass coordinating parallel worker agents and applying reviewed fixes](./img/ex1.png)\n\n## Requirements\n\n- Linux, macOS, or native Windows\n- Node.js 22.19.0 or newer\n- npm\n- `ripgrep` (`rg`, or `rg.exe` on Windows) on `PATH`\n- A running LM Studio or other configured OpenAI-compatible gateway, or an OpenRouter account\n\nmacOS support is experimental: the package and launchd backend are covered by\nthe cross-platform test suite and macOS CI, but have not yet been validated on\nthe maintainers' physical Mac hardware. Install Node.js and ripgrep with\nHomebrew if needed (`brew install node ripgrep`), then verify `node --version`\nmeets the minimum above.\n\nOn Windows, use Windows Terminal or another modern terminal. Looking Glass\nresolves the built-in Windows PowerShell executable at\n`%SystemRoot%\\System32\\WindowsPowerShell\\v1.0\\powershell.exe`; that executable\nmust be available. The shell tool and scheduled commands use noninteractive\nWindows PowerShell, so use PowerShell syntax for those commands. Linux and\nmacOS use noninteractive `/bin/bash`; scripts on macOS should remain compatible\nwith the system Bash or invoke another installed shell explicitly.\n\nFor a local LM Studio setup, the gateway URL is:\n\n```text\nhttp://127.0.0.1:1234/v1\n```\n\n## Install from npm\n\nOn Linux, macOS, or native Windows with Node.js 22.19.0 or newer:\n\n```text\nnpm install --global @sigil0/looking-glass\nglass --version\n```\n\nThe same commands run natively from PowerShell in Windows Terminal:\n\n```powershell\nnpm install --global @sigil0/looking-glass\nglass --version\n```\n\n## Install From Source\n\nFor development or to work from the source tree, clone the public repository:\n\n```text\ngit clone https://github.com/S1gil0/lookingglass.git\ncd lookingglass\nnpm ci\nnpm run build\nnpm link\nglass --version\n```\n\nYou can run directly from TypeScript during development with `npm run dev`, but the installed `glass` command and scheduler service use the compiled `dist/` output.\n\n## Configure a Gateway\n\nLooking Glass supports the built-in codex-lb and LM Studio Responses profiles, model-specific OpenCode Go routing, OpenRouter Chat Completions, and a custom OpenAI-compatible gateway profile. When a gateway requires an API key, it is read from the environment variable named by `gateway.apiKeyEnv`:\n\n```bash\nexport LM_STUDIO_API_KEY='your-token'\n```\n\nIn Windows PowerShell, use `$env:LM_STUDIO_API_KEY = 'your-token'` instead.\n\nConfiguration is loaded in this order:\n\n```text\nLinux:   ~/.config/looking-glass/config.jsonc\n         ~/.config/looking-glass/config.json\nmacOS:   ~/.config/looking-glass/config.jsonc\n         ~/.config/looking-glass/config.json\nWindows: %APPDATA%\\looking-glass\\config.jsonc\n         %APPDATA%\\looking-glass\\config.json\n<workspace>/.looking-glass.jsonc\n<workspace>/.looking-glass.json\n```\n\nSet `LOOKING_GLASS_CONFIG` to add a final, highest-priority explicit JSON or\nJSONC file. On\nWindows, `APPDATA` and `LOCALAPPDATA` provide the roaming configuration and\nlocal state roots respectively. `XDG_CONFIG_HOME` and `XDG_DATA_HOME` can\noverride those platform defaults. Workspace settings are applied after global\nsettings, so a project can select its own model, gateway, instructions, or\nsafety defaults.\n\nExample configuration:\n\n```jsonc\n{\n  \"gateway\": {\n    \"provider\": \"lm-studio\",\n    \"baseURL\": \"http://127.0.0.1:1234/v1\",\n    \"apiKeyEnv\": \"LM_STUDIO_API_KEY\",\n    \"timeoutMs\": 600000\n  },\n  \"model\": \"example-model\",\n  \"reasoningEffort\": \"medium\",\n  \"verbosity\": \"low\",\n  \"fast\": false,\n  \"tools\": {\n    \"approval\": \"code\",\n    \"shellTimeoutMs\": 120000,\n    \"maxOutputBytes\": 65536,\n    \"maxReadLines\": 2000,\n    \"maxToolRounds\": 1000\n  },\n  \"scheduler\": {\n    \"timezone\": \"UTC\",\n    \"pollIntervalMs\": 1000,\n    \"leaseMs\": 20000,\n    \"maxConcurrentCommands\": 2,\n    \"commandStartGraceMs\": 60000,\n    \"commandTimeoutMs\": 600000,\n    \"commandOutputBytes\": 65536\n  },\n  \"automation\": {\n    \"providerRetryMaxAttempts\": 8,\n    \"providerRetryMaxElapsedMs\": 900000,\n    \"agentTurnTimeoutMs\": 2700000,\n    \"scheduledTurnTimeoutMs\": 7200000\n  },\n  \"maintenance\": {\n    \"runOnStartup\": true,\n    \"reconcileOrphanedTools\": true,\n    \"agentSessions\": {\n      \"maxAgeMs\": 2592000000,\n      \"minAgeMs\": 3600000,\n      \"maxSessions\": 500,\n      \"maxLogicalBytes\": 536870912,\n      \"maxSessionsPerRun\": 25,\n      \"maxLogicalBytesPerRun\": 67108864\n    },\n    \"detachedArtifacts\": {\n      \"maxAgeMs\": 2592000000,\n      \"minAgeMs\": 3600000,\n      \"maxArtifacts\": 1000,\n      \"maxBytes\": 1073741824,\n      \"maxArtifactsPerRun\": 100,\n      \"maxBytesPerRun\": 134217728\n    },\n    \"schedulerHistory\": {\n      \"outputRetentionMs\": 2592000000,\n      \"occurrenceRetentionMs\": 7776000000,\n      \"acknowledgedInboxRetentionMs\": 2592000000,\n      \"deletedJobRetentionMs\": 2592000000,\n      \"minOccurrencesPerJob\": 20,\n      \"batchSize\": 500\n    }\n  }\n}\n```\n\nThe default approval mode is `code`.\nAutomation durations and maintenance ages are milliseconds. The automation\nretry and timeout limits apply to automated agent and scheduled turns; they do\nnot impose a retry budget on interactive turns.\n\n### Built-in and Custom OpenAI-Compatible Gateways\n\nLM Studio is one local option. OpenRouter uses `/v1/models` and\n`/v1/chat/completions` with stateless local history replay. The `custom` profile\nis an escape hatch for other OpenAI-compatible gateways; it is not a guarantee\nthat every API variant, extension, or provider-specific feature is compatible.\nThe exact feature set depends on the selected protocol and the gateway's\nsupport for streaming, tools, and model metadata.\n\nFor an authenticated gateway, set the environment variable named by\n`apiKeyEnv`. Unauthenticated local endpoints receive a harmless fallback\ntoken when that variable is unset:\n\n```bash\nexport LM_STUDIO_API_KEY='your-token'\n```\n\n```jsonc\n{\n  \"gateway\": {\n    \"provider\": \"lm-studio\",\n    \"baseURL\": \"http://127.0.0.1:1234/v1\",\n    \"apiKeyEnv\": \"LM_STUDIO_API_KEY\"\n  }\n}\n```\n\nOn Windows PowerShell, set it with `$env:LM_STUDIO_API_KEY = 'your-token'`.\n\n#### Custom gateway: Responses API\n\nSet `provider` to `custom` and use the default (or explicit) Responses\nprotocol. The gateway must provide `GET /models` and `POST /responses` relative\nto `baseURL`:\n\n```jsonc\n{\n  \"gateway\": {\n    \"provider\": \"custom\",\n    \"protocol\": \"responses\",\n    \"baseURL\": \"https://gateway.example/v1\",\n    \"apiKeyEnv\": \"CUSTOM_API_KEY\"\n  },\n  \"model\": \"example-model\"\n}\n```\n\n#### Custom gateway: Chat Completions API\n\nSelect `protocol: \"chat\"` when the gateway provides `GET /models` and\n`POST /chat/completions` instead:\n\n```jsonc\n{\n  \"gateway\": {\n    \"provider\": \"custom\",\n    \"protocol\": \"chat\",\n    \"baseURL\": \"https://gateway.example/v1\",\n    \"apiKeyEnv\": \"CUSTOM_API_KEY\"\n  },\n  \"model\": \"example-model\"\n}\n```\n\nWhen omitted, a custom gateway defaults to `protocol: \"responses\"` and\n`apiKeyEnv: \"CUSTOM_API_KEY\"`. Both custom protocols use standard bearer\nauthentication (`Authorization: Bearer ...`) and stateless local replay:\nLooking Glass sends the durable conversation context on each request rather\nthan relying on remote response continuity. Custom model catalog entries use\nconservative capability defaults: reasoning, images, parallel tool calls, and\nfast service are not advertised; an omitted context limit is estimated at\n32,768 tokens. Choose this profile only when the gateway\nmatches the expected OpenAI-compatible request and streaming response shapes.\n\nFor OpenRouter, use `https://openrouter.ai/api/v1`; selecting the provider\ndefaults `apiKeyEnv` to `OPENROUTER_API_KEY`:\n\n```jsonc\n{\n  \"gateway\": {\n    \"provider\": \"openrouter\",\n    \"baseURL\": \"https://openrouter.ai/api/v1\"\n  }\n}\n```\n\n#### OpenCode Go\n\nOpenCode Go uses `https://opencode.ai/zen/go/v1` by default, reads\n`OPENCODE_API_KEY`, and discovers its model catalog from `/models`. Looking\nGlass automatically routes each known model through its documented protocol:\nOpenAI Responses, OpenAI-compatible Chat Completions, or Anthropic Messages.\nIt also exposes only the model-specific effort levels documented by OpenCode,\nincluding `none`, `low`, `medium`, `high`, `xhigh`, and `max` where supported;\nsome models instead expose bounded `high` and `max` thinking budgets, while\nMiniMax M3 uses `high` as the switch for adaptive thinking. Unknown future\nmodel IDs use conservative Chat Completions defaults without an inferred\nreasoning control. OpenCode Go is separate from OpenCode Zen. For example:\n\n```bash\nexport OPENCODE_API_KEY='your-token'\n```\n\n```jsonc\n{\n  \"gateway\": {\n    \"provider\": \"opencode-go\",\n    \"baseURL\": \"https://opencode.ai/zen/go/v1\",\n    \"apiKeyEnv\": \"OPENCODE_API_KEY\"\n  },\n  \"model\": \"deepseek-v4-flash\"\n}\n```\n\nAdditional gateways can be listed in `gateways`; each provider must be unique.\nModels ending in `:free` or with zero catalog pricing are marked `[free]` by\n`glass models` and selected by `glass models --free`.\n\nInspect the configured model catalog and gateway health:\n\n```bash\nglass models\n```\n\nUse a provider-prefixed model ID to make an explicit provider selection:\n\n```text\n/model lm-studio:example-model\n```\n\nChanging provider or model rotates remote continuity and cache identity, then replays the durable local session history. Provider affinity is retained, so a provider does not change silently.\n\n## CLI At A Glance\n\nRun `glass help` for the built-in synopsis:\n\n```text\nglass                         Start the interactive chat\nglass run [--yes] [--session ID] PROMPT\nglass models                  List provider, model, context, and display name\nglass models --free           List only free models\nglass sessions                List durable interactive sessions\nglass sessions persist ID on|off\nglass config                  Print paths, instruction files, and effective config\nglass doctor [--json]        Check SQLite, ripgrep, providers, and scheduler status\nglass maintenance [dry-run|apply] [--json]\nglass cron status [--json]   Show scheduler service and aggregate state\nglass cron ...                Create and manage reminders, commands, and session prompts\n```\n\n`glass maintenance` is a dry-run unless `apply` (or `--apply`) is selected;\n`--json` is supported by maintenance, `doctor`, and `cron status`.\n\n### Start an Interactive Session\n\nRun `glass` from the workspace you want the model to work in:\n\n```bash\ncd ~/src/my-project\nglass\n```\n\nBare `glass` starts a fresh session. It appears in session history only after its first message; exiting or switching away before then discards the empty draft. The top metadata line shows the active model, reasoning effort, context usage, agent state, approval mode, persistence state, and session title. The transcript and tool history are saved as you work.\n\nAn empty interactive session opens on a centered Looking Glass startup screen. The screen remains available while slash commands such as `/model` run and changes to the normal transcript layout when the first non-empty plain prompt is accepted. Resuming or switching to a session with durable events skips the startup screen; `/new` and other empty sessions show it again.\n\n### Run One Prompt\n\nUse `glass run` when you want a single prompt from a script or a regular shell:\n\n```bash\nglass run \"Inspect the project and summarize its current state\"\nglass run \"Run the tests and explain any failures\"\n```\n\nUse `--session` to continue an existing session instead of creating a new one:\n\n```bash\nglass run --session SESSION_ID \"Continue the deployment investigation\"\n```\n\n`glass run --yes` automatically approves normal interactive approvals for the one-shot process, but does not approve persistent or critical actions. For fully noninteractive work, use a session whose durable approval mode is `unrestricted`.\n\n### Inspect the Local Installation\n\n```bash\nglass --help\nglass --version\nglass models\nglass sessions\nglass config\nglass doctor\n```\n\n`glass config` is useful when a session is using an unexpected model or gateway. It prints the workspace, state database, loaded instruction files, truncation status, and effective configuration without printing API-key values.\n\nIf configuration is missing, malformed, or the configured gateway is offline, the CLI still starts with safe defaults. Use `/config` inside the interactive session to choose a provider, endpoint, API-key environment variable, and model. The wizard probes the model catalog when available, stores non-secret settings in the global config, stores the entered key in the protected scheduler environment file, reloads the runtime immediately, and can be used to recover from a damaged configuration layer. API keys are never written to JSON. Configuration and scheduler-environment updates are transactional and restore the prior files if persistence or runtime reload fails. If a higher-priority workspace or explicit configuration keeps another gateway active, the wizard reports that override and removes the newly entered key from the scheduler environment rather than risking its use with a different endpoint; the non-secret global selection remains saved.\n\n## Maintenance and Operations\n\n`glass maintenance` previews cleanup without changing state (dry-run is the\ndefault). Use `apply` to make one bounded cleanup pass, and `--json` for the\naggregate report:\n\n```bash\nglass maintenance\nglass maintenance --json\nglass maintenance apply\nglass maintenance apply --json\n```\n\nStartup cleanup is enabled by default. It runs at most one apply pass per state\ndatabase in a process, and each pass is bounded by the `*PerRun` maintenance\nlimits and `schedulerHistory.batchSize`. A nested `agentSessions`,\n`detachedArtifacts`, or `schedulerHistory` report with `batchLimited: true`\nmeans a later startup or explicit `glass maintenance apply` can continue the\nwork; startup never loops without a bound. Set\n`maintenance.runOnStartup` to `false` to disable it, or override the\nmaintenance sections in global or explicit JSON/JSONC configuration to\ncustomize its age, quota, and per-run limits. Workspace maintenance overrides\nare ignored because retention operates on the shared state database. Set\n`maintenance.reconcileOrphanedTools` to `false` when orphaned-tool\nreconciliation is not wanted.\n\n`glass doctor --json` and `glass cron status --json` expose health and scheduler\nstate as aggregate, privacy-safe diagnostics. Maintenance `--json` reports\ncounts and policy values only: these outputs contain no row identifiers, paths,\nprompts, commands, inbox text, or stored output payloads.\n\n## Sessions: Durable Project Memory\n\nA session is a durable work thread scoped to a workspace. It is the unit that connects conversation context, files, model settings, permissions, and schedules.\n\n### Start, Resume, and Switch\n\n```bash\nglass                         # New interactive session in the current workspace\nglass chat --session ID       # Resume an interactive session\nglass run --session ID \"...\"  # Continue it with one prompt\n```\n\nInside the TUI:\n\n```text\n/new\n/sessions\n/sessions SESSION_ID\n/config\n```\n\nUse `/new` for a separate task, even in the same folder. This keeps unrelated context from contaminating one another. Use `/sessions` when you want to browse titles, models, approval modes, persistence state, schedule counts, and last activity.\n\nUse `/fork` to create and switch to an independent copy of the active session. The fork keeps the transcript, context checkpoints, model and session settings, and tool history, but receives a new session identity and response continuity. It is named automatically as `Session title (fork 1)`, `Session title (fork 2)`, and so on. Schedules and remembered command approvals are not copied; the original session remains unchanged.\n\n### What Persists\n\nLooking Glass stores session events and tool state in SQLite. Depending on the provider, it also stores local replay material or response continuity identifiers. Context compaction creates durable checkpoints instead of deleting the session's identity.\n\nCompaction keeps a bounded recent suffix of complete exchanges unchanged and summarizes older history using the session's configured **leaf model and provider** (`/agentmodel`), even with `/agents off`. It generates portable text directly rather than calling native/encrypted compaction, sizes summary parts against the leaf model's context and output limits, and never silently switches to the main model on failure. Legacy opaque checkpoints are reconstructed from durable semantic history, reusing the newest portable checkpoint when available.\n\nSummary parts share the existing bounded checkpoint allowance (32–64k characters, depending on part count). Space unused by shorter summaries is redistributed deterministically before longer summaries are trimmed. This does not increase output-token limits, request counts, or the replay-size limit. Genuine overflow and incomplete model output still produce quality warnings.\n\nRemote compaction is limited to two top-level attempts and three minutes in total (automated retry limits may shorten this); semantic parts retain their own bounded retries. Completed semantic parts survive the operation deadline; unfinished parts become bounded local excerpts. An outage with no completed semantic parts stops after at most twelve semantic requests instead of retrying every part. If essential compaction still fails because of an outage, empty summaries, or oversized history, the turn can continue with a clearly labeled, bounded local recovery checkpoint. This is an extractive fallback, not a semantic summary: older details may be omitted from model context, while source session events remain stored locally under the normal retention policy. Manual compaction reconciles interrupted tools with durable results or explicit unknown outcomes, without rerunning them. Cancellation, lease loss, authentication errors, active tool execution, and native checkpoints without recoverable source history are not bypassed. Optional end-of-turn maintenance can still defer compaction rather than degrade a completed answer.\n\nCheckpoint metadata records the summarizer, elapsed time, attempts, and bounded failure classifications (stage, known error code, HTTP status, part, and attempt). Diagnostics exclude raw provider error text and conversation content. Local excerpts, shortened summaries, and incomplete summaries produced by the current compaction still warn rather than show an unqualified success notice; hard failures retain the previous checkpoint and record a diagnostic note.\n\nOrdinary compaction retains inherited degradation as checkpoint provenance, but historical omissions alone no longer repeat warnings or label a successful compaction degraded. This applies to existing sessions without deleting history or old diagnostic notes: successfully summarizing an earlier lossy checkpoint does not restore its omitted details. Use **`/compact repair`** to explicitly attempt a source rebuild with the leaf model. Repair skips checkpoints marked degraded, reuses the newest usable portable checkpoint not marked degraded when available, and otherwise starts from retained original events. Normal compaction now retains one older usable checkpoint while degraded descendants exist, so future repairs need not replay the whole session. Historical tool calls are never executed again; durable results or explicit unknown outcomes are retained.\n\nRepair keeps the existing two-attempt/three-minute remote budget and 32-part limit. Its source preflight is capped at 8,388,608 characters of stored payloads and referenced tool outputs; leaf transcript limits may be tighter. Missing source events/results, oversized history, provider failure, cancellation, or a repair containing local excerpts, trimmed summaries, or incomplete output leave the previous checkpoint and response continuity intact. A diagnostic note may be added, and interrupted-tool reconciliation can record known results or uncertainty. Repair is opt-in because it can cost more than summarizing the current checkpoint. Very old sessions whose earlier usable checkpoints were already discarded may be too large to repair in one bounded operation; neither repair nor ordinary semantic summarization guarantees preservation of every detail.\n\nThe `ctx:` meter refreshes as soon as a checkpoint is saved, including during a tool loop. It shows a replay estimate marked with `~` until fresh provider usage is available, ignoring pre-compaction usage from retained responses. The denominator remains the main conversation model's context window, not the summarizer's.\n\nThe workspace is part of the session's operating context. Files are not copied into the database: the session continues to work against the same workspace on disk. If you schedule a prompt for a session, the scheduler opens that session in its workspace and sends the next model turn with the session's durable history.\n\nThis means a scheduled session can naturally follow a task such as:\n\n1. Ask the model to scaffold a service.\n2. Leave the workspace while tests or a deployment run.\n3. Schedule the same session to inspect the result.\n4. Let the scheduled turn read the files, see the prior conversation, run tools, and report or fix the next issue.\n\nThe model does not magically remember external changes that were never written to the workspace or session events. A scheduled prompt should explicitly ask it to inspect current files, logs, test results, or other durable inputs.\n\n### Rename and Manage a Session\n\nUse `/session` for the session menu. It can rename the session, manage persistence, inspect schedules, and review or revoke remembered approvals. Session deletion is permanent for the transcript, checkpoints, tool records, attached schedules, scheduler occurrences, inbox records, and approvals. Detached artifact files are retained.\n\n## TUI Commands\n\nEnter slash commands inside `glass`:\n\n| Command | Purpose |\n| --- | --- |\n| `/new` | Create and switch to a new session |\n| `/fork` | Fork the current session and switch to the independent copy |\n| `/sessions [ID]` | Browse sessions or switch directly to an ID |\n| `/session` | Open session management, rename, persistence, schedules, or approvals |\n| `/persist [on\\|off]` | Enable or disable persistence for this session |\n| `/model [ID]` | Select a primary model; without an ID, open the model picker |\n| `/reasoning [effort]` | Select primary model reasoning effort |\n| `/agents [on\\|off]` | Enable or disable delegation for this session |\n| `/agentmodel [ID]` | Select the model used by leaf agents and compaction |\n| `/agentreasoning [effort]` | Select leaf-agent reasoning effort |\n| `/fast [on\\|off]` | Toggle fast service when supported |\n| `/compact [repair]` | Compact context, or explicitly rebuild from retained source history |\n| `/permissions [review\\|code\\|unrestricted]` | Change durable approval mode |\n| `/schedule ...` | Schedule an AI turn in this session |\n| `/cron [session]` | Browse, run, pause, resume, resolve, or delete schedules |\n| `/inbox` | Show unread scheduler records and mark them read |\n| `/exit` | Exit the TUI |\n\nThe TUI supports mouse-wheel scrolling, `PageUp`, and `PageDown`. Dragging across rendered TUI text selects and copies it through OSC52 with a native clipboard fallback. To keep very large sessions responsive, the TUI renders the latest 1,000 transcript events while retaining the complete durable history and model context. The editor remains available during active work: submissions are acknowledged and run FIFO, with plain prompts continuing as follow-up turns, bare setting selectors available immediately, and their choices applying after the current turn before later queued work. Press `Esc` twice within 10 seconds to stop an active operation without leaving the TUI. Press `Ctrl+C` twice within 10 seconds to exit; if an operation is active, exiting stops it. Exiting does not hand an active turn to background processing, even when persistence is enabled.\n\nFor interactive turns, before any visible model output, transient connectivity,\nrate-limit, and temporary provider/model availability failures keep the current\nturn alive. Looking Glass retries indefinitely with exponential backoff capped\nat 30 seconds, preserving the session, task plan, and operation lease; press\n`Esc` twice to stop waiting without exiting. These retries remain\nuser-controlled and are not governed by the automation retry or timeout\nlimits. Failures after visible output are not retried because replaying them\ncould duplicate or mix streamed text.\n\n## The Main Automation Workflow\n\nScheduled session prompts are the feature to use when you want Looking Glass to continue a project by itself. A scheduled prompt is not a detached new chat. It is a future turn of an existing session.\n\n### Schedule From Inside the Session\n\nFirst make the session persistent:\n\n```text\n/persist on\n```\n\nThen schedule a one-shot follow-up:\n\n```text\n/schedule once 2026-07-20T12:00:00Z Inspect the current test results and fix any failures\n```\n\nOr schedule a recurring review using a five-field cron expression:\n\n```text\n/schedule cron \"0 9 * * 1-5\" Review project health, run the tests, and report anything requiring operator action\n```\n\nIf you use `/schedule` before persistence is enabled, the TUI offers to enable it. Scheduled session prompts inherit the current session's workspace, conversation, model, agent settings, approval mode, and durable state.\n\n### Schedule From the CLI\n\nUse `glass cron prompt` with an existing session:\n\n```bash\nglass cron prompt --once 2026-07-20T12:00:00Z --session SESSION_ID \"Inspect the current test results and fix any failures\"\n```\n\nRecurring prompt:\n\n```bash\nglass cron prompt --cron \"0 9 * * 1-5\" --timezone UTC --session SESSION_ID \"Review project health and report anything requiring operator action\"\n```\n\nThe target session must be persistent. Enable it from the TUI with `/persist on` or from the CLI:\n\n```bash\nglass sessions persist SESSION_ID on\n```\n\n### What Happens When It Runs\n\nThe scheduler daemon claims the occurrence and asks the selected session's model to process the prompt. The turn:\n\n- Reopens the same session ID.\n- Uses the same workspace on disk.\n- Replays or anchors the existing conversation context.\n- Retains the session's model, provider, reasoning, agents, and approval settings.\n- Can read files changed since the previous turn.\n- Can write files and run commands according to the session's durable permissions.\n- Writes the response, tool calls, output, and outcome back to durable state.\n- Appears in the scheduler inbox and session transcript.\n\nScheduled turns cannot wait for a human answer. In `review` and `code`, unremembered gated actions remain denied. In `unrestricted`, the session can execute available tools without confirmation. If a process is interrupted after a side effect may have occurred, the occurrence becomes unknown and must be explicitly resolved before a recurring job continues.\n\n### Keep Scheduled Work Safe and Useful\n\nWrite prompts that describe the desired autonomous boundary:\n\n```text\nReview the latest test output. Read the changed files, run the focused tests, and fix only failures inside this workspace. Summarize every change and leave deployment untouched.\n```\n\nFor recurring sessions, make the prompt idempotent and ask for current inspection rather than assuming the previous turn completed. Store important external inputs in files or logs that the session can read.\n\n## Scheduler Job Types\n\nLooking Glass supports three schedule types:\n\n| Job | What it does | Best for |\n| --- | --- | --- |\n| `reminder` | Writes a durable inbox message | Human follow-ups and deadlines |\n| `command` | Runs the exact stored command through the host shell | Deterministic tests, scripts, and maintenance |\n| `session_prompt` | Runs one model turn in a persistent session | Context-aware project automation |\n\nCreate a reminder:\n\n```bash\nglass cron reminder --once 2026-07-20T12:00:00Z \"Review the deployment dashboard\"\nglass cron reminder --cron \"0 9 * * 1-5\" --timezone UTC \"Review the deployment dashboard\"\n```\n\nCreate a deterministic command. Pass the full command as one quoted argument so\nits exact text is preserved. It runs through Bash on Linux and macOS, or\nWindows PowerShell on Windows:\n\n```bash\nglass cron command --once 2026-07-20T12:00:00Z \"npm test\"\n```\n\nUse host-shell syntax for scripts, for example:\n\n```bash\nglass cron command --cron \"0 2 * * *\" --cwd . \"./scripts/backup.sh\"  # Linux/macOS\n```\n\n```powershell\nglass cron command --cron \"0 2 * * *\" --cwd . \".\\scripts\\backup.ps1\"  # Windows\n```\n\nUnlike `session_prompt`, a deterministic command does not use model context. It runs exactly the command stored in the job, with the configured timeout and output limit.\n\nList and manage jobs:\n\n```bash\nglass cron list\nglass cron inbox\nglass cron inbox --all\nglass cron status\nglass cron pause JOB_ID\nglass cron resume JOB_ID\nglass cron run JOB_ID\nglass cron resolve JOB_ID\nglass cron delete JOB_ID\nglass cron ack INBOX_ID\n```\n\n`run` queues one immediate occurrence. `resolve` acknowledges an unknown side-effect outcome so a blocked recurring job can continue. `ack` marks an inbox item as read.\n\n## Install the Scheduler Service\n\nThe scheduler must be running for schedules to execute while the TUI is closed.\nBuild first, then install the native per-user scheduler:\n\n```text\nnpm run build\nglass cron install\nglass cron status\n```\n\nOn Linux, `glass cron install` manages the user-level systemd unit at\n`~/.config/systemd/user/looking-glass-scheduler.service`. On macOS, it installs\nand starts the user LaunchAgent\n`~/Library/LaunchAgents/com.sigil0.looking-glass.scheduler.plist`. On Windows, it\ncreates and starts the current user's logon task named `Looking Glass\nScheduler` through Task Scheduler. The Windows task uses the generated files\n`%APPDATA%\\looking-glass\\scheduler-launcher.ps1` and\n`%APPDATA%\\looking-glass\\scheduler-task.xml`; it runs with the user's\ninteractive token and least privilege. The task is not a Windows service.\n\nAll scheduler backends use the current user's state database, take one durable daemon\nlease, claim occurrences safely, and preserve scheduler state across\nuninstallation. Installation captures active `LOOKING_GLASS_CONFIG`,\n`XDG_CONFIG_HOME`, and `XDG_DATA_HOME` overrides (plus Windows app-data roots)\nso background turns use the same config, artifacts, and state locations:\n\n```bash\nglass cron uninstall\n```\n\nAuthenticated gateways used by scheduled prompts need their token available to\nthe scheduler. The optional environment file is\n`~/.config/looking-glass/scheduler.env` on Linux and macOS, and\n`%APPDATA%\\looking-glass\\scheduler.env` on Windows. On POSIX systems, keep it\noutside the repository with mode `0600`:\n\n```bash\ninstall -d -m 700 ~/.config/looking-glass\ntoken=\"$(printenv LM_STUDIO_API_KEY)\"\nkey_name='LM_STUDIO_API_KEY'\nprintf '%s' \"$key_name=$token\" > ~/.config/looking-glass/scheduler.env\nchmod 600 ~/.config/looking-glass/scheduler.env\n```\n\nOn Windows, create the same file from PowerShell and keep it accessible only to\nyour user account:\n\n```powershell\n$config = Join-Path $env:APPDATA 'looking-glass'\nNew-Item -ItemType Directory -Force $config | Out-Null\n$utf8NoBom = [System.Text.UTF8Encoding]::new($false)\n$token = [Environment]::GetEnvironmentVariable('LM_STUDIO_API_KEY')\n$keyName = 'LM_STUDIO_API_KEY'\n$line = $keyName + '=' + $token\n[IO.File]::WriteAllText((Join-Path $config 'scheduler.env'), $line, $utf8NoBom)\n```\n\nExported environment variables take precedence. Never commit this file.\n\nThe macOS LaunchAgent runs in the logged-in user's GUI domain. It continues\nafter the terminal closes, but not after that user logs out; sleep can delay a\nturn until the Mac wakes. Installation records the current `PATH` so launchd\ncan find tools such as `rg`; rerun `glass cron install` after changing that\npath. The plist contains paths and non-secret location overrides only. Gateway\ntokens remain in `scheduler.env` and are loaded by Looking Glass at runtime.\n\nFor macOS diagnostics, run:\n\n```bash\nglass cron status --json\nlaunchctl print \"gui/$(id -u)/com.sigil0.looking-glass.scheduler\"\n```\n\nIf launchd activation fails, run `glass cron daemon` in the foreground to see\napplication errors, then reinstall the LaunchAgent. Looking Glass does not\nwrite unbounded scheduler log files from the plist.\n\nTo run the daemon in the foreground for debugging:\n\n```bash\nglass cron daemon\n```\n\n## Agents\n\nThe main model can call `run_agents` with up to eight self-contained tasks and bounded concurrency. Agents are useful for independent discovery, disjoint implementation, newly discovered branches, or focused review after a change.\n\n```text\n/agentmodel lm-studio:example-model\n/agentreasoning high\n/agents on\n```\n\nEach worker gets a hidden child session with isolated conversation history, response continuity, and tool records. The parent transcript is not copied, so delegated prompts should include the objective, relevant files, constraints, validation command, and expected return format.\n\nWorkers share the filesystem with the parent. Keep concurrent tasks independent or assign disjoint files. Leaf agents cannot recursively spawn agents, create schedules, or ask the operator questions. They inherit the parent's approval mode and remembered approvals.\n\n## Tools\n\nThe model can use these built-in tools:\n\n| Tool | Function |\n| --- | --- |\n| `read` | Read files or bounded directory listings inside the workspace |\n| `glob` | Find files with bounded `ripgrep` searches |\n| `grep` | Search workspace text with bounded regular expressions |\n| `apply_patch` | Apply atomic workspace patches |\n| `bash` | Run bounded commands through the host shell |\n| `ask_user` | Ask the interactive operator a question |\n| `run_agents` | Run isolated leaf-agent tasks concurrently |\n| `schedule_create` | Create reminders, deterministic commands, or session prompts |\n| `schedule_list` | List schedules and scoped scheduler inbox records |\n| `schedule_manage` | Pause, resume, delete, run, resolve, or acknowledge schedules |\n\nFile tools are workspace-bound and symlink-aware. The `bash` tool is\nplatform-aware: it disables startup profiles and runs noninteractive Bash on\nLinux and macOS, or Windows PowerShell (`powershell.exe`) on Windows. It bounds\ncaptured output, stores oversized results as artifacts, and terminates process\ngroups on cancellation or timeout.\n\nPatches validate all operations before writing. Context-only hunks are accepted as exact, unique assertions, and unchanged files are reported without being rewritten. Stale or ambiguous matches, conflicting paths, workspace escapes, and malformed patches still fail preflight; approval rules are unchanged.\n\n## Approval Modes\n\nApproval mode is durable per session and applies to both interactive and scheduled model turns:\n\n| Mode | Reads | Normal writes | Host shell | Persistent actions | Critical actions |\n| --- | --- | --- | --- | --- | --- |\n| `review` | No prompt | Prompt | Prompt | Prompt | Prompt |\n| `code` | No prompt | No prompt | Prompt | Prompt | Prompt |\n| `unrestricted` | No prompt | No prompt | No prompt | No prompt | No prompt |\n\nChange the mode inside the TUI:\n\n```text\n/permissions review\n/permissions code\n/permissions unrestricted\n```\n\n`unrestricted` is fully noninteractive. It does not ask for confirmation for destructive commands, access-critical changes, schedules, or uncertain reruns. Risk is still classified for logging and display, but does not gate execution.\n\nIn `code`, choose `Always approve` when a command family should be reusable.\nShell approvals are scoped by shell kind. Bash keeps leading-executable\nremembered scopes: approving `cat one.txt` on Linux authorizes later Bash\ncommands starting with `cat`, regardless of arguments, redirects, working\ndirectory, timeout, risk classification, or compound suffix. PowerShell\napprovals are exact command, working-directory, and timeout only. Other tools\nuse their canonical action arguments. Remembered approvals apply to the\nsession's main turns, agents, and scheduled turns.\n\nLooking Glass is not a sandbox. The process has the operating-system permissions of the user who launched it. Use `review` for unfamiliar repositories and reserve `unrestricted` for trusted local work.\n\n## State and Workspace Instructions\n\nDefault platform paths:\n\n| Data | Linux | macOS | Windows | Override |\n| --- | --- | --- | --- | --- |\n| Global config | `~/.config/looking-glass/` | `~/.config/looking-glass/` | `%APPDATA%\\looking-glass\\` | `XDG_CONFIG_HOME` |\n| SQLite state | `~/.local/share/looking-glass/state.db` | `~/.local/share/looking-glass/state.db` | `%LOCALAPPDATA%\\looking-glass\\state.db` | `LOOKING_GLASS_DB` |\n| Artifacts | `~/.local/share/looking-glass/artifacts/` | `~/.local/share/looking-glass/artifacts/` | `%LOCALAPPDATA%\\looking-glass\\artifacts\\` | `XDG_DATA_HOME` |\n| Scheduler environment | `~/.config/looking-glass/scheduler.env` | `~/.config/looking-glass/scheduler.env` | `%APPDATA%\\looking-glass\\scheduler.env` | `XDG_CONFIG_HOME` |\n\nOn Windows, `APPDATA` and `LOCALAPPDATA` select the roaming configuration and\nlocal data roots (with a home-directory fallback if unset). State directories\nuse mode `0700` where POSIX permissions are available. Large tool output is\nretained as a durable artifact and referenced from the model result. Do not\ncommit the database, artifacts, credentials, `.env` files, or local\nconfiguration.\n\n### Retention and protection\n\nMaintenance only auto-prunes old non-persistent leaf-agent sessions (or the\noldest eligible sessions needed to satisfy configured quotas), detached\nartifacts, acknowledged inbox records, and known terminal scheduler history\nand stored outputs after their retention periods. Interactive sessions,\npersistent sessions, sessions with schedules, active leases, active schedules,\nunread inbox items, and unknown outcomes are protected. Orphaned started tool\ncalls are marked `unknown` rather than deleted; expired leases may be removed\nwhen `reconcileOrphanedTools` is enabled. Session deletion can detach attached\nartifacts, which are then subject to the detached-artifact policy.\n\nMaintenance reports and the `doctor --json`/`cron status --json` operational\nsnapshots are aggregate and privacy-safe: they contain counts, ages, and byte\nmetadata, not identifiers, paths, prompts, commands, or stored content.\n\nLooking Glass loads instruction files in this order:\n\n1. Linux/macOS: `~/.config/looking-glass/AGENTS.md`; Windows: `%APPDATA%\\looking-glass\\AGENTS.md`\n2. `<workspace>/AGENTS.md`\n3. Paths listed in the `instructions` configuration array\n\nInstruction files can describe project conventions and operational context, but cannot create approval records or override a session's durable permissions. Only an explicit interactive `Always approve` decision creates reusable authorization.\n\n## Troubleshooting\n\nCheck the effective environment:\n\n```bash\nglass config\nglass doctor\nglass doctor --json\nglass cron status --json\nglass maintenance --json\nglass models\n```\n\nCommon fixes:\n\n- If the model list is empty, verify the gateway URL and API key environment variable.\n- If a scheduled prompt does not run, verify the session is persistent and `glass cron status --json` shows an active daemon and no unknown occurrence.\n- If LM Studio schedules fail after the TUI exits, put the token in the platform scheduler environment file (`~/.config/looking-glass/scheduler.env` on Linux/macOS or `%APPDATA%\\looking-glass\\scheduler.env` on Windows).\n- If mouse controls do not respond on Windows, use an up-to-date Windows Terminal session and confirm native Windows PowerShell is available at `%SystemRoot%\\System32\\WindowsPowerShell\\v1.0\\powershell.exe`; all approval and picker actions remain available from the keyboard.\n- On macOS, if `glass cron status --json` reports launchd inactive, confirm the user is logged in, inspect the LaunchAgent with `launchctl print \"gui/$(id -u)/com.sigil0.looking-glass.scheduler\"`, and rerun `glass cron install`.\n- If a recurring job is blocked, inspect `glass cron list`, review the unknown outcome, then run `glass cron resolve JOB_ID` deliberately.\n- If a nested maintenance report has `batchLimited: true`, rerun `glass maintenance apply` deliberately; per-run caps intentionally spread cleanup across bounded passes.\n- If startup cleanup is unexpected, inspect `glass config` and set `maintenance.runOnStartup` to `false` or customize the maintenance policy in the global or explicit config; workspace maintenance overrides are ignored because the state database is shared.\n- If a resumed session appears to have lost context, confirm you used `--session ID` and are looking at the same workspace and state database.\n- After source changes, run `npm run build` before using the installed `glass` command or reinstalling the scheduler service.\n\n## Development\n\n```bash\nnpm ci\nnpm run typecheck\nnpm test\nnpm run build\nnpm run dev\nnpm pack --dry-run\n```\n\nThe build output is ignored by Git. The public source repository is:\n\n```text\nhttps://github.com/S1gil0/lookingglass.git\n```\n\n## Repository Layout\n\n```text\nsrc/\n  app.ts                 Application wiring and workspace discovery\n  cli.ts                 CLI entry point and scheduler commands\n  config.ts              Global/workspace configuration loading\n  maintenance.ts         Bounded retention and orphan reconciliation\n  operations.ts          Aggregate, privacy-safe operational snapshots\n  engine/                Conversation execution and context projection\n  model/                OpenAI-compatible gateway client integrations\n  scheduler/             Persistent jobs, leases, claims, runner, daemon\n  storage/               SQLite sessions, events, and artifacts\n  tools/                 Coding tools, schemas, approvals, and safety policy\n  ui/                    TUI and stdio interfaces\ntest/                    Unit and integration coverage\nimg/                     README screenshots\nlooking-glass-light.svg  README title graphic (light)\nlooking-glass-dark.svg   README title graphic (dark)\n```\n","readmeFilename":"README.md"}