dsh-session-toolbox 0.1.6 → 0.1.8

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/lib/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.mjs", "../package.json"],
4
- "sourcesContent": ["/**\n * dsh-session-toolbox host plugin: draft vault manifest mirror (\u00A74 FR1), session\n * move (\u00A710) and trash bin (\u00A711) for DeepSeek Harness. Every official surface\n * is reached through `ctx.get(...)` service names probed at runtime; a missing\n * capability degrades that feature to a visible \"unavailable\" state \u2014 never a\n * crash, never a patch (NFR3 / \u00A710 MN1). The plugin declares no hard `inject`\n * dependencies so it can never block host boot.\n */\nimport { mkdir, realpath, stat } from 'node:fs/promises';\nimport { appendFileSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport z from '@deepseek-ai/schemastery';\nimport { resolveDshHome } from '@deepseek-ai/dsh-home-paths';\nimport { guardJournal, guardLedger, guardManifest, guardSettings, JsonDocument } from './store.mjs';\nimport { MoveEngine } from './move.mjs';\nimport { TrashEngine } from './trash.mjs';\nimport { apiHandler, dispatch } from './api.mjs';\nimport pkg from '../package.json' with { type: 'json' };\nconst pluginVersion = pkg.version;\n\nexport const name = 'dsh-session-toolbox';\nexport const inject = [];\n// schemastery has no `.optional()`; empty defaults mean \"unset\" (apply() treats '' as absent).\nexport const Config = z.object({\n\tconfigFile: z.string().description('Directory for session-toolbox data (defaults to <DSH_HOME>/session-toolbox)').default(''),\n\tdshHome: z.string().description('Override the DSH home whose sessions/ storage the tool manages (advanced)').default(''),\n});\n\nexport function defaultKitRoot() {\n\treturn join(resolveDshHome(), 'session-toolbox');\n}\n\nexport async function apply(ctx, options = {}) {\n\ttry {\n\t\treturn await applyInner(ctx, options);\n\t} catch (error) {\n\t\t// A failing third-party plugin must never take the whole app down.\n\t\t// Record the real stack so the failure is diagnosable, then degrade.\n\t\trecordStartupFailure(error);\n\t\tconst hint = /Cannot find package|ERR_MODULE_NOT_FOUND/.test(String(error?.message ?? error))\n\t\t\t? '\uFF08\u4F9D\u8D56\u7F3A\u5931\uFF1A\u8BF7\u4ECE\u63D2\u4EF6\u9875\u5378\u8F7D\u540E\u91CD\u65B0\u5B89\u88C5\uFF0C\u8BA9\u5305\u7BA1\u7406\u5668\u91CD\u65B0\u62C9\u53D6 peer \u4F9D\u8D56\uFF09'\n\t\t\t: '';\n\t\tctx.logger?.warn?.(`session-toolbox: disabled after startup error${hint} \u2014 ${error?.message ?? error}`);\n\t}\n}\n\n/** Absolute path of the startup-failure log, next to the plugin's other state. */\nfunction startupFailureLog() {\n\ttry {\n\t\treturn join(resolve(resolveDshHome()), 'session-toolbox', 'startup-error.log');\n\t} catch { return ''; }\n}\n\n/** Append a startup failure (with stack) so a failed activation stays diagnosable. */\nfunction recordStartupFailure(error) {\n\tconst file = startupFailureLog();\n\tif (file === '') return;\n\ttry {\n\t\tconst detail = `${new Date().toISOString()}\\n${error?.stack ?? String(error)}\\n\\n`;\n\t\tappendFileSync(file, detail, { mode: 0o600 });\n\t} catch { /* diagnostics must never throw */ }\n}\n\nasync function applyInner(ctx, options = {}) {\n\tconst dshHome = resolve(options.dshHome || resolveDshHome());\n\tconst root = resolve(options.configFile || join(dshHome, 'session-toolbox'));\n\tawait mkdir(root, { recursive: true, mode: 0o700 });\n\tconst capabilities = {\n\t\tworkspaceRegistry: ctx.get('workspaceRegistry') !== undefined,\n\t\tsessions: ctx.get('sessions') !== undefined,\n\t\tsessionPersistence: ctx.get('sessionPersistence') !== undefined,\n\t\twebServer: false, // flips true when the optional webServer inject fires\n\t};\n\tconst settingsDoc = new JsonDocument(root, 'session-toolbox.json', { version: 1 }, guardSettings);\n\tconst journalDoc = new JsonDocument(root, 'journal.json', { version: 1, active: null }, guardJournal);\n\tconst ledgerDoc = new JsonDocument(root, 'trash.json', { version: 1, items: [] }, guardLedger);\n\tconst manifestDoc = new JsonDocument(root, 'vault-manifest.json', { version: 1, records: [] }, guardManifest);\n\n\tlet settingsCache = await settingsDoc.read().catch(() => ({ trash: {}, draftVault: {} }));\n\tlet journalCache = null;\n\ttry { journalCache = (await journalDoc.read()).active; }\n\tcatch (error) { ctx.logger?.warn?.(`session-toolbox: journal unreadable \u2014 ${error.message}`); }\n\tif (journalCache !== null) ctx.logger?.warn?.(`session-toolbox: unresolved move journal for ${journalCache.sessionId}; complete or roll it back from the panel or CLI`);\n\n\tconst move = new MoveEngine({\n\t\troot,\n\t\tsessionsRoot: join(dshHome, 'sessions'),\n\t\tprojcacheRoot: join(dshHome, 'storages', 'session_projcache', 'sessions'),\n\t\tjournal: journalDoc,\n\t\tcapabilities: hostCapabilities(ctx),\n\t});\n\tconst trash = new TrashEngine({\n\t\tadapter: registryAdapter(ctx),\n\t\tsessions: () => (ctx.get('sessions')?.list() ?? []).map(session => session.header?.id).filter(id => typeof id === 'string'),\n\t\tsessionsRoot: join(dshHome, 'sessions'),\n\t\tprojcacheRoot: join(dshHome, 'storages', 'session_projcache', 'sessions'),\n\t\tkitRoot: root,\n\t\tledger: ledgerDoc,\n\t\tvault: { dropSession: sessionId => manifestDoc.update(current => ({ ...current, records: current.records.filter(record => record.sessionId !== sessionId) })) },\n\t\tjournal: () => journalCache,\n\t\tsettings: () => settingsCache.trash ?? {},\n\t});\n\n\tconst kit = {\n\t\tsettings: settingsDoc,\n\t\tmanifest: manifestDoc,\n\t\tjournal: journalDoc,\n\t\tmove,\n\t\ttrash,\n\t\tupdateSettings: async patch => {\n\t\t\tconst next = await settingsDoc.update(current => deepMerge(current, patch));\n\t\t\tsettingsCache = next;\n\t\t\treturn next;\n\t\t},\n\t\tvaultSync: async records => {\n\t\t\tconst manifest = await manifestDoc.update(() => ({\n\t\t\t\tversion: 1,\n\t\t\t\trecords: (Array.isArray(records) ? records : []).filter(record => typeof record.sessionId === 'string' && typeof record.attachmentId === 'string')\n\t\t\t\t\t.slice(-2000)\n\t\t\t\t\t.map(record => ({ sessionId: record.sessionId, attachmentId: record.attachmentId,\n\t\t\t\t\t\tname: String(record.name ?? ''), size: Number(record.size) || 0, hash: String(record.hash ?? ''),\n\t\t\t\t\t\tcreatedAt: Number(record.createdAt) || Date.now() })),\n\t\t\t}));\n\t\t\treturn manifest;\n\t\t},\n\t\tstate: async () => {\n\t\t\tconst settings = await settingsDoc.read();\n\t\t\tsettingsCache = settings;\n\t\t\tconst journal = (await journalDoc.read().catch(() => ({ active: journalCache }))).active;\n\t\t\tjournalCache = journal;\n\t\t\tconst manifest = await manifestDoc.read();\n\t\t\treturn {\n\t\t\t\tpluginVersion,\n\t\t\t\tcapabilities,\n\t\t\t\tsettings,\n\t\t\t\tjournal,\n\t\t\t\ttrash: await trash.items(),\n\t\t\t\t// Bytes live in browser IndexedDB; the manifest mirrors their metadata only.\n\t\t\t\tvault: { records: manifest.records.length, bytes: manifest.records.reduce((total, record) => total + (record.size ?? 0), 0) },\n\t\t\t\trecovery: journal === null ? null : `\u672A\u5B8C\u6210\u8FC1\u79FB\uFF1A${journal.sessionId} \u2192 ${journal.toCwd}\uFF08\u5DF2\u5B8C\u6210 ${journal.done.join('/') || '\u65E0'}\uFF09`,\n\t\t\t};\n\t\t},\n\t\taction: input => dispatch(kit, input),\n\t};\n\n\tctx.inject?.(['webServer'], webCtx => {\n\t\tcapabilities.webServer = true;\n\t\twebCtx.effect(() => webCtx.webServer.register({ kind: 'exact', path: '/.well-known/dsh-session-toolbox', handler: apiHandler(kit) }));\n\t});\n\n\t// Expose the kit in-process (cordis plugins must return nothing; the service\n\t// is the surface other plugins or future official hooks can reach).\n\tctx.provide('sessionToolbox', kit);\n\n\tctx.effect(() => () => {});\n\tctx.logger?.info?.('dsh-session-toolbox ready', JSON.stringify({ version: pluginVersion, capabilities }));\n}\n\n/**\n * Host capabilities for the move engine (\u00A710 MR5). Services are fetched lazily\n * through `ctx.get`; a missing one raises a stable error the UI can show.\n */\nexport function hostCapabilities(ctx) {\n\treturn {\n\t\tsessionLive: sessionId => {\n\t\t\tconst sessions = ctx.get('sessions');\n\t\t\treturn sessions ? sessions.list().some(session => session.header?.id === sessionId) : false;\n\t\t},\n\t\tlistHeaders: async () => {\n\t\t\tconst persistence = ctx.get('sessionPersistence');\n\t\t\tif (persistence?.list !== undefined) return (await persistence.list()).map(snapshot => snapshot.header);\n\t\t\tconst registry = ctx.get('workspaceRegistry');\n\t\t\tif (registry?.listStoredHeaders !== undefined) return await registry.listStoredHeaders();\n\t\t\tthrow new Error('no session-persistence service in this DSH build');\n\t\t},\n\t\t/** Drop stale header entries so `attachSession` validates the NEW on-disk cwd (\u00A710 MR4). */\n\t\trefreshHeaderCache: async () => {\n\t\t\tconst registry = ctx.get('workspaceRegistry');\n\t\t\tif (typeof registry?.replaceHeaderIndex !== 'function') return;\n\t\t\tawait registry.replaceHeaderIndex(await registry.listStoredHeaders());\n\t\t},\n\t\t/** Ledger step (\u00A710 MR2 step 2): source detach \u2192 target create \u2192 attach. */\n\t\tmoveLedger: async (sessionId, fromCwd, toCwd) => {\n\t\t\tconst registry = ctx.get('workspaceRegistry');\n\t\t\tif (registry === undefined) throw new Error('workspaceRegistry unavailable in this DSH build');\n\t\t\tconst canonicalFrom = fromCwd === undefined ? undefined : await realpath(fromCwd).catch(() => fromCwd);\n\t\t\tconst source = canonicalFrom === undefined ? undefined : await registry.resolveByPath(canonicalFrom);\n\t\t\tif (source !== undefined) await source.detachSession(sessionId);\n\t\t\tlet target = await registry.resolveByPath(toCwd);\n\t\t\tif (target === undefined) {\n\t\t\t\tif (!(await stat(toCwd).then(s => s.isDirectory(), () => false))) throw new Error(`target directory ${toCwd} does not exist`);\n\t\t\t\ttarget = await registry.create(toCwd);\n\t\t\t}\n\t\t\tawait target.attachSession(sessionId);\n\t\t},\n\t\tresyncIndex: async () => {\n\t\t\t// \u00A710.8-3: the sqlite query index reconciles against persistence lazily on\n\t\t\t// every query path; there is nothing explicit to call in this build.\n\t\t\treturn ctx.get('sessionQuery') !== undefined ? 'lazy' : 'unavailable';\n\t\t},\n\t};\n}\n\n/**\n * The narrow adapter the trash engine runs every official effect through\n * (\u00A711 TB5). Workspace deletion keeps session logs (\u00A711.1-2); bootstrap only\n * re-claims non-archived unaccounted sessions \u2014 which is why trashing a project\n * archives its sessions first, and restoring re-registers + attaches +\n * unarchives in order.\n */\nexport function registryAdapter(ctx) {\n\tconst registry = () => {\n\t\tconst value = ctx.get('workspaceRegistry');\n\t\tif (value === undefined) throw Object.assign(new Error('workspaceRegistry unavailable'), { code: 'no-capability' });\n\t\treturn value;\n\t};\n\treturn {\n\t\tsessionKnown: async sessionId => {\n\t\t\tconst rows = registry();\n\t\t\treturn typeof rows.sessionKnown === 'function' ? await rows.sessionKnown(sessionId) : false;\n\t\t},\n\t\tarchivedSet: async () => new Set(registry().archivedSessionIds ?? []),\n\t\tpinnedSet: async () => new Set(registry().pinnedSessionIds ?? []),\n\t\tlocateSession: async sessionId => {\n\t\t\tfor (const entity of registry().list()) {\n\t\t\t\tconst ids = entity.sessionIds ?? [];\n\t\t\t\tif (!ids.includes(sessionId)) continue;\n\t\t\t\tconst at = ids.indexOf(sessionId);\n\t\t\t\treturn { workspaceId: entity.id, beforeId: at + 1 < ids.length ? ids[at + 1] : null, title: null };\n\t\t\t}\n\t\t\treturn { workspaceId: null, beforeId: null, title: null };\n\t\t},\n\t\tworkspaceSnapshot: async workspaceId => {\n\t\t\tconst rows = registry();\n\t\t\tconst entity = rows.get(workspaceId);\n\t\t\tif (entity === undefined) return undefined;\n\t\t\tconst ids = entity.sessionIds ?? [];\n\t\t\tconst archived = new Set(rows.archivedSessionIds ?? []);\n\t\t\tconst pinned = new Set(rows.pinnedSessionIds ?? []);\n\t\t\tconst order = rows.list().map(row => row.id);\n\t\t\tconst at = order.indexOf(entity.id);\n\t\t\treturn {\n\t\t\t\tworkspaceId: entity.id, path: entity.path, title: entity.title,\n\t\t\t\tbeforeId: at > 0 ? order[at - 1] : null,\n\t\t\t\tsessions: ids.map((sessionId, index) => ({ sessionId,\n\t\t\t\t\tpreviouslyArchived: archived.has(sessionId),\n\t\t\t\t\tpreviouslyPinned: pinned.has(sessionId),\n\t\t\t\t\tbeforeId: index + 1 < ids.length ? ids[index + 1] : null })),\n\t\t\t};\n\t\t},\n\t\tarchiveSession: (sessionId, options) => registry().archiveSession(sessionId, options),\n\t\tunarchiveSession: sessionId => registry().unarchiveSession(sessionId),\n\t\tpinSession: sessionId => registry().pinSession(sessionId),\n\t\tunpinSession: sessionId => registry().unpinSession(sessionId),\n\t\tdeleteWorkspace: workspaceId => registry().delete(workspaceId),\n\t\trepairSlot: async (sessionId, workspaceId, beforeId) => {\n\t\t\tconst entity = registry().get(workspaceId);\n\t\t\tif (entity === undefined) return;\n\t\t\tif (!entity.sessionIds?.includes(sessionId)) await entity.attachSession(sessionId);\n\t\t\tif (beforeId !== null && entity.sessionIds?.includes(beforeId)) await entity.insertSessionBefore(sessionId, beforeId);\n\t\t},\n\t\trestoreWorkspace: async snapshot => {\n\t\t\tconst rows = registry();\n\t\t\tlet entity = rows.list().find(row => row.path === snapshot.path);\n\t\t\tif (entity === undefined) {\n\t\t\t\tawait mkdir(snapshot.path, { recursive: true }).catch(() => {});\n\t\t\t\tentity = await rows.create(snapshot.path, snapshot.title);\n\t\t\t}\n\t\t\tfor (const row of [...snapshot.sessions].reverse()) await entity.attachSession(row.sessionId).catch(() => {});\n\t\t\tif (snapshot.beforeId !== null && entity.id !== snapshot.beforeId) await rows.insertBefore(entity.id, snapshot.beforeId).catch(() => {});\n\t\t\treturn entity;\n\t\t},\n\t\tpurgeSession: async () => ctx.get('sessionPersistence')?.delete === undefined ? 'unavailable' : 'present',\n\t};\n}\n\nfunction deepMerge(base, patch) {\n\tconst next = { ...base };\n\tfor (const [key, value] of Object.entries(patch ?? {})) {\n\t\tnext[key] = value !== null && typeof value === 'object' && !Array.isArray(value) ? deepMerge(base[key] ?? {}, value) : value;\n\t}\n\treturn next;\n}\n", "{\n \"name\": \"dsh-session-toolbox\",\n \"version\": \"0.1.6\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/AndroidSix/dsh-session-toolbox.git\"\n },\n \"description\": \"Draft vault, session-to-project move and a trash bin for DeepSeek Harness\",\n \"type\": \"module\",\n \"main\": \"lib/index.js\",\n \"bin\": {\n \"dsh-session-toolbox\": \"lib/cli.js\"\n },\n \"exports\": {\n \".\": \"./lib/index.js\",\n \"./host\": \"./lib/host.js\",\n \"./client\": \"./lib/client.js\",\n \"./cordis.patch.yml\": \"./cordis.patch.yml\",\n \"./package.json\": \"./package.json\"\n },\n \"engines\": {\n \"node\": \"^22.19.0 || >=24.0.0\",\n \"dsh\": \"^0.2.0-rc.2 || ^0.2.1-rc.2\"\n },\n \"files\": [\n \"lib\",\n \"cordis.patch.yml\",\n \"README.md\",\n \"LICENSE\",\n \"THIRD_PARTY_NOTICES.md\",\n \"session-toolbox.example.json\",\n \"CHANGELOG.md\"\n ],\n \"dsh\": {\n \"bundle\": {\n \"patch\": \"./cordis.patch.yml\"\n },\n \"client\": {\n \"inject\": [\n \"@deepseek-ai/dsh-client-ui-renderer\"\n ],\n \"platform\": \"web\"\n }\n },\n \"scripts\": {\n \"build\": \"node scripts/build.mjs\",\n \"test\": \"node --test tests/*.test.mjs\",\n \"check\": \"npm run build && npm test && node scripts/check-package.mjs\",\n \"check:tarball\": \"npm run build && node scripts/check-package.mjs --tarball\",\n \"pack:release\": \"npm run build && npm pack --ignore-scripts\"\n },\n \"peerDependencies\": {\n \"@deepseek-ai/cordis\": \"^4.0.4\",\n \"@deepseek-ai/dsh-atomic-write\": \"^0.2.0-rc.2 || ^0.2.1-rc.2\",\n \"@deepseek-ai/dsh-home-paths\": \"^0.2.0-rc.2 || ^0.2.1-rc.2\",\n \"@deepseek-ai/schemastery\": \"^3.18.4\",\n \"react\": \"^18.2.0\"\n },\n \"devDependencies\": {\n \"@deepseek-ai/cordis\": \"^4.0.4\",\n \"@deepseek-ai/dsh-atomic-write\": \"^0.2.0-rc.2 || ^0.2.1-rc.2\",\n \"@deepseek-ai/dsh-home-paths\": \"^0.2.0-rc.2 || ^0.2.1-rc.2\",\n \"@deepseek-ai/schemastery\": \"^3.18.4\",\n \"esbuild\": \"^0.25.0\",\n \"react\": \"^18.2.0\",\n \"react-dom\": \"^18.2.0\"\n },\n \"license\": \"MIT\",\n \"keywords\": [\n \"dsh-plugin\",\n \"deepseek-harness\",\n \"draft-vault\",\n \"session-move\",\n \"trash-bin\"\n ]\n}\n"],
5
- "mappings": "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",
6
- "names": []
4
+ "sourcesContent": ["/**\n * dsh-session-toolbox host plugin: draft vault manifest mirror (\u00A74 FR1), session\n * move (\u00A710) and trash bin (\u00A711) for DeepSeek Harness. Every official surface\n * is reached through `ctx.get(...)` service names probed at runtime; a missing\n * capability degrades that feature to a visible \"unavailable\" state \u2014 never a\n * crash, never a patch (NFR3 / \u00A710 MN1). The plugin declares no hard `inject`\n * dependencies so it can never block host boot.\n */\nimport { mkdir, realpath, stat } from 'node:fs/promises';\nimport { appendFileSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport z from '@deepseek-ai/schemastery';\nimport { resolveDshHome } from '@deepseek-ai/dsh-home-paths';\nimport { guardJournal, guardLedger, guardManifest, guardSettings, JsonDocument } from './store.mjs';\nimport { MoveEngine } from './move.mjs';\nimport { TrashEngine } from './trash.mjs';\nimport { apiHandler, dispatch } from './api.mjs';\nimport pkg from '../package.json' with { type: 'json' };\nconst pluginVersion = pkg.version;\n\nexport const name = 'dsh-session-toolbox';\nexport const inject = [];\n// schemastery has no `.optional()`; empty defaults mean \"unset\" (apply() treats '' as absent).\nexport const Config = z.object({\n\tconfigFile: z.string().description('Directory for session-toolbox data (defaults to <DSH_HOME>/session-toolbox)').default(''),\n\tdshHome: z.string().description('Override the DSH home whose sessions/ storage the tool manages (advanced)').default(''),\n});\n\nexport function defaultKitRoot() {\n\treturn join(resolveDshHome(), 'session-toolbox');\n}\n\nexport async function apply(ctx, options = {}) {\n\ttry {\n\t\treturn await applyInner(ctx, options);\n\t} catch (error) {\n\t\t// A failing third-party plugin must never take the whole app down.\n\t\t// Record the real stack so the failure is diagnosable, then degrade.\n\t\trecordStartupFailure(error);\n\t\tconst hint = /Cannot find package|ERR_MODULE_NOT_FOUND/.test(String(error?.message ?? error))\n\t\t\t? '\uFF08\u4F9D\u8D56\u7F3A\u5931\uFF1A\u8BF7\u4ECE\u63D2\u4EF6\u9875\u5378\u8F7D\u540E\u91CD\u65B0\u5B89\u88C5\uFF0C\u8BA9\u5305\u7BA1\u7406\u5668\u91CD\u65B0\u62C9\u53D6 peer \u4F9D\u8D56\uFF09'\n\t\t\t: '';\n\t\tctx.logger?.warn?.(`session-toolbox: disabled after startup error${hint} \u2014 ${error?.message ?? error}`);\n\t}\n}\n\n/** Absolute path of the startup-failure log, next to the plugin's other state. */\nfunction startupFailureLog() {\n\ttry {\n\t\treturn join(resolve(resolveDshHome()), 'session-toolbox', 'startup-error.log');\n\t} catch { return ''; }\n}\n\n/** Append a startup failure (with stack) so a failed activation stays diagnosable. */\nfunction recordStartupFailure(error) {\n\tconst file = startupFailureLog();\n\tif (file === '') return;\n\ttry {\n\t\tconst detail = `${new Date().toISOString()}\\n${error?.stack ?? String(error)}\\n\\n`;\n\t\tappendFileSync(file, detail, { mode: 0o600 });\n\t} catch { /* diagnostics must never throw */ }\n}\n\nasync function applyInner(ctx, options = {}) {\n\tconst dshHome = resolve(options.dshHome || resolveDshHome());\n\tconst root = resolve(options.configFile || join(dshHome, 'session-toolbox'));\n\tawait mkdir(root, { recursive: true, mode: 0o700 });\n\tconst capabilities = {\n\t\tworkspaceRegistry: ctx.get('workspaceRegistry') !== undefined,\n\t\tsessions: ctx.get('sessions') !== undefined,\n\t\tsessionPersistence: ctx.get('sessionPersistence') !== undefined,\n\t\twebServer: false, // flips true when the optional webServer inject fires\n\t};\n\tconst settingsDoc = new JsonDocument(root, 'session-toolbox.json', { version: 1 }, guardSettings);\n\tconst journalDoc = new JsonDocument(root, 'journal.json', { version: 1, active: null }, guardJournal);\n\tconst ledgerDoc = new JsonDocument(root, 'trash.json', { version: 1, items: [] }, guardLedger);\n\tconst manifestDoc = new JsonDocument(root, 'vault-manifest.json', { version: 1, records: [] }, guardManifest);\n\n\tlet settingsCache = await settingsDoc.read().catch(() => ({ trash: {}, draftVault: {} }));\n\tlet journalCache = null;\n\ttry { journalCache = (await journalDoc.read()).active; }\n\tcatch (error) { ctx.logger?.warn?.(`session-toolbox: journal unreadable \u2014 ${error.message}`); }\n\tif (journalCache !== null) ctx.logger?.warn?.(`session-toolbox: unresolved move journal for ${journalCache.sessionId}; complete or roll it back from the panel or CLI`);\n\n\tconst move = new MoveEngine({\n\t\troot,\n\t\tsessionsRoot: join(dshHome, 'sessions'),\n\t\tprojcacheRoot: join(dshHome, 'storages', 'session_projcache', 'sessions'),\n\t\tjournal: journalDoc,\n\t\tcapabilities: hostCapabilities(ctx),\n\t});\n\tconst trash = new TrashEngine({\n\t\tadapter: registryAdapter(ctx),\n\t\tsessions: () => (ctx.get('sessions')?.list() ?? []).map(session => session.header?.id).filter(id => typeof id === 'string'),\n\t\tsessionsRoot: join(dshHome, 'sessions'),\n\t\tprojcacheRoot: join(dshHome, 'storages', 'session_projcache', 'sessions'),\n\t\tkitRoot: root,\n\t\tledger: ledgerDoc,\n\t\tvault: { dropSession: sessionId => manifestDoc.update(current => ({ ...current, records: current.records.filter(record => record.sessionId !== sessionId) })) },\n\t\tjournal: () => journalCache,\n\t\tsettings: () => settingsCache.trash ?? {},\n\t});\n\n\t/** All known projects (id/path/title/session count) for the move picker. */\n\tconst listProjects = ctx => {\n\t\tconst registry = ctx.get('workspaceRegistry');\n\t\tif (registry === undefined) return [];\n\t\treturn registry.list().map(row => ({\n\t\t\tid: row.id,\n\t\t\tpath: row.path,\n\t\t\ttitle: row.title ?? row.path,\n\t\t\tsessions: (row.sessionIds ?? []).length,\n\t\t})).sort((a, b) => a.title.localeCompare(b.title));\n\t};\n\n\tconst kit = {\n\t\tsettings: settingsDoc,\n\t\tmanifest: manifestDoc,\n\t\tjournal: journalDoc,\n\t\tmove,\n\t\ttrash,\n\t\tupdateSettings: async patch => {\n\t\t\tconst next = await settingsDoc.update(current => deepMerge(current, patch));\n\t\t\tsettingsCache = next;\n\t\t\treturn next;\n\t\t},\n\t\tvaultSync: async records => {\n\t\t\tconst manifest = await manifestDoc.update(() => ({\n\t\t\t\tversion: 1,\n\t\t\t\trecords: (Array.isArray(records) ? records : []).filter(record => typeof record.sessionId === 'string' && typeof record.attachmentId === 'string')\n\t\t\t\t\t.slice(-2000)\n\t\t\t\t\t.map(record => ({ sessionId: record.sessionId, attachmentId: record.attachmentId,\n\t\t\t\t\t\tname: String(record.name ?? ''), size: Number(record.size) || 0, hash: String(record.hash ?? ''),\n\t\t\t\t\t\tcreatedAt: Number(record.createdAt) || Date.now() })),\n\t\t\t}));\n\t\t\treturn manifest;\n\t\t},\n\t\tstate: async () => {\n\t\t\tconst settings = await settingsDoc.read();\n\t\t\tsettingsCache = settings;\n\t\t\tconst journal = (await journalDoc.read().catch(() => ({ active: journalCache }))).active;\n\t\t\tjournalCache = journal;\n\t\t\tconst manifest = await manifestDoc.read();\n\t\t\treturn {\n\t\t\t\tpluginVersion,\n\t\t\t\tcapabilities,\n\t\t\t\tsettings,\n\t\t\t\tjournal,\n\t\t\t\tprojects: listProjects(ctx),\n\t\t\t\ttrash: await trash.items(),\n\t\t\t\t// Bytes live in browser IndexedDB; the manifest mirrors their metadata only.\n\t\t\t\tvault: { records: manifest.records.length, bytes: manifest.records.reduce((total, record) => total + (record.size ?? 0), 0) },\n\t\t\t\trecovery: journal === null ? null : `\u672A\u5B8C\u6210\u8FC1\u79FB\uFF1A${journal.sessionId} \u2192 ${journal.toCwd}\uFF08\u5DF2\u5B8C\u6210 ${journal.done.join('/') || '\u65E0'}\uFF09`,\n\t\t\t};\n\t\t},\n\t\t/** The project a session currently belongs to (null when unknown). */\n\t\tprojectOf: async sessionId => {\n\t\t\tif (sessionId === '') return null;\n\t\t\tconst registry = ctx.get('workspaceRegistry');\n\t\t\tif (registry === undefined) return null;\n\t\t\tfor (const row of registry.list()) {\n\t\t\t\tif ((row.sessionIds ?? []).includes(sessionId)) {\n\t\t\t\t\treturn { id: row.id, path: row.path, title: row.title ?? row.path };\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\taction: input => dispatch(kit, input),\n\t};\n\n\tctx.inject?.(['webServer'], webCtx => {\n\t\tcapabilities.webServer = true;\n\t\twebCtx.effect(() => webCtx.webServer.register({ kind: 'exact', path: '/.well-known/dsh-session-toolbox', handler: apiHandler(kit) }));\n\t});\n\n\t// Expose the kit in-process (cordis plugins must return nothing; the service\n\t// is the surface other plugins or future official hooks can reach).\n\tctx.provide('sessionToolbox', kit);\n\n\tctx.effect(() => () => {});\n\tctx.logger?.info?.('dsh-session-toolbox ready', JSON.stringify({ version: pluginVersion, capabilities }));\n}\n\n/**\n * Host capabilities for the move engine (\u00A710 MR5). Services are fetched lazily\n * through `ctx.get`; a missing one raises a stable error the UI can show.\n */\nexport function hostCapabilities(ctx) {\n\treturn {\n\t\tsessionLive: sessionId => {\n\t\t\tconst sessions = ctx.get('sessions');\n\t\t\treturn sessions ? sessions.list().some(session => session.header?.id === sessionId) : false;\n\t\t},\n\t\tlistHeaders: async () => {\n\t\t\tconst persistence = ctx.get('sessionPersistence');\n\t\t\tif (persistence?.list !== undefined) return (await persistence.list()).map(snapshot => snapshot.header);\n\t\t\tconst registry = ctx.get('workspaceRegistry');\n\t\t\tif (registry?.listStoredHeaders !== undefined) return await registry.listStoredHeaders();\n\t\t\tthrow new Error('no session-persistence service in this DSH build');\n\t\t},\n\t\t/** Drop stale header entries so `attachSession` validates the NEW on-disk cwd (\u00A710 MR4). */\n\t\trefreshHeaderCache: async () => {\n\t\t\tconst registry = ctx.get('workspaceRegistry');\n\t\t\tif (typeof registry?.replaceHeaderIndex !== 'function') return;\n\t\t\tawait registry.replaceHeaderIndex(await registry.listStoredHeaders());\n\t\t},\n\t\t/** Ledger step (\u00A710 MR2 step 2): source detach \u2192 target create \u2192 attach. */\n\t\tmoveLedger: async (sessionId, fromCwd, toCwd) => {\n\t\t\tconst registry = ctx.get('workspaceRegistry');\n\t\t\tif (registry === undefined) throw new Error('workspaceRegistry unavailable in this DSH build');\n\t\t\tconst canonicalFrom = fromCwd === undefined ? undefined : await realpath(fromCwd).catch(() => fromCwd);\n\t\t\tconst source = canonicalFrom === undefined ? undefined : await registry.resolveByPath(canonicalFrom);\n\t\t\tif (source !== undefined) await source.detachSession(sessionId);\n\t\t\tlet target = await registry.resolveByPath(toCwd);\n\t\t\tif (target === undefined) {\n\t\t\t\tif (!(await stat(toCwd).then(s => s.isDirectory(), () => false))) throw new Error(`target directory ${toCwd} does not exist`);\n\t\t\t\ttarget = await registry.create(toCwd);\n\t\t\t}\n\t\t\tawait target.attachSession(sessionId);\n\t\t},\n\t\tresyncIndex: async () => {\n\t\t\t// \u00A710.8-3: the sqlite query index reconciles against persistence lazily on\n\t\t\t// every query path; there is nothing explicit to call in this build.\n\t\t\treturn ctx.get('sessionQuery') !== undefined ? 'lazy' : 'unavailable';\n\t\t},\n\t};\n}\n\n/**\n * The narrow adapter the trash engine runs every official effect through\n * (\u00A711 TB5). Workspace deletion keeps session logs (\u00A711.1-2); bootstrap only\n * re-claims non-archived unaccounted sessions \u2014 which is why trashing a project\n * archives its sessions first, and restoring re-registers + attaches +\n * unarchives in order.\n */\nexport function registryAdapter(ctx) {\n\tconst registry = () => {\n\t\tconst value = ctx.get('workspaceRegistry');\n\t\tif (value === undefined) throw Object.assign(new Error('workspaceRegistry unavailable'), { code: 'no-capability' });\n\t\treturn value;\n\t};\n\treturn {\n\t\tsessionKnown: async sessionId => {\n\t\t\tconst rows = registry();\n\t\t\treturn typeof rows.sessionKnown === 'function' ? await rows.sessionKnown(sessionId) : false;\n\t\t},\n\t\tarchivedSet: async () => new Set(registry().archivedSessionIds ?? []),\n\t\tpinnedSet: async () => new Set(registry().pinnedSessionIds ?? []),\n\t\tlocateSession: async sessionId => {\n\t\t\tfor (const entity of registry().list()) {\n\t\t\t\tconst ids = entity.sessionIds ?? [];\n\t\t\t\tif (!ids.includes(sessionId)) continue;\n\t\t\t\tconst at = ids.indexOf(sessionId);\n\t\t\t\treturn { workspaceId: entity.id, beforeId: at + 1 < ids.length ? ids[at + 1] : null, title: null };\n\t\t\t}\n\t\t\treturn { workspaceId: null, beforeId: null, title: null };\n\t\t},\n\t\tworkspaceSnapshot: async workspaceId => {\n\t\t\tconst rows = registry();\n\t\t\tconst entity = rows.get(workspaceId);\n\t\t\tif (entity === undefined) return undefined;\n\t\t\tconst ids = entity.sessionIds ?? [];\n\t\t\tconst archived = new Set(rows.archivedSessionIds ?? []);\n\t\t\tconst pinned = new Set(rows.pinnedSessionIds ?? []);\n\t\t\tconst order = rows.list().map(row => row.id);\n\t\t\tconst at = order.indexOf(entity.id);\n\t\t\treturn {\n\t\t\t\tworkspaceId: entity.id, path: entity.path, title: entity.title,\n\t\t\t\tbeforeId: at > 0 ? order[at - 1] : null,\n\t\t\t\tsessions: ids.map((sessionId, index) => ({ sessionId,\n\t\t\t\t\tpreviouslyArchived: archived.has(sessionId),\n\t\t\t\t\tpreviouslyPinned: pinned.has(sessionId),\n\t\t\t\t\tbeforeId: index + 1 < ids.length ? ids[index + 1] : null })),\n\t\t\t};\n\t\t},\n\t\tarchiveSession: (sessionId, options) => registry().archiveSession(sessionId, options),\n\t\tunarchiveSession: sessionId => registry().unarchiveSession(sessionId),\n\t\tpinSession: sessionId => registry().pinSession(sessionId),\n\t\tunpinSession: sessionId => registry().unpinSession(sessionId),\n\t\tdeleteWorkspace: workspaceId => registry().delete(workspaceId),\n\t\trepairSlot: async (sessionId, workspaceId, beforeId) => {\n\t\t\tconst entity = registry().get(workspaceId);\n\t\t\tif (entity === undefined) return;\n\t\t\tif (!entity.sessionIds?.includes(sessionId)) await entity.attachSession(sessionId);\n\t\t\tif (beforeId !== null && entity.sessionIds?.includes(beforeId)) await entity.insertSessionBefore(sessionId, beforeId);\n\t\t},\n\t\trestoreWorkspace: async snapshot => {\n\t\t\tconst rows = registry();\n\t\t\tlet entity = rows.list().find(row => row.path === snapshot.path);\n\t\t\tif (entity === undefined) {\n\t\t\t\tawait mkdir(snapshot.path, { recursive: true }).catch(() => {});\n\t\t\t\tentity = await rows.create(snapshot.path, snapshot.title);\n\t\t\t}\n\t\t\tfor (const row of [...snapshot.sessions].reverse()) await entity.attachSession(row.sessionId).catch(() => {});\n\t\t\tif (snapshot.beforeId !== null && entity.id !== snapshot.beforeId) await rows.insertBefore(entity.id, snapshot.beforeId).catch(() => {});\n\t\t\treturn entity;\n\t\t},\n\t\tpurgeSession: async () => ctx.get('sessionPersistence')?.delete === undefined ? 'unavailable' : 'present',\n\t};\n}\n\nfunction deepMerge(base, patch) {\n\tconst next = { ...base };\n\tfor (const [key, value] of Object.entries(patch ?? {})) {\n\t\tnext[key] = value !== null && typeof value === 'object' && !Array.isArray(value) ? deepMerge(base[key] ?? {}, value) : value;\n\t}\n\treturn next;\n}\n", "{\n \"name\": \"dsh-session-toolbox\",\n \"version\": \"0.1.8\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/AndroidSix/dsh-session-toolbox.git\"\n },\n \"description\": \"Draft vault, session-to-project move and a trash bin for DeepSeek Harness\",\n \"type\": \"module\",\n \"main\": \"lib/index.js\",\n \"bin\": {\n \"dsh-session-toolbox\": \"lib/cli.js\"\n },\n \"exports\": {\n \".\": \"./lib/index.js\",\n \"./host\": \"./lib/host.js\",\n \"./client\": \"./lib/client.js\",\n \"./cordis.patch.yml\": \"./cordis.patch.yml\",\n \"./package.json\": \"./package.json\"\n },\n \"engines\": {\n \"node\": \"^22.19.0 || >=24.0.0\",\n \"dsh\": \"^0.2.0-rc.2 || ^0.2.1-rc.2\"\n },\n \"files\": [\n \"lib\",\n \"cordis.patch.yml\",\n \"README.md\",\n \"LICENSE\",\n \"THIRD_PARTY_NOTICES.md\",\n \"session-toolbox.example.json\",\n \"CHANGELOG.md\"\n ],\n \"dsh\": {\n \"bundle\": {\n \"patch\": \"./cordis.patch.yml\"\n },\n \"client\": {\n \"inject\": [\n \"@deepseek-ai/dsh-client-ui-renderer\"\n ],\n \"platform\": \"web\"\n }\n },\n \"scripts\": {\n \"build\": \"node scripts/build.mjs\",\n \"test\": \"node --test tests/*.test.mjs\",\n \"check\": \"npm run build && npm test && node scripts/check-package.mjs\",\n \"check:tarball\": \"npm run build && node scripts/check-package.mjs --tarball\",\n \"pack:release\": \"npm run build && npm pack --ignore-scripts\"\n },\n \"peerDependencies\": {\n \"@deepseek-ai/cordis\": \"^4.0.4\",\n \"@deepseek-ai/dsh-atomic-write\": \"^0.2.0-rc.2 || ^0.2.1-rc.2\",\n \"@deepseek-ai/dsh-home-paths\": \"^0.2.0-rc.2 || ^0.2.1-rc.2\",\n \"@deepseek-ai/schemastery\": \"^3.18.4\",\n \"react\": \"^18.2.0\"\n },\n \"devDependencies\": {\n \"@deepseek-ai/cordis\": \"^4.0.4\",\n \"@deepseek-ai/dsh-atomic-write\": \"^0.2.0-rc.2 || ^0.2.1-rc.2\",\n \"@deepseek-ai/dsh-home-paths\": \"^0.2.0-rc.2 || ^0.2.1-rc.2\",\n \"@deepseek-ai/schemastery\": \"^3.18.4\",\n \"esbuild\": \"^0.25.0\",\n \"react\": \"^18.2.0\",\n \"react-dom\": \"^18.2.0\"\n },\n \"license\": \"MIT\",\n \"keywords\": [\n \"dsh-plugin\",\n \"deepseek-harness\",\n \"draft-vault\",\n \"session-move\",\n \"trash-bin\"\n ]\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["ctx"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-session-toolbox",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/AndroidSix/dsh-session-toolbox.git"