{"format":1,"manifest":{"name":"clipboard-history","publisher":"vyloxi","version":"1.0.0","displayName":"Clipboard History","description":"Remembers what you copied and lets you paste an older item from a list.","engines":{"ferrum":"^0.1.0"},"categories":["Productivity"],"icon":"icon.png","repository":"https://github.com/voukengdongmofrankysteve/ferrum-market","license":"MIT","main":"extension.js","activationEvents":["onStartup"],"permissions":["clipboard"],"contributes":{"commands":[{"command":"clipboardHistory.show","title":"Paste from History...","category":"Clipboard History"},{"command":"clipboardHistory.pasteLast","title":"Paste the Previous Clipboard Item","category":"Clipboard History"},{"command":"clipboardHistory.copy","title":"Copy an Earlier Item Again...","category":"Clipboard History"},{"command":"clipboardHistory.togglePause","title":"Pause or Resume Recording","category":"Clipboard History"},{"command":"clipboardHistory.clear","title":"Clear History","category":"Clipboard History"}],"keybindings":[{"command":"clipboardHistory.show","key":"Ctrl+Alt+V"}],"configuration":{"title":"Clipboard History","properties":{"clipboardHistory.max":{"type":"number","default":50,"description":"How many items to remember (5 to 200)."},"clipboardHistory.persist":{"type":"boolean","default":false,"description":"Keep the last 50 items between sessions. Off by default so copied passwords do not stay on disk."}}}}},"files":{"icon.png":{"encoding":"base64","content":"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"},"extension.js":{"encoding":"utf8","content":"// Clipboard History: remembers what you copied and lets you paste an older item. It checks the clipboard every second or two\n// while Ferrum is open, so it needs the clipboard permission. Nothing leaves your computer.\n\n/** Adds an item to the front, removing an older copy of the same text, and keeps `max` items. */\nfunction push(list, text, max) {\n  const t = String(text);\n  if (!t.trim()) return list;\n  const next = [{ text: t, at: Date.now() }, ...list.filter((x) => x.text !== t)];\n  return next.slice(0, Math.max(1, max));\n}\n\n/** A one-line preview for the list. */\nfunction preview(text, n = 90) {\n  const one = text.replace(/\\s+/g, ' ').trim();\n  return one.length > n ? one.slice(0, n - 1) + '…' : one;\n}\n\nfunction ago(at, now = Date.now()) {\n  const s = Math.max(0, Math.round((now - at) / 1000));\n  if (s < 60) return 'just now';\n  if (s < 3600) return Math.floor(s / 60) + ' min ago';\n  if (s < 86400) return Math.floor(s / 3600) + ' h ago';\n  return Math.floor(s / 86400) + ' d ago';\n}\n\n/** Text that looks like a secret is not stored: long random strings, private keys, tokens. */\nfunction looksSecret(text) {\n  const t = text.trim();\n  if (/-----BEGIN [A-Z ]*PRIVATE KEY-----/.test(t)) return true;\n  if (/^(sk|pk|ghp|gho|ghs|glpat|xox[abp]|AKIA)[-_A-Za-z0-9]{16,}$/.test(t)) return true;\n  if (/^eyJ[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]*$/.test(t)) return true;\n  return false;\n}\n\nexports._test = { push, preview, ago, looksSecret };\n\nexports.activate = function (context) {\n  let history = [];\n  let paused = false;\n  let last = null;\n  let timer = null;\n  const max = () => Math.min(200, Math.max(5, Number(ferrum.settings.get('clipboardHistory.max')) || 50));\n  const persist = () => ferrum.settings.get('clipboardHistory.persist') === true;\n  const reg = (id, fn) => context.subscriptions.push(ferrum.commands.register(id, fn));\n\n  function status() {\n    ferrum.window.setStatusBar('clipboardHistory.status', { text: paused ? 'Clipboard: paused' : 'Clipboard: ' + history.length, tooltip: 'Clipboard History: click to browse', command: 'clipboardHistory.show' });\n  }\n\n  async function poll() {\n    if (paused) return;\n    let text;\n    try { text = await ferrum.clipboard.readText(); } catch { return; }\n    if (typeof text !== 'string' || text === last) return;\n    last = text;\n    if (!text.trim() || text.length > 100000 || looksSecret(text)) return;\n    history = push(history, text, max());\n    status();\n    if (persist()) await ferrum.storage.set('history', history.slice(0, 50));\n  }\n\n  (async () => {\n    if (persist()) history = (await ferrum.storage.get('history', [])).filter((x) => x && typeof x.text === 'string');\n    try { last = await ferrum.clipboard.readText(); } catch { last = null; }\n    status();\n    timer = setInterval(poll, 1500);\n    context.subscriptions.push({ dispose: () => clearInterval(timer) });\n  })();\n\n  reg('clipboardHistory.show', async () => {\n    if (!history.length) return ferrum.window.showMessage('Nothing has been copied since Ferrum started.');\n    const pick = await ferrum.window.showQuickPick(\n      history.map((h, i) => ({ label: preview(h.text), detail: h.text.length + ' characters', description: ago(h.at), i })),\n      { placeholder: 'Pick what to paste at the cursor' },\n    );\n    if (!pick) return;\n    const item = history[pick.i];\n    const doc = await ferrum.editor.active();\n    if (doc) await ferrum.editor.insert(item.text);\n    else ferrum.window.showMessage('Open a file to paste into.', 'warn');\n  });\n  reg('clipboardHistory.copy', async () => {\n    if (!history.length) return ferrum.window.showMessage('Nothing has been copied since Ferrum started.');\n    const pick = await ferrum.window.showQuickPick(history.map((h, i) => ({ label: preview(h.text), description: ago(h.at), i })), { placeholder: 'Pick what to copy again' });\n    if (!pick) return;\n    last = history[pick.i].text;\n    await ferrum.clipboard.writeText(last);\n    ferrum.window.showMessage('Copied again. Press Ctrl+V anywhere.');\n  });\n  reg('clipboardHistory.pasteLast', async () => {\n    if (history.length < 2) return ferrum.window.showMessage('There is no earlier item yet.');\n    const doc = await ferrum.editor.active();\n    if (doc) await ferrum.editor.insert(history[1].text);\n  });\n  reg('clipboardHistory.clear', async () => {\n    history = [];\n    await ferrum.storage.set('history', []);\n    status();\n    ferrum.window.showMessage('Clipboard history cleared.');\n  });\n  reg('clipboardHistory.togglePause', () => {\n    paused = !paused;\n    status();\n    ferrum.window.showMessage(paused ? 'Clipboard History is paused. New copies are not recorded.' : 'Clipboard History is recording again.');\n  });\n};\n\nexports.deactivate = function () {};\n"},"README.md":{"encoding":"utf8","content":"# Clipboard History\n\nFerrum checks the clipboard every second or two while it is open and keeps what you copied, newest first. **Paste from History...** shows the list; pick an item to insert it at the cursor. **Copy an Earlier Item Again...** puts an old item back on the clipboard to paste anywhere. The status bar shows how many items are kept; click it to browse.\n\n## Privacy\n\n- It needs the **clipboard** permission, because that is how it can read what you copied. Everything stays on your computer.\n- The history is **in memory only**, and is gone when you close Ferrum, unless you turn on `clipboardHistory.persist`.\n- Things that look like secrets are **never recorded**: private keys, JWT tokens and common API key formats. Other text is recorded as is, so use **Pause or Resume Recording** before copying a password, and **Clear History** when you are done.\n- Items over 100,000 characters are skipped.\n\nIt only sees the clipboard while Ferrum is running, and it cannot know what you copied in a program that was closed.\n"}}}