@ai-studio-3d/vyasa 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +69 -0
- package/data/common-kit.json +34 -0
- package/data/pricing.json +119 -0
- package/data/schema/AnalyticsData.json +214 -0
- package/data/schema/FoundationData.json +42 -0
- package/data/schema/KitData.json +321 -0
- package/data/schema/SearchData.json +173 -0
- package/data/schema/SessionDetailData.json +231 -0
- package/data/schema/SessionsListData.json +115 -0
- package/data/schema/WasteData.json +95 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +343 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/billing/index.d.ts +4 -0
- package/dist/core/billing/index.d.ts.map +1 -0
- package/dist/core/billing/index.js +43 -0
- package/dist/core/billing/index.js.map +1 -0
- package/dist/core/budget/index.d.ts +30 -0
- package/dist/core/budget/index.d.ts.map +1 -0
- package/dist/core/budget/index.js +61 -0
- package/dist/core/budget/index.js.map +1 -0
- package/dist/core/codex/index.d.ts +3 -0
- package/dist/core/codex/index.d.ts.map +1 -0
- package/dist/core/codex/index.js +212 -0
- package/dist/core/codex/index.js.map +1 -0
- package/dist/core/cursor/index.d.ts +3 -0
- package/dist/core/cursor/index.d.ts.map +1 -0
- package/dist/core/cursor/index.js +304 -0
- package/dist/core/cursor/index.js.map +1 -0
- package/dist/core/cursor/scan.d.ts +28 -0
- package/dist/core/cursor/scan.d.ts.map +1 -0
- package/dist/core/cursor/scan.js +79 -0
- package/dist/core/cursor/scan.js.map +1 -0
- package/dist/core/decisions/index.d.ts +21 -0
- package/dist/core/decisions/index.d.ts.map +1 -0
- package/dist/core/decisions/index.js +133 -0
- package/dist/core/decisions/index.js.map +1 -0
- package/dist/core/dlp/index.d.ts +7 -0
- package/dist/core/dlp/index.d.ts.map +1 -0
- package/dist/core/dlp/index.js +115 -0
- package/dist/core/dlp/index.js.map +1 -0
- package/dist/core/health/index.d.ts +10 -0
- package/dist/core/health/index.d.ts.map +1 -0
- package/dist/core/health/index.js +21 -0
- package/dist/core/health/index.js.map +1 -0
- package/dist/core/index/index.d.ts +9 -0
- package/dist/core/index/index.d.ts.map +1 -0
- package/dist/core/index/index.js +103 -0
- package/dist/core/index/index.js.map +1 -0
- package/dist/core/index/ingest.d.ts +16 -0
- package/dist/core/index/ingest.d.ts.map +1 -0
- package/dist/core/index/ingest.js +184 -0
- package/dist/core/index/ingest.js.map +1 -0
- package/dist/core/index/platforms.d.ts +21 -0
- package/dist/core/index/platforms.d.ts.map +1 -0
- package/dist/core/index/platforms.js +44 -0
- package/dist/core/index/platforms.js.map +1 -0
- package/dist/core/index/pricing-map.d.ts +10 -0
- package/dist/core/index/pricing-map.d.ts.map +1 -0
- package/dist/core/index/pricing-map.js +16 -0
- package/dist/core/index/pricing-map.js.map +1 -0
- package/dist/core/index/progress.d.ts +26 -0
- package/dist/core/index/progress.d.ts.map +1 -0
- package/dist/core/index/progress.js +59 -0
- package/dist/core/index/progress.js.map +1 -0
- package/dist/core/index/scan.d.ts +9 -0
- package/dist/core/index/scan.d.ts.map +1 -0
- package/dist/core/index/scan.js +42 -0
- package/dist/core/index/scan.js.map +1 -0
- package/dist/core/index/statements.d.ts +18 -0
- package/dist/core/index/statements.d.ts.map +1 -0
- package/dist/core/index/statements.js +82 -0
- package/dist/core/index/statements.js.map +1 -0
- package/dist/core/index/tail.d.ts +42 -0
- package/dist/core/index/tail.d.ts.map +1 -0
- package/dist/core/index/tail.js +123 -0
- package/dist/core/index/tail.js.map +1 -0
- package/dist/core/jsonl/index.d.ts +3 -0
- package/dist/core/jsonl/index.d.ts.map +1 -0
- package/dist/core/jsonl/index.js +106 -0
- package/dist/core/jsonl/index.js.map +1 -0
- package/dist/core/jsonl-validate/index.d.ts +10 -0
- package/dist/core/jsonl-validate/index.d.ts.map +1 -0
- package/dist/core/jsonl-validate/index.js +40 -0
- package/dist/core/jsonl-validate/index.js.map +1 -0
- package/dist/core/kit/detection.d.ts +94 -0
- package/dist/core/kit/detection.d.ts.map +1 -0
- package/dist/core/kit/detection.js +312 -0
- package/dist/core/kit/detection.js.map +1 -0
- package/dist/core/kit/index.d.ts +12 -0
- package/dist/core/kit/index.d.ts.map +1 -0
- package/dist/core/kit/index.js +131 -0
- package/dist/core/kit/index.js.map +1 -0
- package/dist/core/kit/scan.d.ts +28 -0
- package/dist/core/kit/scan.d.ts.map +1 -0
- package/dist/core/kit/scan.js +432 -0
- package/dist/core/kit/scan.js.map +1 -0
- package/dist/core/recap/index.d.ts +18 -0
- package/dist/core/recap/index.d.ts.map +1 -0
- package/dist/core/recap/index.js +88 -0
- package/dist/core/recap/index.js.map +1 -0
- package/dist/core/repetition/index.d.ts +5 -0
- package/dist/core/repetition/index.d.ts.map +1 -0
- package/dist/core/repetition/index.js +0 -0
- package/dist/core/repetition/index.js.map +1 -0
- package/dist/core/schema/index.d.ts +514 -0
- package/dist/core/schema/index.d.ts.map +1 -0
- package/dist/core/schema/index.js +2 -0
- package/dist/core/schema/index.js.map +1 -0
- package/dist/core/schema-watch/index.d.ts +34 -0
- package/dist/core/schema-watch/index.d.ts.map +1 -0
- package/dist/core/schema-watch/index.js +87 -0
- package/dist/core/schema-watch/index.js.map +1 -0
- package/dist/core/search/index.d.ts +44 -0
- package/dist/core/search/index.d.ts.map +1 -0
- package/dist/core/search/index.js +641 -0
- package/dist/core/search/index.js.map +1 -0
- package/dist/core/settings/index.d.ts +24 -0
- package/dist/core/settings/index.d.ts.map +1 -0
- package/dist/core/settings/index.js +76 -0
- package/dist/core/settings/index.js.map +1 -0
- package/dist/core/share/bundle.d.ts +40 -0
- package/dist/core/share/bundle.d.ts.map +1 -0
- package/dist/core/share/bundle.js +158 -0
- package/dist/core/share/bundle.js.map +1 -0
- package/dist/core/share/canonical/from-claude.d.ts +13 -0
- package/dist/core/share/canonical/from-claude.d.ts.map +1 -0
- package/dist/core/share/canonical/from-claude.js +129 -0
- package/dist/core/share/canonical/from-claude.js.map +1 -0
- package/dist/core/share/canonical/from-codex.d.ts +18 -0
- package/dist/core/share/canonical/from-codex.d.ts.map +1 -0
- package/dist/core/share/canonical/from-codex.js +183 -0
- package/dist/core/share/canonical/from-codex.js.map +1 -0
- package/dist/core/share/canonical/to-claude.d.ts +15 -0
- package/dist/core/share/canonical/to-claude.d.ts.map +1 -0
- package/dist/core/share/canonical/to-claude.js +146 -0
- package/dist/core/share/canonical/to-claude.js.map +1 -0
- package/dist/core/share/canonical/to-codex.d.ts +21 -0
- package/dist/core/share/canonical/to-codex.d.ts.map +1 -0
- package/dist/core/share/canonical/to-codex.js +124 -0
- package/dist/core/share/canonical/to-codex.js.map +1 -0
- package/dist/core/share/canonical/tool-map.d.ts +61 -0
- package/dist/core/share/canonical/tool-map.d.ts.map +1 -0
- package/dist/core/share/canonical/tool-map.js +299 -0
- package/dist/core/share/canonical/tool-map.js.map +1 -0
- package/dist/core/share/canonical/types.d.ts +57 -0
- package/dist/core/share/canonical/types.d.ts.map +1 -0
- package/dist/core/share/canonical/types.js +9 -0
- package/dist/core/share/canonical/types.js.map +1 -0
- package/dist/core/share/import.d.ts +28 -0
- package/dist/core/share/import.d.ts.map +1 -0
- package/dist/core/share/import.js +174 -0
- package/dist/core/share/import.js.map +1 -0
- package/dist/core/share/manifest.d.ts +37 -0
- package/dist/core/share/manifest.d.ts.map +1 -0
- package/dist/core/share/manifest.js +31 -0
- package/dist/core/share/manifest.js.map +1 -0
- package/dist/core/share/preview.d.ts +4 -0
- package/dist/core/share/preview.d.ts.map +1 -0
- package/dist/core/share/preview.js +153 -0
- package/dist/core/share/preview.js.map +1 -0
- package/dist/core/share/primer.d.ts +19 -0
- package/dist/core/share/primer.d.ts.map +1 -0
- package/dist/core/share/primer.js +196 -0
- package/dist/core/share/primer.js.map +1 -0
- package/dist/core/share/resume.d.ts +10 -0
- package/dist/core/share/resume.d.ts.map +1 -0
- package/dist/core/share/resume.js +58 -0
- package/dist/core/share/resume.js.map +1 -0
- package/dist/core/share/scrub.d.ts +10 -0
- package/dist/core/share/scrub.d.ts.map +1 -0
- package/dist/core/share/scrub.js +198 -0
- package/dist/core/share/scrub.js.map +1 -0
- package/dist/core/share/tar.d.ts +12 -0
- package/dist/core/share/tar.d.ts.map +1 -0
- package/dist/core/share/tar.js +78 -0
- package/dist/core/share/tar.js.map +1 -0
- package/dist/core/tags/index.d.ts +48 -0
- package/dist/core/tags/index.d.ts.map +1 -0
- package/dist/core/tags/index.js +113 -0
- package/dist/core/tags/index.js.map +1 -0
- package/dist/core/today/index.d.ts +25 -0
- package/dist/core/today/index.d.ts.map +1 -0
- package/dist/core/today/index.js +42 -0
- package/dist/core/today/index.js.map +1 -0
- package/dist/core/waste/abandoned.d.ts +12 -0
- package/dist/core/waste/abandoned.d.ts.map +1 -0
- package/dist/core/waste/abandoned.js +127 -0
- package/dist/core/waste/abandoned.js.map +1 -0
- package/dist/core/waste/cache-miss.d.ts +9 -0
- package/dist/core/waste/cache-miss.d.ts.map +1 -0
- package/dist/core/waste/cache-miss.js +84 -0
- package/dist/core/waste/cache-miss.js.map +1 -0
- package/dist/core/waste/index.d.ts +12 -0
- package/dist/core/waste/index.d.ts.map +1 -0
- package/dist/core/waste/index.js +45 -0
- package/dist/core/waste/index.js.map +1 -0
- package/dist/core/waste/wrong-model.d.ts +11 -0
- package/dist/core/waste/wrong-model.d.ts.map +1 -0
- package/dist/core/waste/wrong-model.js +104 -0
- package/dist/core/waste/wrong-model.js.map +1 -0
- package/dist/db/index.d.ts +10 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +29 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/migrate.d.ts +8 -0
- package/dist/db/migrate.d.ts.map +1 -0
- package/dist/db/migrate.js +282 -0
- package/dist/db/migrate.js.map +1 -0
- package/dist/server/events.d.ts +4 -0
- package/dist/server/events.d.ts.map +1 -0
- package/dist/server/events.js +54 -0
- package/dist/server/events.js.map +1 -0
- package/dist/server/index.d.ts +7 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +238 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/routes/foundation.d.ts +2 -0
- package/dist/server/routes/foundation.d.ts.map +1 -0
- package/dist/server/routes/foundation.js +2 -0
- package/dist/server/routes/foundation.js.map +1 -0
- package/dist/server/routes/search.d.ts +2 -0
- package/dist/server/routes/search.d.ts.map +1 -0
- package/dist/server/routes/search.js +2 -0
- package/dist/server/routes/search.js.map +1 -0
- package/dist/server/routes/sessions.d.ts +2 -0
- package/dist/server/routes/sessions.d.ts.map +1 -0
- package/dist/server/routes/sessions.js +2 -0
- package/dist/server/routes/sessions.js.map +1 -0
- package/dist/server/routes/waste.d.ts +2 -0
- package/dist/server/routes/waste.d.ts.map +1 -0
- package/dist/server/routes/waste.js +2 -0
- package/dist/server/routes/waste.js.map +1 -0
- package/dist/web/assets/index-Ba1VvTj0.js +37 -0
- package/dist/web/index.html +12 -0
- package/package.json +76 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export const MANIFEST_SCHEMA_VERSION = 1;
|
|
2
|
+
export class ManifestError extends Error {
|
|
3
|
+
constructor(msg) {
|
|
4
|
+
super(msg);
|
|
5
|
+
this.name = 'ManifestError';
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
export function validateManifest(raw) {
|
|
9
|
+
if (typeof raw !== 'object' || raw === null) {
|
|
10
|
+
throw new ManifestError('manifest must be a JSON object');
|
|
11
|
+
}
|
|
12
|
+
const m = raw;
|
|
13
|
+
if (m.schema !== 1) {
|
|
14
|
+
throw new ManifestError(`unsupported manifest schema: ${String(m.schema)} (this version supports schema=1)`);
|
|
15
|
+
}
|
|
16
|
+
if (m.platform !== 'claude-code' && m.platform !== 'codex' && m.platform !== 'cursor') {
|
|
17
|
+
throw new ManifestError(`unknown platform: ${String(m.platform)}`);
|
|
18
|
+
}
|
|
19
|
+
for (const field of ['sessionId', 'project', 'projectDir', 'originalPath', 'exportedAt', 'exportedBy']) {
|
|
20
|
+
if (typeof m[field] !== 'string') {
|
|
21
|
+
throw new ManifestError(`manifest field "${field}" must be a string`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
for (const field of ['originalMtimeMs', 'jsonlSizeBytes']) {
|
|
25
|
+
if (typeof m[field] !== 'number' || !Number.isFinite(m[field])) {
|
|
26
|
+
throw new ManifestError(`manifest field "${field}" must be a finite number`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return m;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/core/share/manifest.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAA;AA6BxC,MAAM,OAAO,aAAc,SAAQ,KAAK;IACtC,YAAY,GAAW;QACrB,KAAK,CAAC,GAAG,CAAC,CAAA;QACV,IAAI,CAAC,IAAI,GAAG,eAAe,CAAA;IAC7B,CAAC;CACF;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC3C,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC5C,MAAM,IAAI,aAAa,CAAC,gCAAgC,CAAC,CAAA;IAC3D,CAAC;IACD,MAAM,CAAC,GAAG,GAA8B,CAAA;IACxC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,aAAa,CAAC,gCAAgC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,mCAAmC,CAAC,CAAA;IAC9G,CAAC;IACD,IAAI,CAAC,CAAC,QAAQ,KAAK,aAAa,IAAI,CAAC,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACtF,MAAM,IAAI,aAAa,CAAC,qBAAqB,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IACpE,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,CAAU,EAAE,CAAC;QAChH,IAAI,OAAO,CAAC,CAAC,KAAK,CAAC,KAAK,QAAQ,EAAE,CAAC;YACjC,MAAM,IAAI,aAAa,CAAC,mBAAmB,KAAK,oBAAoB,CAAC,CAAA;QACvE,CAAC;IACH,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,CAAC,iBAAiB,EAAE,gBAAgB,CAAU,EAAE,CAAC;QACnE,IAAI,OAAO,CAAC,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAW,CAAC,EAAE,CAAC;YACzE,MAAM,IAAI,aAAa,CAAC,mBAAmB,KAAK,2BAA2B,CAAC,CAAA;QAC9E,CAAC;IACH,CAAC;IACD,OAAO,CAAwB,CAAA;AACjC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../../../src/core/share/preview.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAA;AAErC,OAAO,KAAK,EAAE,YAAY,EAAgB,MAAM,oBAAoB,CAAA;AAwBpE,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,YAAY,CA+BxF"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
2
|
+
import { loadSessionSource, extractPlanRef } from './bundle.js';
|
|
3
|
+
import { scrubClaudeJsonl } from './scrub.js';
|
|
4
|
+
/**
|
|
5
|
+
* Build a pre-share preview: scrub the session, then surface what REMAINS that the
|
|
6
|
+
* user should review before sharing — sensitive-path tool-result dumps, large
|
|
7
|
+
* outputs, secret/PII patterns, and the bundled plan file. The scrubber removes the
|
|
8
|
+
* involuntary leak; this catches the conversational residue a machine can't safely
|
|
9
|
+
* strip on its own.
|
|
10
|
+
*/
|
|
11
|
+
// Paths whose contents are almost certainly private config/memory/secrets.
|
|
12
|
+
const SENSITIVE_PATH_RE = /(\/\.claude\/|\/\.codex\/|CLAUDE\.md$|\/memory\/|\.env$|settings.*\.json$|\/\.git\/config$)/;
|
|
13
|
+
const TOOL_DUMP_BYTES = 4096;
|
|
14
|
+
const SECRET_PATTERNS = [
|
|
15
|
+
{ re: /sk-[A-Za-z0-9]{16,}/, kind: 'secret', reason: 'possible API key (sk-…)' },
|
|
16
|
+
{ re: /gh[pousr]_[A-Za-z0-9]{16,}/, kind: 'secret', reason: 'possible GitHub token' },
|
|
17
|
+
{ re: /AKIA[0-9A-Z]{16}/, kind: 'secret', reason: 'possible AWS access key' },
|
|
18
|
+
{ re: /eyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}/, kind: 'secret', reason: 'possible JWT' },
|
|
19
|
+
{ re: /[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}/, kind: 'pii', reason: 'email address' },
|
|
20
|
+
];
|
|
21
|
+
export function buildSharePreview(db, sessionId) {
|
|
22
|
+
const { row, jsonlData } = loadSessionSource(db, sessionId);
|
|
23
|
+
// V1 scrubbing is claude-code only; warn the caller to review Codex manually.
|
|
24
|
+
if (row.platform !== 'claude-code') {
|
|
25
|
+
return { platform: row.platform, scrubReport: null, residualFlags: [], canScrub: false };
|
|
26
|
+
}
|
|
27
|
+
const raw = jsonlData.toString('utf8');
|
|
28
|
+
const { cleaned, report } = scrubClaudeJsonl(raw);
|
|
29
|
+
const flags = scanResiduals(cleaned);
|
|
30
|
+
// The plan file rides along by default — flag it for review (can hold strategy).
|
|
31
|
+
const planRef = extractPlanRef(raw);
|
|
32
|
+
if (planRef && existsSync(planRef.path)) {
|
|
33
|
+
try {
|
|
34
|
+
const planText = readFileSync(planRef.path, 'utf8');
|
|
35
|
+
flags.push({
|
|
36
|
+
uuid: '',
|
|
37
|
+
kind: 'plan_file',
|
|
38
|
+
reason: `plan file ${planRef.slug}.md will be bundled (can contain strategy)`,
|
|
39
|
+
snippet: planText.slice(0, 200),
|
|
40
|
+
sizeBytes: Buffer.byteLength(planText, 'utf8'),
|
|
41
|
+
defaultExclude: false,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// unreadable plan file — nothing to flag
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return { platform: 'claude-code', scrubReport: report, residualFlags: flags, canScrub: true };
|
|
49
|
+
}
|
|
50
|
+
function extractPath(input) {
|
|
51
|
+
if (!input || typeof input !== 'object')
|
|
52
|
+
return null;
|
|
53
|
+
const o = input;
|
|
54
|
+
if (typeof o['file_path'] === 'string')
|
|
55
|
+
return o['file_path'];
|
|
56
|
+
if (typeof o['path'] === 'string')
|
|
57
|
+
return o['path'];
|
|
58
|
+
if (typeof o['command'] === 'string') {
|
|
59
|
+
const m = o['command'].match(/(?:cat|less|head|tail)\s+(\S+)/);
|
|
60
|
+
if (m)
|
|
61
|
+
return m[1];
|
|
62
|
+
}
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
function scanResiduals(cleaned) {
|
|
66
|
+
const flags = [];
|
|
67
|
+
const records = [];
|
|
68
|
+
for (const line of cleaned.split('\n')) {
|
|
69
|
+
const t = line.trim();
|
|
70
|
+
if (!t)
|
|
71
|
+
continue;
|
|
72
|
+
try {
|
|
73
|
+
records.push(JSON.parse(t));
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// skip
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Pass 1: map tool_use id → { name, path } from assistant records.
|
|
80
|
+
const toolMap = new Map();
|
|
81
|
+
for (const rec of records) {
|
|
82
|
+
if (rec.type !== 'assistant')
|
|
83
|
+
continue;
|
|
84
|
+
const content = rec.message?.content;
|
|
85
|
+
if (!Array.isArray(content))
|
|
86
|
+
continue;
|
|
87
|
+
for (const b of content) {
|
|
88
|
+
if (b?.type === 'tool_use' && typeof b.id === 'string') {
|
|
89
|
+
toolMap.set(b.id, { name: typeof b.name === 'string' ? b.name : '', path: extractPath(b.input) });
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// Pass 2: flag sensitive/large tool-results + secret/PII patterns in text.
|
|
94
|
+
for (const rec of records) {
|
|
95
|
+
const content = rec.message?.content;
|
|
96
|
+
if (Array.isArray(content)) {
|
|
97
|
+
for (const b of content) {
|
|
98
|
+
if (b?.type === 'tool_result' && typeof b.tool_use_id === 'string') {
|
|
99
|
+
const tool = toolMap.get(b.tool_use_id);
|
|
100
|
+
const text = typeof b.content === 'string' ? b.content : JSON.stringify(b.content ?? '');
|
|
101
|
+
const sizeBytes = Buffer.byteLength(text, 'utf8');
|
|
102
|
+
const sensitivePath = !!(tool?.path && SENSITIVE_PATH_RE.test(tool.path));
|
|
103
|
+
if (sensitivePath || sizeBytes > TOOL_DUMP_BYTES) {
|
|
104
|
+
flags.push({
|
|
105
|
+
uuid: typeof rec.uuid === 'string' ? rec.uuid : '',
|
|
106
|
+
kind: 'tool_dump',
|
|
107
|
+
reason: sensitivePath
|
|
108
|
+
? `reads sensitive path ${tool.path}`
|
|
109
|
+
: `large tool output (${sizeBytes} bytes)`,
|
|
110
|
+
snippet: text.slice(0, 200),
|
|
111
|
+
sizeBytes,
|
|
112
|
+
defaultExclude: sensitivePath,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
scanTextForSecrets(rec, flags);
|
|
119
|
+
}
|
|
120
|
+
return flags;
|
|
121
|
+
}
|
|
122
|
+
function scanTextForSecrets(rec, flags) {
|
|
123
|
+
const texts = [];
|
|
124
|
+
const content = rec.message?.content;
|
|
125
|
+
if (typeof content === 'string')
|
|
126
|
+
texts.push(content);
|
|
127
|
+
else if (Array.isArray(content)) {
|
|
128
|
+
for (const b of content) {
|
|
129
|
+
if (b?.type === 'text' && typeof b.text === 'string')
|
|
130
|
+
texts.push(b.text);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
else if (typeof rec.content === 'string') {
|
|
134
|
+
texts.push(rec.content);
|
|
135
|
+
}
|
|
136
|
+
for (const text of texts) {
|
|
137
|
+
for (const { re, kind, reason } of SECRET_PATTERNS) {
|
|
138
|
+
const m = text.match(re);
|
|
139
|
+
if (m) {
|
|
140
|
+
flags.push({
|
|
141
|
+
uuid: typeof rec.uuid === 'string' ? rec.uuid : '',
|
|
142
|
+
kind,
|
|
143
|
+
reason,
|
|
144
|
+
snippet: m[0].slice(0, 60),
|
|
145
|
+
sizeBytes: Buffer.byteLength(m[0], 'utf8'),
|
|
146
|
+
defaultExclude: kind === 'secret',
|
|
147
|
+
});
|
|
148
|
+
break; // one flag per text block to limit noise
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=preview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preview.js","sourceRoot":"","sources":["../../../src/core/share/preview.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
export interface PrimerOptions {
|
|
3
|
+
/** Number of turns (user/assistant pairs) of recent context to include verbatim. Default 12, max 50. */
|
|
4
|
+
recentTurns?: number;
|
|
5
|
+
/** Hard cap on output character count. Default 8000. Truncates from oldest turn first. */
|
|
6
|
+
maxChars?: number;
|
|
7
|
+
}
|
|
8
|
+
export declare class PrimerError extends Error {
|
|
9
|
+
readonly status: number;
|
|
10
|
+
constructor(msg: string, status?: number);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Build a paste-able primer prompt that primes any other agent CLI with the recent
|
|
14
|
+
* context of this session. Deterministic: same session + opts → byte-identical output.
|
|
15
|
+
*
|
|
16
|
+
* The primer is intentionally lossy — receiving agent gets a summary, not full state.
|
|
17
|
+
*/
|
|
18
|
+
export declare function buildPrimer(db: Database.Database, sessionId: string, opts?: PrimerOptions): string;
|
|
19
|
+
//# sourceMappingURL=primer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"primer.d.ts","sourceRoot":"","sources":["../../../src/core/share/primer.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAA;AAGrC,MAAM,WAAW,aAAa;IAC5B,wGAAwG;IACxG,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,0FAA0F;IAC1F,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,qBAAa,WAAY,SAAQ,KAAK;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;gBACX,GAAG,EAAE,MAAM,EAAE,MAAM,SAAM;CAKtC;AAsBD;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,aAAkB,GACvB,MAAM,CA4ER"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
export class PrimerError extends Error {
|
|
2
|
+
status;
|
|
3
|
+
constructor(msg, status = 404) {
|
|
4
|
+
super(msg);
|
|
5
|
+
this.name = 'PrimerError';
|
|
6
|
+
this.status = status;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Build a paste-able primer prompt that primes any other agent CLI with the recent
|
|
11
|
+
* context of this session. Deterministic: same session + opts → byte-identical output.
|
|
12
|
+
*
|
|
13
|
+
* The primer is intentionally lossy — receiving agent gets a summary, not full state.
|
|
14
|
+
*/
|
|
15
|
+
export function buildPrimer(db, sessionId, opts = {}) {
|
|
16
|
+
const recentTurns = clamp(opts.recentTurns ?? 12, 1, 50);
|
|
17
|
+
const maxChars = Math.max(500, opts.maxChars ?? 8000);
|
|
18
|
+
const session = db
|
|
19
|
+
.prepare('SELECT id, project, platform, started_at, ended_at FROM sessions WHERE id = ?')
|
|
20
|
+
.get(sessionId);
|
|
21
|
+
if (!session)
|
|
22
|
+
throw new PrimerError(`session not found: ${sessionId}`, 404);
|
|
23
|
+
// Pull the last N user+assistant messages (skip system records — they're meta)
|
|
24
|
+
const messages = db
|
|
25
|
+
.prepare(`SELECT id, role, ts, content_json FROM messages
|
|
26
|
+
WHERE session_id = ? AND role IN ('user', 'assistant')
|
|
27
|
+
ORDER BY idx DESC LIMIT ?`)
|
|
28
|
+
.all(sessionId, recentTurns * 2);
|
|
29
|
+
// Re-sort oldest-first for rendering
|
|
30
|
+
messages.reverse();
|
|
31
|
+
// Tool usage stats (any time, full session — small rollup, useful for primer header)
|
|
32
|
+
const toolUsage = db
|
|
33
|
+
.prepare(`SELECT tc.tool AS tool, COUNT(*) AS n
|
|
34
|
+
FROM tool_calls tc
|
|
35
|
+
INNER JOIN messages m ON m.id = tc.message_id
|
|
36
|
+
WHERE m.session_id = ?
|
|
37
|
+
GROUP BY tc.tool ORDER BY n DESC LIMIT 10`)
|
|
38
|
+
.all(sessionId);
|
|
39
|
+
const dateRange = formatDateRange(session.started_at, session.ended_at);
|
|
40
|
+
const toolsLine = toolUsage.length
|
|
41
|
+
? toolUsage.map((t) => `${t.tool} (${t.n})`).join(', ')
|
|
42
|
+
: '(none)';
|
|
43
|
+
const header = [
|
|
44
|
+
'=== Continuing previous AI session ===',
|
|
45
|
+
`Origin: ${session.platform} • Project: ${session.project} • ${dateRange}`,
|
|
46
|
+
`Session ID (for reference, not resume): ${session.id}`,
|
|
47
|
+
`Tools used: ${toolsLine}`,
|
|
48
|
+
'',
|
|
49
|
+
`--- Most recent context (last ${messages.length} turns) ---`,
|
|
50
|
+
];
|
|
51
|
+
const body = [];
|
|
52
|
+
for (const m of messages) {
|
|
53
|
+
body.push(formatMessage(m));
|
|
54
|
+
}
|
|
55
|
+
const lastAssistant = [...messages].reverse().find((m) => m.role === 'assistant');
|
|
56
|
+
const recentFiles = recentTouchedFiles(db, sessionId);
|
|
57
|
+
const tail = [
|
|
58
|
+
'',
|
|
59
|
+
'--- Where we left off ---',
|
|
60
|
+
`Last assistant action: ${lastAssistant ? oneLineSummary(lastAssistant) : '(none)'}`,
|
|
61
|
+
`Files most recently touched: ${recentFiles.length ? recentFiles.join(', ') : '(none recorded)'}`,
|
|
62
|
+
'',
|
|
63
|
+
'Note: this is a warm-start, not an exact resume. The receiving agent does not have',
|
|
64
|
+
'prior tool-call output detail beyond what is summarized above. Tool semantics may',
|
|
65
|
+
'differ across platforms (e.g., Bash vs shell, Read vs file_read).',
|
|
66
|
+
'',
|
|
67
|
+
'=== Continue from here ===',
|
|
68
|
+
'',
|
|
69
|
+
];
|
|
70
|
+
let output = [...header, ...body, ...tail].join('\n');
|
|
71
|
+
// Truncate from oldest turns if over maxChars
|
|
72
|
+
if (output.length > maxChars) {
|
|
73
|
+
output = truncatePrimer(header, body, tail, maxChars);
|
|
74
|
+
}
|
|
75
|
+
return output;
|
|
76
|
+
}
|
|
77
|
+
function clamp(n, lo, hi) {
|
|
78
|
+
return Math.max(lo, Math.min(hi, Math.floor(n)));
|
|
79
|
+
}
|
|
80
|
+
function formatDateRange(start, end) {
|
|
81
|
+
if (!start)
|
|
82
|
+
return '(date unknown)';
|
|
83
|
+
const s = start.slice(0, 10);
|
|
84
|
+
const e = end ? end.slice(0, 10) : null;
|
|
85
|
+
return e && e !== s ? `${s} → ${e}` : s;
|
|
86
|
+
}
|
|
87
|
+
function formatMessage(m) {
|
|
88
|
+
let parsed;
|
|
89
|
+
try {
|
|
90
|
+
parsed = JSON.parse(m.content_json);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return `[${m.role}]: <unparseable>`;
|
|
94
|
+
}
|
|
95
|
+
// The shape of `content_json` is the inner `message` object; we extract its `content` field.
|
|
96
|
+
const msg = parsed;
|
|
97
|
+
if (typeof msg.content === 'string') {
|
|
98
|
+
return `[${m.role}]: ${truncate(msg.content, 1500)}`;
|
|
99
|
+
}
|
|
100
|
+
if (!Array.isArray(msg.content)) {
|
|
101
|
+
return `[${m.role}]: <empty>`;
|
|
102
|
+
}
|
|
103
|
+
const parts = [];
|
|
104
|
+
for (const block of msg.content) {
|
|
105
|
+
if (block.type === 'text') {
|
|
106
|
+
parts.push(truncate(block.text, 1500));
|
|
107
|
+
}
|
|
108
|
+
else if (block.type === 'tool_use') {
|
|
109
|
+
const summary = summarizeToolInput(block.input);
|
|
110
|
+
parts.push(`Used ${block.name}(${summary})`);
|
|
111
|
+
}
|
|
112
|
+
else if (block.type === 'tool_result') {
|
|
113
|
+
const content = typeof block.content === 'string'
|
|
114
|
+
? truncate(block.content, 400)
|
|
115
|
+
: '<structured>';
|
|
116
|
+
parts.push(`(tool_result) ${content}`);
|
|
117
|
+
}
|
|
118
|
+
// skip thinking blocks — internal reasoning, not user-facing
|
|
119
|
+
}
|
|
120
|
+
return `[${m.role}]: ${parts.join('\n ')}`;
|
|
121
|
+
}
|
|
122
|
+
function summarizeToolInput(input) {
|
|
123
|
+
// Pick the most informative-looking field for a short summary
|
|
124
|
+
const keys = Object.keys(input);
|
|
125
|
+
if (keys.length === 0)
|
|
126
|
+
return '';
|
|
127
|
+
// Prefer common informative fields
|
|
128
|
+
for (const k of ['command', 'file_path', 'path', 'pattern', 'query', 'url']) {
|
|
129
|
+
if (typeof input[k] === 'string')
|
|
130
|
+
return `${k}=${truncate(input[k], 80)}`;
|
|
131
|
+
}
|
|
132
|
+
// Fallback: first key
|
|
133
|
+
const first = input[keys[0]];
|
|
134
|
+
if (typeof first === 'string')
|
|
135
|
+
return `${keys[0]}=${truncate(first, 80)}`;
|
|
136
|
+
return `${keys.length} param(s)`;
|
|
137
|
+
}
|
|
138
|
+
function oneLineSummary(m) {
|
|
139
|
+
let parsed;
|
|
140
|
+
try {
|
|
141
|
+
parsed = JSON.parse(m.content_json);
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
return '(unparseable)';
|
|
145
|
+
}
|
|
146
|
+
const msg = parsed;
|
|
147
|
+
if (typeof msg.content === 'string')
|
|
148
|
+
return truncate(msg.content, 200);
|
|
149
|
+
if (!Array.isArray(msg.content))
|
|
150
|
+
return '(empty)';
|
|
151
|
+
for (const block of msg.content) {
|
|
152
|
+
if (block.type === 'text')
|
|
153
|
+
return truncate(block.text, 200);
|
|
154
|
+
if (block.type === 'tool_use')
|
|
155
|
+
return `Used ${block.name}(${summarizeToolInput(block.input)})`;
|
|
156
|
+
}
|
|
157
|
+
return '(no text or tool_use)';
|
|
158
|
+
}
|
|
159
|
+
function recentTouchedFiles(db, sessionId) {
|
|
160
|
+
// Pull recent tool_use inputs for tools that act on files
|
|
161
|
+
const rows = db
|
|
162
|
+
.prepare(`SELECT tc.input_json
|
|
163
|
+
FROM tool_calls tc
|
|
164
|
+
INNER JOIN messages m ON m.id = tc.message_id
|
|
165
|
+
WHERE m.session_id = ? AND tc.tool IN ('Read', 'Edit', 'Write', 'apply_patch')
|
|
166
|
+
ORDER BY m.idx DESC LIMIT 8`)
|
|
167
|
+
.all(sessionId);
|
|
168
|
+
const files = new Set();
|
|
169
|
+
for (const r of rows) {
|
|
170
|
+
try {
|
|
171
|
+
const input = JSON.parse(r.input_json);
|
|
172
|
+
const path = (input['file_path'] ?? input['path']);
|
|
173
|
+
if (typeof path === 'string')
|
|
174
|
+
files.add(path);
|
|
175
|
+
}
|
|
176
|
+
catch { /* ignore */ }
|
|
177
|
+
}
|
|
178
|
+
return [...files].slice(0, 5);
|
|
179
|
+
}
|
|
180
|
+
function truncate(s, max) {
|
|
181
|
+
if (s.length <= max)
|
|
182
|
+
return s;
|
|
183
|
+
return s.slice(0, max - 1) + '…';
|
|
184
|
+
}
|
|
185
|
+
/** Drop oldest body turns until total length fits maxChars (or we hit 1 turn floor). */
|
|
186
|
+
function truncatePrimer(header, body, tail, maxChars) {
|
|
187
|
+
const remaining = [...body];
|
|
188
|
+
while (remaining.length > 1) {
|
|
189
|
+
const candidate = [...header, ...remaining, ...tail].join('\n');
|
|
190
|
+
if (candidate.length <= maxChars)
|
|
191
|
+
return candidate;
|
|
192
|
+
remaining.shift(); // drop the oldest turn
|
|
193
|
+
}
|
|
194
|
+
return [...header, ...remaining, ...tail].join('\n');
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=primer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"primer.js","sourceRoot":"","sources":["../../../src/core/share/primer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** Scan PATH for the agent binary; return absolute path or null. */
|
|
2
|
+
export declare function detectAgentBinary(platform: 'claude-code' | 'codex'): string | null;
|
|
3
|
+
/**
|
|
4
|
+
* Replace the current Node process by spawning the agent CLI in resume mode.
|
|
5
|
+
* stdio is inherited so the user lands directly in the agent's TUI.
|
|
6
|
+
* Returns nothing because this terminates the current process via process.exit
|
|
7
|
+
* after the child finishes.
|
|
8
|
+
*/
|
|
9
|
+
export declare function spawnResume(binPath: string, platform: 'claude-code' | 'codex', sessionId: string): never;
|
|
10
|
+
//# sourceMappingURL=resume.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resume.d.ts","sourceRoot":"","sources":["../../../src/core/share/resume.ts"],"names":[],"mappings":"AASA,oEAAoE;AACpE,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,CAelF;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,aAAa,GAAG,OAAO,EACjC,SAAS,EAAE,MAAM,GAChB,KAAK,CAcP"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { spawnSync, spawn } from 'node:child_process';
|
|
2
|
+
import { delimiter, join } from 'node:path';
|
|
3
|
+
import { existsSync } from 'node:fs';
|
|
4
|
+
const PLATFORM_BINARY = {
|
|
5
|
+
'claude-code': 'claude',
|
|
6
|
+
'codex': 'codex',
|
|
7
|
+
};
|
|
8
|
+
/** Scan PATH for the agent binary; return absolute path or null. */
|
|
9
|
+
export function detectAgentBinary(platform) {
|
|
10
|
+
const name = PLATFORM_BINARY[platform];
|
|
11
|
+
const pathEnv = process.env.PATH ?? '';
|
|
12
|
+
// Try `which` first (works on macOS/Linux); fall back to manual PATH scan
|
|
13
|
+
const which = spawnSync('which', [name], { encoding: 'utf8' });
|
|
14
|
+
if (which.status === 0) {
|
|
15
|
+
const out = which.stdout.trim();
|
|
16
|
+
if (out && existsSync(out))
|
|
17
|
+
return out;
|
|
18
|
+
}
|
|
19
|
+
for (const dir of pathEnv.split(delimiter)) {
|
|
20
|
+
if (!dir)
|
|
21
|
+
continue;
|
|
22
|
+
const candidate = join(dir, name);
|
|
23
|
+
if (existsSync(candidate))
|
|
24
|
+
return candidate;
|
|
25
|
+
}
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Replace the current Node process by spawning the agent CLI in resume mode.
|
|
30
|
+
* stdio is inherited so the user lands directly in the agent's TUI.
|
|
31
|
+
* Returns nothing because this terminates the current process via process.exit
|
|
32
|
+
* after the child finishes.
|
|
33
|
+
*/
|
|
34
|
+
export function spawnResume(binPath, platform, sessionId) {
|
|
35
|
+
const args = resumeArgs(platform, sessionId);
|
|
36
|
+
const child = spawn(binPath, args, { stdio: 'inherit' });
|
|
37
|
+
child.on('exit', (code) => {
|
|
38
|
+
process.exit(code ?? 0);
|
|
39
|
+
});
|
|
40
|
+
child.on('error', (err) => {
|
|
41
|
+
console.error(`[vyasa] failed to spawn ${binPath}: ${err.message}`);
|
|
42
|
+
process.exit(1);
|
|
43
|
+
});
|
|
44
|
+
// Block forever — the spawn callbacks above will exit
|
|
45
|
+
// (technically not "never" until exit, but TypeScript-wise this is the contract)
|
|
46
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
47
|
+
return new Promise(() => { });
|
|
48
|
+
}
|
|
49
|
+
function resumeArgs(platform, sessionId) {
|
|
50
|
+
// Both CLIs change their resume flags between releases — these are best guesses
|
|
51
|
+
// as of writing. If the args are wrong, the agent will print its own usage and
|
|
52
|
+
// the user can run the correct command from the printed manual fallback.
|
|
53
|
+
if (platform === 'claude-code') {
|
|
54
|
+
return ['--resume', sessionId];
|
|
55
|
+
}
|
|
56
|
+
return ['--resume', sessionId];
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=resume.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resume.js","sourceRoot":"","sources":["../../../src/core/share/resume.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEpC,MAAM,eAAe,GAA4C;IAC/D,aAAa,EAAE,QAAQ;IACvB,OAAO,EAAE,OAAO;CACjB,CAAA;AAED,oEAAoE;AACpE,MAAM,UAAU,iBAAiB,CAAC,QAAiC;IACjE,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAA;IACtC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAA;IACtC,0EAA0E;IAC1E,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAA;IAC9D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA;QAC/B,IAAI,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,GAAG,CAAA;IACxC,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3C,IAAI,CAAC,GAAG;YAAE,SAAQ;QAClB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;QACjC,IAAI,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAA;IAC7C,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CACzB,OAAe,EACf,QAAiC,EACjC,SAAiB;IAEjB,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;IAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAA;IACxD,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACxB,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAA;IACzB,CAAC,CAAC,CAAA;IACF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;QACxB,OAAO,CAAC,KAAK,CAAC,2BAA2B,OAAO,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;QACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC,CAAC,CAAA;IACF,sDAAsD;IACtD,iFAAiF;IACjF,gEAAgE;IAChE,OAAO,IAAI,OAAO,CAAQ,GAAG,EAAE,GAAE,CAAC,CAAU,CAAA;AAC9C,CAAC;AAED,SAAS,UAAU,CAAC,QAAiC,EAAE,SAAiB;IACtE,gFAAgF;IAChF,+EAA+E;IAC/E,yEAAyE;IACzE,IAAI,QAAQ,KAAK,aAAa,EAAE,CAAC;QAC/B,OAAO,CAAC,UAAU,EAAE,SAAS,CAAC,CAAA;IAChC,CAAC;IACD,OAAO,CAAC,UAAU,EAAE,SAAS,CAAC,CAAA;AAChC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ScrubReport } from '../schema/index.js';
|
|
2
|
+
export interface ScrubOptions {
|
|
3
|
+
/** Record uuids whose content should be redacted in place (kept, but payload masked). */
|
|
4
|
+
redactUuids?: string[];
|
|
5
|
+
}
|
|
6
|
+
export declare function scrubClaudeJsonl(raw: string, opts?: ScrubOptions): {
|
|
7
|
+
cleaned: string;
|
|
8
|
+
report: ScrubReport;
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=scrub.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scrub.d.ts","sourceRoot":"","sources":["../../../src/core/share/scrub.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAyCrD,MAAM,WAAW,YAAY;IAC3B,yFAAyF;IACzF,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CACvB;AAED,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,YAAiB,GACtB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAE,CAsE1C"}
|