@cesarandreslopez/occ 0.6.3 → 0.8.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 CHANGED
@@ -277,6 +277,38 @@ session.chunk({ maxChunkWords: 200 });
277
277
  await session.refresh(); // rebuild index when files change
278
278
  ```
279
279
 
280
+ For persistent caching across sessions with automatic freshness checks:
281
+
282
+ ```ts
283
+ import { openCodeIndexStore } from '@cesarandreslopez/occ/code/store';
284
+
285
+ const store = openCodeIndexStore({
286
+ repoRoot: './my-repo',
287
+ cacheDir: '.occ-cache',
288
+ });
289
+
290
+ // First call builds + caches; subsequent calls load from cache
291
+ const session = await store.getSession({ strategy: 'prefer-cache' });
292
+ session.findByName('UserService');
293
+
294
+ // Check freshness via file manifests before returning cache
295
+ await store.getSession({ strategy: 'ensure-fresh' });
296
+
297
+ // Force a full rebuild
298
+ await store.refresh();
299
+ ```
300
+
301
+ Or use the unified facade for all OCC APIs from a single import:
302
+
303
+ ```ts
304
+ import { createOcc } from '@cesarandreslopez/occ';
305
+
306
+ const occ = createOcc();
307
+ const session = await occ.code.createSession({ repoRoot: './my-repo' });
308
+ const analysis = await occ.workspace.analyze('./my-project', { includeCode: true });
309
+ const doc = await occ.doc.inspect('report.docx', {});
310
+ ```
311
+
280
312
  For workspace-level analysis:
281
313
 
282
314
  ```ts
@@ -297,7 +329,8 @@ Available subpath exports:
297
329
  | `@cesarandreslopez/occ/code/discover` | `discoverCodeFiles` — file discovery |
298
330
  | `@cesarandreslopez/occ/code/chunk` | `chunkCodebase`, `chunkFromIndex` — semantic code chunking |
299
331
  | `@cesarandreslopez/occ/code/session` | `createCodeQuerySession` — stateful code query session |
300
- | `@cesarandreslopez/occ/code/cache` | Index caching utilities |
332
+ | `@cesarandreslopez/occ/code/store` | `openCodeIndexStore` persistent index store with cache strategies |
333
+ | `@cesarandreslopez/occ/code/cache` | Index caching utilities (legacy — prefer `./code/store`) |
301
334
  | `@cesarandreslopez/occ/doc/inspect` | `inspectDocument` — document metadata and content extraction |
302
335
  | `@cesarandreslopez/occ/doc/types` | Document inspection types |
303
336
  | `@cesarandreslopez/occ/doc/discover` | Document file discovery |
@@ -307,6 +340,8 @@ Available subpath exports:
307
340
  | `@cesarandreslopez/occ/workspace/analyze` | `analyzeWorkspace` — workspace-level analysis |
308
341
  | `@cesarandreslopez/occ/workspace/documents` | `inspectWorkspaceDocumentSet` — document summaries and cross-references |
309
342
  | `@cesarandreslopez/occ/workspace/types` | Workspace analysis types |
343
+ | `@cesarandreslopez/occ/workspace/prepare` | `prepareWorkspaceContext` — combined code indexing + document inspection |
344
+ | `@cesarandreslopez/occ/workspace/prepare-types` | Workspace preparation types (`WorkspacePrepareOptions`, `WorkspacePreparedContext`, etc.) |
310
345
  | `@cesarandreslopez/occ/markdown/convert` | `documentToMarkdown` — document-to-markdown conversion |
311
346
  | `@cesarandreslopez/occ/structure/extract` | `extractFromMarkdown` — heading tree extraction |
312
347
  | `@cesarandreslopez/occ/structure/types` | Structure types and helpers |
@@ -439,6 +474,25 @@ occ workspace documents --max-files 20 --include-markdown --format json
439
474
 
440
475
  `occ workspace analyze` returns a `schemaVersion: 1` JSON envelope containing code metrics (via scc), document aggregates, heading structures, skipped files, and errors. `occ workspace documents` returns per-document summaries with cross-references (filename mentions, hyperlinks, citations) and unresolved mentions detected across the document set.
441
476
 
477
+ For combined code indexing and document inspection with progress tracking:
478
+
479
+ ```ts
480
+ import { prepareWorkspaceContext } from '@cesarandreslopez/occ/workspace/prepare';
481
+
482
+ const context = await prepareWorkspaceContext('./my-project', {
483
+ includeCode: true,
484
+ includeDocuments: true,
485
+ executionMode: 'auto', // 'auto' | 'inline' | 'subprocess'
486
+ }, (event) => {
487
+ console.log(`[${event.scope}] ${event.stage}: ${event.completed}/${event.total}`);
488
+ });
489
+
490
+ // context.code?.index — full CodebaseIndex
491
+ // context.documents — WorkspaceDocumentSet with cross-references
492
+ // context.elapsedMs — total wall time
493
+ // context.errors — collected errors from both phases
494
+ ```
495
+
442
496
  ## Documentation
443
497
 
444
498
  Full documentation is available at [cesarandreslopez.github.io/occ](https://cesarandreslopez.github.io/occ/), including:
@@ -24,3 +24,4 @@ export interface CodeQuerySession {
24
24
  chunk(options?: CodeSessionChunkOptions): CodeChunk[];
25
25
  }
26
26
  export declare function createCodeQuerySession(options: BuildCodebaseOptions, onProgress?: OnProgress): Promise<CodeQuerySession>;
27
+ export declare function createCodeQuerySessionFromIndex(options: BuildCodebaseOptions, index: CodebaseIndex): CodeQuerySession;
@@ -56,4 +56,7 @@ export async function createCodeQuerySession(options, onProgress) {
56
56
  const index = await buildCodebaseIndex(options, onProgress);
57
57
  return new InMemoryCodeQuerySession(options, index);
58
58
  }
59
+ export function createCodeQuerySessionFromIndex(options, index) {
60
+ return new InMemoryCodeQuerySession(options, index);
61
+ }
59
62
  //# sourceMappingURL=session.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/code/session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/code/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { type CodeQuerySession } from './session.js';
2
+ import type { CodebaseIndex } from './types.js';
3
+ import type { OnProgress } from '../progress-event.js';
4
+ export type StoreStrategy = 'prefer-cache' | 'ensure-fresh' | 'rebuild';
5
+ export interface CodeIndexStoreOptions {
6
+ repoRoot: string;
7
+ cacheDir: string;
8
+ excludeDir?: string[];
9
+ noGitignore?: boolean;
10
+ }
11
+ export interface StoreSessionOptions {
12
+ strategy?: StoreStrategy;
13
+ signal?: AbortSignal;
14
+ onProgress?: OnProgress;
15
+ }
16
+ export interface StoreMetadata {
17
+ schemaVersion: number;
18
+ occVersion: string;
19
+ repoRoot: string;
20
+ builtAt: string;
21
+ fileCount: number;
22
+ nodeCount: number;
23
+ edgeCount: number;
24
+ loadSource: 'cache' | 'build';
25
+ buildOptionFingerprint: string;
26
+ }
27
+ export interface CodeIndexStore {
28
+ getSession(options?: StoreSessionOptions): Promise<CodeQuerySession>;
29
+ refresh(options?: {
30
+ signal?: AbortSignal;
31
+ onProgress?: OnProgress;
32
+ }): Promise<CodeQuerySession>;
33
+ exportIndex(options?: StoreSessionOptions): Promise<CodebaseIndex>;
34
+ clear(): Promise<void>;
35
+ getMetadata(): StoreMetadata | null;
36
+ }
37
+ export declare function openCodeIndexStore(options: CodeIndexStoreOptions): CodeIndexStore;
@@ -0,0 +1,283 @@
1
+ import { readFile, writeFile, mkdir, rm, stat } from 'node:fs/promises';
2
+ import { createHash } from 'node:crypto';
3
+ import path from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { buildCodebaseIndex } from './build.js';
6
+ import { createCodeQuerySessionFromIndex } from './session.js';
7
+ import { discoverCodeFiles } from './discover.js';
8
+ // ---------------------------------------------------------------------------
9
+ // Constants
10
+ // ---------------------------------------------------------------------------
11
+ const SCHEMA_VERSION = 1;
12
+ // Resolve version from package.json — works from both src/ (dev) and dist/src/ (built)
13
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
14
+ let _occVersion;
15
+ async function getOccVersion() {
16
+ if (_occVersion)
17
+ return _occVersion;
18
+ for (const rel of ['../..', '../../..']) {
19
+ try {
20
+ const raw = await readFile(path.resolve(__dirname, rel, 'package.json'), 'utf8');
21
+ const pkg = JSON.parse(raw);
22
+ if (pkg.version) {
23
+ _occVersion = pkg.version;
24
+ return _occVersion;
25
+ }
26
+ }
27
+ catch { /* try next */ }
28
+ }
29
+ _occVersion = '0.0.0';
30
+ return _occVersion;
31
+ }
32
+ // ---------------------------------------------------------------------------
33
+ // Helpers
34
+ // ---------------------------------------------------------------------------
35
+ function buildOptionFingerprint(opts) {
36
+ const material = JSON.stringify({
37
+ excludeDir: (opts.excludeDir ?? []).slice().sort(),
38
+ noGitignore: opts.noGitignore ?? false,
39
+ });
40
+ return createHash('sha256').update(material).digest('hex').slice(0, 16);
41
+ }
42
+ function indexPath(cacheDir) {
43
+ return path.join(cacheDir, 'index.json');
44
+ }
45
+ function metaPath(cacheDir) {
46
+ return path.join(cacheDir, 'meta.json');
47
+ }
48
+ function manifestPath(cacheDir) {
49
+ return path.join(cacheDir, 'manifest.json');
50
+ }
51
+ function checkAbort(signal) {
52
+ if (signal?.aborted) {
53
+ throw new DOMException('The operation was aborted.', 'AbortError');
54
+ }
55
+ }
56
+ // ---------------------------------------------------------------------------
57
+ // Cache I/O
58
+ // ---------------------------------------------------------------------------
59
+ async function loadCachedIndex(cacheDir) {
60
+ try {
61
+ const raw = await readFile(indexPath(cacheDir), 'utf8');
62
+ if (!raw)
63
+ return undefined;
64
+ return JSON.parse(raw);
65
+ }
66
+ catch {
67
+ return undefined;
68
+ }
69
+ }
70
+ async function loadCacheMeta(cacheDir) {
71
+ try {
72
+ const raw = await readFile(metaPath(cacheDir), 'utf8');
73
+ if (!raw)
74
+ return undefined;
75
+ const parsed = JSON.parse(raw);
76
+ if (parsed.schemaVersion !== SCHEMA_VERSION)
77
+ return undefined;
78
+ return parsed;
79
+ }
80
+ catch {
81
+ return undefined;
82
+ }
83
+ }
84
+ async function loadManifest(cacheDir) {
85
+ try {
86
+ const raw = await readFile(manifestPath(cacheDir), 'utf8');
87
+ if (!raw)
88
+ return undefined;
89
+ return JSON.parse(raw);
90
+ }
91
+ catch {
92
+ return undefined;
93
+ }
94
+ }
95
+ async function persistCache(cacheDir, index, buildOpts, onProgress) {
96
+ await mkdir(cacheDir, { recursive: true });
97
+ onProgress?.({ phase: 'serialize', total: 3, completed: 0, detail: 'writing cache' });
98
+ // Strip file content/lines from cached index to reduce size
99
+ const slimFiles = index.files.map(f => ({ ...f, content: '', lines: [] }));
100
+ const slimIndex = { ...index, files: slimFiles };
101
+ await writeFile(indexPath(cacheDir), JSON.stringify(slimIndex), 'utf8');
102
+ onProgress?.({ phase: 'serialize', total: 3, completed: 1, detail: 'index written' });
103
+ // Build and write manifest (stat calls in parallel)
104
+ const repoRoot = path.resolve(buildOpts.repoRoot);
105
+ const statResults = await Promise.all(index.files.map(async (file) => {
106
+ try {
107
+ const fileStat = await stat(path.join(repoRoot, file.relativePath));
108
+ return { relativePath: file.relativePath, size: fileStat.size, mtimeMs: fileStat.mtimeMs };
109
+ }
110
+ catch {
111
+ return null; // File may have been deleted between build and persist
112
+ }
113
+ }));
114
+ const manifest = statResults.filter((e) => e !== null);
115
+ await writeFile(manifestPath(cacheDir), JSON.stringify(manifest), 'utf8');
116
+ onProgress?.({ phase: 'serialize', total: 3, completed: 2, detail: 'manifest written' });
117
+ // Write metadata
118
+ const occVersion = await getOccVersion();
119
+ const meta = {
120
+ schemaVersion: SCHEMA_VERSION,
121
+ occVersion,
122
+ repoRoot: repoRoot,
123
+ builtAt: new Date().toISOString(),
124
+ fileCount: index.files.length,
125
+ nodeCount: index.nodes.length,
126
+ edgeCount: index.edges.length,
127
+ buildOptionFingerprint: buildOptionFingerprint(buildOpts),
128
+ };
129
+ await writeFile(metaPath(cacheDir), JSON.stringify(meta, null, 2), 'utf8');
130
+ onProgress?.({ phase: 'serialize', total: 3, completed: 3, detail: 'metadata written' });
131
+ return meta;
132
+ }
133
+ // ---------------------------------------------------------------------------
134
+ // Manifest freshness check
135
+ // ---------------------------------------------------------------------------
136
+ async function isManifestFresh(manifest, repoRoot, buildOpts) {
137
+ // Discover current files to detect additions/deletions
138
+ const currentFiles = await discoverCodeFiles(repoRoot, {
139
+ excludeDir: buildOpts.excludeDir,
140
+ noGitignore: buildOpts.noGitignore,
141
+ });
142
+ const currentRelPaths = new Set(currentFiles.map(f => path.relative(repoRoot, f)));
143
+ const manifestRelPaths = new Set(manifest.map(e => e.relativePath));
144
+ // Check for added or deleted files
145
+ if (currentRelPaths.size !== manifestRelPaths.size)
146
+ return false;
147
+ for (const rel of currentRelPaths) {
148
+ if (!manifestRelPaths.has(rel))
149
+ return false;
150
+ }
151
+ // Check size and mtime for each file
152
+ for (const entry of manifest) {
153
+ try {
154
+ const fileStat = await stat(path.join(repoRoot, entry.relativePath));
155
+ if (fileStat.size !== entry.size || fileStat.mtimeMs !== entry.mtimeMs) {
156
+ return false;
157
+ }
158
+ }
159
+ catch {
160
+ return false; // File disappeared
161
+ }
162
+ }
163
+ return true;
164
+ }
165
+ // ---------------------------------------------------------------------------
166
+ // Store implementation
167
+ // ---------------------------------------------------------------------------
168
+ export function openCodeIndexStore(options) {
169
+ const repoRoot = path.resolve(options.repoRoot);
170
+ const { cacheDir } = options;
171
+ const fingerprint = buildOptionFingerprint(options);
172
+ const buildOpts = {
173
+ repoRoot,
174
+ excludeDir: options.excludeDir,
175
+ noGitignore: options.noGitignore,
176
+ };
177
+ let currentSession = null;
178
+ let currentMeta = null;
179
+ async function buildAndPersist(signal, onProgress) {
180
+ checkAbort(signal);
181
+ const index = await buildCodebaseIndex(buildOpts, onProgress);
182
+ checkAbort(signal);
183
+ const cacheMeta = await persistCache(cacheDir, index, options, onProgress);
184
+ const session = createCodeQuerySessionFromIndex(buildOpts, index);
185
+ const meta = {
186
+ ...cacheMeta,
187
+ loadSource: 'build',
188
+ };
189
+ return { session, meta };
190
+ }
191
+ async function loadFromCache(onProgress) {
192
+ onProgress?.({ phase: 'cache-check', total: 1, completed: 0, detail: 'checking cache' });
193
+ const cacheMeta = await loadCacheMeta(cacheDir);
194
+ if (!cacheMeta)
195
+ return undefined;
196
+ if (cacheMeta.buildOptionFingerprint !== fingerprint)
197
+ return undefined;
198
+ if (cacheMeta.occVersion !== await getOccVersion())
199
+ return undefined;
200
+ onProgress?.({ phase: 'deserialize', total: 1, completed: 0, detail: 'loading index' });
201
+ const cachedIndex = await loadCachedIndex(cacheDir);
202
+ if (!cachedIndex)
203
+ return undefined;
204
+ onProgress?.({ phase: 'deserialize', total: 1, completed: 1, detail: 'index loaded' });
205
+ const session = createCodeQuerySessionFromIndex(buildOpts, cachedIndex);
206
+ const meta = {
207
+ ...cacheMeta,
208
+ loadSource: 'cache',
209
+ };
210
+ return { session, meta };
211
+ }
212
+ return {
213
+ async getSession(opts) {
214
+ const strategy = opts?.strategy ?? 'prefer-cache';
215
+ const { signal, onProgress } = opts ?? {};
216
+ checkAbort(signal);
217
+ if (strategy === 'rebuild') {
218
+ const result = await buildAndPersist(signal, onProgress);
219
+ currentSession = result.session;
220
+ currentMeta = result.meta;
221
+ return result.session;
222
+ }
223
+ if (strategy === 'prefer-cache') {
224
+ const cached = await loadFromCache(onProgress);
225
+ if (cached) {
226
+ currentSession = cached.session;
227
+ currentMeta = cached.meta;
228
+ return cached.session;
229
+ }
230
+ // Cache miss — build
231
+ const result = await buildAndPersist(signal, onProgress);
232
+ currentSession = result.session;
233
+ currentMeta = result.meta;
234
+ return result.session;
235
+ }
236
+ // ensure-fresh
237
+ const manifest = await loadManifest(cacheDir);
238
+ if (manifest) {
239
+ onProgress?.({ phase: 'cache-check', total: 1, completed: 0, detail: 'checking freshness' });
240
+ const fresh = await isManifestFresh(manifest, repoRoot, options);
241
+ if (fresh) {
242
+ const cached = await loadFromCache(onProgress);
243
+ if (cached) {
244
+ currentSession = cached.session;
245
+ currentMeta = cached.meta;
246
+ return cached.session;
247
+ }
248
+ }
249
+ }
250
+ // Stale or no cache — rebuild
251
+ const result = await buildAndPersist(signal, onProgress);
252
+ currentSession = result.session;
253
+ currentMeta = result.meta;
254
+ return result.session;
255
+ },
256
+ async refresh(opts) {
257
+ const result = await buildAndPersist(opts?.signal, opts?.onProgress);
258
+ currentSession = result.session;
259
+ currentMeta = result.meta;
260
+ return result.session;
261
+ },
262
+ async exportIndex(opts) {
263
+ if (currentSession)
264
+ return currentSession.getIndex();
265
+ const session = await this.getSession(opts);
266
+ return session.getIndex();
267
+ },
268
+ async clear() {
269
+ currentSession = null;
270
+ currentMeta = null;
271
+ try {
272
+ await rm(cacheDir, { recursive: true, force: true });
273
+ }
274
+ catch {
275
+ // Ignore if already missing
276
+ }
277
+ },
278
+ getMetadata() {
279
+ return currentMeta;
280
+ },
281
+ };
282
+ }
283
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/code/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import { buildCodebaseIndex } from './code/build.js';
2
+ import { createCodeQuerySession, createCodeQuerySessionFromIndex } from './code/session.js';
3
+ import { openCodeIndexStore } from './code/store.js';
4
+ import { chunkCodebase, chunkFromIndex } from './code/chunk.js';
5
+ import { discoverCodeFiles } from './code/discover.js';
6
+ import { inspectDocument } from './doc/inspect.js';
7
+ import { discoverDocuments } from './doc/discover.js';
8
+ import { inspectWorkbook } from './sheet/inspect.js';
9
+ import { inspectPresentation } from './slide/inspect.js';
10
+ import { analyzeWorkspace } from './workspace/analyze.js';
11
+ import { inspectWorkspaceDocumentSet } from './workspace/documents.js';
12
+ import { prepareWorkspaceContext } from './workspace/prepare.js';
13
+ export type { CodebaseIndex, CodeNode, CodeEdge, CodeNodeType, CodeEdgeType } from './code/types.js';
14
+ export type { CodeQuerySession, CodeSessionChunkOptions } from './code/session.js';
15
+ export type { CodeIndexStore, CodeIndexStoreOptions, StoreStrategy, StoreMetadata, StoreSessionOptions } from './code/store.js';
16
+ export type { CodeChunk } from './code/chunk.js';
17
+ export type { BuildCodebaseOptions } from './code/build.js';
18
+ export type { OnProgress, ProgressEvent } from './progress-event.js';
19
+ export type { WorkspacePrepareOptions, WorkspacePreparedContext, WorkspacePreparationProgressEvent, OnPrepareProgress } from './workspace/prepare-types.js';
20
+ export interface OccCodeNamespace {
21
+ buildIndex: typeof buildCodebaseIndex;
22
+ createSession: typeof createCodeQuerySession;
23
+ createSessionFromIndex: typeof createCodeQuerySessionFromIndex;
24
+ openStore: typeof openCodeIndexStore;
25
+ discover: typeof discoverCodeFiles;
26
+ chunk: typeof chunkCodebase;
27
+ chunkFromIndex: typeof chunkFromIndex;
28
+ }
29
+ export interface OccWorkspaceNamespace {
30
+ analyze: typeof analyzeWorkspace;
31
+ inspectDocuments: typeof inspectWorkspaceDocumentSet;
32
+ prepare: typeof prepareWorkspaceContext;
33
+ }
34
+ export interface OccDocNamespace {
35
+ inspect: typeof inspectDocument;
36
+ discover: typeof discoverDocuments;
37
+ }
38
+ export interface OccSheetNamespace {
39
+ inspect: typeof inspectWorkbook;
40
+ }
41
+ export interface OccSlideNamespace {
42
+ inspect: typeof inspectPresentation;
43
+ }
44
+ export interface OccNamespace {
45
+ code: OccCodeNamespace;
46
+ workspace: OccWorkspaceNamespace;
47
+ doc: OccDocNamespace;
48
+ sheet: OccSheetNamespace;
49
+ slide: OccSlideNamespace;
50
+ }
51
+ export declare function createOcc(): OccNamespace;
@@ -0,0 +1,41 @@
1
+ import { buildCodebaseIndex } from './code/build.js';
2
+ import { createCodeQuerySession, createCodeQuerySessionFromIndex, } from './code/session.js';
3
+ import { openCodeIndexStore } from './code/store.js';
4
+ import { chunkCodebase, chunkFromIndex } from './code/chunk.js';
5
+ import { discoverCodeFiles } from './code/discover.js';
6
+ import { inspectDocument } from './doc/inspect.js';
7
+ import { discoverDocuments } from './doc/discover.js';
8
+ import { inspectWorkbook } from './sheet/inspect.js';
9
+ import { inspectPresentation } from './slide/inspect.js';
10
+ import { analyzeWorkspace } from './workspace/analyze.js';
11
+ import { inspectWorkspaceDocumentSet } from './workspace/documents.js';
12
+ import { prepareWorkspaceContext } from './workspace/prepare.js';
13
+ export function createOcc() {
14
+ return {
15
+ code: {
16
+ buildIndex: buildCodebaseIndex,
17
+ createSession: createCodeQuerySession,
18
+ createSessionFromIndex: createCodeQuerySessionFromIndex,
19
+ openStore: openCodeIndexStore,
20
+ discover: discoverCodeFiles,
21
+ chunk: chunkCodebase,
22
+ chunkFromIndex: chunkFromIndex,
23
+ },
24
+ workspace: {
25
+ analyze: analyzeWorkspace,
26
+ inspectDocuments: inspectWorkspaceDocumentSet,
27
+ prepare: prepareWorkspaceContext,
28
+ },
29
+ doc: {
30
+ inspect: inspectDocument,
31
+ discover: discoverDocuments,
32
+ },
33
+ sheet: {
34
+ inspect: inspectWorkbook,
35
+ },
36
+ slide: {
37
+ inspect: inspectPresentation,
38
+ },
39
+ };
40
+ }
41
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EACL,sBAAsB,EACtB,+BAA+B,GAChC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAgDjE,MAAM,UAAU,SAAS;IACvB,OAAO;QACL,IAAI,EAAE;YACJ,UAAU,EAAE,kBAAkB;YAC9B,aAAa,EAAE,sBAAsB;YACrC,sBAAsB,EAAE,+BAA+B;YACvD,SAAS,EAAE,kBAAkB;YAC7B,QAAQ,EAAE,iBAAiB;YAC3B,KAAK,EAAE,aAAa;YACpB,cAAc,EAAE,cAAc;SAC/B;QACD,SAAS,EAAE;YACT,OAAO,EAAE,gBAAgB;YACzB,gBAAgB,EAAE,2BAA2B;YAC7C,OAAO,EAAE,uBAAuB;SACjC;QACD,GAAG,EAAE;YACH,OAAO,EAAE,eAAe;YACxB,QAAQ,EAAE,iBAAiB;SAC5B;QACD,KAAK,EAAE;YACL,OAAO,EAAE,eAAe;SACzB;QACD,KAAK,EAAE;YACL,OAAO,EAAE,mBAAmB;SAC7B;KACF,CAAC;AACJ,CAAC"}
@@ -1,3 +1,4 @@
1
+ import type { OnProgress } from '../progress-event.js';
1
2
  import type { WorkspaceDocumentSet } from './types.js';
2
3
  export interface InspectWorkspaceDocumentSetOptions {
3
4
  excludeDir?: string[];
@@ -7,4 +8,4 @@ export interface InspectWorkspaceDocumentSetOptions {
7
8
  maxReferenceFiles?: number;
8
9
  includeMarkdown?: boolean;
9
10
  }
10
- export declare function inspectWorkspaceDocumentSet(rootDir: string, options?: InspectWorkspaceDocumentSetOptions): Promise<WorkspaceDocumentSet>;
11
+ export declare function inspectWorkspaceDocumentSet(rootDir: string, options?: InspectWorkspaceDocumentSetOptions, onProgress?: OnProgress): Promise<WorkspaceDocumentSet>;
@@ -5,7 +5,7 @@ import { documentToMarkdown } from '../markdown/convert.js';
5
5
  import { detectCrossReferences } from '../doc/references.js';
6
6
  import { inspectDocumentSummary } from '../doc/batch.js';
7
7
  const DOCUMENT_FORMATS = new Set(['docx', 'pdf', 'pptx', 'xlsx', 'odt', 'ods', 'odp']);
8
- export async function inspectWorkspaceDocumentSet(rootDir, options = {}) {
8
+ export async function inspectWorkspaceDocumentSet(rootDir, options = {}, onProgress) {
9
9
  const resolvedRoot = path.resolve(rootDir);
10
10
  const excludeDir = options.excludeDir ?? ['node_modules', '.git', 'dist', 'vendor', 'build', 'coverage', 'target'];
11
11
  const discovery = await findFiles([resolvedRoot], {
@@ -22,7 +22,20 @@ export async function inspectWorkspaceDocumentSet(rootDir, options = {}) {
22
22
  const discovered = discovery.files
23
23
  .filter((file) => DOCUMENT_FORMATS.has(getExtension(file.path)))
24
24
  .slice(0, maxFiles);
25
- for (const file of discovered) {
25
+ onProgress?.({ phase: 'discover', total: discovered.length, completed: discovered.length, detail: discovered.length > 0 ? `${discovered.length} documents found` : 'No documents found' });
26
+ if (discovered.length === 0) {
27
+ return {
28
+ schemaVersion: 1,
29
+ rootDir: resolvedRoot,
30
+ documents: [],
31
+ crossReferences: [],
32
+ unresolvedMentions: [],
33
+ skipped: discovery.skipped,
34
+ errors: [],
35
+ };
36
+ }
37
+ for (let i = 0; i < discovered.length; i++) {
38
+ const file = discovered[i];
26
39
  const relativePath = path.relative(resolvedRoot, file.path).split(path.sep).join('/');
27
40
  const format = getExtension(file.path);
28
41
  const result = await inspectDocumentSummary(file.path, relativePath, format, { includeMarkdown });
@@ -36,9 +49,12 @@ export async function inspectWorkspaceDocumentSet(rootDir, options = {}) {
36
49
  message: result.error,
37
50
  });
38
51
  }
52
+ onProgress?.({ phase: 'inspect', total: discovered.length, completed: i + 1, detail: relativePath });
39
53
  }
40
54
  const docsWithContent = [];
41
- for (const doc of documents.slice(0, maxReferenceFiles)) {
55
+ const refSlice = documents.slice(0, maxReferenceFiles);
56
+ for (let i = 0; i < refSlice.length; i++) {
57
+ const doc = refSlice[i];
42
58
  try {
43
59
  const content = doc.markdownContent ?? markdownByPath.get(doc.filePath) ?? await documentToMarkdown(doc.filePath);
44
60
  if (content)
@@ -51,10 +67,12 @@ export async function inspectWorkspaceDocumentSet(rootDir, options = {}) {
51
67
  message: error.message,
52
68
  });
53
69
  }
70
+ onProgress?.({ phase: 'references', total: refSlice.length, completed: i + 1, detail: path.relative(resolvedRoot, doc.filePath).split(path.sep).join('/') });
54
71
  }
55
72
  const references = docsWithContent.length >= 2
56
73
  ? detectCrossReferences(docsWithContent)
57
74
  : { references: [], unresolvedMentions: [] };
75
+ onProgress?.({ phase: 'cross-references', total: 1, completed: 1, detail: `${references.references.length} cross-references detected` });
58
76
  return {
59
77
  schemaVersion: 1,
60
78
  rootDir: resolvedRoot,
@@ -1 +1 @@
1
- {"version":3,"file":"documents.js","sourceRoot":"","sources":["../../../src/workspace/documents.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"documents.js","sourceRoot":"","sources":["../../../src/workspace/documents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Internal subprocess entry point for workspace preparation.
3
+ * Spawned via fork() by prepare.ts — not a public API.
4
+ *
5
+ * IPC protocol:
6
+ * Parent → Child: { type: 'start', options: BuildCodebaseOptions }
7
+ * Child → Parent: { type: 'progress', event: ProgressEvent }
8
+ * Child → Parent: { type: 'complete', resultPath: string }
9
+ * Child → Parent: { type: 'error', message: string }
10
+ */
11
+ export {};
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Internal subprocess entry point for workspace preparation.
3
+ * Spawned via fork() by prepare.ts — not a public API.
4
+ *
5
+ * IPC protocol:
6
+ * Parent → Child: { type: 'start', options: BuildCodebaseOptions }
7
+ * Child → Parent: { type: 'progress', event: ProgressEvent }
8
+ * Child → Parent: { type: 'complete', resultPath: string }
9
+ * Child → Parent: { type: 'error', message: string }
10
+ */
11
+ import { writeFileSync } from 'node:fs';
12
+ import { join } from 'node:path';
13
+ import { tmpdir } from 'node:os';
14
+ import { buildCodebaseIndex } from '../code/build.js';
15
+ function send(msg) {
16
+ if (process.send) {
17
+ process.send(msg);
18
+ }
19
+ }
20
+ process.on('message', async (msg) => {
21
+ if (msg.type !== 'start')
22
+ return;
23
+ try {
24
+ const index = await buildCodebaseIndex(msg.options, (event) => {
25
+ send({ type: 'progress', event });
26
+ });
27
+ // Write index to temp file to avoid IPC size limits (~50MB+ indexes)
28
+ const resultPath = join(tmpdir(), `occ-prepare-${process.pid}-${Date.now()}.json`);
29
+ writeFileSync(resultPath, JSON.stringify(index));
30
+ send({ type: 'complete', resultPath });
31
+ }
32
+ catch (err) {
33
+ const error = err instanceof Error ? err : new Error(String(err));
34
+ send({ type: 'error', message: error.message });
35
+ }
36
+ if (process.connected) {
37
+ process.disconnect?.();
38
+ }
39
+ });
40
+ //# sourceMappingURL=prepare-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepare-runner.js","sourceRoot":"","sources":["../../../src/workspace/prepare-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAStD,SAAS,IAAI,CAAC,GAA6C;IACzD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,GAAiB,EAAE,EAAE;IAChD,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO;IAEjC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,KAAoB,EAAE,EAAE;YAC3E,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,qEAAqE;QACrE,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACnF,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QACjD,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAClE,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;IACzB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,50 @@
1
+ import type { CodebaseIndex } from '../code/types.js';
2
+ import type { WorkspaceDocumentSet } from './types.js';
3
+ export interface WorkspacePrepareOptions {
4
+ /** Include code indexing via buildCodebaseIndex. Default: true. */
5
+ includeCode?: boolean;
6
+ /** Include document inspection via inspectWorkspaceDocumentSet. Default: true. */
7
+ includeDocuments?: boolean;
8
+ /** Directories to exclude from both code and document discovery. */
9
+ excludeDir?: string[];
10
+ /** Disable .gitignore respect. */
11
+ noGitignore?: boolean;
12
+ /** Maximum document file size in MB. */
13
+ largeFileLimitMb?: number;
14
+ /** Maximum number of document files to inspect. */
15
+ maxFiles?: number;
16
+ /** Maximum number of documents to load for cross-reference detection. */
17
+ maxReferenceFiles?: number;
18
+ /** Include raw markdown content in document summaries. */
19
+ includeMarkdown?: boolean;
20
+ /**
21
+ * Execution mode for code indexing.
22
+ * - `'auto'` (default): subprocess when code indexing is enabled, inline for docs-only.
23
+ * - `'inline'`: run code indexing in the current process.
24
+ * - `'subprocess'`: always fork a child process for code indexing.
25
+ */
26
+ executionMode?: 'auto' | 'inline' | 'subprocess';
27
+ }
28
+ export interface WorkspacePreparedContext {
29
+ rootDir: string;
30
+ code: {
31
+ index: CodebaseIndex;
32
+ fileCount: number;
33
+ nodeCount: number;
34
+ edgeCount: number;
35
+ } | null;
36
+ documents: WorkspaceDocumentSet | null;
37
+ elapsedMs: number;
38
+ errors: string[];
39
+ }
40
+ export interface WorkspacePreparationProgressEvent {
41
+ /** Which subsystem is reporting: 'prepare' for overall, 'code' for indexing, 'documents' for inspection. */
42
+ scope: 'prepare' | 'code' | 'documents';
43
+ /** Current stage within the scope (e.g. 'discover', 'parse', 'index', 'inspect', 'references'). */
44
+ stage: string;
45
+ completed: number;
46
+ total: number;
47
+ detail?: string;
48
+ stats?: Record<string, number>;
49
+ }
50
+ export type OnPrepareProgress = (event: WorkspacePreparationProgressEvent) => void;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=prepare-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepare-types.js","sourceRoot":"","sources":["../../../src/workspace/prepare-types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ import type { WorkspacePrepareOptions, WorkspacePreparedContext, OnPrepareProgress } from './prepare-types.js';
2
+ export declare function prepareWorkspaceContext(rootDir: string, options?: WorkspacePrepareOptions, onProgress?: OnPrepareProgress): Promise<WorkspacePreparedContext>;
@@ -0,0 +1,151 @@
1
+ import path from 'node:path';
2
+ import { fork } from 'node:child_process';
3
+ import { readFileSync, unlinkSync } from 'node:fs';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { buildCodebaseIndex } from '../code/build.js';
6
+ import { inspectWorkspaceDocumentSet } from './documents.js';
7
+ function resolveExecutionMode(options) {
8
+ const mode = options.executionMode ?? 'auto';
9
+ if (mode === 'inline')
10
+ return 'inline';
11
+ if (mode === 'subprocess')
12
+ return 'subprocess';
13
+ // auto: subprocess when code indexing is enabled
14
+ return (options.includeCode !== false) ? 'subprocess' : 'inline';
15
+ }
16
+ function mapCodeProgress(event, onProgress) {
17
+ onProgress({
18
+ scope: 'code',
19
+ stage: event.phase,
20
+ completed: event.completed,
21
+ total: event.total,
22
+ detail: event.detail,
23
+ });
24
+ }
25
+ async function buildCodeInline(rootDir, options, onProgress) {
26
+ return buildCodebaseIndex({
27
+ repoRoot: rootDir,
28
+ excludeDir: options.excludeDir,
29
+ noGitignore: options.noGitignore,
30
+ }, onProgress ? (event) => mapCodeProgress(event, onProgress) : undefined);
31
+ }
32
+ async function buildCodeSubprocess(rootDir, options, onProgress) {
33
+ const runnerPath = path.resolve(path.dirname(fileURLToPath(import.meta.url)), 'prepare-runner.js');
34
+ return new Promise((resolve, reject) => {
35
+ let settled = false;
36
+ const child = fork(runnerPath, [], { stdio: ['ignore', 'ignore', 'pipe', 'ipc'] });
37
+ let stderr = '';
38
+ child.stderr?.on('data', (d) => {
39
+ stderr += d.toString();
40
+ });
41
+ child.on('message', (msg) => {
42
+ if (msg.type === 'progress' && msg.event && onProgress) {
43
+ mapCodeProgress(msg.event, onProgress);
44
+ }
45
+ else if (msg.type === 'complete' && msg.resultPath) {
46
+ settled = true;
47
+ try {
48
+ const index = JSON.parse(readFileSync(msg.resultPath, 'utf-8'));
49
+ unlinkSync(msg.resultPath);
50
+ resolve(index);
51
+ }
52
+ catch (err) {
53
+ reject(err instanceof Error ? err : new Error(String(err)));
54
+ }
55
+ }
56
+ else if (msg.type === 'error') {
57
+ settled = true;
58
+ reject(new Error(msg.message ?? 'Subprocess failed'));
59
+ }
60
+ });
61
+ child.on('error', (err) => {
62
+ settled = true;
63
+ reject(err);
64
+ });
65
+ child.on('close', (code) => {
66
+ if (settled)
67
+ return;
68
+ if (code !== 0) {
69
+ reject(new Error(`Prepare runner exited with code ${code}: ${stderr.trim()}`));
70
+ }
71
+ else {
72
+ reject(new Error('Prepare runner exited without sending a result'));
73
+ }
74
+ });
75
+ child.send({
76
+ type: 'start',
77
+ options: {
78
+ repoRoot: rootDir,
79
+ excludeDir: options.excludeDir,
80
+ noGitignore: options.noGitignore,
81
+ },
82
+ });
83
+ });
84
+ }
85
+ export async function prepareWorkspaceContext(rootDir, options = {}, onProgress) {
86
+ const resolvedRoot = path.resolve(rootDir);
87
+ const startedAt = Date.now();
88
+ const errors = [];
89
+ const includeCode = options.includeCode !== false;
90
+ const includeDocuments = options.includeDocuments !== false;
91
+ onProgress?.({ scope: 'prepare', stage: 'start', completed: 0, total: 1, detail: 'Starting workspace preparation' });
92
+ // Phase 1: Code indexing
93
+ let codeResult = null;
94
+ if (includeCode) {
95
+ try {
96
+ const mode = resolveExecutionMode(options);
97
+ const buildFn = mode === 'subprocess' ? buildCodeSubprocess : buildCodeInline;
98
+ const index = await buildFn(resolvedRoot, options, onProgress);
99
+ codeResult = {
100
+ index,
101
+ fileCount: index.files.length,
102
+ nodeCount: index.nodes.length,
103
+ edgeCount: index.edges.length,
104
+ };
105
+ }
106
+ catch (err) {
107
+ const error = err instanceof Error ? err : new Error(String(err));
108
+ errors.push(`Code indexing failed: ${error.message}`);
109
+ }
110
+ }
111
+ // Phase 2: Document inspection
112
+ let documentsResult = null;
113
+ if (includeDocuments) {
114
+ try {
115
+ const docSet = await inspectWorkspaceDocumentSet(resolvedRoot, {
116
+ excludeDir: options.excludeDir,
117
+ noGitignore: options.noGitignore,
118
+ largeFileLimitMb: options.largeFileLimitMb,
119
+ maxFiles: options.maxFiles,
120
+ maxReferenceFiles: options.maxReferenceFiles,
121
+ includeMarkdown: options.includeMarkdown,
122
+ }, onProgress ? (event) => {
123
+ onProgress({
124
+ scope: 'documents',
125
+ stage: event.phase,
126
+ completed: event.completed,
127
+ total: event.total,
128
+ detail: event.detail,
129
+ });
130
+ } : undefined);
131
+ documentsResult = docSet;
132
+ for (const err of docSet.errors) {
133
+ errors.push(`Document error${err.path ? ` (${err.path})` : ''}: ${err.message}`);
134
+ }
135
+ }
136
+ catch (err) {
137
+ const error = err instanceof Error ? err : new Error(String(err));
138
+ errors.push(`Document inspection failed: ${error.message}`);
139
+ }
140
+ }
141
+ const elapsedMs = Date.now() - startedAt;
142
+ onProgress?.({ scope: 'prepare', stage: 'complete', completed: 1, total: 1, detail: `Completed in ${elapsedMs}ms` });
143
+ return {
144
+ rootDir: resolvedRoot,
145
+ code: codeResult,
146
+ documents: documentsResult,
147
+ elapsedMs,
148
+ errors,
149
+ };
150
+ }
151
+ //# sourceMappingURL=prepare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepare.js","sourceRoot":"","sources":["../../../src/workspace/prepare.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@cesarandreslopez/occ",
3
- "version": "0.6.3",
3
+ "version": "0.8.0",
4
4
  "description": "Office Cloc and Count — scc-style summary tables for office documents",
5
5
  "type": "module",
6
- "main": "./dist/bin/occ.js",
7
- "types": "./dist/bin/occ.d.ts",
6
+ "main": "./dist/src/index.js",
7
+ "types": "./dist/src/index.d.ts",
8
8
  "bin": {
9
9
  "occ": "./dist/bin/occ.js"
10
10
  },
@@ -37,8 +37,8 @@
37
37
  ],
38
38
  "exports": {
39
39
  ".": {
40
- "types": "./dist/bin/occ.d.ts",
41
- "default": "./dist/bin/occ.js"
40
+ "types": "./dist/src/index.d.ts",
41
+ "default": "./dist/src/index.js"
42
42
  },
43
43
  "./code/build": {
44
44
  "types": "./dist/src/code/build.d.ts",
@@ -68,6 +68,10 @@
68
68
  "types": "./dist/src/code/cache.d.ts",
69
69
  "default": "./dist/src/code/cache.js"
70
70
  },
71
+ "./code/store": {
72
+ "types": "./dist/src/code/store.d.ts",
73
+ "default": "./dist/src/code/store.js"
74
+ },
71
75
  "./doc/inspect": {
72
76
  "types": "./dist/src/doc/inspect.d.ts",
73
77
  "default": "./dist/src/doc/inspect.js"
@@ -96,6 +100,14 @@
96
100
  "types": "./dist/src/workspace/types.d.ts",
97
101
  "default": "./dist/src/workspace/types.js"
98
102
  },
103
+ "./workspace/prepare": {
104
+ "types": "./dist/src/workspace/prepare.d.ts",
105
+ "default": "./dist/src/workspace/prepare.js"
106
+ },
107
+ "./workspace/prepare-types": {
108
+ "types": "./dist/src/workspace/prepare-types.d.ts",
109
+ "default": "./dist/src/workspace/prepare-types.js"
110
+ },
99
111
  "./markdown/convert": {
100
112
  "types": "./dist/src/markdown/convert.d.ts",
101
113
  "default": "./dist/src/markdown/convert.js"
@@ -172,6 +184,9 @@
172
184
  "code/cache": [
173
185
  "dist/src/code/cache.d.ts"
174
186
  ],
187
+ "code/store": [
188
+ "dist/src/code/store.d.ts"
189
+ ],
175
190
  "doc/inspect": [
176
191
  "dist/src/doc/inspect.d.ts"
177
192
  ],
@@ -199,6 +214,12 @@
199
214
  "workspace/types": [
200
215
  "dist/src/workspace/types.d.ts"
201
216
  ],
217
+ "workspace/prepare": [
218
+ "dist/src/workspace/prepare.d.ts"
219
+ ],
220
+ "workspace/prepare-types": [
221
+ "dist/src/workspace/prepare-types.d.ts"
222
+ ],
202
223
  "markdown/convert": [
203
224
  "dist/src/markdown/convert.d.ts"
204
225
  ],