@jacques-ai/core 0.0.7-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/archive/archive-store.d.ts +166 -0
- package/dist/archive/archive-store.d.ts.map +1 -0
- package/dist/archive/archive-store.js +612 -0
- package/dist/archive/archive-store.js.map +1 -0
- package/dist/archive/bulk-archive.d.ts +63 -0
- package/dist/archive/bulk-archive.d.ts.map +1 -0
- package/dist/archive/bulk-archive.js +315 -0
- package/dist/archive/bulk-archive.js.map +1 -0
- package/dist/archive/filename-utils.d.ts +39 -0
- package/dist/archive/filename-utils.d.ts.map +1 -0
- package/dist/archive/filename-utils.js +78 -0
- package/dist/archive/filename-utils.js.map +1 -0
- package/dist/archive/index.d.ts +21 -0
- package/dist/archive/index.d.ts.map +1 -0
- package/dist/archive/index.js +45 -0
- package/dist/archive/index.js.map +1 -0
- package/dist/archive/manifest-extractor.d.ts +40 -0
- package/dist/archive/manifest-extractor.d.ts.map +1 -0
- package/dist/archive/manifest-extractor.js +456 -0
- package/dist/archive/manifest-extractor.js.map +1 -0
- package/dist/archive/migration.d.ts +59 -0
- package/dist/archive/migration.d.ts.map +1 -0
- package/dist/archive/migration.js +172 -0
- package/dist/archive/migration.js.map +1 -0
- package/dist/archive/plan-cataloger.d.ts +24 -0
- package/dist/archive/plan-cataloger.d.ts.map +1 -0
- package/dist/archive/plan-cataloger.js +100 -0
- package/dist/archive/plan-cataloger.js.map +1 -0
- package/dist/archive/plan-extractor.d.ts +84 -0
- package/dist/archive/plan-extractor.d.ts.map +1 -0
- package/dist/archive/plan-extractor.js +371 -0
- package/dist/archive/plan-extractor.js.map +1 -0
- package/dist/archive/search-indexer.d.ts +50 -0
- package/dist/archive/search-indexer.d.ts.map +1 -0
- package/dist/archive/search-indexer.js +294 -0
- package/dist/archive/search-indexer.js.map +1 -0
- package/dist/archive/subagent-store.d.ts +113 -0
- package/dist/archive/subagent-store.d.ts.map +1 -0
- package/dist/archive/subagent-store.js +173 -0
- package/dist/archive/subagent-store.js.map +1 -0
- package/dist/archive/types.d.ts +236 -0
- package/dist/archive/types.d.ts.map +1 -0
- package/dist/archive/types.js +30 -0
- package/dist/archive/types.js.map +1 -0
- package/dist/branding.d.ts +9 -0
- package/dist/branding.d.ts.map +1 -0
- package/dist/branding.js +50 -0
- package/dist/branding.js.map +1 -0
- package/dist/cache/git-utils.d.ts +36 -0
- package/dist/cache/git-utils.d.ts.map +1 -0
- package/dist/cache/git-utils.js +160 -0
- package/dist/cache/git-utils.js.map +1 -0
- package/dist/cache/hidden-projects.d.ts +19 -0
- package/dist/cache/hidden-projects.d.ts.map +1 -0
- package/dist/cache/hidden-projects.js +48 -0
- package/dist/cache/hidden-projects.js.map +1 -0
- package/dist/cache/index.d.ts +15 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +20 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/metadata-extractor.d.ts +62 -0
- package/dist/cache/metadata-extractor.d.ts.map +1 -0
- package/dist/cache/metadata-extractor.js +574 -0
- package/dist/cache/metadata-extractor.js.map +1 -0
- package/dist/cache/mode-detector.d.ts +19 -0
- package/dist/cache/mode-detector.d.ts.map +1 -0
- package/dist/cache/mode-detector.js +161 -0
- package/dist/cache/mode-detector.js.map +1 -0
- package/dist/cache/persistence.d.ts +39 -0
- package/dist/cache/persistence.d.ts.map +1 -0
- package/dist/cache/persistence.js +98 -0
- package/dist/cache/persistence.js.map +1 -0
- package/dist/cache/project-discovery.d.ts +41 -0
- package/dist/cache/project-discovery.d.ts.map +1 -0
- package/dist/cache/project-discovery.js +212 -0
- package/dist/cache/project-discovery.js.map +1 -0
- package/dist/cache/session-index.d.ts +258 -0
- package/dist/cache/session-index.d.ts.map +1 -0
- package/dist/cache/session-index.js +1030 -0
- package/dist/cache/session-index.js.map +1 -0
- package/dist/cache/types.d.ts +159 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +29 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/catalog/bulk-extractor.d.ts +18 -0
- package/dist/catalog/bulk-extractor.d.ts.map +1 -0
- package/dist/catalog/bulk-extractor.js +150 -0
- package/dist/catalog/bulk-extractor.js.map +1 -0
- package/dist/catalog/extractor.d.ts +53 -0
- package/dist/catalog/extractor.d.ts.map +1 -0
- package/dist/catalog/extractor.js +522 -0
- package/dist/catalog/extractor.js.map +1 -0
- package/dist/catalog/index.d.ts +10 -0
- package/dist/catalog/index.d.ts.map +1 -0
- package/dist/catalog/index.js +11 -0
- package/dist/catalog/index.js.map +1 -0
- package/dist/catalog/types.d.ts +134 -0
- package/dist/catalog/types.d.ts.map +1 -0
- package/dist/catalog/types.js +8 -0
- package/dist/catalog/types.js.map +1 -0
- package/dist/client/index.d.ts +6 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +5 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/websocket-client.d.ts +96 -0
- package/dist/client/websocket-client.d.ts.map +1 -0
- package/dist/client/websocket-client.js +222 -0
- package/dist/client/websocket-client.js.map +1 -0
- package/dist/context/index.d.ts +13 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +26 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/indexer.d.ts +73 -0
- package/dist/context/indexer.d.ts.map +1 -0
- package/dist/context/indexer.js +233 -0
- package/dist/context/indexer.js.map +1 -0
- package/dist/context/manager.d.ts +66 -0
- package/dist/context/manager.d.ts.map +1 -0
- package/dist/context/manager.js +310 -0
- package/dist/context/manager.js.map +1 -0
- package/dist/context/types.d.ts +149 -0
- package/dist/context/types.d.ts.map +1 -0
- package/dist/context/types.js +36 -0
- package/dist/context/types.js.map +1 -0
- package/dist/handoff/catalog.d.ts +54 -0
- package/dist/handoff/catalog.d.ts.map +1 -0
- package/dist/handoff/catalog.js +121 -0
- package/dist/handoff/catalog.js.map +1 -0
- package/dist/handoff/generator.d.ts +107 -0
- package/dist/handoff/generator.d.ts.map +1 -0
- package/dist/handoff/generator.js +603 -0
- package/dist/handoff/generator.js.map +1 -0
- package/dist/handoff/index.d.ts +13 -0
- package/dist/handoff/index.d.ts.map +1 -0
- package/dist/handoff/index.js +12 -0
- package/dist/handoff/index.js.map +1 -0
- package/dist/handoff/llm-generator.d.ts +77 -0
- package/dist/handoff/llm-generator.d.ts.map +1 -0
- package/dist/handoff/llm-generator.js +513 -0
- package/dist/handoff/llm-generator.js.map +1 -0
- package/dist/handoff/prompts.d.ts +18 -0
- package/dist/handoff/prompts.d.ts.map +1 -0
- package/dist/handoff/prompts.js +22 -0
- package/dist/handoff/prompts.js.map +1 -0
- package/dist/handoff/types.d.ts +28 -0
- package/dist/handoff/types.d.ts.map +1 -0
- package/dist/handoff/types.js +7 -0
- package/dist/handoff/types.js.map +1 -0
- package/dist/index.d.ts +56 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +132 -0
- package/dist/index.js.map +1 -0
- package/dist/logging/claude-operations.d.ts +111 -0
- package/dist/logging/claude-operations.d.ts.map +1 -0
- package/dist/logging/claude-operations.js +132 -0
- package/dist/logging/claude-operations.js.map +1 -0
- package/dist/logging/error-utils.d.ts +18 -0
- package/dist/logging/error-utils.d.ts.map +1 -0
- package/dist/logging/error-utils.js +37 -0
- package/dist/logging/error-utils.js.map +1 -0
- package/dist/logging/index.d.ts +11 -0
- package/dist/logging/index.d.ts.map +1 -0
- package/dist/logging/index.js +10 -0
- package/dist/logging/index.js.map +1 -0
- package/dist/logging/logger.d.ts +25 -0
- package/dist/logging/logger.d.ts.map +1 -0
- package/dist/logging/logger.js +39 -0
- package/dist/logging/logger.js.map +1 -0
- package/dist/notifications/constants.d.ts +16 -0
- package/dist/notifications/constants.d.ts.map +1 -0
- package/dist/notifications/constants.js +49 -0
- package/dist/notifications/constants.js.map +1 -0
- package/dist/notifications/index.d.ts +9 -0
- package/dist/notifications/index.d.ts.map +1 -0
- package/dist/notifications/index.js +8 -0
- package/dist/notifications/index.js.map +1 -0
- package/dist/notifications/types.d.ts +28 -0
- package/dist/notifications/types.d.ts.map +1 -0
- package/dist/notifications/types.js +7 -0
- package/dist/notifications/types.js.map +1 -0
- package/dist/notifications/utils.d.ts +20 -0
- package/dist/notifications/utils.d.ts.map +1 -0
- package/dist/notifications/utils.js +37 -0
- package/dist/notifications/utils.js.map +1 -0
- package/dist/plan/index.d.ts +12 -0
- package/dist/plan/index.d.ts.map +1 -0
- package/dist/plan/index.js +15 -0
- package/dist/plan/index.js.map +1 -0
- package/dist/plan/plan-parser.d.ts +33 -0
- package/dist/plan/plan-parser.d.ts.map +1 -0
- package/dist/plan/plan-parser.js +189 -0
- package/dist/plan/plan-parser.js.map +1 -0
- package/dist/plan/progress-computer.d.ts +34 -0
- package/dist/plan/progress-computer.d.ts.map +1 -0
- package/dist/plan/progress-computer.js +211 -0
- package/dist/plan/progress-computer.js.map +1 -0
- package/dist/plan/progress-matcher.d.ts +34 -0
- package/dist/plan/progress-matcher.d.ts.map +1 -0
- package/dist/plan/progress-matcher.js +297 -0
- package/dist/plan/progress-matcher.js.map +1 -0
- package/dist/plan/task-extractor.d.ts +30 -0
- package/dist/plan/task-extractor.d.ts.map +1 -0
- package/dist/plan/task-extractor.js +435 -0
- package/dist/plan/task-extractor.js.map +1 -0
- package/dist/plan/types.d.ts +131 -0
- package/dist/plan/types.d.ts.map +1 -0
- package/dist/plan/types.js +8 -0
- package/dist/plan/types.js.map +1 -0
- package/dist/project/aggregator.d.ts +43 -0
- package/dist/project/aggregator.d.ts.map +1 -0
- package/dist/project/aggregator.js +218 -0
- package/dist/project/aggregator.js.map +1 -0
- package/dist/project/index.d.ts +9 -0
- package/dist/project/index.d.ts.map +1 -0
- package/dist/project/index.js +9 -0
- package/dist/project/index.js.map +1 -0
- package/dist/project/types.d.ts +65 -0
- package/dist/project/types.d.ts.map +1 -0
- package/dist/project/types.js +27 -0
- package/dist/project/types.js.map +1 -0
- package/dist/session/detector.d.ts +113 -0
- package/dist/session/detector.d.ts.map +1 -0
- package/dist/session/detector.js +333 -0
- package/dist/session/detector.js.map +1 -0
- package/dist/session/filters.d.ts +32 -0
- package/dist/session/filters.d.ts.map +1 -0
- package/dist/session/filters.js +100 -0
- package/dist/session/filters.js.map +1 -0
- package/dist/session/format-title.d.ts +16 -0
- package/dist/session/format-title.d.ts.map +1 -0
- package/dist/session/format-title.js +54 -0
- package/dist/session/format-title.js.map +1 -0
- package/dist/session/index.d.ts +16 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +10 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/parser.d.ts +264 -0
- package/dist/session/parser.d.ts.map +1 -0
- package/dist/session/parser.js +588 -0
- package/dist/session/parser.js.map +1 -0
- package/dist/session/token-estimator.d.ts +32 -0
- package/dist/session/token-estimator.d.ts.map +1 -0
- package/dist/session/token-estimator.js +139 -0
- package/dist/session/token-estimator.js.map +1 -0
- package/dist/session/transformer.d.ts +126 -0
- package/dist/session/transformer.d.ts.map +1 -0
- package/dist/session/transformer.js +158 -0
- package/dist/session/transformer.js.map +1 -0
- package/dist/setup/hooks-config.d.ts +35 -0
- package/dist/setup/hooks-config.d.ts.map +1 -0
- package/dist/setup/hooks-config.js +107 -0
- package/dist/setup/hooks-config.js.map +1 -0
- package/dist/setup/hooks-symlink.d.ts +17 -0
- package/dist/setup/hooks-symlink.d.ts.map +1 -0
- package/dist/setup/hooks-symlink.js +89 -0
- package/dist/setup/hooks-symlink.js.map +1 -0
- package/dist/setup/index.d.ts +13 -0
- package/dist/setup/index.d.ts.map +1 -0
- package/dist/setup/index.js +12 -0
- package/dist/setup/index.js.map +1 -0
- package/dist/setup/prerequisites.d.ts +11 -0
- package/dist/setup/prerequisites.d.ts.map +1 -0
- package/dist/setup/prerequisites.js +72 -0
- package/dist/setup/prerequisites.js.map +1 -0
- package/dist/setup/settings-merge.d.ts +33 -0
- package/dist/setup/settings-merge.d.ts.map +1 -0
- package/dist/setup/settings-merge.js +131 -0
- package/dist/setup/settings-merge.js.map +1 -0
- package/dist/setup/skills-install.d.ts +17 -0
- package/dist/setup/skills-install.d.ts.map +1 -0
- package/dist/setup/skills-install.js +60 -0
- package/dist/setup/skills-install.js.map +1 -0
- package/dist/setup/types.d.ts +39 -0
- package/dist/setup/types.d.ts.map +1 -0
- package/dist/setup/types.js +7 -0
- package/dist/setup/types.js.map +1 -0
- package/dist/setup/verification.d.ts +9 -0
- package/dist/setup/verification.d.ts.map +1 -0
- package/dist/setup/verification.js +91 -0
- package/dist/setup/verification.js.map +1 -0
- package/dist/shortcuts/index.d.ts +8 -0
- package/dist/shortcuts/index.d.ts.map +1 -0
- package/dist/shortcuts/index.js +6 -0
- package/dist/shortcuts/index.js.map +1 -0
- package/dist/shortcuts/key-utils.d.ts +54 -0
- package/dist/shortcuts/key-utils.d.ts.map +1 -0
- package/dist/shortcuts/key-utils.js +129 -0
- package/dist/shortcuts/key-utils.js.map +1 -0
- package/dist/shortcuts/shortcut-registry.d.ts +37 -0
- package/dist/shortcuts/shortcut-registry.d.ts.map +1 -0
- package/dist/shortcuts/shortcut-registry.js +322 -0
- package/dist/shortcuts/shortcut-registry.js.map +1 -0
- package/dist/sources/config.d.ts +91 -0
- package/dist/sources/config.d.ts.map +1 -0
- package/dist/sources/config.js +229 -0
- package/dist/sources/config.js.map +1 -0
- package/dist/sources/googledocs.d.ts +43 -0
- package/dist/sources/googledocs.d.ts.map +1 -0
- package/dist/sources/googledocs.js +298 -0
- package/dist/sources/googledocs.js.map +1 -0
- package/dist/sources/index.d.ts +14 -0
- package/dist/sources/index.d.ts.map +1 -0
- package/dist/sources/index.js +19 -0
- package/dist/sources/index.js.map +1 -0
- package/dist/sources/notion.d.ts +35 -0
- package/dist/sources/notion.d.ts.map +1 -0
- package/dist/sources/notion.js +352 -0
- package/dist/sources/notion.js.map +1 -0
- package/dist/sources/obsidian.d.ts +38 -0
- package/dist/sources/obsidian.d.ts.map +1 -0
- package/dist/sources/obsidian.js +228 -0
- package/dist/sources/obsidian.js.map +1 -0
- package/dist/sources/types.d.ts +133 -0
- package/dist/sources/types.d.ts.map +1 -0
- package/dist/sources/types.js +19 -0
- package/dist/sources/types.js.map +1 -0
- package/dist/storage/index.d.ts +6 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +5 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/writer.d.ts +86 -0
- package/dist/storage/writer.d.ts.map +1 -0
- package/dist/storage/writer.js +137 -0
- package/dist/storage/writer.js.map +1 -0
- package/dist/types.d.ts +203 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/claude-token.d.ts +49 -0
- package/dist/utils/claude-token.d.ts.map +1 -0
- package/dist/utils/claude-token.js +169 -0
- package/dist/utils/claude-token.js.map +1 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +13 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/settings.d.ts +100 -0
- package/dist/utils/settings.d.ts.map +1 -0
- package/dist/utils/settings.js +206 -0
- package/dist/utils/settings.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,456 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Manifest Extractor
|
|
3
|
+
*
|
|
4
|
+
* Extracts ConversationManifest from JSONL session files.
|
|
5
|
+
* Reuses existing parser for JSONL parsing.
|
|
6
|
+
*/
|
|
7
|
+
import { promises as fs } from "fs";
|
|
8
|
+
import * as path from "path";
|
|
9
|
+
import { homedir } from "os";
|
|
10
|
+
import { parseJSONL } from "../session/parser.js";
|
|
11
|
+
import { extractEmbeddedPlans } from "./plan-extractor.js";
|
|
12
|
+
import { catalogPlan } from "./plan-cataloger.js";
|
|
13
|
+
/** Max chars for truncated user questions */
|
|
14
|
+
const MAX_QUESTION_LENGTH = 200;
|
|
15
|
+
/** Max chars for context snippets */
|
|
16
|
+
const MAX_SNIPPET_LENGTH = 300;
|
|
17
|
+
/** Max number of context snippets to store */
|
|
18
|
+
const MAX_SNIPPETS = 20;
|
|
19
|
+
/** Technology detection patterns */
|
|
20
|
+
const TECH_PATTERNS = [
|
|
21
|
+
// Languages
|
|
22
|
+
{ pattern: /typescript|\.tsx?$/i, tech: "typescript" },
|
|
23
|
+
{ pattern: /javascript|\.jsx?$/i, tech: "javascript" },
|
|
24
|
+
{ pattern: /python|\.py$/i, tech: "python" },
|
|
25
|
+
{ pattern: /rust|\.rs$/i, tech: "rust" },
|
|
26
|
+
{ pattern: /golang|\.go$/i, tech: "go" },
|
|
27
|
+
{ pattern: /java(?!script)|\.java$/i, tech: "java" },
|
|
28
|
+
{ pattern: /c\+\+|\.cpp$|\.cc$/i, tech: "cpp" },
|
|
29
|
+
{ pattern: /c#|csharp|\.cs$/i, tech: "csharp" },
|
|
30
|
+
{ pattern: /ruby|\.rb$/i, tech: "ruby" },
|
|
31
|
+
{ pattern: /php|\.php$/i, tech: "php" },
|
|
32
|
+
{ pattern: /swift|\.swift$/i, tech: "swift" },
|
|
33
|
+
{ pattern: /kotlin|\.kt$/i, tech: "kotlin" },
|
|
34
|
+
// Frameworks
|
|
35
|
+
{ pattern: /\breact\b/i, tech: "react" },
|
|
36
|
+
{ pattern: /\bvue\b/i, tech: "vue" },
|
|
37
|
+
{ pattern: /\bangular\b/i, tech: "angular" },
|
|
38
|
+
{ pattern: /\bsvelte\b/i, tech: "svelte" },
|
|
39
|
+
{ pattern: /\bnextjs?\b|next\.config/i, tech: "nextjs" },
|
|
40
|
+
{ pattern: /\bnuxt\b/i, tech: "nuxt" },
|
|
41
|
+
{ pattern: /\bexpress\b/i, tech: "express" },
|
|
42
|
+
{ pattern: /\bfastapi\b/i, tech: "fastapi" },
|
|
43
|
+
{ pattern: /\bdjango\b/i, tech: "django" },
|
|
44
|
+
{ pattern: /\bflask\b/i, tech: "flask" },
|
|
45
|
+
{ pattern: /\brails\b/i, tech: "rails" },
|
|
46
|
+
{ pattern: /\bspring\b/i, tech: "spring" },
|
|
47
|
+
// Databases
|
|
48
|
+
{ pattern: /\bpostgres|psql\b/i, tech: "postgres" },
|
|
49
|
+
{ pattern: /\bmysql\b/i, tech: "mysql" },
|
|
50
|
+
{ pattern: /\bmongodb?\b/i, tech: "mongodb" },
|
|
51
|
+
{ pattern: /\bredis\b/i, tech: "redis" },
|
|
52
|
+
{ pattern: /\bsqlite\b/i, tech: "sqlite" },
|
|
53
|
+
{ pattern: /\bprisma\b/i, tech: "prisma" },
|
|
54
|
+
// Tools/Infrastructure
|
|
55
|
+
{ pattern: /\bdocker\b/i, tech: "docker" },
|
|
56
|
+
{ pattern: /\bkubernetes|k8s\b/i, tech: "kubernetes" },
|
|
57
|
+
{ pattern: /\baws\b/i, tech: "aws" },
|
|
58
|
+
{ pattern: /\bgcp\b|google cloud/i, tech: "gcp" },
|
|
59
|
+
{ pattern: /\bazure\b/i, tech: "azure" },
|
|
60
|
+
{ pattern: /\bgraphql\b/i, tech: "graphql" },
|
|
61
|
+
{ pattern: /\brest\s*api\b/i, tech: "rest" },
|
|
62
|
+
{ pattern: /\bwebsocket\b/i, tech: "websocket" },
|
|
63
|
+
{ pattern: /\bjest\b/i, tech: "jest" },
|
|
64
|
+
{ pattern: /\bpytest\b/i, tech: "pytest" },
|
|
65
|
+
{ pattern: /\bink\b.*\breact\b|\breact\b.*\bink\b/i, tech: "ink" },
|
|
66
|
+
{ pattern: /\btailwind\b/i, tech: "tailwind" },
|
|
67
|
+
// Build tools
|
|
68
|
+
{ pattern: /\bwebpack\b/i, tech: "webpack" },
|
|
69
|
+
{ pattern: /\bvite\b/i, tech: "vite" },
|
|
70
|
+
{ pattern: /\besbuild\b/i, tech: "esbuild" },
|
|
71
|
+
{ pattern: /\brollup\b/i, tech: "rollup" },
|
|
72
|
+
];
|
|
73
|
+
/**
|
|
74
|
+
* Get the plans directory from Claude Code settings
|
|
75
|
+
*/
|
|
76
|
+
export function getPlansDirectory() {
|
|
77
|
+
const settingsPath = path.join(homedir(), ".claude", "settings.json");
|
|
78
|
+
try {
|
|
79
|
+
// Use require("fs") for sync read to avoid top-level await
|
|
80
|
+
const fsSync = require("fs");
|
|
81
|
+
const content = fsSync.readFileSync(settingsPath, "utf-8");
|
|
82
|
+
const settings = JSON.parse(content);
|
|
83
|
+
return settings.plansDirectory || path.join(homedir(), ".claude", "plans");
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return path.join(homedir(), ".claude", "plans");
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Extract a manifest from a JSONL session file.
|
|
91
|
+
*/
|
|
92
|
+
export async function extractManifest(jsonlPath, projectPath, options = {}) {
|
|
93
|
+
const entries = await parseJSONL(jsonlPath);
|
|
94
|
+
return await extractManifestFromEntries(entries, projectPath, jsonlPath, options);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Extract a manifest from already-parsed entries.
|
|
98
|
+
*/
|
|
99
|
+
export async function extractManifestFromEntries(entries, projectPath, jsonlPath, options = {}) {
|
|
100
|
+
// Extract session ID from first entry or filename
|
|
101
|
+
const sessionId = entries[0]?.sessionId || path.basename(jsonlPath, ".jsonl");
|
|
102
|
+
// Generate unique projectId from full path (dash-encoding pattern)
|
|
103
|
+
const projectId = projectPath.replace(/\//g, "-");
|
|
104
|
+
// Keep projectSlug for human-readable display
|
|
105
|
+
const projectSlug = path.basename(projectPath);
|
|
106
|
+
// Find timestamps
|
|
107
|
+
const timestamps = entries
|
|
108
|
+
.map((e) => e.timestamp)
|
|
109
|
+
.filter((t) => t)
|
|
110
|
+
.sort();
|
|
111
|
+
const startedAt = timestamps[0] || new Date().toISOString();
|
|
112
|
+
const endedAt = timestamps[timestamps.length - 1] || startedAt;
|
|
113
|
+
// Calculate duration
|
|
114
|
+
const durationMs = new Date(endedAt).getTime() - new Date(startedAt).getTime();
|
|
115
|
+
const durationMinutes = Math.round(durationMs / 1000 / 60);
|
|
116
|
+
// Extract title from summary entry
|
|
117
|
+
const summaryEntry = entries.find((e) => e.type === "summary");
|
|
118
|
+
const title = summaryEntry?.content.summary || extractFallbackTitle(entries);
|
|
119
|
+
// Extract user questions
|
|
120
|
+
const userQuestions = extractUserQuestions(entries);
|
|
121
|
+
// Extract files modified (from Write/Edit tool calls)
|
|
122
|
+
const filesModified = extractFilesModified(entries);
|
|
123
|
+
// Extract tools used
|
|
124
|
+
const toolsUsed = extractToolsUsed(entries);
|
|
125
|
+
// Extract technologies
|
|
126
|
+
const technologies = extractTechnologies(entries, filesModified);
|
|
127
|
+
// Detect plans from Write tool calls and catalog them
|
|
128
|
+
const writePlanPaths = detectWrittenPlanPaths(entries);
|
|
129
|
+
const writePlans = await catalogWrittenPlans(writePlanPaths, projectPath, sessionId);
|
|
130
|
+
// Detect transient plans (created by plan mode, stored in ~/.claude/plans/)
|
|
131
|
+
const transientPlans = await catalogTransientPlans(entries, projectPath, sessionId);
|
|
132
|
+
// Detect embedded plans from user messages (already catalogs them)
|
|
133
|
+
const embeddedPlans = await extractEmbeddedPlans(entries, projectPath, sessionId);
|
|
134
|
+
// Combine all sources (dedup happens via cataloging)
|
|
135
|
+
const plans = [...writePlans, ...transientPlans, ...embeddedPlans];
|
|
136
|
+
// Extract context snippets
|
|
137
|
+
const contextSnippets = extractContextSnippets(entries);
|
|
138
|
+
// Count messages and tool calls
|
|
139
|
+
const messageCount = entries.filter((e) => e.type === "user_message" || e.type === "assistant_message").length;
|
|
140
|
+
const toolCallCount = entries.filter((e) => e.type === "tool_call").length;
|
|
141
|
+
return {
|
|
142
|
+
id: sessionId,
|
|
143
|
+
projectId,
|
|
144
|
+
projectSlug,
|
|
145
|
+
projectPath,
|
|
146
|
+
archivedAt: new Date().toISOString(),
|
|
147
|
+
autoArchived: options.autoArchived ?? false,
|
|
148
|
+
title,
|
|
149
|
+
startedAt,
|
|
150
|
+
endedAt,
|
|
151
|
+
durationMinutes,
|
|
152
|
+
userQuestions,
|
|
153
|
+
filesModified,
|
|
154
|
+
toolsUsed,
|
|
155
|
+
technologies,
|
|
156
|
+
plans,
|
|
157
|
+
contextSnippets,
|
|
158
|
+
messageCount,
|
|
159
|
+
toolCallCount,
|
|
160
|
+
userLabel: options.userLabel,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Extract a fallback title from entries when no summary exists.
|
|
165
|
+
* Uses multiple strategies to find a meaningful title.
|
|
166
|
+
*/
|
|
167
|
+
function extractFallbackTitle(entries) {
|
|
168
|
+
// Strategy 1: Look for a plan title in the conversation
|
|
169
|
+
// Plans often have good titles like "# Authentication System Design"
|
|
170
|
+
for (const entry of entries) {
|
|
171
|
+
if (entry.type === "tool_call" && entry.content.toolName === "Write") {
|
|
172
|
+
const filePath = entry.content.toolInput?.file_path;
|
|
173
|
+
const content = entry.content.toolInput?.content;
|
|
174
|
+
if (filePath &&
|
|
175
|
+
content &&
|
|
176
|
+
(filePath.includes("/plans/") || filePath.includes("plan"))) {
|
|
177
|
+
const titleMatch = content.match(/^#\s+(.+)$/m);
|
|
178
|
+
if (titleMatch && titleMatch[1].length <= 80) {
|
|
179
|
+
return titleMatch[1].trim();
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// Strategy 2: Extract action from first real user message (skip internal commands)
|
|
185
|
+
const firstUser = entries.find((e) => {
|
|
186
|
+
if (e.type !== "user_message" || !e.content.text)
|
|
187
|
+
return false;
|
|
188
|
+
const text = e.content.text.trim();
|
|
189
|
+
// Skip internal Claude Code messages
|
|
190
|
+
if (text.startsWith("<local-command"))
|
|
191
|
+
return false;
|
|
192
|
+
if (text.startsWith("<command-"))
|
|
193
|
+
return false;
|
|
194
|
+
if (text.length === 0)
|
|
195
|
+
return false;
|
|
196
|
+
return true;
|
|
197
|
+
});
|
|
198
|
+
if (firstUser?.content.text) {
|
|
199
|
+
const text = firstUser.content.text.trim();
|
|
200
|
+
// Skip common noise prefixes
|
|
201
|
+
const noisePrefixes = [
|
|
202
|
+
/^implement the following plan[:\s]*/i,
|
|
203
|
+
/^here is the plan[:\s]*/i,
|
|
204
|
+
/^please implement[:\s]*/i,
|
|
205
|
+
/^can you[:\s]*/i,
|
|
206
|
+
/^i want to[:\s]*/i,
|
|
207
|
+
/^i need to[:\s]*/i,
|
|
208
|
+
/^help me[:\s]*/i,
|
|
209
|
+
/^let's[:\s]*/i,
|
|
210
|
+
];
|
|
211
|
+
let cleanText = text;
|
|
212
|
+
for (const prefix of noisePrefixes) {
|
|
213
|
+
cleanText = cleanText.replace(prefix, "");
|
|
214
|
+
}
|
|
215
|
+
cleanText = cleanText.trim();
|
|
216
|
+
// If it's still too long, try to extract first sentence or phrase
|
|
217
|
+
if (cleanText.length > 80) {
|
|
218
|
+
// Try to get first sentence
|
|
219
|
+
const sentenceMatch = cleanText.match(/^[^.!?\n]+[.!?]?/);
|
|
220
|
+
if (sentenceMatch && sentenceMatch[0].length <= 80) {
|
|
221
|
+
return sentenceMatch[0].trim();
|
|
222
|
+
}
|
|
223
|
+
// Just truncate
|
|
224
|
+
return cleanText.substring(0, 77) + "...";
|
|
225
|
+
}
|
|
226
|
+
if (cleanText.length > 0) {
|
|
227
|
+
return cleanText;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
// Strategy 3: Use project name + date as last resort
|
|
231
|
+
return "Session " + new Date().toISOString().split("T")[0];
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Extract user questions from entries (truncated).
|
|
235
|
+
*/
|
|
236
|
+
function extractUserQuestions(entries) {
|
|
237
|
+
return entries
|
|
238
|
+
.filter((e) => e.type === "user_message" && e.content.text)
|
|
239
|
+
.map((e) => {
|
|
240
|
+
const text = e.content.text.trim();
|
|
241
|
+
if (text.length <= MAX_QUESTION_LENGTH) {
|
|
242
|
+
return text;
|
|
243
|
+
}
|
|
244
|
+
return text.substring(0, MAX_QUESTION_LENGTH - 3) + "...";
|
|
245
|
+
})
|
|
246
|
+
.filter((q) => q.length > 0);
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Extract files modified from Write/Edit tool calls.
|
|
250
|
+
*/
|
|
251
|
+
function extractFilesModified(entries) {
|
|
252
|
+
const files = new Set();
|
|
253
|
+
for (const entry of entries) {
|
|
254
|
+
if (entry.type === "tool_call") {
|
|
255
|
+
const toolName = entry.content.toolName;
|
|
256
|
+
const input = entry.content.toolInput;
|
|
257
|
+
if (toolName === "Write" || toolName === "Edit") {
|
|
258
|
+
const filePath = input?.file_path;
|
|
259
|
+
if (filePath) {
|
|
260
|
+
files.add(filePath);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
return Array.from(files);
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Extract unique tools used.
|
|
269
|
+
*/
|
|
270
|
+
function extractToolsUsed(entries) {
|
|
271
|
+
const tools = new Set();
|
|
272
|
+
for (const entry of entries) {
|
|
273
|
+
if (entry.type === "tool_call" && entry.content.toolName) {
|
|
274
|
+
tools.add(entry.content.toolName);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
return Array.from(tools).sort();
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Extract technologies from content and file paths.
|
|
281
|
+
*/
|
|
282
|
+
function extractTechnologies(entries, filesModified) {
|
|
283
|
+
const techs = new Set();
|
|
284
|
+
// Build combined text for pattern matching
|
|
285
|
+
const textParts = [];
|
|
286
|
+
for (const entry of entries) {
|
|
287
|
+
if (entry.content.text) {
|
|
288
|
+
textParts.push(entry.content.text);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
// Add file paths
|
|
292
|
+
textParts.push(...filesModified);
|
|
293
|
+
const combinedText = textParts.join(" ");
|
|
294
|
+
// Check each pattern
|
|
295
|
+
for (const { pattern, tech } of TECH_PATTERNS) {
|
|
296
|
+
if (pattern.test(combinedText)) {
|
|
297
|
+
techs.add(tech);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
return Array.from(techs).sort();
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Detect plan file paths written in this conversation.
|
|
304
|
+
* Returns paths to plan files that were written via the Write tool.
|
|
305
|
+
*/
|
|
306
|
+
export function detectWrittenPlanPaths(entries) {
|
|
307
|
+
const planPaths = new Set();
|
|
308
|
+
const plansDir = getPlansDirectory();
|
|
309
|
+
for (const entry of entries) {
|
|
310
|
+
if (entry.type === "tool_call" && entry.content.toolName === "Write") {
|
|
311
|
+
const filePath = entry.content.toolInput?.file_path;
|
|
312
|
+
if (filePath) {
|
|
313
|
+
// Detect plans in ~/.claude/plans/ or custom plansDirectory
|
|
314
|
+
const isPlanPath = filePath.startsWith(plansDir) ||
|
|
315
|
+
filePath.includes("/plans/") ||
|
|
316
|
+
(filePath.includes("plan") && filePath.endsWith(".md"));
|
|
317
|
+
if (isPlanPath) {
|
|
318
|
+
planPaths.add(filePath);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
return Array.from(planPaths);
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Catalog written plans into the project index.
|
|
327
|
+
* Reads plan content and catalogs it using the standard cataloger (with dedup).
|
|
328
|
+
*/
|
|
329
|
+
async function catalogWrittenPlans(planPaths, projectPath, sessionId) {
|
|
330
|
+
const references = [];
|
|
331
|
+
for (const planPath of planPaths) {
|
|
332
|
+
try {
|
|
333
|
+
const content = await fs.readFile(planPath, "utf-8");
|
|
334
|
+
// Extract title from content
|
|
335
|
+
const titleMatch = content.match(/^#\s+(.+)$/m);
|
|
336
|
+
const title = titleMatch
|
|
337
|
+
? titleMatch[1].trim().replace(/^Plan:\s*/i, "")
|
|
338
|
+
: path.basename(planPath, ".md");
|
|
339
|
+
// Catalog the plan (handles dedup automatically)
|
|
340
|
+
const planEntry = await catalogPlan(projectPath, {
|
|
341
|
+
title,
|
|
342
|
+
content,
|
|
343
|
+
sessionId,
|
|
344
|
+
});
|
|
345
|
+
// Return reference pointing to the cataloged plan
|
|
346
|
+
references.push({
|
|
347
|
+
path: path.join(projectPath, ".jacques", planEntry.path),
|
|
348
|
+
name: planEntry.filename,
|
|
349
|
+
archivedPath: planEntry.path,
|
|
350
|
+
source: "write",
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
catch (error) {
|
|
354
|
+
// Plan file doesn't exist or can't be read - still track it as reference
|
|
355
|
+
references.push({
|
|
356
|
+
path: planPath,
|
|
357
|
+
name: path.basename(planPath),
|
|
358
|
+
archivedPath: `plans/${path.basename(planPath)}`,
|
|
359
|
+
source: "write",
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
return references;
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Catalog transient plans created by Claude Code's plan mode.
|
|
367
|
+
* These are stored in ~/.claude/plans/ with the session's slug as filename.
|
|
368
|
+
*/
|
|
369
|
+
async function catalogTransientPlans(entries, projectPath, sessionId) {
|
|
370
|
+
const references = [];
|
|
371
|
+
const plansDir = getPlansDirectory();
|
|
372
|
+
// Find the session slug from entries (stored in "progress" type entries)
|
|
373
|
+
const slugs = new Set();
|
|
374
|
+
for (const entry of entries) {
|
|
375
|
+
// The slug is stored in progress entries or can be found in the raw entry
|
|
376
|
+
const rawEntry = entry;
|
|
377
|
+
if (rawEntry.slug) {
|
|
378
|
+
slugs.add(rawEntry.slug);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
// Check each slug for a corresponding plan file
|
|
382
|
+
for (const slug of slugs) {
|
|
383
|
+
const planPath = path.join(plansDir, `${slug}.md`);
|
|
384
|
+
try {
|
|
385
|
+
const content = await fs.readFile(planPath, "utf-8");
|
|
386
|
+
// Extract title from content
|
|
387
|
+
const titleMatch = content.match(/^#\s+(.+)$/m);
|
|
388
|
+
const title = titleMatch
|
|
389
|
+
? titleMatch[1].trim().replace(/^Plan:\s*/i, "")
|
|
390
|
+
: slug;
|
|
391
|
+
// Catalog the plan (handles dedup automatically)
|
|
392
|
+
const planEntry = await catalogPlan(projectPath, {
|
|
393
|
+
title,
|
|
394
|
+
content,
|
|
395
|
+
sessionId,
|
|
396
|
+
});
|
|
397
|
+
// Return reference pointing to the cataloged plan
|
|
398
|
+
references.push({
|
|
399
|
+
path: path.join(projectPath, ".jacques", planEntry.path),
|
|
400
|
+
name: planEntry.filename,
|
|
401
|
+
archivedPath: planEntry.path,
|
|
402
|
+
source: "write", // Treat as "write" since it's from a file
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
catch (error) {
|
|
406
|
+
// Plan file doesn't exist for this slug - that's fine, not all sessions have plans
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
return references;
|
|
410
|
+
}
|
|
411
|
+
/**
|
|
412
|
+
* @deprecated Use detectWrittenPlanPaths instead
|
|
413
|
+
*/
|
|
414
|
+
export function detectPlans(entries) {
|
|
415
|
+
const paths = detectWrittenPlanPaths(entries);
|
|
416
|
+
return paths.map((p) => ({
|
|
417
|
+
path: p,
|
|
418
|
+
name: path.basename(p),
|
|
419
|
+
archivedPath: `plans/${path.basename(p)}`,
|
|
420
|
+
source: "write",
|
|
421
|
+
}));
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* Extract context snippets from key assistant responses.
|
|
425
|
+
*/
|
|
426
|
+
function extractContextSnippets(entries) {
|
|
427
|
+
const snippets = [];
|
|
428
|
+
for (const entry of entries) {
|
|
429
|
+
if (entry.type === "assistant_message" && entry.content.text) {
|
|
430
|
+
const text = entry.content.text.trim();
|
|
431
|
+
if (text.length > 0) {
|
|
432
|
+
// Only take first part of response
|
|
433
|
+
const snippet = text.length <= MAX_SNIPPET_LENGTH
|
|
434
|
+
? text
|
|
435
|
+
: text.substring(0, MAX_SNIPPET_LENGTH - 3) + "...";
|
|
436
|
+
snippets.push(snippet);
|
|
437
|
+
if (snippets.length >= MAX_SNIPPETS) {
|
|
438
|
+
break;
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
return snippets;
|
|
444
|
+
}
|
|
445
|
+
/**
|
|
446
|
+
* Read a plan file's content.
|
|
447
|
+
*/
|
|
448
|
+
export async function readPlanContent(planPath) {
|
|
449
|
+
try {
|
|
450
|
+
return await fs.readFile(planPath, "utf-8");
|
|
451
|
+
}
|
|
452
|
+
catch {
|
|
453
|
+
return null;
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
//# sourceMappingURL=manifest-extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest-extractor.js","sourceRoot":"","sources":["../../src/archive/manifest-extractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration Module
|
|
3
|
+
*
|
|
4
|
+
* Handles migrations for the archive system, including adding projectId
|
|
5
|
+
* to existing manifests that only have projectSlug.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Result of a migration operation
|
|
9
|
+
*/
|
|
10
|
+
export interface MigrationResult {
|
|
11
|
+
/** Number of manifests updated */
|
|
12
|
+
updated: number;
|
|
13
|
+
/** Number of manifests skipped (already have projectId) */
|
|
14
|
+
skipped: number;
|
|
15
|
+
/** Errors encountered during migration */
|
|
16
|
+
errors: string[];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Migrate existing manifests to include projectId.
|
|
20
|
+
*
|
|
21
|
+
* For manifests that have projectPath but no projectId, generates
|
|
22
|
+
* projectId from the full path using dash-encoding pattern.
|
|
23
|
+
*
|
|
24
|
+
* Also rebuilds the search index to use projectId as keys.
|
|
25
|
+
*/
|
|
26
|
+
export declare function migrateToProjectId(): Promise<MigrationResult>;
|
|
27
|
+
/**
|
|
28
|
+
* Check if migration is needed.
|
|
29
|
+
* Returns true if any manifests are missing projectId.
|
|
30
|
+
*/
|
|
31
|
+
export declare function isMigrationNeeded(): Promise<boolean>;
|
|
32
|
+
/**
|
|
33
|
+
* Get migration status (how many manifests need migration).
|
|
34
|
+
*/
|
|
35
|
+
export declare function getMigrationStatus(): Promise<{
|
|
36
|
+
total: number;
|
|
37
|
+
needsMigration: number;
|
|
38
|
+
alreadyMigrated: number;
|
|
39
|
+
}>;
|
|
40
|
+
/**
|
|
41
|
+
* Result of project path migration
|
|
42
|
+
*/
|
|
43
|
+
export interface PathMigrationResult {
|
|
44
|
+
/** Number of manifests whose projectPath/projectSlug were updated */
|
|
45
|
+
updated: number;
|
|
46
|
+
/** Number of manifests that were already correct */
|
|
47
|
+
skipped: number;
|
|
48
|
+
/** Errors encountered */
|
|
49
|
+
errors: string[];
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Migrate manifest project paths using the fixed decodeProjectPath().
|
|
53
|
+
*
|
|
54
|
+
* Re-decodes each manifest's projectId (which is the encoded dir name)
|
|
55
|
+
* to get the correct projectPath and projectSlug using sessions-index.json.
|
|
56
|
+
* Updates manifests where the decoded values differ from what's stored.
|
|
57
|
+
*/
|
|
58
|
+
export declare function migrateProjectPaths(): Promise<PathMigrationResult>;
|
|
59
|
+
//# sourceMappingURL=migration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration.d.ts","sourceRoot":"","sources":["../../src/archive/migration.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgBH;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,2DAA2D;IAC3D,OAAO,EAAE,MAAM,CAAC;IAChB,0CAA0C;IAC1C,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,eAAe,CAAC,CA4DnE;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC,CAkB1D;AAED;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC,CAqBD;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,qEAAqE;IACrE,OAAO,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,yBAAyB;IACzB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAoDxE"}
|