@vibgrate/cli 2026.806.1 → 2026.807.1
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/DOCS.md +3 -1
- package/dist/{agent-SBVWSP7G.js → agent-K3J6EHLI.js} +11 -11
- package/dist/{agent-SBVWSP7G.js.map → agent-K3J6EHLI.js.map} +1 -1
- package/dist/{baseline-NM53X2TB.js → baseline-IAFWF2ET.js} +3 -3
- package/dist/{baseline-NM53X2TB.js.map → baseline-IAFWF2ET.js.map} +1 -1
- package/dist/{chunk-ITGUM42X.js → chunk-2HAJCW7Z.js} +4 -4
- package/dist/{chunk-ITGUM42X.js.map → chunk-2HAJCW7Z.js.map} +1 -1
- package/dist/{chunk-SMDHK37H.js → chunk-2M6B5V2U.js} +3 -3
- package/dist/{chunk-SMDHK37H.js.map → chunk-2M6B5V2U.js.map} +1 -1
- package/dist/{chunk-5AUCYYBG.js → chunk-5ESL76CM.js} +6 -6
- package/dist/{chunk-5AUCYYBG.js.map → chunk-5ESL76CM.js.map} +1 -1
- package/dist/{chunk-Y6AMGI4L.js → chunk-7CYFCSY2.js} +4 -4
- package/dist/{chunk-Y6AMGI4L.js.map → chunk-7CYFCSY2.js.map} +1 -1
- package/dist/{chunk-BOAUTBTB.js → chunk-ADP6ITGF.js} +53 -8
- package/dist/chunk-ADP6ITGF.js.map +1 -0
- package/dist/{chunk-6XP2TQS5.js → chunk-EJUMV5HU.js} +3 -3
- package/dist/{chunk-6XP2TQS5.js.map → chunk-EJUMV5HU.js.map} +1 -1
- package/dist/{chunk-LFHXJHOZ.js → chunk-EXOYSXH6.js} +3 -3
- package/dist/{chunk-LFHXJHOZ.js.map → chunk-EXOYSXH6.js.map} +1 -1
- package/dist/{chunk-TWZLUOTR.js → chunk-FOKURZL3.js} +4 -4
- package/dist/{chunk-TWZLUOTR.js.map → chunk-FOKURZL3.js.map} +1 -1
- package/dist/{chunk-H4ZIJSHE.js → chunk-G4KO5W6H.js} +65 -9
- package/dist/chunk-G4KO5W6H.js.map +1 -0
- package/dist/{chunk-N6LGZBIC.js → chunk-GQ2EQXBG.js} +5 -5
- package/dist/{chunk-N6LGZBIC.js.map → chunk-GQ2EQXBG.js.map} +1 -1
- package/dist/chunk-ITY2NPIQ.js +6 -0
- package/dist/{chunk-3Z6TDWNS.js.map → chunk-ITY2NPIQ.js.map} +1 -1
- package/dist/{chunk-A42UDYL2.js → chunk-JFCCJWXD.js} +3 -3
- package/dist/{chunk-A42UDYL2.js.map → chunk-JFCCJWXD.js.map} +1 -1
- package/dist/{chunk-SAHORNZX.js → chunk-KEIMMCS5.js} +4 -4
- package/dist/{chunk-SAHORNZX.js.map → chunk-KEIMMCS5.js.map} +1 -1
- package/dist/{chunk-AN7RCXE4.js → chunk-LS7GZBKP.js} +32 -12
- package/dist/chunk-LS7GZBKP.js.map +1 -0
- package/dist/{chunk-OGJ633I2.js → chunk-N5EP5ZR2.js} +35 -17
- package/dist/{chunk-OGJ633I2.js.map → chunk-N5EP5ZR2.js.map} +1 -1
- package/dist/{chunk-KACPLPFT.js → chunk-NWX4VUFS.js} +7 -7
- package/dist/{chunk-KACPLPFT.js.map → chunk-NWX4VUFS.js.map} +1 -1
- package/dist/{chunk-OKJTAHOL.js → chunk-PT2XQTSK.js} +5 -5
- package/dist/{chunk-OKJTAHOL.js.map → chunk-PT2XQTSK.js.map} +1 -1
- package/dist/{chunk-VJIRJLV2.js → chunk-QXIWQ2WG.js} +4 -4
- package/dist/{chunk-VJIRJLV2.js.map → chunk-QXIWQ2WG.js.map} +1 -1
- package/dist/{chunk-VP5ECB7T.js → chunk-VNAOFA6X.js} +8 -8
- package/dist/{chunk-VP5ECB7T.js.map → chunk-VNAOFA6X.js.map} +1 -1
- package/dist/{chunk-VKVGREHC.js → chunk-VQVLY63G.js} +1326 -61
- package/dist/chunk-VQVLY63G.js.map +1 -0
- package/dist/{chunk-K3KEKY2L.js → chunk-XSHGXGVJ.js} +4 -4
- package/dist/{chunk-K3KEKY2L.js.map → chunk-XSHGXGVJ.js.map} +1 -1
- package/dist/{chunk-KUZLILN3.js → chunk-Z7FM3ETS.js} +18 -4
- package/dist/chunk-Z7FM3ETS.js.map +1 -0
- package/dist/cli.js +95 -53
- package/dist/cli.js.map +1 -1
- package/dist/embed-worker-main.js +3 -3
- package/dist/{ensure-map-JICVC2ZJ.js → ensure-map-TYMYYIJE.js} +12 -12
- package/dist/{ensure-map-JICVC2ZJ.js.map → ensure-map-TYMYYIJE.js.map} +1 -1
- package/dist/graph-backend-5YOWNHHG.js +13 -0
- package/dist/{graph-backend-TB35N5MC.js.map → graph-backend-5YOWNHHG.js.map} +1 -1
- package/dist/index.d.ts +10 -3
- package/dist/index.js +11 -11
- package/dist/{interactive-IJS33F4K.js → interactive-YEMXHGBO.js} +25 -23
- package/dist/interactive-YEMXHGBO.js.map +1 -0
- package/dist/load-IIWVYUN7.js +9 -0
- package/dist/{load-OMTSGVDX.js.map → load-IIWVYUN7.js.map} +1 -1
- package/dist/{run-outcome-UENLWBWC.js → run-outcome-2JO55QCC.js} +5 -5
- package/dist/{run-outcome-UENLWBWC.js.map → run-outcome-2JO55QCC.js.map} +1 -1
- package/dist/runtime-session-HFKGKQV7.js +20 -0
- package/dist/{runtime-session-AFL7P4TQ.js.map → runtime-session-HFKGKQV7.js.map} +1 -1
- package/dist/session-5LFX4U2E.js +15 -0
- package/dist/{session-HOS4454T.js.map → session-5LFX4U2E.js.map} +1 -1
- package/dist/session-store-KGONLWHN.js +4 -0
- package/dist/{session-store-F7NX7SZN.js.map → session-store-KGONLWHN.js.map} +1 -1
- package/dist/{stream-json-SVMGVBFB.js → stream-json-DUCFTBUF.js} +11 -11
- package/dist/{stream-json-SVMGVBFB.js.map → stream-json-DUCFTBUF.js.map} +1 -1
- package/dist/{vg-mcp-bridge-NYCAQEMU.js → vg-mcp-bridge-4KPDQUFN.js} +8 -8
- package/dist/{vg-mcp-bridge-NYCAQEMU.js.map → vg-mcp-bridge-4KPDQUFN.js.map} +1 -1
- package/dist/{vgd-YFPJHQB5.js → vgd-LFHQ4GWC.js} +8 -8
- package/dist/vgd-LFHQ4GWC.js.map +1 -0
- package/package.json +3 -3
- package/dist/chunk-3Z6TDWNS.js +0 -6
- package/dist/chunk-AN7RCXE4.js.map +0 -1
- package/dist/chunk-BOAUTBTB.js.map +0 -1
- package/dist/chunk-H4ZIJSHE.js.map +0 -1
- package/dist/chunk-KUZLILN3.js.map +0 -1
- package/dist/chunk-VKVGREHC.js.map +0 -1
- package/dist/graph-backend-TB35N5MC.js +0 -13
- package/dist/interactive-IJS33F4K.js.map +0 -1
- package/dist/load-OMTSGVDX.js +0 -9
- package/dist/runtime-session-AFL7P4TQ.js +0 -20
- package/dist/session-HOS4454T.js +0 -15
- package/dist/session-store-F7NX7SZN.js +0 -4
- package/dist/vgd-YFPJHQB5.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/code/session-store.ts"],"names":[],"mappings":"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","file":"chunk-KUZLILN3.js","sourcesContent":["/**\n * Session persistence for VG Code (VG-CLI-CODE §16) — `vg code --continue`.\n *\n * A coding session is a series of tasks; this stores a compact record of them\n * (what you asked, a one-line outcome, which files changed) plus the last\n * change-set so `/undo` survives a restart. `--continue` reloads the most recent\n * session and hands the model a short summary of what was already done, so you\n * can pick a conversation back up instead of re-explaining. We persist a\n * *summary*, never raw file contents or tool transcripts — small, private, and\n * safe to keep on disk.\n *\n * Pure over an injected clock; the store is JSON under `.vibgrate/code-sessions/`.\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { FileChange } from './types.js';\n\nexport interface SessionTask {\n instruction: string;\n summary: string;\n files: string[];\n stopped: string;\n ts: number;\n}\n\nexport interface StoredSession {\n id: string;\n provider: string;\n model: string;\n startedAt: number;\n updatedAt: number;\n tasks: SessionTask[];\n /** The most recent change-set, so `/undo` works after `--continue`. */\n lastChanges: FileChange[];\n}\n\nexport function sessionsDir(root: string): string {\n return path.join(root, '.vibgrate', 'code-sessions');\n}\nfunction latestPointer(root: string): string {\n return path.join(sessionsDir(root), 'latest.json');\n}\n\n/** Write a session and update the `latest` pointer. Best-effort; never throws. */\nexport function saveSession(root: string, session: StoredSession): void {\n try {\n const dir = sessionsDir(root);\n fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(path.join(dir, `${session.id}.json`), JSON.stringify(session, null, 2));\n fs.writeFileSync(latestPointer(root), JSON.stringify({ id: session.id }));\n } catch {\n /* persistence is best-effort */\n }\n}\n\n/** Load the most recent session, or undefined if none/there was a read error. */\nexport function loadLatestSession(root: string): StoredSession | undefined {\n try {\n const { id } = JSON.parse(fs.readFileSync(latestPointer(root), 'utf8')) as { id: string };\n return loadSession(root, id);\n } catch {\n /* no session */\n }\n return undefined;\n}\n\n/** Load one session by id, or undefined if missing/invalid. */\nexport function loadSession(root: string, id: string): StoredSession | undefined {\n try {\n const safe = id.replace(/[^a-zA-Z0-9_-]/g, '');\n if (!safe || safe !== id) return undefined;\n const raw = JSON.parse(fs.readFileSync(path.join(sessionsDir(root), `${safe}.json`), 'utf8')) as StoredSession;\n if (Array.isArray(raw.tasks) && raw.id) return raw;\n } catch {\n /* missing */\n }\n return undefined;\n}\n\nexport interface SessionListEntry {\n id: string;\n provider: string;\n model: string;\n startedAt: number;\n updatedAt: number;\n taskCount: number;\n /** First task instruction (truncated) for history UI. */\n title: string;\n}\n\n/** List stored sessions newest-first (multi-chat history). Best-effort. */\nexport function listSessions(root: string, limit = 50): SessionListEntry[] {\n try {\n const dir = sessionsDir(root);\n if (!fs.existsSync(dir)) return [];\n const files = fs.readdirSync(dir).filter((f) => f.endsWith('.json') && f !== 'latest.json');\n const out: SessionListEntry[] = [];\n for (const f of files) {\n try {\n const raw = JSON.parse(fs.readFileSync(path.join(dir, f), 'utf8')) as StoredSession;\n if (!raw?.id || !Array.isArray(raw.tasks)) continue;\n const first = raw.tasks[0]?.instruction?.trim() || 'New chat';\n out.push({\n id: raw.id,\n provider: raw.provider ?? '',\n model: raw.model ?? '',\n startedAt: raw.startedAt ?? 0,\n updatedAt: raw.updatedAt ?? raw.startedAt ?? 0,\n taskCount: raw.tasks.length,\n title: first.slice(0, 80),\n });\n } catch {\n /* skip bad file */\n }\n }\n out.sort((a, b) => b.updatedAt - a.updatedAt);\n return out.slice(0, Math.max(1, limit));\n } catch {\n return [];\n }\n}\n\n/** Point `latest` at an existing session (resume a prior chat). */\nexport function setLatestSession(root: string, id: string): boolean {\n const s = loadSession(root, id);\n if (!s) return false;\n try {\n fs.mkdirSync(sessionsDir(root), { recursive: true });\n fs.writeFileSync(latestPointer(root), JSON.stringify({ id: s.id }));\n return true;\n } catch {\n return false;\n }\n}\n\n/** A short natural-language recap of a session to seed a continued run's context. */\nexport function summarizeSession(session: StoredSession): string {\n if (session.tasks.length === 0) return '';\n const lines = session.tasks.slice(-8).map((t, i) => `${i + 1}. ${t.instruction} — ${t.summary}${t.files.length ? ` (${t.files.join(', ')})` : ''}`);\n return `Earlier in this session (${session.provider}/${session.model}) you did:\\n${lines.join('\\n')}`;\n}\n\n/** A fresh session record. `id` and `now` are injected so this stays deterministic. */\nexport function newSession(id: string, provider: string, model: string, now: number): StoredSession {\n return { id, provider, model, startedAt: now, updatedAt: now, tasks: [], lastChanges: [] };\n}\n\n/**\n * Manually compact a session: collapse all recorded tasks into a single\n * checkpoint entry so the recap seeded into future turns shrinks to one line\n * per prior task, capped. Deterministic (no model call) — the in-turn LLM\n * compaction handles rich summaries; this is the user-invoked `/compact`.\n */\nexport function condenseSession(session: StoredSession, now: number): StoredSession {\n if (session.tasks.length <= 1) return session;\n const files = [...new Set(session.tasks.flatMap((t) => t.files))];\n const lines = session.tasks\n .slice(-12)\n .map((t) => `${t.instruction.slice(0, 80)} — ${t.summary.slice(0, 80)}`);\n const checkpoint: SessionTask = {\n instruction: `(compacted: ${session.tasks.length} earlier task(s))`,\n summary: lines.join(' · ').slice(0, 1500),\n files,\n stopped: 'compacted',\n ts: now,\n };\n return { ...session, updatedAt: now, tasks: [checkpoint] };\n}\n\n/** Append a completed task (immutably updating the record's timestamps). */\nexport function recordTask(\n session: StoredSession,\n task: { instruction: string; summary: string; changes: FileChange[]; stopped: string },\n now: number,\n): StoredSession {\n const files = [...new Set(task.changes.map((c) => c.file))];\n return {\n ...session,\n updatedAt: now,\n tasks: [...session.tasks, { instruction: task.instruction.slice(0, 300), summary: task.summary.slice(0, 300), files, stopped: task.stopped, ts: now }],\n lastChanges: task.changes.length ? task.changes : session.lastChanges,\n };\n}\n"]}
|