@wrongstack/core 0.87.0 → 0.89.3
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/{agent-bridge-C9P_HPez.d.ts → agent-bridge-DbVe1dHT.d.ts} +1 -1
- package/dist/{agent-subagent-runner-2Aq0jOSj.d.ts → agent-subagent-runner-C6eqID1t.d.ts} +477 -476
- package/dist/{events-DnRqXaZ3.d.ts → brain-s9DyD_Vf.d.ts} +185 -92
- package/dist/{compactor-CJq7LQev.d.ts → compactor-DXLxLcmU.d.ts} +2 -2
- package/dist/{config-_DZ7dN-T.d.ts → config-84VaZpH6.d.ts} +45 -38
- package/dist/{context-ToHAp4-U.d.ts → context-CNRYfhUv.d.ts} +1 -1
- package/dist/coordination/index.d.ts +16 -17
- package/dist/coordination/index.js +208 -93
- package/dist/coordination/index.js.map +1 -1
- package/dist/{default-config-DEXI4jsl.d.ts → default-config-CXsDvOmP.d.ts} +3 -1
- package/dist/defaults/index.d.ts +32 -34
- package/dist/defaults/index.js +744 -274
- package/dist/defaults/index.js.map +1 -1
- package/dist/{director-state-CgIc30qi.d.ts → director-state-BfeCUbmk.d.ts} +1 -1
- package/dist/execution/index.d.ts +18 -19
- package/dist/execution/index.js +79 -64
- package/dist/execution/index.js.map +1 -1
- package/dist/extension/index.d.ts +9 -10
- package/dist/extension/index.js +8 -6
- package/dist/extension/index.js.map +1 -1
- package/dist/{index-BNOLadHw.d.ts → index-CqrroYcU.d.ts} +13 -15
- package/dist/{index-N0_c4bHQ.d.ts → index-D3Nax3YU.d.ts} +11 -10
- package/dist/index.d.ts +191 -178
- package/dist/index.js +1419 -526
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/index.d.ts +9 -9
- package/dist/infrastructure/index.js +16 -5
- package/dist/infrastructure/index.js.map +1 -1
- package/dist/kernel/index.d.ts +14 -16
- package/dist/kernel/index.js +17 -0
- package/dist/kernel/index.js.map +1 -1
- package/dist/{logger-B72yyPc6.d.ts → logger-B63L5bTg.d.ts} +1 -1
- package/dist/{logger-C_27pj9i.d.ts → logger-B9J5puGM.d.ts} +1 -1
- package/dist/{mcp-servers-Dck3T85_.d.ts → mcp-servers-D3E5ixAR.d.ts} +3 -3
- package/dist/{mode-CHo2XtHs.d.ts → mode-ARA3HrkY.d.ts} +1 -1
- package/dist/models/index.d.ts +5 -5
- package/dist/models/index.js +8 -6
- package/dist/models/index.js.map +1 -1
- package/dist/{models-registry-Be3osGt5.d.ts → models-registry-B6_KfS65.d.ts} +1 -1
- package/dist/{models-registry-Boz639EI.d.ts → models-registry-DU64QxQa.d.ts} +1 -1
- package/dist/{multi-agent-coordinator-DllpCVkF.d.ts → multi-agent-coordinator-DHNrjPaA.d.ts} +2 -2
- package/dist/{null-fleet-bus-BY0AN-sr.d.ts → null-fleet-bus-BzzciAc4.d.ts} +39 -32
- package/dist/observability/index.d.ts +3 -3
- package/dist/{observability-CoSNZdhX.d.ts → observability-D-HZN_mF.d.ts} +1 -1
- package/dist/{parallel-eternal-engine-D402RASp.d.ts → parallel-eternal-engine-CTpcrb9O.d.ts} +34 -33
- package/dist/{path-resolver-UPFTsDyD.d.ts → path-resolver-B7hgMAVe.d.ts} +3 -3
- package/dist/{permission-14CChMmO.d.ts → permission-BDv7z0mk.d.ts} +7 -2
- package/dist/{permission-policy-gW5htOo1.d.ts → permission-policy-dF74EpDp.d.ts} +2 -2
- package/dist/{system-prompt-C0rLCeyn.d.ts → pipeline-C1Ad9OjI.d.ts} +73 -73
- package/dist/{plan-templates-DRvPgkfZ.d.ts → plan-templates-CNphsz0n.d.ts} +79 -11
- package/dist/{provider-runner-COAJM8tC.d.ts → provider-runner-cqvlB_oS.d.ts} +5 -5
- package/dist/{retry-policy-DSu6O6rD.d.ts → retry-policy-BcmuT_V0.d.ts} +2 -2
- package/dist/sdd/index.d.ts +12 -33
- package/dist/sdd/index.js +110 -50
- package/dist/sdd/index.js.map +1 -1
- package/dist/{secret-scrubber-yGBFQYju.d.ts → secret-vault-DrOhc2i5.d.ts} +7 -7
- package/dist/security/index.d.ts +4 -5
- package/dist/security/index.js +22 -4
- package/dist/security/index.js.map +1 -1
- package/dist/{selector-11-fm95U.d.ts → selector-C7wcdqMA.d.ts} +1 -1
- package/dist/{session-event-bridge-D0u-x576.d.ts → session-event-bridge-IVzs2GpE.d.ts} +1 -1
- package/dist/{session-reader-BQU-toaN.d.ts → session-reader-DDz1Ek4V.d.ts} +2 -2
- package/dist/{skill-BJeF2DwY.d.ts → skill-BJxzIyyN.d.ts} +1 -1
- package/dist/skills/index.d.ts +1 -1
- package/dist/skills/index.js +3 -9
- package/dist/skills/index.js.map +1 -1
- package/dist/storage/index.d.ts +134 -14
- package/dist/storage/index.js +982 -248
- package/dist/storage/index.js.map +1 -1
- package/dist/{task-graph-CikNdRTG.d.ts → task-graph-DJBqO0EY.d.ts} +1 -1
- package/dist/types/index.d.ts +26 -28
- package/dist/types/index.js +62 -37
- package/dist/types/index.js.map +1 -1
- package/dist/utils/expect-defined.d.ts +7 -0
- package/dist/utils/expect-defined.js +11 -0
- package/dist/utils/expect-defined.js.map +1 -0
- package/dist/utils/index.d.ts +11 -20
- package/dist/utils/index.js +61 -43
- package/dist/utils/index.js.map +1 -1
- package/dist/{wstack-paths-BQMvEllz.d.ts → wstack-paths-_lqjzErq.d.ts} +1 -1
- package/package.json +5 -1
- package/dist/memory-CEXuo7sz.d.ts +0 -16
- package/dist/secret-scrubber-3MHDDAtm.d.ts +0 -6
package/dist/skills/index.d.ts
CHANGED
package/dist/skills/index.js
CHANGED
|
@@ -6,8 +6,8 @@ import { Readable } from 'stream';
|
|
|
6
6
|
import { pipeline } from 'stream/promises';
|
|
7
7
|
import { randomBytes } from 'crypto';
|
|
8
8
|
|
|
9
|
-
// src/
|
|
10
|
-
function expectDefined(value) {
|
|
9
|
+
// src/utils/expect-defined.ts
|
|
10
|
+
function expectDefined(value, label) {
|
|
11
11
|
if (value === null || value === void 0) {
|
|
12
12
|
throw new Error("Expected value to be defined");
|
|
13
13
|
}
|
|
@@ -258,12 +258,6 @@ var SkillManifestStore = class {
|
|
|
258
258
|
};
|
|
259
259
|
|
|
260
260
|
// src/skills/skill-installer.ts
|
|
261
|
-
function expectDefined2(value) {
|
|
262
|
-
if (value === null || value === void 0) {
|
|
263
|
-
throw new Error("Expected value to be defined");
|
|
264
|
-
}
|
|
265
|
-
return value;
|
|
266
|
-
}
|
|
267
261
|
var MAX_SKILL_FILE_SIZE = 100 * 1024;
|
|
268
262
|
var SkillInstaller = class {
|
|
269
263
|
opts;
|
|
@@ -388,7 +382,7 @@ var SkillInstaller = class {
|
|
|
388
382
|
bySource.get(key)?.push(entry);
|
|
389
383
|
}
|
|
390
384
|
for (const [, entries] of bySource) {
|
|
391
|
-
const first =
|
|
385
|
+
const first = expectDefined(entries[0]);
|
|
392
386
|
const scope = first.scope;
|
|
393
387
|
const isGlobal = scope === "user";
|
|
394
388
|
try {
|
package/dist/skills/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/skills/github-fetcher.ts","../../src/utils/atomic-write.ts","../../src/skills/manifest-store.ts","../../src/skills/skill-installer.ts"],"names":["fs","path","path2","fs2","stat","resolve","fs3","path3","expectDefined"],"mappings":"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","file":"index.js","sourcesContent":["import * as fs from 'node:fs/promises';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { createGunzip } from 'node:zlib';\nimport { Readable } from 'node:stream';\nimport { pipeline } from 'node:stream/promises';\n\n\n\nfunction expectDefined<T>(value: T | null | undefined): T {\n if (value === null || value === undefined) {\n throw new Error('Expected value to be defined');\n }\n return value;\n}\n\nexport interface ParsedRef {\n owner: string;\n repo: string;\n ref: string;\n}\n\n/**\n * Parse a skill reference string.\n * Formats: `user/repo` (default ref: main), `user/repo@ref`\n */\nexport function parseSkillRef(input: string): ParsedRef {\n const trimmed = input.trim().replace(/^https?:\\/\\/github\\.com\\//, '').replace(/\\.git$/, '');\n const atIdx = trimmed.indexOf('@');\n let refPath: string;\n let ref: string;\n if (atIdx > 0) {\n refPath = trimmed.slice(0, atIdx);\n ref = trimmed.slice(atIdx + 1);\n } else {\n refPath = trimmed;\n ref = 'main';\n }\n const parts = refPath.split('/').filter(Boolean);\n if (parts.length < 2) {\n throw new Error(`Invalid skill reference \"${input}\". Expected format: user/repo or user/repo@ref`);\n }\n return { owner: expectDefined(parts[0]), repo: expectDefined(parts[1]), ref };\n}\n\nexport interface DownloadResult {\n /** Temp directory containing the extracted repo. Caller must clean up. */\n tempDir: string;\n}\n\nconst MAX_TARBALL_SIZE = 50 * 1024 * 1024; // 50MB\n\n/**\n * Download and extract a GitHub repository tarball.\n * Uses the public GitHub API — no auth token required for public repos.\n * Returns the path to a temp directory with the extracted contents.\n */\nexport async function downloadGitHubTarball(parsed: ParsedRef): Promise<DownloadResult> {\n const url = `https://api.github.com/repos/${parsed.owner}/${parsed.repo}/tarball/${parsed.ref}`;\n\n const response = await fetch(url, {\n signal: AbortSignal.timeout(30_000),\n headers: {\n Accept: 'application/vnd.github+json',\n 'User-Agent': 'wrongstack-skill-installer',\n },\n redirect: 'follow',\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new Error(\n `Repository not found: ${parsed.owner}/${parsed.repo}` +\n (parsed.ref !== 'main' ? ` (ref: ${parsed.ref})` : ''),\n );\n }\n if (response.status === 403) {\n throw new Error(\n `Access denied: ${parsed.owner}/${parsed.repo}. The repository may be private or rate-limited.`,\n );\n }\n throw new Error(`GitHub API error (${response.status}): ${response.statusText}`);\n }\n\n const contentLength = response.headers.get('content-length');\n if (contentLength && Number.parseInt(contentLength, 10) > MAX_TARBALL_SIZE) {\n throw new Error(\n `Tarball too large (${(Number.parseInt(contentLength, 10) / 1024 / 1024).toFixed(1)}MB). Max: ${MAX_TARBALL_SIZE / 1024 / 1024}MB`,\n );\n }\n\n const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'wskill-'));\n\n try {\n if (!response.body) {\n throw new Error('Empty response body from GitHub API');\n }\n\n // Gunzip the response body, then extract the tar stream\n const nodeStream = Readable.fromWeb(response.body as import('node:stream/web').ReadableStream);\n const gunzip = createGunzip();\n\n // Collect the uncompressed tar data into a buffer, then extract\n const chunks: Buffer[] = [];\n await pipeline(nodeStream, gunzip, async (source) => {\n for await (const chunk of source) {\n chunks.push(Buffer.from(chunk));\n }\n });\n const tarBuf = Buffer.concat(chunks);\n\n // Extract tar archive (POSIX ustar format)\n await extractTar(tarBuf, tempDir);\n\n return { tempDir };\n } catch (err) {\n await fs.rm(tempDir, { recursive: true, force: true }).catch(() => {});\n throw err;\n }\n}\n\n/**\n * Minimal POSIX tar extractor. Handles the ustar format produced by GitHub.\n * Only extracts regular files and directories — symlinks and special entries\n * are skipped for security.\n */\nasync function extractTar(buf: Buffer, destDir: string): Promise<void> {\n let offset = 0;\n\n while (offset + 512 <= buf.length) {\n // Check for end-of-archive (two consecutive zero blocks)\n const header = buf.subarray(offset, offset + 512);\n if (header.every((b) => b === 0)) break;\n\n // Parse ustar header\n const name = readTarString(buf, offset, 100); // name field\n const prefix = readTarString(buf, offset + 345, 155); // ustar prefix\n const size = Number.parseInt(readTarString(buf, offset + 124, 12).trim(), 8) || 0;\n const typeflag = buf[offset + 156] ?? 0;\n\n // Full path: prefix/name (ustar) or just name\n const fullPath = prefix ? `${prefix}/${name}` : name;\n // Strip the top-level directory (GitHub tarballs have owner-repo-sha/)\n const relPath = stripTopDir(fullPath);\n\n if (relPath && relPath !== '.' && relPath !== '..') {\n const destPath = path.join(destDir, relPath);\n\n // Zip-slip guard: reject any entry whose resolved path escapes destDir\n // (e.g. a crafted entry name like `x/../../../etc/cron.d/evil`). GitHub\n // tarballs are built from git trees and so cannot carry `..` components,\n // but this extractor is generic — never trust archive entry names.\n const resolvedDest = path.resolve(destPath);\n const resolvedRoot = path.resolve(destDir);\n if (resolvedDest !== resolvedRoot && !resolvedDest.startsWith(resolvedRoot + path.sep)) {\n // Skip the entry entirely; advance past its data below.\n offset += 512 + Math.ceil(size / 512) * 512;\n continue;\n }\n\n // typeflag: '0' or '\\0' = regular file, '5' = directory\n if (typeflag === 0x35 || typeflag === 0) {\n // Directory\n if (relPath.endsWith('/') || typeflag === 0x35) {\n await fs.mkdir(destPath, { recursive: true });\n }\n }\n\n if ((typeflag === 0x30 || typeflag === 0 || typeflag === 0x00) && size > 0) {\n // Regular file\n const dir = path.dirname(destPath);\n await fs.mkdir(dir, { recursive: true });\n const dataStart = offset + 512;\n const dataEnd = dataStart + size;\n if (dataEnd > buf.length) break; // truncated archive\n await fs.writeFile(destPath, buf.subarray(dataStart, dataEnd));\n }\n }\n\n // Advance: 512-byte header + data padded to 512-byte boundary\n offset += 512 + Math.ceil(size / 512) * 512;\n }\n}\n\nfunction readTarString(buf: Buffer, start: number, maxLen: number): string {\n let end = start;\n while (end < start + maxLen && end < buf.length && buf[end] !== 0) {\n end++;\n }\n return buf.subarray(start, end).toString('utf8');\n}\n\n/**\n * Strip the top-level directory from a tar path.\n * GitHub tarballs have a single root dir like `owner-repo-sha/`.\n */\nfunction stripTopDir(p: string): string {\n const idx = p.indexOf('/');\n if (idx === -1) return ''; // top-level file, skip\n return p.slice(idx + 1);\n}\n","import { randomBytes } from 'node:crypto';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\nexport interface AtomicWriteOptions {\n mode?: number | undefined;\n encoding?: BufferEncoding | undefined;\n}\n\nexport async function atomicWrite(\n targetPath: string,\n content: string | Uint8Array,\n opts: AtomicWriteOptions = {},\n): Promise<void> {\n const dir = path.dirname(targetPath);\n await fs.mkdir(dir, { recursive: true });\n const tmp = path.join(dir, `.${path.basename(targetPath)}.${randomBytes(6).toString('hex')}.tmp`);\n\n // Write content to tmp first; 'wx' ensures exclusive creation (fails if\n // tmp already exists — extremely unlikely with 6-byte random suffix).\n try {\n if (typeof content === 'string') {\n await fs.writeFile(tmp, content, { flag: 'wx', encoding: opts.encoding ?? 'utf8' });\n } else {\n await fs.writeFile(tmp, content, { flag: 'wx' });\n }\n try {\n const fh = await fs.open(tmp, 'r+');\n try {\n await fh.sync();\n } finally {\n await fh.close();\n }\n } catch {\n // fsync best-effort\n }\n // Now safely read mode from target (if it exists) and apply to tmp before rename.\n // Prefer opts.mode for new files; for existing files preserve their mode.\n let mode: number | undefined;\n try {\n const stat = await fs.stat(targetPath);\n mode = stat.mode & 0o777;\n } catch {\n mode = opts.mode;\n }\n if (mode !== undefined) {\n await fs.chmod(tmp, mode);\n }\n await renameWithRetry(tmp, targetPath);\n } catch (err) {\n try {\n await fs.unlink(tmp);\n } catch {\n // ignore cleanup error\n }\n throw err;\n }\n}\n\nexport async function ensureDir(dir: string): Promise<void> {\n await fs.mkdir(dir, { recursive: true });\n}\n\n// On Windows, fs.rename over an existing file can fail with EPERM/EBUSY/EACCES\n// when antivirus, file indexers, editor file watchers, or a concurrent writer\n// briefly hold a handle on the destination. These are transient — retry with a\n// short backoff before giving up. POSIX renames are atomic and won't hit this.\nconst TRANSIENT_RENAME_CODES = new Set(['EPERM', 'EBUSY', 'EACCES', 'ENOTEMPTY']);\n\nasync function renameWithRetry(from: string, to: string): Promise<void> {\n if (process.platform !== 'win32') {\n await fs.rename(from, to);\n return;\n }\n const delays = [10, 25, 60, 120, 250];\n let lastErr: unknown;\n for (let i = 0; i <= delays.length; i++) {\n try {\n await fs.rename(from, to);\n return;\n } catch (err) {\n lastErr = err;\n const code = (err as NodeJS.ErrnoException)?.code;\n if (!code || !TRANSIENT_RENAME_CODES.has(code) || i === delays.length) {\n throw err;\n }\n await new Promise((resolve) => setTimeout(resolve, delays[i]));\n }\n }\n throw lastErr;\n}\n","import * as fs from 'node:fs/promises';\r\nimport * as path from 'node:path';\r\nimport { atomicWrite } from '../utils/atomic-write.js';\r\n\r\nexport interface InstalledSkillEntry {\r\n name: string;\r\n /** Source identifier, e.g. \"github:user/repo\" */\r\n source: string;\r\n /** Git ref that was installed (branch, tag, commit) */\r\n ref: string;\r\n /** Installation scope */\r\n scope: 'project' | 'user';\r\n /** Project hash — only set when scope=project */\r\n projectHash?: string | undefined;\r\n /** ISO 8601 timestamp */\r\n installedAt: string;\r\n /** List of files that were installed (relative to skill dir) */\r\n files: string[];\r\n}\r\n\r\nexport interface ManifestData {\r\n skills: InstalledSkillEntry[];\r\n}\r\n\r\nexport class SkillManifestStore {\r\n private readonly manifestPath: string;\r\n private cache?: ManifestData | undefined;\r\n\r\n constructor(manifestPath: string) {\r\n this.manifestPath = manifestPath;\r\n }\r\n\r\n async read(): Promise<ManifestData> {\r\n if (this.cache) return this.cache;\r\n try {\r\n const raw = await fs.readFile(this.manifestPath, 'utf8');\r\n const data = JSON.parse(raw) as ManifestData;\r\n if (!Array.isArray(data.skills)) {\r\n this.cache = { skills: [] };\r\n } else {\r\n this.cache = data;\r\n }\r\n } catch {\r\n this.cache = { skills: [] };\r\n }\r\n return this.cache;\r\n }\r\n\r\n async write(data: ManifestData): Promise<void> {\r\n const dir = path.dirname(this.manifestPath);\r\n await fs.mkdir(dir, { recursive: true });\r\n await atomicWrite(this.manifestPath, JSON.stringify(data, null, 2) + '\\n');\r\n this.cache = data;\r\n }\r\n\r\n async addEntry(entry: InstalledSkillEntry): Promise<void> {\r\n const data = await this.read();\r\n // Remove existing entry with the same name + scope\r\n data.skills = data.skills.filter(\r\n (s) => !(s.name === entry.name && s.scope === entry.scope),\r\n );\r\n data.skills.push(entry);\r\n await this.write(data);\r\n }\r\n\r\n async removeEntry(name: string, scope: 'project' | 'user'): Promise<boolean> {\r\n const data = await this.read();\r\n const before = data.skills.length;\r\n data.skills = data.skills.filter(\r\n (s) => !(s.name === name && s.scope === scope),\r\n );\r\n if (data.skills.length === before) return false;\r\n await this.write(data);\r\n return true;\r\n }\r\n\r\n async findByName(name: string): Promise<InstalledSkillEntry[]> {\r\n const data = await this.read();\r\n return data.skills.filter((s) => s.name === name);\r\n }\r\n\r\n async findBySource(source: string): Promise<InstalledSkillEntry[]> {\r\n const data = await this.read();\r\n return data.skills.filter((s) => s.source === source);\r\n }\r\n\r\n async listAll(): Promise<InstalledSkillEntry[]> {\r\n const data = await this.read();\r\n return data.skills;\r\n }\r\n\r\n /** Invalidate the in-memory cache (e.g. after external file changes). */\r\n invalidateCache(): void {\r\n this.cache = undefined;\r\n }\r\n}\r\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { SkillLoader } from '../types/skill.js';\nimport { downloadGitHubTarball, parseSkillRef } from './github-fetcher.js';\nimport { type InstalledSkillEntry, SkillManifestStore } from './manifest-store.js';\n\n\n\nfunction expectDefined<T>(value: T | null | undefined): T {\n if (value === null || value === undefined) {\n throw new Error('Expected value to be defined');\n }\n return value;\n}\n\nexport interface SkillInstallerOptions {\n /** Path to the manifest file (~/.wrongstack/installed-skills.json) */\n manifestPath: string;\n /** Path to project-level skills dir (<project>/.wrongstack/skills/) */\n projectSkillsDir: string;\n /** Path to user-global skills dir (~/.wrongstack/skills/) */\n globalSkillsDir: string;\n /** Current project hash (for manifest tracking) */\n projectHash: string;\n /** Skill loader — cache will be invalidated after mutations */\n skillLoader?: SkillLoader | undefined;\n /** Logger for status messages */\n log?: (((msg: string) => void)) | undefined;\n}\n\nexport interface InstallResult {\n name: string;\n path: string;\n scope: 'project' | 'user';\n source: string;\n ref: string;\n skillCount: number;\n}\n\nexport interface UpdateResult {\n updated: Array<{ name: string; oldRef: string; newRef: string }>;\n unchanged: string[];\n errors: Array<{ name: string; error: string }>;\n}\n\nconst MAX_SKILL_FILE_SIZE = 100 * 1024; // 100KB\n\nexport class SkillInstaller {\n private readonly opts: SkillInstallerOptions;\n private readonly manifest: SkillManifestStore;\n\n constructor(opts: SkillInstallerOptions) {\n this.opts = opts;\n this.manifest = new SkillManifestStore(opts.manifestPath);\n }\n\n /**\n * Install skills from a GitHub repository.\n * Supports both single-skill repos (SKILL.md at root) and multi-skill repos (skills/ subdirectory).\n */\n async install(refInput: string, opts?: { global?: boolean | undefined }): Promise<InstallResult[]> {\n const parsed = parseSkillRef(refInput);\n const scope: 'project' | 'user' = opts?.global ? 'user' : 'project';\n const targetDir = scope === 'project' ? this.opts.projectSkillsDir : this.opts.globalSkillsDir;\n const source = `github:${parsed.owner}/${parsed.repo}`;\n\n this.opts.log?.(`Downloading ${parsed.owner}/${parsed.repo}@${parsed.ref}...`);\n\n const { tempDir } = await downloadGitHubTarball(parsed);\n\n try {\n // Detect skill structure\n const skills = await this.detectSkills(tempDir);\n\n if (skills.length === 0) {\n throw new Error(\n 'No skills found in repository. Expected SKILL.md at root or skills/ subdirectory.',\n );\n }\n\n const results: InstallResult[] = [];\n\n for (const skill of skills) {\n // Check for overwrite\n const existing = await this.manifest.findByName(skill.name);\n const existingInScope = existing.find((e) => e.scope === scope);\n if (existingInScope) {\n this.opts.log?.(`Overwriting existing skill \"${skill.name}\" (${scope})...`);\n await this.removeSkillFiles(skill.name, scope);\n }\n\n // Copy skill files\n const destDir = path.join(targetDir, skill.name);\n await fs.mkdir(destDir, { recursive: true });\n const copiedFiles: string[] = [];\n\n for (const file of skill.files) {\n const srcPath = path.join(skill.baseDir, file);\n const destPath = path.join(destDir, file);\n\n // Path traversal check\n const resolved = path.resolve(destPath);\n if (!resolved.startsWith(path.resolve(destDir))) {\n throw new Error(`Path traversal detected in skill file: ${file}`);\n }\n\n // Size check\n const stat = await fs.stat(srcPath);\n if (stat.size > MAX_SKILL_FILE_SIZE) {\n throw new Error(\n `Skill file \"${file}\" is too large (${(stat.size / 1024).toFixed(1)}KB). Max: ${MAX_SKILL_FILE_SIZE / 1024}KB`,\n );\n }\n\n await fs.mkdir(path.dirname(destPath), { recursive: true });\n await fs.copyFile(srcPath, destPath);\n copiedFiles.push(file);\n }\n\n // Write manifest entry\n const entry: InstalledSkillEntry = {\n name: skill.name,\n source,\n ref: parsed.ref,\n scope,\n projectHash: scope === 'project' ? this.opts.projectHash : undefined,\n installedAt: new Date().toISOString(),\n files: copiedFiles,\n };\n await this.manifest.addEntry(entry);\n\n results.push({\n name: skill.name,\n path: destDir,\n scope,\n source,\n ref: parsed.ref,\n skillCount: 1,\n });\n }\n\n this.invalidateLoaderCache();\n return results;\n } finally {\n // Clean up temp directory\n await fs.rm(tempDir, { recursive: true, force: true }).catch(() => {});\n }\n }\n\n /**\n * Update installed skills.\n * - No args: update all\n * - Name: update that specific skill\n * - Name + newRef: update to a different ref\n */\n async update(\n nameOrRef?: string | undefined,\n _opts?: { global?: boolean | undefined } | undefined,\n ): Promise<UpdateResult> {\n const result: UpdateResult = { updated: [], unchanged: [], errors: [] };\n const allEntries = await this.manifest.listAll();\n\n let targets: InstalledSkillEntry[];\n if (nameOrRef) {\n // Check if it's a name or a ref (user/repo@ref)\n const byName = allEntries.filter((e) => e.name === nameOrRef);\n if (byName.length > 0) {\n targets = byName;\n } else {\n // Treat as a new ref — find matching source\n try {\n const parsed = parseSkillRef(nameOrRef);\n const source = `github:${parsed.owner}/${parsed.repo}`;\n targets = allEntries.filter((e) => e.source === source);\n if (targets.length === 0) {\n result.errors.push({\n name: nameOrRef,\n error: `No installed skills found matching \"${nameOrRef}\"`,\n });\n return result;\n }\n } catch {\n result.errors.push({\n name: nameOrRef,\n error: `Invalid reference: ${nameOrRef}`,\n });\n return result;\n }\n }\n } else {\n targets = allEntries;\n }\n\n // Group by source to avoid downloading the same repo multiple times\n const bySource = new Map<string, InstalledSkillEntry[]>();\n for (const entry of targets) {\n const key = `${entry.source}@${entry.ref}`;\n if (!bySource.has(key)) bySource.set(key, []);\n bySource.get(key)?.push(entry);\n }\n\n for (const [, entries] of bySource) {\n const first = expectDefined(entries[0]);\n const scope = first.scope;\n const isGlobal = scope === 'user';\n\n try {\n // Parse the original source to get the ref\n const sourceRepo = first.source.replace('github:', '');\n let refToInstall = first.ref;\n\n // If nameOrRef looks like a new ref, use it\n if (nameOrRef && !allEntries.find((e) => e.name === nameOrRef)) {\n try {\n const parsed = parseSkillRef(nameOrRef);\n refToInstall = parsed.ref;\n } catch {\n // keep original ref\n }\n }\n\n this.opts.log?.(`Updating ${first.source}@${refToInstall}...`);\n const results = await this.install(`${sourceRepo}@${refToInstall}`, { global: isGlobal });\n\n for (const r of results) {\n result.updated.push({\n name: r.name,\n oldRef: first.ref,\n newRef: refToInstall,\n });\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n for (const entry of entries) {\n result.errors.push({ name: entry.name, error: msg });\n }\n }\n }\n\n return result;\n }\n\n /**\n * Uninstall a skill by name.\n */\n async uninstall(name: string, opts?: { global?: boolean | undefined }): Promise<void> {\n const scope: 'project' | 'user' = opts?.global ? 'user' : 'project';\n const entries = await this.manifest.findByName(name);\n const entry = entries.find((e) => e.scope === scope);\n\n if (!entry) {\n throw new Error(`Skill \"${name}\" is not installed${scope === 'user' ? ' (global)' : ''}.`);\n }\n\n // Remove files\n await this.removeSkillFiles(name, scope);\n\n // Remove from manifest\n await this.manifest.removeEntry(name, scope);\n this.invalidateLoaderCache();\n }\n\n /**\n * List all installed skills from the manifest.\n */\n async listInstalled(): Promise<InstalledSkillEntry[]> {\n return this.manifest.listAll();\n }\n\n // ── Private helpers ──────────────────────────────────────────────\n\n /**\n * Detect skills in an extracted repository.\n * Returns an array of detected skills with their files.\n */\n private async detectSkills(\n baseDir: string,\n ): Promise<Array<{ name: string; baseDir: string; files: string[] }>> {\n const results: Array<{ name: string; baseDir: string; files: string[] }> = [];\n\n // Check for SKILL.md at root (single-skill repo)\n const rootSkillMd = path.join(baseDir, 'SKILL.md');\n try {\n await fs.access(rootSkillMd);\n const content = await fs.readFile(rootSkillMd, 'utf8');\n const meta = parseFrontmatter(content);\n if (meta.name && meta.description) {\n results.push({\n name: meta.name,\n baseDir,\n files: ['SKILL.md'],\n });\n return results; // Single-skill repo — don't look for skills/\n }\n } catch {\n // No root SKILL.md\n }\n\n // Check for skills/ subdirectory (multi-skill repo)\n const skillsDir = path.join(baseDir, 'skills');\n try {\n const entries = await fs.readdir(skillsDir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const skillFile = path.join(skillsDir, entry.name, 'SKILL.md');\n try {\n const content = await fs.readFile(skillFile, 'utf8');\n const meta = parseFrontmatter(content);\n if (meta.name && meta.description) {\n // Collect all files in the skill directory\n const skillDir = path.join(skillsDir, entry.name);\n const files = await collectFiles(skillDir, skillDir);\n results.push({\n name: meta.name,\n baseDir: skillDir,\n files,\n });\n }\n } catch {\n // Skip malformed skills\n }\n }\n } catch {\n // No skills/ directory\n }\n\n return results;\n }\n\n /**\n * Remove all files for an installed skill.\n */\n private async removeSkillFiles(name: string, scope: 'project' | 'user'): Promise<void> {\n const targetDir =\n scope === 'project' ? this.opts.projectSkillsDir : this.opts.globalSkillsDir;\n const skillDir = path.join(targetDir, name);\n await fs.rm(skillDir, { recursive: true, force: true });\n }\n\n /**\n * Invalidate the skill loader's cache so newly installed skills appear.\n */\n private invalidateLoaderCache(): void {\n // The SkillLoader interface has a cache internally.\n // We access it via the 'any' cast to call invalidateCache if available.\n const loader = this.opts.skillLoader as unknown as { invalidateCache?: () => void };\n if (loader && typeof loader.invalidateCache === 'function') {\n loader.invalidateCache();\n }\n }\n}\n\n// ── Utilities ──────────────────────────────────────────────────────\n\ninterface Frontmatter {\n name?: string | undefined;\n description?: string | undefined;\n}\n\nfunction parseFrontmatter(raw: string): Frontmatter {\n if (!raw.startsWith('---')) return {};\n const end = raw.indexOf('\\n---', 4);\n if (end === -1) return {};\n const block = raw.slice(4, end);\n const out: Frontmatter = {};\n let key: keyof Frontmatter | null = null;\n let value: string[] = [];\n const flush = () => {\n if (key) {\n out[key] = value.join('\\n').trim();\n }\n key = null;\n value = [];\n };\n for (const line of block.split('\\n')) {\n const m = /^([a-zA-Z_]+):\\s*(\\|?)\\s*(.*)$/.exec(line);\n if (m) {\n flush();\n key = (m[1] ?? '') as keyof Frontmatter;\n const pipe = m[2];\n const rest = m[3] ?? '';\n if (pipe === '|') {\n value = [];\n } else if (rest) {\n value = [rest];\n } else {\n value = [];\n }\n } else if (key) {\n value.push(line.replace(/^\\s+/, ''));\n }\n }\n flush();\n return out;\n}\n\n/**\n * Recursively collect all files in a directory (relative paths).\n */\nasync function collectFiles(dir: string, baseDir: string): Promise<string[]> {\n const results: string[] = [];\n const entries = await fs.readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n const relPath = path.relative(baseDir, fullPath);\n if (entry.isDirectory()) {\n // Skip hidden dirs and node_modules\n if (entry.name.startsWith('.') || entry.name === 'node_modules') continue;\n results.push(...(await collectFiles(fullPath, baseDir)));\n } else {\n results.push(relPath);\n }\n }\n return results;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/expect-defined.ts","../../src/skills/github-fetcher.ts","../../src/utils/atomic-write.ts","../../src/skills/manifest-store.ts","../../src/skills/skill-installer.ts"],"names":["fs","path","path2","fs2","stat","resolve","fs3","path3"],"mappings":"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","file":"index.js","sourcesContent":["/** Assert a value is neither null nor undefined. Throws if it is.\n * Useful after optional chaining and indexed access when the\n * control flow guarantees the value exists but TypeScript can't\n * prove it (e.g. after a check on a related field). */\nexport function expectDefined<T>(value: T | null | undefined, label?: string): T {\n if (value === null || value === undefined) {\n throw new Error(label ? `Expected ${label} to be defined` : 'Expected value to be defined');\n }\n return value;\n}\n","import { expectDefined } from '../utils/expect-defined.js';\nimport * as fs from 'node:fs/promises';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { createGunzip } from 'node:zlib';\nimport { Readable } from 'node:stream';\nimport { pipeline } from 'node:stream/promises';\nexport interface ParsedRef {\n owner: string;\n repo: string;\n ref: string;\n}\n\n/**\n * Parse a skill reference string.\n * Formats: `user/repo` (default ref: main), `user/repo@ref`\n */\nexport function parseSkillRef(input: string): ParsedRef {\n const trimmed = input.trim().replace(/^https?:\\/\\/github\\.com\\//, '').replace(/\\.git$/, '');\n const atIdx = trimmed.indexOf('@');\n let refPath: string;\n let ref: string;\n if (atIdx > 0) {\n refPath = trimmed.slice(0, atIdx);\n ref = trimmed.slice(atIdx + 1);\n } else {\n refPath = trimmed;\n ref = 'main';\n }\n const parts = refPath.split('/').filter(Boolean);\n if (parts.length < 2) {\n throw new Error(`Invalid skill reference \"${input}\". Expected format: user/repo or user/repo@ref`);\n }\n return { owner: expectDefined(parts[0]), repo: expectDefined(parts[1]), ref };\n}\n\nexport interface DownloadResult {\n /** Temp directory containing the extracted repo. Caller must clean up. */\n tempDir: string;\n}\n\nconst MAX_TARBALL_SIZE = 50 * 1024 * 1024; // 50MB\n\n/**\n * Download and extract a GitHub repository tarball.\n * Uses the public GitHub API — no auth token required for public repos.\n * Returns the path to a temp directory with the extracted contents.\n */\nexport async function downloadGitHubTarball(parsed: ParsedRef): Promise<DownloadResult> {\n const url = `https://api.github.com/repos/${parsed.owner}/${parsed.repo}/tarball/${parsed.ref}`;\n\n const response = await fetch(url, {\n signal: AbortSignal.timeout(30_000),\n headers: {\n Accept: 'application/vnd.github+json',\n 'User-Agent': 'wrongstack-skill-installer',\n },\n redirect: 'follow',\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new Error(\n `Repository not found: ${parsed.owner}/${parsed.repo}` +\n (parsed.ref !== 'main' ? ` (ref: ${parsed.ref})` : ''),\n );\n }\n if (response.status === 403) {\n throw new Error(\n `Access denied: ${parsed.owner}/${parsed.repo}. The repository may be private or rate-limited.`,\n );\n }\n throw new Error(`GitHub API error (${response.status}): ${response.statusText}`);\n }\n\n const contentLength = response.headers.get('content-length');\n if (contentLength && Number.parseInt(contentLength, 10) > MAX_TARBALL_SIZE) {\n throw new Error(\n `Tarball too large (${(Number.parseInt(contentLength, 10) / 1024 / 1024).toFixed(1)}MB). Max: ${MAX_TARBALL_SIZE / 1024 / 1024}MB`,\n );\n }\n\n const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'wskill-'));\n\n try {\n if (!response.body) {\n throw new Error('Empty response body from GitHub API');\n }\n\n // Gunzip the response body, then extract the tar stream\n const nodeStream = Readable.fromWeb(response.body as import('node:stream/web').ReadableStream);\n const gunzip = createGunzip();\n\n // Collect the uncompressed tar data into a buffer, then extract\n const chunks: Buffer[] = [];\n await pipeline(nodeStream, gunzip, async (source) => {\n for await (const chunk of source) {\n chunks.push(Buffer.from(chunk));\n }\n });\n const tarBuf = Buffer.concat(chunks);\n\n // Extract tar archive (POSIX ustar format)\n await extractTar(tarBuf, tempDir);\n\n return { tempDir };\n } catch (err) {\n await fs.rm(tempDir, { recursive: true, force: true }).catch(() => {});\n throw err;\n }\n}\n\n/**\n * Minimal POSIX tar extractor. Handles the ustar format produced by GitHub.\n * Only extracts regular files and directories — symlinks and special entries\n * are skipped for security.\n */\nasync function extractTar(buf: Buffer, destDir: string): Promise<void> {\n let offset = 0;\n\n while (offset + 512 <= buf.length) {\n // Check for end-of-archive (two consecutive zero blocks)\n const header = buf.subarray(offset, offset + 512);\n if (header.every((b) => b === 0)) break;\n\n // Parse ustar header\n const name = readTarString(buf, offset, 100); // name field\n const prefix = readTarString(buf, offset + 345, 155); // ustar prefix\n const size = Number.parseInt(readTarString(buf, offset + 124, 12).trim(), 8) || 0;\n const typeflag = buf[offset + 156] ?? 0;\n\n // Full path: prefix/name (ustar) or just name\n const fullPath = prefix ? `${prefix}/${name}` : name;\n // Strip the top-level directory (GitHub tarballs have owner-repo-sha/)\n const relPath = stripTopDir(fullPath);\n\n if (relPath && relPath !== '.' && relPath !== '..') {\n const destPath = path.join(destDir, relPath);\n\n // Zip-slip guard: reject any entry whose resolved path escapes destDir\n // (e.g. a crafted entry name like `x/../../../etc/cron.d/evil`). GitHub\n // tarballs are built from git trees and so cannot carry `..` components,\n // but this extractor is generic — never trust archive entry names.\n const resolvedDest = path.resolve(destPath);\n const resolvedRoot = path.resolve(destDir);\n if (resolvedDest !== resolvedRoot && !resolvedDest.startsWith(resolvedRoot + path.sep)) {\n // Skip the entry entirely; advance past its data below.\n offset += 512 + Math.ceil(size / 512) * 512;\n continue;\n }\n\n // typeflag: '0' or '\\0' = regular file, '5' = directory\n if (typeflag === 0x35 || typeflag === 0) {\n // Directory\n if (relPath.endsWith('/') || typeflag === 0x35) {\n await fs.mkdir(destPath, { recursive: true });\n }\n }\n\n if ((typeflag === 0x30 || typeflag === 0 || typeflag === 0x00) && size > 0) {\n // Regular file\n const dir = path.dirname(destPath);\n await fs.mkdir(dir, { recursive: true });\n const dataStart = offset + 512;\n const dataEnd = dataStart + size;\n if (dataEnd > buf.length) break; // truncated archive\n await fs.writeFile(destPath, buf.subarray(dataStart, dataEnd));\n }\n }\n\n // Advance: 512-byte header + data padded to 512-byte boundary\n offset += 512 + Math.ceil(size / 512) * 512;\n }\n}\n\nfunction readTarString(buf: Buffer, start: number, maxLen: number): string {\n let end = start;\n while (end < start + maxLen && end < buf.length && buf[end] !== 0) {\n end++;\n }\n return buf.subarray(start, end).toString('utf8');\n}\n\n/**\n * Strip the top-level directory from a tar path.\n * GitHub tarballs have a single root dir like `owner-repo-sha/`.\n */\nfunction stripTopDir(p: string): string {\n const idx = p.indexOf('/');\n if (idx === -1) return ''; // top-level file, skip\n return p.slice(idx + 1);\n}\n","import { randomBytes } from 'node:crypto';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\nexport interface AtomicWriteOptions {\n mode?: number | undefined;\n encoding?: BufferEncoding | undefined;\n}\n\nexport interface FileLockOptions {\n timeoutMs?: number | undefined;\n staleMs?: number | undefined;\n}\n\nexport async function atomicWrite(\n targetPath: string,\n content: string | Uint8Array,\n opts: AtomicWriteOptions = {},\n): Promise<void> {\n const dir = path.dirname(targetPath);\n await fs.mkdir(dir, { recursive: true });\n const tmp = path.join(dir, `.${path.basename(targetPath)}.${randomBytes(6).toString('hex')}.tmp`);\n\n // Write content to tmp first; 'wx' ensures exclusive creation (fails if\n // tmp already exists — extremely unlikely with 6-byte random suffix).\n try {\n if (typeof content === 'string') {\n await fs.writeFile(tmp, content, { flag: 'wx', encoding: opts.encoding ?? 'utf8' });\n } else {\n await fs.writeFile(tmp, content, { flag: 'wx' });\n }\n try {\n const fh = await fs.open(tmp, 'r+');\n try {\n await fh.sync();\n } finally {\n await fh.close();\n }\n } catch {\n // fsync best-effort\n }\n // Now safely read mode from target (if it exists) and apply to tmp before rename.\n // Prefer opts.mode for new files; for existing files preserve their mode.\n let mode: number | undefined;\n try {\n const stat = await fs.stat(targetPath);\n mode = stat.mode & 0o777;\n } catch {\n mode = opts.mode;\n }\n if (mode !== undefined) {\n await fs.chmod(tmp, mode);\n }\n await renameWithRetry(tmp, targetPath);\n } catch (err) {\n try {\n await fs.unlink(tmp);\n } catch {\n // ignore cleanup error\n }\n throw err;\n }\n}\n\nexport async function ensureDir(dir: string): Promise<void> {\n await fs.mkdir(dir, { recursive: true });\n}\n\nexport async function withFileLock<T>(\n targetPath: string,\n fn: () => Promise<T>,\n opts: FileLockOptions = {},\n): Promise<T> {\n const dir = path.dirname(targetPath);\n await fs.mkdir(dir, { recursive: true });\n const lockPath = path.join(dir, `.${path.basename(targetPath)}.lock`);\n const timeoutMs = opts.timeoutMs ?? 5_000;\n const staleMs = opts.staleMs ?? 30_000;\n const started = Date.now();\n let handle: fs.FileHandle | undefined;\n\n for (;;) {\n try {\n handle = await fs.open(lockPath, 'wx');\n await handle.writeFile(`${process.pid}:${Date.now()}`);\n break;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'EEXIST') throw err;\n try {\n const stat = await fs.stat(lockPath);\n if (Date.now() - stat.mtimeMs > staleMs) {\n await fs.unlink(lockPath);\n continue;\n }\n } catch {\n continue;\n }\n if (Date.now() - started >= timeoutMs) {\n throw new Error(`Timed out waiting for file lock: ${targetPath}`);\n }\n await new Promise((resolve) => setTimeout(resolve, 25));\n }\n }\n\n try {\n return await fn();\n } finally {\n try {\n await handle?.close();\n } catch {\n // ignore\n }\n try {\n await fs.unlink(lockPath);\n } catch {\n // ignore\n }\n }\n}\n\n// On Windows, fs.rename over an existing file can fail with EPERM/EBUSY/EACCES\n// when antivirus, file indexers, editor file watchers, or a concurrent writer\n// briefly hold a handle on the destination. These are transient — retry with a\n// short backoff before giving up. POSIX renames are atomic and won't hit this.\nconst TRANSIENT_RENAME_CODES = new Set(['EPERM', 'EBUSY', 'EACCES', 'ENOTEMPTY']);\n\nasync function renameWithRetry(from: string, to: string): Promise<void> {\n if (process.platform !== 'win32') {\n await fs.rename(from, to);\n return;\n }\n const delays = [10, 25, 60, 120, 250];\n let lastErr: unknown;\n for (let i = 0; i <= delays.length; i++) {\n try {\n await fs.rename(from, to);\n return;\n } catch (err) {\n lastErr = err;\n const code = (err as NodeJS.ErrnoException)?.code;\n if (!code || !TRANSIENT_RENAME_CODES.has(code) || i === delays.length) {\n throw err;\n }\n await new Promise((resolve) => setTimeout(resolve, delays[i]));\n }\n }\n throw lastErr;\n}\n","import * as fs from 'node:fs/promises';\r\nimport * as path from 'node:path';\r\nimport { atomicWrite } from '../utils/atomic-write.js';\r\n\r\nexport interface InstalledSkillEntry {\r\n name: string;\r\n /** Source identifier, e.g. \"github:user/repo\" */\r\n source: string;\r\n /** Git ref that was installed (branch, tag, commit) */\r\n ref: string;\r\n /** Installation scope */\r\n scope: 'project' | 'user';\r\n /** Project hash — only set when scope=project */\r\n projectHash?: string | undefined;\r\n /** ISO 8601 timestamp */\r\n installedAt: string;\r\n /** List of files that were installed (relative to skill dir) */\r\n files: string[];\r\n}\r\n\r\nexport interface ManifestData {\r\n skills: InstalledSkillEntry[];\r\n}\r\n\r\nexport class SkillManifestStore {\r\n private readonly manifestPath: string;\r\n private cache?: ManifestData | undefined;\r\n\r\n constructor(manifestPath: string) {\r\n this.manifestPath = manifestPath;\r\n }\r\n\r\n async read(): Promise<ManifestData> {\r\n if (this.cache) return this.cache;\r\n try {\r\n const raw = await fs.readFile(this.manifestPath, 'utf8');\r\n const data = JSON.parse(raw) as ManifestData;\r\n if (!Array.isArray(data.skills)) {\r\n this.cache = { skills: [] };\r\n } else {\r\n this.cache = data;\r\n }\r\n } catch {\r\n this.cache = { skills: [] };\r\n }\r\n return this.cache;\r\n }\r\n\r\n async write(data: ManifestData): Promise<void> {\r\n const dir = path.dirname(this.manifestPath);\r\n await fs.mkdir(dir, { recursive: true });\r\n await atomicWrite(this.manifestPath, JSON.stringify(data, null, 2) + '\\n');\r\n this.cache = data;\r\n }\r\n\r\n async addEntry(entry: InstalledSkillEntry): Promise<void> {\r\n const data = await this.read();\r\n // Remove existing entry with the same name + scope\r\n data.skills = data.skills.filter(\r\n (s) => !(s.name === entry.name && s.scope === entry.scope),\r\n );\r\n data.skills.push(entry);\r\n await this.write(data);\r\n }\r\n\r\n async removeEntry(name: string, scope: 'project' | 'user'): Promise<boolean> {\r\n const data = await this.read();\r\n const before = data.skills.length;\r\n data.skills = data.skills.filter(\r\n (s) => !(s.name === name && s.scope === scope),\r\n );\r\n if (data.skills.length === before) return false;\r\n await this.write(data);\r\n return true;\r\n }\r\n\r\n async findByName(name: string): Promise<InstalledSkillEntry[]> {\r\n const data = await this.read();\r\n return data.skills.filter((s) => s.name === name);\r\n }\r\n\r\n async findBySource(source: string): Promise<InstalledSkillEntry[]> {\r\n const data = await this.read();\r\n return data.skills.filter((s) => s.source === source);\r\n }\r\n\r\n async listAll(): Promise<InstalledSkillEntry[]> {\r\n const data = await this.read();\r\n return data.skills;\r\n }\r\n\r\n /** Invalidate the in-memory cache (e.g. after external file changes). */\r\n invalidateCache(): void {\r\n this.cache = undefined;\r\n }\r\n}\r\n","import { expectDefined } from '../utils/expect-defined.js';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { SkillLoader } from '../types/skill.js';\nimport { downloadGitHubTarball, parseSkillRef } from './github-fetcher.js';\nimport { type InstalledSkillEntry, SkillManifestStore } from './manifest-store.js';\nexport interface SkillInstallerOptions {\n /** Path to the manifest file (~/.wrongstack/installed-skills.json) */\n manifestPath: string;\n /** Path to project-level skills dir (<project>/.wrongstack/skills/) */\n projectSkillsDir: string;\n /** Path to user-global skills dir (~/.wrongstack/skills/) */\n globalSkillsDir: string;\n /** Current project hash (for manifest tracking) */\n projectHash: string;\n /** Skill loader — cache will be invalidated after mutations */\n skillLoader?: SkillLoader | undefined;\n /** Logger for status messages */\n log?: (((msg: string) => void)) | undefined;\n}\n\nexport interface InstallResult {\n name: string;\n path: string;\n scope: 'project' | 'user';\n source: string;\n ref: string;\n skillCount: number;\n}\n\nexport interface UpdateResult {\n updated: Array<{ name: string; oldRef: string; newRef: string }>;\n unchanged: string[];\n errors: Array<{ name: string; error: string }>;\n}\n\nconst MAX_SKILL_FILE_SIZE = 100 * 1024; // 100KB\n\nexport class SkillInstaller {\n private readonly opts: SkillInstallerOptions;\n private readonly manifest: SkillManifestStore;\n\n constructor(opts: SkillInstallerOptions) {\n this.opts = opts;\n this.manifest = new SkillManifestStore(opts.manifestPath);\n }\n\n /**\n * Install skills from a GitHub repository.\n * Supports both single-skill repos (SKILL.md at root) and multi-skill repos (skills/ subdirectory).\n */\n async install(refInput: string, opts?: { global?: boolean | undefined }): Promise<InstallResult[]> {\n const parsed = parseSkillRef(refInput);\n const scope: 'project' | 'user' = opts?.global ? 'user' : 'project';\n const targetDir = scope === 'project' ? this.opts.projectSkillsDir : this.opts.globalSkillsDir;\n const source = `github:${parsed.owner}/${parsed.repo}`;\n\n this.opts.log?.(`Downloading ${parsed.owner}/${parsed.repo}@${parsed.ref}...`);\n\n const { tempDir } = await downloadGitHubTarball(parsed);\n\n try {\n // Detect skill structure\n const skills = await this.detectSkills(tempDir);\n\n if (skills.length === 0) {\n throw new Error(\n 'No skills found in repository. Expected SKILL.md at root or skills/ subdirectory.',\n );\n }\n\n const results: InstallResult[] = [];\n\n for (const skill of skills) {\n // Check for overwrite\n const existing = await this.manifest.findByName(skill.name);\n const existingInScope = existing.find((e) => e.scope === scope);\n if (existingInScope) {\n this.opts.log?.(`Overwriting existing skill \"${skill.name}\" (${scope})...`);\n await this.removeSkillFiles(skill.name, scope);\n }\n\n // Copy skill files\n const destDir = path.join(targetDir, skill.name);\n await fs.mkdir(destDir, { recursive: true });\n const copiedFiles: string[] = [];\n\n for (const file of skill.files) {\n const srcPath = path.join(skill.baseDir, file);\n const destPath = path.join(destDir, file);\n\n // Path traversal check\n const resolved = path.resolve(destPath);\n if (!resolved.startsWith(path.resolve(destDir))) {\n throw new Error(`Path traversal detected in skill file: ${file}`);\n }\n\n // Size check\n const stat = await fs.stat(srcPath);\n if (stat.size > MAX_SKILL_FILE_SIZE) {\n throw new Error(\n `Skill file \"${file}\" is too large (${(stat.size / 1024).toFixed(1)}KB). Max: ${MAX_SKILL_FILE_SIZE / 1024}KB`,\n );\n }\n\n await fs.mkdir(path.dirname(destPath), { recursive: true });\n await fs.copyFile(srcPath, destPath);\n copiedFiles.push(file);\n }\n\n // Write manifest entry\n const entry: InstalledSkillEntry = {\n name: skill.name,\n source,\n ref: parsed.ref,\n scope,\n projectHash: scope === 'project' ? this.opts.projectHash : undefined,\n installedAt: new Date().toISOString(),\n files: copiedFiles,\n };\n await this.manifest.addEntry(entry);\n\n results.push({\n name: skill.name,\n path: destDir,\n scope,\n source,\n ref: parsed.ref,\n skillCount: 1,\n });\n }\n\n this.invalidateLoaderCache();\n return results;\n } finally {\n // Clean up temp directory\n await fs.rm(tempDir, { recursive: true, force: true }).catch(() => {});\n }\n }\n\n /**\n * Update installed skills.\n * - No args: update all\n * - Name: update that specific skill\n * - Name + newRef: update to a different ref\n */\n async update(\n nameOrRef?: string | undefined,\n _opts?: { global?: boolean | undefined } | undefined,\n ): Promise<UpdateResult> {\n const result: UpdateResult = { updated: [], unchanged: [], errors: [] };\n const allEntries = await this.manifest.listAll();\n\n let targets: InstalledSkillEntry[];\n if (nameOrRef) {\n // Check if it's a name or a ref (user/repo@ref)\n const byName = allEntries.filter((e) => e.name === nameOrRef);\n if (byName.length > 0) {\n targets = byName;\n } else {\n // Treat as a new ref — find matching source\n try {\n const parsed = parseSkillRef(nameOrRef);\n const source = `github:${parsed.owner}/${parsed.repo}`;\n targets = allEntries.filter((e) => e.source === source);\n if (targets.length === 0) {\n result.errors.push({\n name: nameOrRef,\n error: `No installed skills found matching \"${nameOrRef}\"`,\n });\n return result;\n }\n } catch {\n result.errors.push({\n name: nameOrRef,\n error: `Invalid reference: ${nameOrRef}`,\n });\n return result;\n }\n }\n } else {\n targets = allEntries;\n }\n\n // Group by source to avoid downloading the same repo multiple times\n const bySource = new Map<string, InstalledSkillEntry[]>();\n for (const entry of targets) {\n const key = `${entry.source}@${entry.ref}`;\n if (!bySource.has(key)) bySource.set(key, []);\n bySource.get(key)?.push(entry);\n }\n\n for (const [, entries] of bySource) {\n const first = expectDefined(entries[0]);\n const scope = first.scope;\n const isGlobal = scope === 'user';\n\n try {\n // Parse the original source to get the ref\n const sourceRepo = first.source.replace('github:', '');\n let refToInstall = first.ref;\n\n // If nameOrRef looks like a new ref, use it\n if (nameOrRef && !allEntries.find((e) => e.name === nameOrRef)) {\n try {\n const parsed = parseSkillRef(nameOrRef);\n refToInstall = parsed.ref;\n } catch {\n // keep original ref\n }\n }\n\n this.opts.log?.(`Updating ${first.source}@${refToInstall}...`);\n const results = await this.install(`${sourceRepo}@${refToInstall}`, { global: isGlobal });\n\n for (const r of results) {\n result.updated.push({\n name: r.name,\n oldRef: first.ref,\n newRef: refToInstall,\n });\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n for (const entry of entries) {\n result.errors.push({ name: entry.name, error: msg });\n }\n }\n }\n\n return result;\n }\n\n /**\n * Uninstall a skill by name.\n */\n async uninstall(name: string, opts?: { global?: boolean | undefined }): Promise<void> {\n const scope: 'project' | 'user' = opts?.global ? 'user' : 'project';\n const entries = await this.manifest.findByName(name);\n const entry = entries.find((e) => e.scope === scope);\n\n if (!entry) {\n throw new Error(`Skill \"${name}\" is not installed${scope === 'user' ? ' (global)' : ''}.`);\n }\n\n // Remove files\n await this.removeSkillFiles(name, scope);\n\n // Remove from manifest\n await this.manifest.removeEntry(name, scope);\n this.invalidateLoaderCache();\n }\n\n /**\n * List all installed skills from the manifest.\n */\n async listInstalled(): Promise<InstalledSkillEntry[]> {\n return this.manifest.listAll();\n }\n\n // ── Private helpers ──────────────────────────────────────────────\n\n /**\n * Detect skills in an extracted repository.\n * Returns an array of detected skills with their files.\n */\n private async detectSkills(\n baseDir: string,\n ): Promise<Array<{ name: string; baseDir: string; files: string[] }>> {\n const results: Array<{ name: string; baseDir: string; files: string[] }> = [];\n\n // Check for SKILL.md at root (single-skill repo)\n const rootSkillMd = path.join(baseDir, 'SKILL.md');\n try {\n await fs.access(rootSkillMd);\n const content = await fs.readFile(rootSkillMd, 'utf8');\n const meta = parseFrontmatter(content);\n if (meta.name && meta.description) {\n results.push({\n name: meta.name,\n baseDir,\n files: ['SKILL.md'],\n });\n return results; // Single-skill repo — don't look for skills/\n }\n } catch {\n // No root SKILL.md\n }\n\n // Check for skills/ subdirectory (multi-skill repo)\n const skillsDir = path.join(baseDir, 'skills');\n try {\n const entries = await fs.readdir(skillsDir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const skillFile = path.join(skillsDir, entry.name, 'SKILL.md');\n try {\n const content = await fs.readFile(skillFile, 'utf8');\n const meta = parseFrontmatter(content);\n if (meta.name && meta.description) {\n // Collect all files in the skill directory\n const skillDir = path.join(skillsDir, entry.name);\n const files = await collectFiles(skillDir, skillDir);\n results.push({\n name: meta.name,\n baseDir: skillDir,\n files,\n });\n }\n } catch {\n // Skip malformed skills\n }\n }\n } catch {\n // No skills/ directory\n }\n\n return results;\n }\n\n /**\n * Remove all files for an installed skill.\n */\n private async removeSkillFiles(name: string, scope: 'project' | 'user'): Promise<void> {\n const targetDir =\n scope === 'project' ? this.opts.projectSkillsDir : this.opts.globalSkillsDir;\n const skillDir = path.join(targetDir, name);\n await fs.rm(skillDir, { recursive: true, force: true });\n }\n\n /**\n * Invalidate the skill loader's cache so newly installed skills appear.\n */\n private invalidateLoaderCache(): void {\n // The SkillLoader interface has a cache internally.\n // We access it via the 'any' cast to call invalidateCache if available.\n const loader = this.opts.skillLoader as unknown as { invalidateCache?: () => void };\n if (loader && typeof loader.invalidateCache === 'function') {\n loader.invalidateCache();\n }\n }\n}\n\n// ── Utilities ──────────────────────────────────────────────────────\n\ninterface Frontmatter {\n name?: string | undefined;\n description?: string | undefined;\n}\n\nfunction parseFrontmatter(raw: string): Frontmatter {\n if (!raw.startsWith('---')) return {};\n const end = raw.indexOf('\\n---', 4);\n if (end === -1) return {};\n const block = raw.slice(4, end);\n const out: Frontmatter = {};\n let key: keyof Frontmatter | null = null;\n let value: string[] = [];\n const flush = () => {\n if (key) {\n out[key] = value.join('\\n').trim();\n }\n key = null;\n value = [];\n };\n for (const line of block.split('\\n')) {\n const m = /^([a-zA-Z_]+):\\s*(\\|?)\\s*(.*)$/.exec(line);\n if (m) {\n flush();\n key = (m[1] ?? '') as keyof Frontmatter;\n const pipe = m[2];\n const rest = m[3] ?? '';\n if (pipe === '|') {\n value = [];\n } else if (rest) {\n value = [rest];\n } else {\n value = [];\n }\n } else if (key) {\n value.push(line.replace(/^\\s+/, ''));\n }\n }\n flush();\n return out;\n}\n\n/**\n * Recursively collect all files in a directory (relative paths).\n */\nasync function collectFiles(dir: string, baseDir: string): Promise<string[]> {\n const results: string[] = [];\n const entries = await fs.readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n const relPath = path.relative(baseDir, fullPath);\n if (entry.isDirectory()) {\n // Skip hidden dirs and node_modules\n if (entry.name.startsWith('.') || entry.name === 'node_modules') continue;\n results.push(...(await collectFiles(fullPath, baseDir)));\n } else {\n results.push(relPath);\n }\n }\n return results;\n}\n"]}
|
package/dist/storage/index.d.ts
CHANGED
|
@@ -1,17 +1,137 @@
|
|
|
1
|
-
|
|
2
|
-
export { D as
|
|
3
|
-
import {
|
|
1
|
+
import { M as MemoryBackend, j as FileMemoryBackendOptions } from '../plan-templates-CNphsz0n.js';
|
|
2
|
+
export { A as AbandonedSession, a as AttachmentStoreOptions, C as ConfigLoaderOptions, b as ConfigMigration, c as ConfigMigrationError, d as ConfigSource, D as DEFAULT_CONFIG_MIGRATIONS, e as DefaultAttachmentStore, f as DefaultConfigLoader, g as DefaultConfigStore, h as DefaultMemoryStore, i as DefaultSessionStore, F as FileMemoryBackend, k as MemoryStoreOptions, l as MigrationContext, m as MigrationResult, P as PersistedQueueItem, n as PlanFile, o as PlanItem, p as PlanTemplate, Q as QueueStore, R as RecoveryLock, q as RecoveryLockOptions, S as SessionAnalyzer, r as SessionStoreOptions, T as TodosCheckpointFile, s as addPlanItem, t as attachPlanCheckpoint, u as attachTodosCheckpoint, v as clearPlan, w as deriveTodosFromPlanItem, x as emptyPlan, y as formatPlan, z as formatPlanTemplates, B as getPlanTemplate, E as listPlanTemplates, G as loadPlan, H as loadTodosCheckpoint, I as parseEntries, J as removePlanItem, K as runConfigMigrations, L as savePlan, N as saveTodosCheckpoint, O as setPlanItemStatus } from '../plan-templates-CNphsz0n.js';
|
|
3
|
+
import { M as MemoryScope, k as MemoryEntry, l as MemoryStore } from '../brain-s9DyD_Vf.js';
|
|
4
|
+
import { l as AgentExtension, j as AfterRunHook } from '../index-D3Nax3YU.js';
|
|
5
|
+
import { P as Provider, R as Request, b as Response, S as SessionEvent } from '../context-CNRYfhUv.js';
|
|
6
|
+
export { D as DefaultSessionReader, f as DefaultSessionReaderOptions, S as SessionReader } from '../session-reader-DDz1Ek4V.js';
|
|
4
7
|
import { S as SessionRewinder, C as CheckpointInfo, a as RewindResultExtended } from '../session-rewinder-C9HnMkhP.js';
|
|
5
|
-
export {
|
|
8
|
+
export { a as DirectorStateCheckpoint, D as DirectorStateSnapshot, b as DirectorSubagentState, c as DirectorTaskState, l as loadDirectorState } from '../director-state-BfeCUbmk.js';
|
|
6
9
|
export { G as GoalFile, J as JournalEntry, M as MAX_JOURNAL_ENTRIES, a as appendJournal, e as emptyGoal, f as formatGoal, g as goalFilePath, l as loadGoal, s as saveGoal, b as summarizeUsage } from '../goal-store-DvWLNu52.js';
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
export { A as AuditLevel, C as CORE_RECONSTRUCT_EVENTS, S as STANDARD_AUDIT_EVENTS, a as SessionEventBridge, b as SessionEventBridgeOptions, c as SessionSamplingOptions, T as ToolProgressSamplingOptions, d as createSessionEventBridge, r as resolveAuditLevel, e as resolveSessionLoggingConfig } from '../session-event-bridge-
|
|
10
|
-
import '../
|
|
11
|
-
import '../secret-scrubber-3MHDDAtm.js';
|
|
12
|
-
import '../memory-CEXuo7sz.js';
|
|
10
|
+
import { W as WstackPaths } from '../wstack-paths-_lqjzErq.js';
|
|
11
|
+
import { w as SyncCategory, e as SyncConfig } from '../config-84VaZpH6.js';
|
|
12
|
+
export { A as AuditLevel, C as CORE_RECONSTRUCT_EVENTS, S as STANDARD_AUDIT_EVENTS, a as SessionEventBridge, b as SessionEventBridgeOptions, c as SessionSamplingOptions, T as ToolProgressSamplingOptions, d as createSessionEventBridge, r as resolveAuditLevel, e as resolveSessionLoggingConfig } from '../session-event-bridge-IVzs2GpE.js';
|
|
13
|
+
import '../permission-BDv7z0mk.js';
|
|
13
14
|
import '../secret-vault-DoISxaKO.js';
|
|
14
|
-
import '../
|
|
15
|
+
import '../logger-B63L5bTg.js';
|
|
16
|
+
import '../pipeline-C1Ad9OjI.js';
|
|
17
|
+
import '../observability-D-HZN_mF.js';
|
|
18
|
+
import '../models-registry-B6_KfS65.js';
|
|
19
|
+
|
|
20
|
+
interface GraphNode {
|
|
21
|
+
id: string;
|
|
22
|
+
entry: MemoryEntry;
|
|
23
|
+
firstSeen: string;
|
|
24
|
+
count: number;
|
|
25
|
+
/** Extracted metadata for fast lookup. */
|
|
26
|
+
type?: MemoryEntry['type'];
|
|
27
|
+
tags?: string[];
|
|
28
|
+
priority?: MemoryEntry['priority'];
|
|
29
|
+
}
|
|
30
|
+
interface GraphEdge {
|
|
31
|
+
from: string;
|
|
32
|
+
to: string;
|
|
33
|
+
/** Why these nodes are related. */
|
|
34
|
+
relation: 'co_occurring' | 'similar' | 'same_turn' | 'explicit';
|
|
35
|
+
weight: number;
|
|
36
|
+
ts: string;
|
|
37
|
+
}
|
|
38
|
+
interface GraphMemoryBackendOptions extends FileMemoryBackendOptions {
|
|
39
|
+
/**
|
|
40
|
+
* Path to the graph metadata file (edges + node metadata).
|
|
41
|
+
* Defaults to `<projectDir>/memory-graph.json`.
|
|
42
|
+
*/
|
|
43
|
+
graphPath?: string | undefined;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Graph-based memory backend that tracks relationships between entries.
|
|
47
|
+
* Builds on top of FileMemoryBackend — entries are still persisted as
|
|
48
|
+
* markdown bullets, but the graph layer adds:
|
|
49
|
+
*
|
|
50
|
+
* - Co-occurrence edges (entries from the same remember() batch)
|
|
51
|
+
* - Content similarity edges (simple Jaccard on word overlap)
|
|
52
|
+
* - Turn-based edges (entries created in the same LLM turn)
|
|
53
|
+
* - Graph traversal queries (find related memories)
|
|
54
|
+
*
|
|
55
|
+
* The graph metadata persists to `<projectDir>/memory-graph.json`.
|
|
56
|
+
*/
|
|
57
|
+
declare class GraphMemoryBackend implements MemoryBackend {
|
|
58
|
+
readonly kind = "graph";
|
|
59
|
+
private readonly file;
|
|
60
|
+
private readonly graphFile;
|
|
61
|
+
private nodes;
|
|
62
|
+
private edges;
|
|
63
|
+
private loadedScope;
|
|
64
|
+
private loaded;
|
|
65
|
+
constructor(opts: GraphMemoryBackendOptions);
|
|
66
|
+
remember(scope: MemoryScope, entry: MemoryEntry, filePath: string): Promise<void>;
|
|
67
|
+
forget(scope: MemoryScope, query: string, filePath: string): Promise<number>;
|
|
68
|
+
readAll(scope: MemoryScope, filePath: string): Promise<string>;
|
|
69
|
+
list(scope: MemoryScope, filePath: string, limit?: number): Promise<MemoryEntry[]>;
|
|
70
|
+
search(scope: MemoryScope, query: string, filePath: string, limit?: number): Promise<MemoryEntry[]>;
|
|
71
|
+
clear(scope: MemoryScope, filePath: string): Promise<void>;
|
|
72
|
+
consolidate(scope: MemoryScope, filePath: string): Promise<number>;
|
|
73
|
+
/**
|
|
74
|
+
* Find memories related to the given entry, ordered by edge weight.
|
|
75
|
+
*/
|
|
76
|
+
findRelated(scope: MemoryScope, _filePath: string, entryText: string, limit?: number): Promise<MemoryEntry[]>;
|
|
77
|
+
/**
|
|
78
|
+
* Get all edges for visualization or traversal.
|
|
79
|
+
*/
|
|
80
|
+
getGraph(): {
|
|
81
|
+
nodes: GraphNode[];
|
|
82
|
+
edges: GraphEdge[];
|
|
83
|
+
};
|
|
84
|
+
private nodeId;
|
|
85
|
+
private loadGraph;
|
|
86
|
+
private saveGraph;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
interface ConsolidationOp {
|
|
90
|
+
action: 'add' | 'edit' | 'delete';
|
|
91
|
+
/** For add: the fact to remember. For edit: the new text replacing the old. */
|
|
92
|
+
text?: string | undefined;
|
|
93
|
+
/** For edit/delete: the query to match existing entries. */
|
|
94
|
+
query?: string | undefined;
|
|
95
|
+
/** Memory type for categorization. */
|
|
96
|
+
type?: string | undefined;
|
|
97
|
+
/** Tags for grouping. */
|
|
98
|
+
tags?: string[] | undefined;
|
|
99
|
+
/** Priority level. */
|
|
100
|
+
priority?: string | undefined;
|
|
101
|
+
}
|
|
102
|
+
interface MemoryConsolidatorOptions {
|
|
103
|
+
memoryStore: MemoryStore;
|
|
104
|
+
/**
|
|
105
|
+
* Provider used for the consolidation LLM call. Uses the session's
|
|
106
|
+
* provider by default.
|
|
107
|
+
*/
|
|
108
|
+
provider?: Provider | undefined;
|
|
109
|
+
/**
|
|
110
|
+
* Model override for the consolidation call. Uses the session's model
|
|
111
|
+
* by default. A smaller/faster model is recommended (e.g. haiku, flash).
|
|
112
|
+
*/
|
|
113
|
+
model?: string | undefined;
|
|
114
|
+
/**
|
|
115
|
+
* Minimum session iterations before consolidation fires.
|
|
116
|
+
* Sessions shorter than this are skipped (default 2).
|
|
117
|
+
*/
|
|
118
|
+
minIterations?: number | undefined;
|
|
119
|
+
/**
|
|
120
|
+
* Maximum memory entries to include in the prompt as context.
|
|
121
|
+
*/
|
|
122
|
+
maxExistingEntries?: number | undefined;
|
|
123
|
+
}
|
|
124
|
+
declare class SessionMemoryConsolidator implements AgentExtension {
|
|
125
|
+
name: string;
|
|
126
|
+
owner: string;
|
|
127
|
+
private readonly memoryStore;
|
|
128
|
+
private readonly provider?;
|
|
129
|
+
private readonly model?;
|
|
130
|
+
private readonly minIterations;
|
|
131
|
+
private readonly maxExistingEntries;
|
|
132
|
+
constructor(opts: MemoryConsolidatorOptions);
|
|
133
|
+
afterRun: AfterRunHook;
|
|
134
|
+
}
|
|
15
135
|
|
|
16
136
|
/**
|
|
17
137
|
* L2-B: AnnotationsStore — sidecar storage for collaboration annotations
|
|
@@ -183,7 +303,7 @@ declare class ReplayLogStore {
|
|
|
183
303
|
* Called when entry count exceeds the cap. Rewrites the entire file
|
|
184
304
|
* but only happens O(n / maxEntries) times per session.
|
|
185
305
|
*/
|
|
186
|
-
private
|
|
306
|
+
private rewriteCache;
|
|
187
307
|
/**
|
|
188
308
|
* Look up an entry by hash. Returns `null` when the request has
|
|
189
309
|
* not been recorded for this session. O(1) after the first call
|
|
@@ -405,7 +525,7 @@ declare class ToolAuditLog {
|
|
|
405
525
|
load(sessionId: string): Promise<AuditEntry[]>;
|
|
406
526
|
private filePath;
|
|
407
527
|
private readAll;
|
|
408
|
-
private
|
|
528
|
+
private writeAll;
|
|
409
529
|
/**
|
|
410
530
|
* Explicitly sync the file to disk. Called automatically every
|
|
411
531
|
* `fsyncEvery` writes, and available for callers who want to
|
|
@@ -504,4 +624,4 @@ declare class CloudSync {
|
|
|
504
624
|
private walkDir;
|
|
505
625
|
}
|
|
506
626
|
|
|
507
|
-
export { ALL_SYNC_CATEGORIES, type Annotation, AnnotationsStore, type AnnotationsStoreOptions, type AuditEntry, CloudSync, DefaultPromptStore, DefaultSessionRewinder, type PromptEntry, type PromptStore, type RecoveryPlan, type ReplayEntry, ReplayLogStore, type ReplayLogStoreOptions, SessionRecovery, type SessionRewinderOptions, type StaleSession, SyncCategory, SyncConfig, type SyncResult, ToolAuditLog, type ToolAuditLogOptions, type VerifyResult };
|
|
627
|
+
export { ALL_SYNC_CATEGORIES, type Annotation, AnnotationsStore, type AnnotationsStoreOptions, type AuditEntry, CloudSync, type ConsolidationOp, DefaultPromptStore, DefaultSessionRewinder, FileMemoryBackendOptions, GraphMemoryBackend, type GraphMemoryBackendOptions, MemoryBackend, type MemoryConsolidatorOptions, type PromptEntry, type PromptStore, type RecoveryPlan, type ReplayEntry, ReplayLogStore, type ReplayLogStoreOptions, SessionMemoryConsolidator, SessionRecovery, type SessionRewinderOptions, type StaleSession, SyncCategory, SyncConfig, type SyncResult, ToolAuditLog, type ToolAuditLogOptions, type VerifyResult };
|