@kb-labs/agent-store 2.14.0 → 2.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":["fs"],"mappings":";;;;AAWA,eAAe,cAAA,CAAe,UAAkB,KAAA,EAA+B;AAC7E,EAAA,MAAMA,QAAA,CAAG,MAAW,IAAA,CAAA,OAAA,CAAQ,QAAQ,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAC1D,EAAA,MAAMA,SAAG,UAAA,CAAW,QAAA,EAAU,GAAG,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC;AAAA,CAAA,EAAM,OAAO,CAAA;AACrE;AAEA,eAAe,cAAiB,QAAA,EAAgC;AAC9D,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAMA,QAAA,CAAG,QAAA,CAAS,UAAU,OAAO,CAAA;AACnD,IAAA,OAAO,QACJ,KAAA,CAAM,IAAI,EACV,MAAA,CAAO,CAAC,SAAS,IAAA,CAAK,IAAA,GAAO,MAAA,GAAS,CAAC,EACvC,GAAA,CAAI,CAAC,SAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAM,CAAA;AAAA,EACxC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAEO,IAAM,uBAAN,MAA2B;AAAA,EAChC,YAA6B,UAAA,EAAoB;AAApB,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAAA,EAAqB;AAAA,EAArB,UAAA;AAAA,EAE7B,eAAA,GAA0B;AACxB,IAAA,OAAY,IAAA,CAAA,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY,KAAA,EAAO,UAAU,UAAU,CAAA;AAAA,EAC/D;AAAA,EAEA,cAAc,SAAA,EAA2B;AACvC,IAAA,OAAY,IAAA,CAAA,IAAA,CAAK,IAAA,CAAK,eAAA,EAAgB,EAAG,SAAS,CAAA;AAAA,EACpD;AAAA,EAEA,eAAA,CAAgB,WAAmB,IAAA,EAAsB;AACvD,IAAA,OAAY,IAAA,CAAA,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,SAAS,GAAG,IAAI,CAAA;AAAA,EACtD;AAAA,EAEA,MAAM,uBAAuB,SAAA,EAAkC;AAC7D,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,aAAA,CAAc,SAAS,CAAA;AACxC,IAAA,MAAMA,SAAG,KAAA,CAAM,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AACvC,IAAA,MAAM,cAAA,GAAiB;AAAA,MACrB,aAAA;AAAA,MACA,oBAAA;AAAA,MACA,mBAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,MACZ,cAAA,CAAe,GAAA,CAAI,OAAO,IAAA,KAAS;AACjC,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,SAAA,EAAW,IAAI,CAAA;AACnD,QAAA,IAAI;AACF,UAAA,MAAMA,QAAA,CAAG,OAAO,MAAM,CAAA;AAAA,QACxB,CAAA,CAAA,MAAQ;AACN,UAAA,MAAM,OAAA,GAAU,IAAA,KAAS,mBAAA,GAAsB,EAAC,GAAI,IAAA;AACpD,UAAA,MAAMA,QAAA,CAAG,UAAU,MAAA,EAAQ,CAAA,EAAG,KAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAC;AAAA,CAAA,EAAM,OAAO,CAAA;AAAA,QAC7E;AAAA,MACF,CAAC;AAAA,KACH;AAEA,IAAA,MAAM,aAAA,GAAgB,CAAC,aAAA,EAAe,mBAAA,EAAqB,oBAAoB,cAAc,CAAA;AAC7F,IAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,MACZ,aAAA,CAAc,GAAA,CAAI,OAAO,IAAA,KAAS;AAChC,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,SAAA,EAAW,IAAI,CAAA;AACnD,QAAA,IAAI;AACF,UAAA,MAAMA,QAAA,CAAG,OAAO,MAAM,CAAA;AAAA,QACxB,CAAA,CAAA,MAAQ;AACN,UAAA,MAAMA,QAAA,CAAG,SAAA,CAAU,MAAA,EAAQ,EAAA,EAAI,OAAO,CAAA;AAAA,QACxC;AAAA,MACF,CAAC;AAAA,KACH;AAAA,EACF;AAAA,EAEA,MAAM,oBAAoB,OAAA,EAAgE;AACxF,IAAA,MAAM,IAAA,CAAK,sBAAA,CAAuB,OAAA,CAAQ,EAAE,CAAA;AAC5C,IAAA,MAAMA,QAAA,CAAG,SAAA;AAAA,MACP,IAAA,CAAK,eAAA,CAAgB,OAAA,CAAQ,EAAA,EAAI,cAAc,CAAA;AAAA,MAC/C,GAAG,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAC;AAAA,CAAA;AAAA,MACnC;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,eAAA,CAAgB,SAAA,EAAmB,KAAA,EAAmC;AAC1E,IAAA,MAAM,IAAA,CAAK,uBAAuB,SAAS,CAAA;AAC3C,IAAA,MAAMA,QAAA,CAAG,SAAA;AAAA,MACP,IAAA,CAAK,eAAA,CAAgB,SAAA,EAAW,mBAAmB,CAAA;AAAA,MACnD,GAAG,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,IAAA,EAAM,CAAC,CAAC;AAAA,CAAA;AAAA,MACjC;AAAA,KACF;AACA,IAAA,MAAM,IAAA,CAAK,kBAAA,CAAmB,SAAA,EAAW,KAAA,CAAM,MAAM,CAAA;AACrD,IAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,SAAA,EAAW,KAAA,CAAM,UAAU,IAAI,CAAA;AAAA,EAC7D;AAAA,EAEA,MAAM,gBAAgB,SAAA,EAAgD;AACpE,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAMA,QAAA,CAAG,QAAA,CAAS,KAAK,eAAA,CAAgB,SAAA,EAAW,mBAAmB,CAAA,EAAG,OAAO,CAAA;AAC/F,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AACjC,MAAA,OAAO,UAAU,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,CAAO,YAAY,MAAA,GAAwB,IAAA;AAAA,IAC5F,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,kBAAA,CAAmB,SAAA,EAAmB,MAAA,EAA0C;AACpF,IAAA,MAAM,IAAA,CAAK,uBAAuB,SAAS,CAAA;AAC3C,IAAA,MAAMA,QAAA,CAAG,SAAA;AAAA,MACP,IAAA,CAAK,eAAA,CAAgB,SAAA,EAAW,aAAa,CAAA;AAAA,MAC7C,GAAG,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC;AAAA,CAAA;AAAA,MAClC;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,gBAAA,CAAiB,SAAA,EAAmB,MAAA,EAA4C;AACpF,IAAA,MAAM,IAAA,CAAK,uBAAuB,SAAS,CAAA;AAC3C,IAAA,MAAMA,QAAA,CAAG,SAAA;AAAA,MACP,IAAA,CAAK,eAAA,CAAgB,SAAA,EAAW,oBAAoB,CAAA;AAAA,MACpD,GAAG,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC;AAAA,CAAA;AAAA,MAClC;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,kBAAA,CAAmB,SAAA,EAAmB,IAAA,EAA+B;AACzE,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAMA,QAAA,CAAG,QAAA,CAAS,KAAK,eAAA,CAAgB,SAAA,EAAW,IAAI,CAAA,EAAG,OAAO,CAAA;AAChF,MAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,EAAK,EAAG;AACnB,QAAA,OAAO,CAAA;AAAA,MACT;AACA,MAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,CAAE,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,EAAK,CAAE,MAAA,GAAS,CAAC,CAAA,CAAE,MAAA;AAAA,IACtE,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,UAAA,CAAW,SAAA,EAAmB,IAAA,EAAwC;AAC1E,IAAA,MAAM,eAAe,IAAA,CAAK,eAAA,CAAgB,SAAA,EAAW,aAAa,GAAG,IAAI,CAAA;AAAA,EAC3E;AAAA,EAEA,MAAM,gBAAA,CAAiB,SAAA,EAAmB,MAAA,EAAuC;AAC/E,IAAA,MAAM,eAAe,IAAA,CAAK,eAAA,CAAgB,SAAA,EAAW,mBAAmB,GAAG,MAAM,CAAA;AAAA,EACnF;AAAA,EAEA,MAAM,eAAA,CAAgB,SAAA,EAAmB,KAAA,GAAQ,GAAA,EAAgC;AAC/E,IAAA,MAAM,UAAU,MAAM,aAAA,CAA8B,KAAK,eAAA,CAAgB,SAAA,EAAW,mBAAmB,CAAC,CAAA;AACxG,IAAA,IAAI,KAAA,IAAS,CAAA,IAAK,OAAA,CAAQ,MAAA,IAAU,KAAA,EAAO;AACzC,MAAA,OAAO,OAAA;AAAA,IACT;AACA,IAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,CAAC,KAAK,CAAA;AAAA,EAC7B;AAAA,EAEA,MAAM,eAAA,CAAgB,SAAA,EAAmB,MAAA,EAAgD;AACvF,IAAA,MAAM,eAAe,IAAA,CAAK,eAAA,CAAgB,SAAA,EAAW,kBAAkB,GAAG,MAAM,CAAA;AAAA,EAClF;AACF","file":"index.js","sourcesContent":["import { promises as fs } from 'node:fs';\nimport * as path from 'node:path';\nimport type {\n AgentSession,\n KernelState,\n MemoryRollup,\n RuntimeTurnRecord,\n KernelMemoryState,\n ToolCallRecord,\n} from '@kb-labs/agent-contracts';\n\nasync function appendJsonLine(filePath: string, value: unknown): Promise<void> {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.appendFile(filePath, `${JSON.stringify(value)}\\n`, 'utf-8');\n}\n\nasync function readJsonLines<T>(filePath: string): Promise<T[]> {\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n return content\n .split('\\n')\n .filter((line) => line.trim().length > 0)\n .map((line) => JSON.parse(line) as T);\n } catch {\n return [];\n }\n}\n\nexport class SessionArtifactStore {\n constructor(private readonly workingDir: string) {}\n\n getSessionsRoot(): string {\n return path.join(this.workingDir, '.kb', 'agents', 'sessions');\n }\n\n getSessionDir(sessionId: string): string {\n return path.join(this.getSessionsRoot(), sessionId);\n }\n\n getArtifactPath(sessionId: string, name: string): string {\n return path.join(this.getSessionDir(sessionId), name);\n }\n\n async ensureSessionArtifacts(sessionId: string): Promise<void> {\n const dir = this.getSessionDir(sessionId);\n await fs.mkdir(dir, { recursive: true });\n const emptyJsonFiles = [\n 'memory.json',\n 'memory-rollup.json',\n 'kernel-state.json',\n 'plan.json',\n 'file-changes.json',\n ];\n await Promise.all(\n emptyJsonFiles.map(async (name) => {\n const target = this.getArtifactPath(sessionId, name);\n try {\n await fs.access(target);\n } catch {\n const initial = name === 'file-changes.json' ? [] : null;\n await fs.writeFile(target, `${JSON.stringify(initial, null, 2)}\\n`, 'utf-8');\n }\n }),\n );\n\n const emptyLogFiles = ['turns.jsonl', 'tool-ledger.jsonl', 'run-ledger.jsonl', 'trace.ndjson'];\n await Promise.all(\n emptyLogFiles.map(async (name) => {\n const target = this.getArtifactPath(sessionId, name);\n try {\n await fs.access(target);\n } catch {\n await fs.writeFile(target, '', 'utf-8');\n }\n }),\n );\n }\n\n async saveSessionMetadata(session: AgentSession & Record<string, unknown>): Promise<void> {\n await this.ensureSessionArtifacts(session.id);\n await fs.writeFile(\n this.getArtifactPath(session.id, 'session.json'),\n `${JSON.stringify(session, null, 2)}\\n`,\n 'utf-8',\n );\n }\n\n async saveKernelState(sessionId: string, state: KernelState): Promise<void> {\n await this.ensureSessionArtifacts(sessionId);\n await fs.writeFile(\n this.getArtifactPath(sessionId, 'kernel-state.json'),\n `${JSON.stringify(state, null, 2)}\\n`,\n 'utf-8',\n );\n await this.saveMemorySnapshot(sessionId, state.memory);\n await this.saveMemoryRollup(sessionId, state.rollup ?? null);\n }\n\n async loadKernelState(sessionId: string): Promise<KernelState | null> {\n try {\n const content = await fs.readFile(this.getArtifactPath(sessionId, 'kernel-state.json'), 'utf-8');\n const parsed = JSON.parse(content);\n return parsed && typeof parsed === 'object' && parsed.sessionId ? parsed as KernelState : null;\n } catch {\n return null;\n }\n }\n\n async saveMemorySnapshot(sessionId: string, memory: KernelMemoryState): Promise<void> {\n await this.ensureSessionArtifacts(sessionId);\n await fs.writeFile(\n this.getArtifactPath(sessionId, 'memory.json'),\n `${JSON.stringify(memory, null, 2)}\\n`,\n 'utf-8',\n );\n }\n\n async saveMemoryRollup(sessionId: string, rollup: MemoryRollup | null): Promise<void> {\n await this.ensureSessionArtifacts(sessionId);\n await fs.writeFile(\n this.getArtifactPath(sessionId, 'memory-rollup.json'),\n `${JSON.stringify(rollup, null, 2)}\\n`,\n 'utf-8',\n );\n }\n\n async countArtifactLines(sessionId: string, name: string): Promise<number> {\n try {\n const content = await fs.readFile(this.getArtifactPath(sessionId, name), 'utf-8');\n if (!content.trim()) {\n return 0;\n }\n return content.split('\\n').filter((line) => line.trim().length > 0).length;\n } catch {\n return 0;\n }\n }\n\n async appendTurn(sessionId: string, turn: RuntimeTurnRecord): Promise<void> {\n await appendJsonLine(this.getArtifactPath(sessionId, 'turns.jsonl'), turn);\n }\n\n async appendToolRecord(sessionId: string, record: ToolCallRecord): Promise<void> {\n await appendJsonLine(this.getArtifactPath(sessionId, 'tool-ledger.jsonl'), record);\n }\n\n async loadToolRecords(sessionId: string, limit = 200): Promise<ToolCallRecord[]> {\n const records = await readJsonLines<ToolCallRecord>(this.getArtifactPath(sessionId, 'tool-ledger.jsonl'));\n if (limit <= 0 || records.length <= limit) {\n return records;\n }\n return records.slice(-limit);\n }\n\n async appendRunRecord(sessionId: string, record: Record<string, unknown>): Promise<void> {\n await appendJsonLine(this.getArtifactPath(sessionId, 'run-ledger.jsonl'), record);\n }\n}\n"]}
1
+ {"version":3,"sources":["../../../../../../Users/kirillbaranov/Desktop/kb-labs-workspace/plugins/agents/store/src/index.ts"],"names":["fs"],"mappings":"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","file":"index.js","sourcesContent":["import { promises as fs } from 'node:fs';\nimport * as path from 'node:path';\nimport type {\n AgentSession,\n KernelState,\n MemoryRollup,\n RuntimeTurnRecord,\n KernelMemoryState,\n ToolCallRecord,\n} from '@kb-labs/agent-contracts';\n\nasync function appendJsonLine(filePath: string, value: unknown): Promise<void> {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.appendFile(filePath, `${JSON.stringify(value)}\\n`, 'utf-8');\n}\n\nasync function readJsonLines<T>(filePath: string): Promise<T[]> {\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n return content\n .split('\\n')\n .filter((line) => line.trim().length > 0)\n .map((line) => JSON.parse(line) as T);\n } catch {\n return [];\n }\n}\n\nexport class SessionArtifactStore {\n constructor(private readonly workingDir: string) {}\n\n getSessionsRoot(): string {\n return path.join(this.workingDir, '.kb', 'agents', 'sessions');\n }\n\n getSessionDir(sessionId: string): string {\n return path.join(this.getSessionsRoot(), sessionId);\n }\n\n getArtifactPath(sessionId: string, name: string): string {\n return path.join(this.getSessionDir(sessionId), name);\n }\n\n async ensureSessionArtifacts(sessionId: string): Promise<void> {\n const dir = this.getSessionDir(sessionId);\n await fs.mkdir(dir, { recursive: true });\n const emptyJsonFiles = [\n 'memory.json',\n 'memory-rollup.json',\n 'kernel-state.json',\n 'plan.json',\n 'file-changes.json',\n ];\n await Promise.all(\n emptyJsonFiles.map(async (name) => {\n const target = this.getArtifactPath(sessionId, name);\n try {\n await fs.access(target);\n } catch {\n const initial = name === 'file-changes.json' ? [] : null;\n await fs.writeFile(target, `${JSON.stringify(initial, null, 2)}\\n`, 'utf-8');\n }\n }),\n );\n\n const emptyLogFiles = ['turns.jsonl', 'tool-ledger.jsonl', 'run-ledger.jsonl', 'trace.ndjson'];\n await Promise.all(\n emptyLogFiles.map(async (name) => {\n const target = this.getArtifactPath(sessionId, name);\n try {\n await fs.access(target);\n } catch {\n await fs.writeFile(target, '', 'utf-8');\n }\n }),\n );\n }\n\n async saveSessionMetadata(session: AgentSession & Record<string, unknown>): Promise<void> {\n await this.ensureSessionArtifacts(session.id);\n await fs.writeFile(\n this.getArtifactPath(session.id, 'session.json'),\n `${JSON.stringify(session, null, 2)}\\n`,\n 'utf-8',\n );\n }\n\n async saveKernelState(sessionId: string, state: KernelState): Promise<void> {\n await this.ensureSessionArtifacts(sessionId);\n await fs.writeFile(\n this.getArtifactPath(sessionId, 'kernel-state.json'),\n `${JSON.stringify(state, null, 2)}\\n`,\n 'utf-8',\n );\n await this.saveMemorySnapshot(sessionId, state.memory);\n await this.saveMemoryRollup(sessionId, state.rollup ?? null);\n }\n\n async loadKernelState(sessionId: string): Promise<KernelState | null> {\n try {\n const content = await fs.readFile(this.getArtifactPath(sessionId, 'kernel-state.json'), 'utf-8');\n const parsed = JSON.parse(content);\n return parsed && typeof parsed === 'object' && parsed.sessionId ? parsed as KernelState : null;\n } catch {\n return null;\n }\n }\n\n async saveMemorySnapshot(sessionId: string, memory: KernelMemoryState): Promise<void> {\n await this.ensureSessionArtifacts(sessionId);\n await fs.writeFile(\n this.getArtifactPath(sessionId, 'memory.json'),\n `${JSON.stringify(memory, null, 2)}\\n`,\n 'utf-8',\n );\n }\n\n async saveMemoryRollup(sessionId: string, rollup: MemoryRollup | null): Promise<void> {\n await this.ensureSessionArtifacts(sessionId);\n await fs.writeFile(\n this.getArtifactPath(sessionId, 'memory-rollup.json'),\n `${JSON.stringify(rollup, null, 2)}\\n`,\n 'utf-8',\n );\n }\n\n async countArtifactLines(sessionId: string, name: string): Promise<number> {\n try {\n const content = await fs.readFile(this.getArtifactPath(sessionId, name), 'utf-8');\n if (!content.trim()) {\n return 0;\n }\n return content.split('\\n').filter((line) => line.trim().length > 0).length;\n } catch {\n return 0;\n }\n }\n\n async appendTurn(sessionId: string, turn: RuntimeTurnRecord): Promise<void> {\n await appendJsonLine(this.getArtifactPath(sessionId, 'turns.jsonl'), turn);\n }\n\n async appendToolRecord(sessionId: string, record: ToolCallRecord): Promise<void> {\n await appendJsonLine(this.getArtifactPath(sessionId, 'tool-ledger.jsonl'), record);\n }\n\n async loadToolRecords(sessionId: string, limit = 200): Promise<ToolCallRecord[]> {\n const records = await readJsonLines<ToolCallRecord>(this.getArtifactPath(sessionId, 'tool-ledger.jsonl'));\n if (limit <= 0 || records.length <= limit) {\n return records;\n }\n return records.slice(-limit);\n }\n\n async appendRunRecord(sessionId: string, record: Record<string, unknown>): Promise<void> {\n await appendJsonLine(this.getArtifactPath(sessionId, 'run-ledger.jsonl'), record);\n }\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "dependencies": {
3
- "@kb-labs/agent-contracts": "2.14.0",
4
- "@kb-labs/agent-kernel": "2.14.0"
3
+ "@kb-labs/agent-kernel": "2.16.0",
4
+ "@kb-labs/agent-contracts": "2.16.0"
5
5
  },
6
6
  "description": "Canonical session artifact storage for KB Labs Agents.",
7
7
  "devDependencies": {
@@ -11,7 +11,7 @@
11
11
  "tsup": "^8.5.0",
12
12
  "typescript": "^5.6.3",
13
13
  "vitest": "^3.2.4",
14
- "@kb-labs/devkit": "2.14.0"
14
+ "@kb-labs/devkit": "2.16.0"
15
15
  },
16
16
  "engines": {
17
17
  "node": ">=20.0.0",
@@ -33,7 +33,7 @@
33
33
  "sideEffects": false,
34
34
  "type": "module",
35
35
  "types": "./dist/index.d.ts",
36
- "version": "2.14.0",
36
+ "version": "2.16.0",
37
37
  "scripts": {
38
38
  "build": "tsup --config tsup.config.ts",
39
39
  "clean": "rimraf dist",