yandecode 0.1.1 → 0.2.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.
Files changed (226) hide show
  1. package/dist/bin.js +14 -8
  2. package/dist/bin.js.map +7 -1
  3. package/dist/chunks/chunk-23DG7PZZ.js +58 -0
  4. package/dist/chunks/chunk-23DG7PZZ.js.map +7 -0
  5. package/dist/chunks/chunk-2S6B3DDQ.js +1769 -0
  6. package/dist/chunks/chunk-2S6B3DDQ.js.map +7 -0
  7. package/dist/chunks/chunk-6J5CZVCJ.js +120 -0
  8. package/dist/chunks/chunk-6J5CZVCJ.js.map +7 -0
  9. package/dist/chunks/chunk-7L6DD2VD.js +768 -0
  10. package/dist/chunks/chunk-7L6DD2VD.js.map +7 -0
  11. package/dist/chunks/chunk-DWD37AI2.js +39 -0
  12. package/dist/chunks/chunk-DWD37AI2.js.map +7 -0
  13. package/dist/chunks/chunk-KPDBXQ62.js +62 -0
  14. package/dist/chunks/chunk-KPDBXQ62.js.map +7 -0
  15. package/dist/chunks/chunk-KVBKQXTU.js +351 -0
  16. package/dist/chunks/chunk-KVBKQXTU.js.map +7 -0
  17. package/dist/chunks/chunk-L2DDIZPI.js +53 -0
  18. package/dist/chunks/chunk-L2DDIZPI.js.map +7 -0
  19. package/dist/chunks/chunk-OIAMKDTQ.js +27 -0
  20. package/dist/chunks/chunk-OIAMKDTQ.js.map +7 -0
  21. package/dist/chunks/chunk-PUWSEWX3.js +61 -0
  22. package/dist/chunks/chunk-PUWSEWX3.js.map +7 -0
  23. package/dist/chunks/chunk-QCQC73WX.js +122 -0
  24. package/dist/chunks/chunk-QCQC73WX.js.map +7 -0
  25. package/dist/chunks/chunk-TYLH4NIC.js +39 -0
  26. package/dist/chunks/chunk-TYLH4NIC.js.map +7 -0
  27. package/dist/chunks/chunk-VKVJGBNJ.js +72 -0
  28. package/dist/chunks/chunk-VKVJGBNJ.js.map +7 -0
  29. package/dist/chunks/chunk-Y2MIXROU.js +20072 -0
  30. package/dist/chunks/chunk-Y2MIXROU.js.map +7 -0
  31. package/dist/chunks/cli-V6PJTDLM.js +3464 -0
  32. package/dist/chunks/cli-V6PJTDLM.js.map +7 -0
  33. package/dist/chunks/doctor-LLDVEPWL.js +184 -0
  34. package/dist/chunks/doctor-LLDVEPWL.js.map +7 -0
  35. package/dist/chunks/entry-YAOEX3EB.js +187 -0
  36. package/dist/chunks/entry-YAOEX3EB.js.map +7 -0
  37. package/dist/chunks/init-4ZJFCKIJ.js +46 -0
  38. package/dist/chunks/init-4ZJFCKIJ.js.map +7 -0
  39. package/dist/chunks/mcp-serve-KWKMUGWZ.js +22575 -0
  40. package/dist/chunks/mcp-serve-KWKMUGWZ.js.map +7 -0
  41. package/dist/chunks/modules-CJB5IKUJ.js +121 -0
  42. package/dist/chunks/modules-CJB5IKUJ.js.map +7 -0
  43. package/dist/chunks/runtime-3E4NIFAL.js +208 -0
  44. package/dist/chunks/runtime-3E4NIFAL.js.map +7 -0
  45. package/dist/chunks/runtime-7CRR63B5.js +395 -0
  46. package/dist/chunks/runtime-7CRR63B5.js.map +7 -0
  47. package/dist/chunks/runtime-CKMVHAU4.js +64 -0
  48. package/dist/chunks/runtime-CKMVHAU4.js.map +7 -0
  49. package/dist/chunks/runtime-CVZMWIJO.js +318 -0
  50. package/dist/chunks/runtime-CVZMWIJO.js.map +7 -0
  51. package/dist/chunks/runtime-DBNXBOAL.js +295 -0
  52. package/dist/chunks/runtime-DBNXBOAL.js.map +7 -0
  53. package/dist/chunks/runtime-EKHO2JXB.js +197 -0
  54. package/dist/chunks/runtime-EKHO2JXB.js.map +7 -0
  55. package/dist/chunks/runtime-EY6SVZYP.js +539 -0
  56. package/dist/chunks/runtime-EY6SVZYP.js.map +7 -0
  57. package/dist/chunks/runtime-UB2O2HUN.js +212 -0
  58. package/dist/chunks/runtime-UB2O2HUN.js.map +7 -0
  59. package/dist/chunks/runtime-WAFQWW4M.js +755 -0
  60. package/dist/chunks/runtime-WAFQWW4M.js.map +7 -0
  61. package/dist/chunks/runtime-ZGGF6RVA.js +271 -0
  62. package/dist/chunks/runtime-ZGGF6RVA.js.map +7 -0
  63. package/dist/chunks/status-SPIESL4F.js +38 -0
  64. package/dist/chunks/status-SPIESL4F.js.map +7 -0
  65. package/dist/chunks/uninstall-J2OWCX4A.js +54 -0
  66. package/dist/chunks/uninstall-J2OWCX4A.js.map +7 -0
  67. package/dist/chunks/update-OX5MZYQY.js +34 -0
  68. package/dist/chunks/update-OX5MZYQY.js.map +7 -0
  69. package/dist/content/agents/yandecode-reviewer.md +22 -0
  70. package/dist/content/agents/yandecode-security-reviewer.md +23 -0
  71. package/dist/content/skills/NOTICE.md +29 -0
  72. package/dist/content/skills/yandecode-code-review/SKILL.md +37 -0
  73. package/dist/content/skills/yandecode-debugging/SKILL.md +33 -0
  74. package/dist/content/skills/yandecode-instructions/SKILL.md +26 -0
  75. package/dist/content/skills/yandecode-memory/SKILL.md +36 -0
  76. package/dist/content/skills/yandecode-security-review/SKILL.md +24 -0
  77. package/dist/content/skills/yandecode-tdd/SKILL.md +38 -0
  78. package/dist/content/skills/yandecode-verification/SKILL.md +29 -0
  79. package/dist/content/skills/yandecode-workflow/SKILL.md +50 -0
  80. package/package.json +25 -19
  81. package/dist/bin.d.ts +0 -3
  82. package/dist/bin.d.ts.map +0 -1
  83. package/dist/claude-bin.d.ts +0 -2
  84. package/dist/claude-bin.d.ts.map +0 -1
  85. package/dist/claude-bin.js +0 -4
  86. package/dist/claude-bin.js.map +0 -1
  87. package/dist/cli.d.ts +0 -6
  88. package/dist/cli.d.ts.map +0 -1
  89. package/dist/cli.js +0 -21
  90. package/dist/cli.js.map +0 -1
  91. package/dist/commands/doctor.d.ts +0 -2
  92. package/dist/commands/doctor.d.ts.map +0 -1
  93. package/dist/commands/doctor.js +0 -19
  94. package/dist/commands/doctor.js.map +0 -1
  95. package/dist/commands/hook.d.ts +0 -2
  96. package/dist/commands/hook.d.ts.map +0 -1
  97. package/dist/commands/hook.js +0 -23
  98. package/dist/commands/hook.js.map +0 -1
  99. package/dist/commands/index-cmd.d.ts +0 -2
  100. package/dist/commands/index-cmd.d.ts.map +0 -1
  101. package/dist/commands/index-cmd.js +0 -47
  102. package/dist/commands/index-cmd.js.map +0 -1
  103. package/dist/commands/index.d.ts +0 -13
  104. package/dist/commands/index.d.ts.map +0 -1
  105. package/dist/commands/index.js +0 -15
  106. package/dist/commands/index.js.map +0 -1
  107. package/dist/commands/init.d.ts +0 -2
  108. package/dist/commands/init.d.ts.map +0 -1
  109. package/dist/commands/init.js +0 -22
  110. package/dist/commands/init.js.map +0 -1
  111. package/dist/commands/mcp.d.ts +0 -2
  112. package/dist/commands/mcp.d.ts.map +0 -1
  113. package/dist/commands/mcp.js +0 -71
  114. package/dist/commands/mcp.js.map +0 -1
  115. package/dist/commands/rag.d.ts +0 -2
  116. package/dist/commands/rag.d.ts.map +0 -1
  117. package/dist/commands/rag.js +0 -27
  118. package/dist/commands/rag.js.map +0 -1
  119. package/dist/commands/start.d.ts +0 -5
  120. package/dist/commands/start.d.ts.map +0 -1
  121. package/dist/commands/start.js +0 -74
  122. package/dist/commands/start.js.map +0 -1
  123. package/dist/commands/status.d.ts +0 -2
  124. package/dist/commands/status.d.ts.map +0 -1
  125. package/dist/commands/status.js +0 -29
  126. package/dist/commands/status.js.map +0 -1
  127. package/dist/commands/statusline.d.ts +0 -2
  128. package/dist/commands/statusline.d.ts.map +0 -1
  129. package/dist/commands/statusline.js +0 -90
  130. package/dist/commands/statusline.js.map +0 -1
  131. package/dist/commands/swarm.d.ts +0 -4
  132. package/dist/commands/swarm.d.ts.map +0 -1
  133. package/dist/commands/swarm.js +0 -48
  134. package/dist/commands/swarm.js.map +0 -1
  135. package/dist/commands/uninstall.d.ts +0 -2
  136. package/dist/commands/uninstall.d.ts.map +0 -1
  137. package/dist/commands/uninstall.js +0 -16
  138. package/dist/commands/uninstall.js.map +0 -1
  139. package/dist/context.d.ts +0 -13
  140. package/dist/context.d.ts.map +0 -1
  141. package/dist/context.js +0 -31
  142. package/dist/context.js.map +0 -1
  143. package/dist/doctor/checks.d.ts +0 -18
  144. package/dist/doctor/checks.d.ts.map +0 -1
  145. package/dist/doctor/checks.js +0 -270
  146. package/dist/doctor/checks.js.map +0 -1
  147. package/dist/hooks/handlers.d.ts +0 -21
  148. package/dist/hooks/handlers.d.ts.map +0 -1
  149. package/dist/hooks/handlers.js +0 -191
  150. package/dist/hooks/handlers.js.map +0 -1
  151. package/dist/index.d.ts +0 -10
  152. package/dist/index.d.ts.map +0 -1
  153. package/dist/index.js +0 -10
  154. package/dist/index.js.map +0 -1
  155. package/dist/integration/claude-md.d.ts +0 -6
  156. package/dist/integration/claude-md.d.ts.map +0 -1
  157. package/dist/integration/claude-md.js +0 -30
  158. package/dist/integration/claude-md.js.map +0 -1
  159. package/dist/integration/gitignore.d.ts +0 -3
  160. package/dist/integration/gitignore.d.ts.map +0 -1
  161. package/dist/integration/gitignore.js +0 -13
  162. package/dist/integration/gitignore.js.map +0 -1
  163. package/dist/integration/init.d.ts +0 -17
  164. package/dist/integration/init.d.ts.map +0 -1
  165. package/dist/integration/init.js +0 -86
  166. package/dist/integration/init.js.map +0 -1
  167. package/dist/integration/json-utils.d.ts +0 -13
  168. package/dist/integration/json-utils.d.ts.map +0 -1
  169. package/dist/integration/json-utils.js +0 -33
  170. package/dist/integration/json-utils.js.map +0 -1
  171. package/dist/integration/manifest.d.ts +0 -17
  172. package/dist/integration/manifest.d.ts.map +0 -1
  173. package/dist/integration/manifest.js +0 -26
  174. package/dist/integration/manifest.js.map +0 -1
  175. package/dist/integration/materialize.d.ts +0 -9
  176. package/dist/integration/materialize.d.ts.map +0 -1
  177. package/dist/integration/materialize.js +0 -21
  178. package/dist/integration/materialize.js.map +0 -1
  179. package/dist/integration/mcp-config.d.ts +0 -4
  180. package/dist/integration/mcp-config.d.ts.map +0 -1
  181. package/dist/integration/mcp-config.js +0 -11
  182. package/dist/integration/mcp-config.js.map +0 -1
  183. package/dist/integration/settings.d.ts +0 -7
  184. package/dist/integration/settings.d.ts.map +0 -1
  185. package/dist/integration/settings.js +0 -70
  186. package/dist/integration/settings.js.map +0 -1
  187. package/dist/integration/uninstall.d.ts +0 -10
  188. package/dist/integration/uninstall.d.ts.map +0 -1
  189. package/dist/integration/uninstall.js +0 -71
  190. package/dist/integration/uninstall.js.map +0 -1
  191. package/dist/launcher.d.ts +0 -8
  192. package/dist/launcher.d.ts.map +0 -1
  193. package/dist/launcher.js +0 -18
  194. package/dist/launcher.js.map +0 -1
  195. package/dist/mcp/server.d.ts +0 -27
  196. package/dist/mcp/server.d.ts.map +0 -1
  197. package/dist/mcp/server.js +0 -311
  198. package/dist/mcp/server.js.map +0 -1
  199. package/dist/plugin-content.d.ts +0 -21
  200. package/dist/plugin-content.d.ts.map +0 -1
  201. package/dist/plugin-content.js +0 -67
  202. package/dist/plugin-content.js.map +0 -1
  203. package/dist/rag/format.d.ts +0 -3
  204. package/dist/rag/format.d.ts.map +0 -1
  205. package/dist/rag/format.js +0 -12
  206. package/dist/rag/format.js.map +0 -1
  207. package/dist/retrieval-runtime.d.ts +0 -21
  208. package/dist/retrieval-runtime.d.ts.map +0 -1
  209. package/dist/retrieval-runtime.js +0 -47
  210. package/dist/retrieval-runtime.js.map +0 -1
  211. package/dist/status-line/git.d.ts +0 -3
  212. package/dist/status-line/git.d.ts.map +0 -1
  213. package/dist/status-line/git.js +0 -34
  214. package/dist/status-line/git.js.map +0 -1
  215. package/dist/status-line/render.d.ts +0 -29
  216. package/dist/status-line/render.d.ts.map +0 -1
  217. package/dist/status-line/render.js +0 -72
  218. package/dist/status-line/render.js.map +0 -1
  219. package/dist/swarm-runtime.d.ts +0 -11
  220. package/dist/swarm-runtime.d.ts.map +0 -1
  221. package/dist/swarm-runtime.js +0 -76
  222. package/dist/swarm-runtime.js.map +0 -1
  223. package/dist/version.d.ts +0 -2
  224. package/dist/version.d.ts.map +0 -1
  225. package/dist/version.js +0 -5
  226. package/dist/version.js.map +0 -1
@@ -0,0 +1,318 @@
1
+ import { createRequire as __yandecodeCreateRequire } from 'node:module';
2
+ const require = __yandecodeCreateRequire(import.meta.url);
3
+ import {
4
+ splitSections
5
+ } from "./chunk-KPDBXQ62.js";
6
+ import {
7
+ fitRows
8
+ } from "./chunk-OIAMKDTQ.js";
9
+ import {
10
+ extractSymbols
11
+ } from "./chunk-2S6B3DDQ.js";
12
+ import {
13
+ external_exports,
14
+ openModuleDb,
15
+ queryInput,
16
+ resolveInput,
17
+ toFtsQuery
18
+ } from "./chunk-Y2MIXROU.js";
19
+
20
+ // packages/cli/src/modules/libdocs/runtime.ts
21
+ import { join as join2 } from "node:path";
22
+
23
+ // packages/cli/src/modules/libdocs/packages.ts
24
+ import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
25
+ import { join } from "node:path";
26
+ var MAX_DOC_FILES = 400;
27
+ var MAX_DECLARATION_BYTES = 4 * 1048576;
28
+ function readJson(file) {
29
+ try {
30
+ return JSON.parse(readFileSync(file, "utf8"));
31
+ } catch {
32
+ return null;
33
+ }
34
+ }
35
+ function declaredDependencies(root) {
36
+ const out = /* @__PURE__ */ new Map();
37
+ const pkg = readJson(join(root, "package.json"));
38
+ for (const field of [
39
+ "dependencies",
40
+ "devDependencies",
41
+ "peerDependencies",
42
+ "optionalDependencies"
43
+ ]) {
44
+ const deps = pkg?.[field];
45
+ if (typeof deps === "object" && deps !== null) {
46
+ for (const [name, range] of Object.entries(deps))
47
+ out.set(name, String(range));
48
+ }
49
+ }
50
+ const requirements = join(root, "requirements.txt");
51
+ if (existsSync(requirements)) {
52
+ for (const line of readFileSync(requirements, "utf8").split("\n")) {
53
+ const m = /^\s*([A-Za-z0-9_.-]+)\s*([<>=!~].*)?$/.exec(line.replace(/#.*/, ""));
54
+ if (m) out.set(m[1], m[2]?.trim() ?? "*");
55
+ }
56
+ }
57
+ return out;
58
+ }
59
+ function filesUnder(dir, pattern, depth = 0) {
60
+ if (!existsSync(dir) || depth > 5) return [];
61
+ return readdirSync(dir, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name)).flatMap((e) => {
62
+ const abs = join(dir, e.name);
63
+ if (e.isDirectory())
64
+ return e.name === "node_modules" ? [] : filesUnder(abs, pattern, depth + 1);
65
+ return pattern.test(e.name) ? [abs] : [];
66
+ });
67
+ }
68
+ function declarationFiles(dir, entry) {
69
+ const all = filesUnder(dir, /\.d\.(ts|mts|cts)$/);
70
+ const ordered = entry ? [join(dir, entry), ...all.filter((f) => f !== join(dir, entry))] : all;
71
+ const kept = [];
72
+ let bytes = 0;
73
+ for (const file of ordered) {
74
+ bytes += statSync(file).size;
75
+ if (bytes > MAX_DECLARATION_BYTES) break;
76
+ kept.push(file);
77
+ }
78
+ return kept;
79
+ }
80
+ function npmPackage(root, name, declared) {
81
+ const dir = join(root, "node_modules", ...name.split("/"));
82
+ const manifest = readJson(join(dir, "package.json"));
83
+ if (!manifest || typeof manifest.version !== "string") return null;
84
+ const readme = readdirSync(dir).filter((f) => /^readme(\.mdx?|\.markdown)?$/i.test(f));
85
+ const typesEntry = [manifest.types, manifest.typings, "index.d.ts"].find(
86
+ (t) => typeof t === "string" && existsSync(join(dir, t))
87
+ );
88
+ const docs = filesUnder(join(dir, "docs"), /\.mdx?$/i);
89
+ const files = [...readme.map((f) => join(dir, f)), ...docs, ...declarationFiles(dir, typesEntry)];
90
+ return {
91
+ name,
92
+ version: manifest.version,
93
+ ecosystem: "npm",
94
+ dir,
95
+ declared,
96
+ docFiles: files.slice(0, MAX_DOC_FILES)
97
+ };
98
+ }
99
+ function sitePackagesDirs(root) {
100
+ const dirs = [];
101
+ for (const venv of [".venv", "venv", "env"]) {
102
+ const lib = join(root, venv, "lib");
103
+ if (existsSync(lib)) {
104
+ for (const py of readdirSync(lib).filter((d) => d.startsWith("python")))
105
+ dirs.push(join(lib, py, "site-packages"));
106
+ }
107
+ const windows = join(root, venv, "Lib", "site-packages");
108
+ if (existsSync(windows)) dirs.push(windows);
109
+ }
110
+ return dirs.filter((d) => existsSync(d) && statSync(d).isDirectory());
111
+ }
112
+ function pythonPackage(root, name, declared) {
113
+ const normalized = name.toLowerCase().replace(/[-_.]+/g, "_");
114
+ for (const site of sitePackagesDirs(root)) {
115
+ const dist = readdirSync(site).find((d) => {
116
+ const m = /^(.+)-([^-]+)\.dist-info$/.exec(d);
117
+ return m !== null && m[1].toLowerCase().replace(/[-_.]+/g, "_") === normalized;
118
+ });
119
+ if (!dist) continue;
120
+ const version = /-([^-]+)\.dist-info$/.exec(dist)[1];
121
+ const metadata = join(site, dist, "METADATA");
122
+ return {
123
+ name,
124
+ version,
125
+ ecosystem: "python",
126
+ dir: join(site, dist),
127
+ declared,
128
+ docFiles: existsSync(metadata) ? [metadata] : []
129
+ };
130
+ }
131
+ return null;
132
+ }
133
+ function resolvePackage(root, name) {
134
+ const declared = declaredDependencies(root).get(name) ?? null;
135
+ return npmPackage(root, name, declared) ?? pythonPackage(root, name, declared);
136
+ }
137
+
138
+ // packages/cli/src/modules/libdocs/store.ts
139
+ import { mkdirSync, readFileSync as readFileSync2 } from "node:fs";
140
+ import { basename, dirname, relative } from "node:path";
141
+ var MIGRATIONS = [
142
+ `
143
+ CREATE TABLE libs (key TEXT PRIMARY KEY, version TEXT NOT NULL, indexed_at TEXT NOT NULL, files TEXT NOT NULL);
144
+ CREATE TABLE sections (
145
+ id INTEGER PRIMARY KEY, lib TEXT NOT NULL, file TEXT NOT NULL, heading TEXT NOT NULL,
146
+ start_line INTEGER NOT NULL, end_line INTEGER NOT NULL, content TEXT NOT NULL
147
+ );
148
+ CREATE INDEX sections_lib ON sections (lib);
149
+ CREATE VIRTUAL TABLE sections_fts USING fts5 (content, heading, tokenize = 'porter unicode61');
150
+ `
151
+ ];
152
+ async function declarationPieces(text, file) {
153
+ const lines = text.split("\n");
154
+ const symbols = (await extractSymbols(text, "typescript")).filter((s) => s.parent === null);
155
+ return symbols.map((s) => {
156
+ let start = s.startLine;
157
+ while (start > 1 && /^\s*(\/\*\*|\*)/.test(lines[start - 2] ?? "")) start--;
158
+ return {
159
+ heading: `${basename(file)} \u203A ${s.namePath}`,
160
+ startLine: start,
161
+ endLine: s.endLine,
162
+ content: lines.slice(start - 1, s.endLine).join("\n")
163
+ };
164
+ });
165
+ }
166
+ function metadataPieces(text) {
167
+ const blank = text.indexOf("\n\n");
168
+ const offset = blank < 0 ? 0 : text.slice(0, blank).split("\n").length + 1;
169
+ return splitSections(blank < 0 ? text : text.slice(blank + 2)).map((s) => ({
170
+ ...s,
171
+ startLine: s.startLine + offset,
172
+ endLine: s.endLine + offset
173
+ }));
174
+ }
175
+ var LibDocsStore = class _LibDocsStore {
176
+ constructor(db) {
177
+ this.db = db;
178
+ }
179
+ db;
180
+ static open(file) {
181
+ mkdirSync(dirname(file), { recursive: true });
182
+ return new _LibDocsStore(openModuleDb(file, MIGRATIONS));
183
+ }
184
+ close() {
185
+ this.db.close();
186
+ }
187
+ key(pkg) {
188
+ return `${pkg.ecosystem}:${pkg.name}`;
189
+ }
190
+ /** Indexes the package unless this exact version is already indexed; returns the file list. */
191
+ async ensure(pkg, root) {
192
+ const key = this.key(pkg);
193
+ const row = this.db.prepare("SELECT version, files FROM libs WHERE key = ?").get(key);
194
+ if (row?.version === pkg.version) return JSON.parse(row.files);
195
+ const pieces = await Promise.all(
196
+ pkg.docFiles.map(async (abs) => {
197
+ const text = readFileSync2(abs, "utf8");
198
+ const rel = relative(root, abs).split("\\").join("/");
199
+ const parts = /\.d\.[mc]?ts$/.test(abs) ? await declarationPieces(text, abs) : basename(abs) === "METADATA" ? metadataPieces(text) : splitSections(text);
200
+ return parts.map((p) => ({ ...p, file: rel }));
201
+ })
202
+ );
203
+ const files = pkg.docFiles.map((abs) => relative(pkg.dir, abs).split("\\").join("/"));
204
+ this.db.transaction(() => {
205
+ for (const { id } of this.db.prepare("SELECT id FROM sections WHERE lib = ?").all(key)) {
206
+ this.db.prepare("DELETE FROM sections_fts WHERE rowid = ?").run(id);
207
+ }
208
+ this.db.prepare("DELETE FROM sections WHERE lib = ?").run(key);
209
+ const insert = this.db.prepare(
210
+ "INSERT INTO sections (lib, file, heading, start_line, end_line, content) VALUES (?, ?, ?, ?, ?, ?)"
211
+ );
212
+ const fts = this.db.prepare(
213
+ "INSERT INTO sections_fts (rowid, content, heading) VALUES (?, ?, ?)"
214
+ );
215
+ for (const p of pieces.flat()) {
216
+ const id = insert.run(
217
+ key,
218
+ p.file,
219
+ p.heading,
220
+ p.startLine,
221
+ p.endLine,
222
+ p.content
223
+ ).lastInsertRowid;
224
+ fts.run(id, p.content, p.heading);
225
+ }
226
+ this.db.prepare(
227
+ "INSERT OR REPLACE INTO libs (key, version, indexed_at, files) VALUES (?, ?, ?, ?)"
228
+ ).run(key, pkg.version, (/* @__PURE__ */ new Date()).toISOString(), JSON.stringify(files));
229
+ })();
230
+ return files;
231
+ }
232
+ sectionCount(pkg) {
233
+ return this.db.prepare("SELECT COUNT(*) AS n FROM sections WHERE lib = ?").get(this.key(pkg)).n;
234
+ }
235
+ query(pkg, query, limit) {
236
+ const fts = toFtsQuery(query);
237
+ if (!fts) return [];
238
+ return this.db.prepare(
239
+ `SELECT s.file, s.heading, s.start_line, s.end_line, s.content
240
+ FROM sections_fts JOIN sections s ON s.id = sections_fts.rowid
241
+ WHERE sections_fts MATCH ? AND s.lib = ? ORDER BY bm25(sections_fts, 1.0, 2.0) LIMIT ?`
242
+ ).all(fts, this.key(pkg), limit).map((r) => ({
243
+ file: r.file,
244
+ heading: r.heading,
245
+ startLine: r.start_line,
246
+ endLine: r.end_line,
247
+ content: r.content
248
+ }));
249
+ }
250
+ };
251
+
252
+ // packages/cli/src/modules/libdocs/runtime.ts
253
+ var stores = /* @__PURE__ */ new Map();
254
+ function storeFor(ctx) {
255
+ let store = stores.get(ctx.root);
256
+ if (!store) {
257
+ store = LibDocsStore.open(join2(ctx.paths.yandecodeDir, "libdocs.db"));
258
+ stores.set(ctx.root, store);
259
+ }
260
+ return store;
261
+ }
262
+ function notFound(ctx, name) {
263
+ const declared = declaredDependencies(ctx.root);
264
+ const range = declared.get(name);
265
+ if (range !== void 0) {
266
+ return {
267
+ isError: true,
268
+ text: `${name} is declared in package.json (${range}) but not installed; install dependencies first (docs are read from the installed version).`
269
+ };
270
+ }
271
+ const needle = name.toLowerCase();
272
+ const close = [...declared.keys()].filter(
273
+ (d) => d.toLowerCase().includes(needle) || needle.includes(d.toLowerCase())
274
+ );
275
+ return {
276
+ isError: true,
277
+ text: `No installed package "${name}".${close.length > 0 ? ` Did you mean: ${close.slice(0, 5).join(", ")}?` : ""}`
278
+ };
279
+ }
280
+ var label = (pkg) => `${pkg.name}@${pkg.version} (${pkg.ecosystem}${pkg.declared ? `, declared ${pkg.declared}` : ""})`;
281
+ async function libdocsResolve(raw, ctx) {
282
+ const { name } = external_exports.object(resolveInput).parse(raw);
283
+ const pkg = resolvePackage(ctx.root, name);
284
+ if (!pkg) return notFound(ctx, name);
285
+ const store = storeFor(ctx);
286
+ const files = await store.ensure(pkg, ctx.root);
287
+ const docs = files.length > 0 ? `${store.sectionCount(pkg)} sections from ${files.join(", ")}` : "no docs or type declarations shipped";
288
+ return { text: `${label(pkg)}
289
+ ${docs}
290
+ Query with libdocs_query(name, query).` };
291
+ }
292
+ async function libdocsQuery(raw, ctx) {
293
+ const args = external_exports.object(queryInput).parse(raw);
294
+ const pkg = resolvePackage(ctx.root, args.name);
295
+ if (!pkg) return notFound(ctx, args.name);
296
+ const store = storeFor(ctx);
297
+ await store.ensure(pkg, ctx.root);
298
+ const sections = store.query(pkg, args.query, 6);
299
+ if (sections.length === 0)
300
+ return { text: `${label(pkg)}: nothing matches "${args.query}" in its shipped docs.` };
301
+ const blocks = sections.map(
302
+ (s) => `--- ${s.file}:${s.startLine}-${s.endLine} \xA7 ${s.heading}
303
+ ${s.content.trim()}`
304
+ );
305
+ return { text: fitRows(`${label(pkg)} \u2014 "${args.query}"`, blocks, args.max_chars ?? 5e3) };
306
+ }
307
+ var runtime = {
308
+ tools: { libdocs_resolve: libdocsResolve, libdocs_query: libdocsQuery },
309
+ dispose: () => {
310
+ for (const store of stores.values()) store.close();
311
+ stores.clear();
312
+ return Promise.resolve();
313
+ }
314
+ };
315
+ export {
316
+ runtime
317
+ };
318
+ //# sourceMappingURL=runtime-CVZMWIJO.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/modules/libdocs/runtime.ts", "../../src/modules/libdocs/packages.ts", "../../src/modules/libdocs/store.ts"],
4
+ "sourcesContent": ["import { join } from 'node:path';\nimport { z } from 'zod';\nimport type { ModuleContext, ModuleRuntime, ToolResult } from '@cli/modules/contract';\nimport { fitRows } from '@cli/shared/budget';\nimport { queryInput, resolveInput } from './definition';\nimport { declaredDependencies, resolvePackage, type InstalledPackage } from './packages';\nimport { LibDocsStore } from './store';\n\nconst stores = new Map<string, LibDocsStore>();\n\nfunction storeFor(ctx: ModuleContext): LibDocsStore {\n let store = stores.get(ctx.root);\n if (!store) {\n store = LibDocsStore.open(join(ctx.paths.yandecodeDir, 'libdocs.db'));\n stores.set(ctx.root, store);\n }\n return store;\n}\n\nfunction notFound(ctx: ModuleContext, name: string): ToolResult {\n const declared = declaredDependencies(ctx.root);\n const range = declared.get(name);\n if (range !== undefined) {\n return {\n isError: true,\n text: `${name} is declared in package.json (${range}) but not installed; install dependencies first (docs are read from the installed version).`,\n };\n }\n const needle = name.toLowerCase();\n const close = [...declared.keys()].filter(\n (d) => d.toLowerCase().includes(needle) || needle.includes(d.toLowerCase()),\n );\n return {\n isError: true,\n text: `No installed package \"${name}\".${close.length > 0 ? ` Did you mean: ${close.slice(0, 5).join(', ')}?` : ''}`,\n };\n}\n\nconst label = (pkg: InstalledPackage): string =>\n `${pkg.name}@${pkg.version} (${pkg.ecosystem}${pkg.declared ? `, declared ${pkg.declared}` : ''})`;\n\nasync function libdocsResolve(\n raw: Record<string, unknown>,\n ctx: ModuleContext,\n): Promise<ToolResult> {\n const { name } = z.object(resolveInput).parse(raw);\n const pkg = resolvePackage(ctx.root, name);\n if (!pkg) return notFound(ctx, name);\n const store = storeFor(ctx);\n const files = await store.ensure(pkg, ctx.root);\n const docs =\n files.length > 0\n ? `${store.sectionCount(pkg)} sections from ${files.join(', ')}`\n : 'no docs or type declarations shipped';\n return { text: `${label(pkg)}\\n${docs}\\nQuery with libdocs_query(name, query).` };\n}\n\nasync function libdocsQuery(raw: Record<string, unknown>, ctx: ModuleContext): Promise<ToolResult> {\n const args = z.object(queryInput).parse(raw);\n const pkg = resolvePackage(ctx.root, args.name);\n if (!pkg) return notFound(ctx, args.name);\n const store = storeFor(ctx);\n await store.ensure(pkg, ctx.root);\n const sections = store.query(pkg, args.query, 6);\n if (sections.length === 0)\n return { text: `${label(pkg)}: nothing matches \"${args.query}\" in its shipped docs.` };\n const blocks = sections.map(\n (s) => `--- ${s.file}:${s.startLine}-${s.endLine} \u00A7 ${s.heading}\\n${s.content.trim()}`,\n );\n return { text: fitRows(`${label(pkg)} \u2014 \"${args.query}\"`, blocks, args.max_chars ?? 5_000) };\n}\n\nexport const runtime: ModuleRuntime = {\n tools: { libdocs_resolve: libdocsResolve, libdocs_query: libdocsQuery },\n dispose: () => {\n for (const store of stores.values()) store.close();\n stores.clear();\n return Promise.resolve();\n },\n};\n", "import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';\nimport { join } from 'node:path';\n\nexport interface InstalledPackage {\n name: string;\n version: string;\n ecosystem: 'npm' | 'python';\n dir: string;\n /** Range declared by the project (package.json / requirements.txt), if any. */\n declared: string | null;\n /** Absolute paths of the files worth indexing, most useful first. */\n docFiles: string[];\n}\n\nconst MAX_DOC_FILES = 400;\n/** Declaration files beyond this total size are skipped (huge generated typings). */\nconst MAX_DECLARATION_BYTES = 4 * 1_048_576;\n\nfunction readJson(file: string): Record<string, unknown> | null {\n try {\n return JSON.parse(readFileSync(file, 'utf8')) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\n/** Dependencies the project declares, name \u2192 version range. */\nexport function declaredDependencies(root: string): Map<string, string> {\n const out = new Map<string, string>();\n const pkg = readJson(join(root, 'package.json'));\n for (const field of [\n 'dependencies',\n 'devDependencies',\n 'peerDependencies',\n 'optionalDependencies',\n ]) {\n const deps = pkg?.[field];\n if (typeof deps === 'object' && deps !== null) {\n for (const [name, range] of Object.entries(deps as Record<string, unknown>))\n out.set(name, String(range));\n }\n }\n const requirements = join(root, 'requirements.txt');\n if (existsSync(requirements)) {\n for (const line of readFileSync(requirements, 'utf8').split('\\n')) {\n const m = /^\\s*([A-Za-z0-9_.-]+)\\s*([<>=!~].*)?$/.exec(line.replace(/#.*/, ''));\n if (m) out.set(m[1]!, m[2]?.trim() ?? '*');\n }\n }\n return out;\n}\n\nfunction filesUnder(dir: string, pattern: RegExp, depth = 0): string[] {\n if (!existsSync(dir) || depth > 5) return [];\n return readdirSync(dir, { withFileTypes: true })\n .sort((a, b) => a.name.localeCompare(b.name))\n .flatMap((e) => {\n const abs = join(dir, e.name);\n if (e.isDirectory())\n return e.name === 'node_modules' ? [] : filesUnder(abs, pattern, depth + 1);\n return pattern.test(e.name) ? [abs] : [];\n });\n}\n\n/** The types entry first, then every other declaration file, within a size budget. */\nfunction declarationFiles(dir: string, entry: string | undefined): string[] {\n const all = filesUnder(dir, /\\.d\\.(ts|mts|cts)$/);\n const ordered = entry ? [join(dir, entry), ...all.filter((f) => f !== join(dir, entry))] : all;\n const kept: string[] = [];\n let bytes = 0;\n for (const file of ordered) {\n bytes += statSync(file).size;\n if (bytes > MAX_DECLARATION_BYTES) break;\n kept.push(file);\n }\n return kept;\n}\n\nfunction npmPackage(root: string, name: string, declared: string | null): InstalledPackage | null {\n const dir = join(root, 'node_modules', ...name.split('/'));\n const manifest = readJson(join(dir, 'package.json'));\n if (!manifest || typeof manifest.version !== 'string') return null;\n const readme = readdirSync(dir).filter((f) => /^readme(\\.mdx?|\\.markdown)?$/i.test(f));\n const typesEntry = [manifest.types, manifest.typings, 'index.d.ts'].find(\n (t): t is string => typeof t === 'string' && existsSync(join(dir, t)),\n );\n const docs = filesUnder(join(dir, 'docs'), /\\.mdx?$/i);\n const files = [...readme.map((f) => join(dir, f)), ...docs, ...declarationFiles(dir, typesEntry)];\n return {\n name,\n version: manifest.version,\n ecosystem: 'npm',\n dir,\n declared,\n docFiles: files.slice(0, MAX_DOC_FILES),\n };\n}\n\nfunction sitePackagesDirs(root: string): string[] {\n const dirs: string[] = [];\n for (const venv of ['.venv', 'venv', 'env']) {\n const lib = join(root, venv, 'lib');\n if (existsSync(lib)) {\n for (const py of readdirSync(lib).filter((d) => d.startsWith('python')))\n dirs.push(join(lib, py, 'site-packages'));\n }\n const windows = join(root, venv, 'Lib', 'site-packages');\n if (existsSync(windows)) dirs.push(windows);\n }\n return dirs.filter((d) => existsSync(d) && statSync(d).isDirectory());\n}\n\nfunction pythonPackage(\n root: string,\n name: string,\n declared: string | null,\n): InstalledPackage | null {\n const normalized = name.toLowerCase().replace(/[-_.]+/g, '_');\n for (const site of sitePackagesDirs(root)) {\n const dist = readdirSync(site).find((d) => {\n const m = /^(.+)-([^-]+)\\.dist-info$/.exec(d);\n return m !== null && m[1]!.toLowerCase().replace(/[-_.]+/g, '_') === normalized;\n });\n if (!dist) continue;\n const version = /-([^-]+)\\.dist-info$/.exec(dist)![1]!;\n const metadata = join(site, dist, 'METADATA');\n return {\n name,\n version,\n ecosystem: 'python',\n dir: join(site, dist),\n declared,\n docFiles: existsSync(metadata) ? [metadata] : [],\n };\n }\n return null;\n}\n\n/** The installed package for `name` (npm first, then the project's Python virtualenv). */\nexport function resolvePackage(root: string, name: string): InstalledPackage | null {\n const declared = declaredDependencies(root).get(name) ?? null;\n return npmPackage(root, name, declared) ?? pythonPackage(root, name, declared);\n}\n", "import { mkdirSync, readFileSync } from 'node:fs';\nimport { basename, dirname, relative } from 'node:path';\nimport { openModuleDb, toFtsQuery, type Database } from '@yandecode/core';\nimport { extractSymbols } from '@yandecode/retrieval';\nimport { splitSections } from '@cli/shared/markdown';\nimport type { InstalledPackage } from './packages';\n\nconst MIGRATIONS = [\n `\n CREATE TABLE libs (key TEXT PRIMARY KEY, version TEXT NOT NULL, indexed_at TEXT NOT NULL, files TEXT NOT NULL);\n CREATE TABLE sections (\n id INTEGER PRIMARY KEY, lib TEXT NOT NULL, file TEXT NOT NULL, heading TEXT NOT NULL,\n start_line INTEGER NOT NULL, end_line INTEGER NOT NULL, content TEXT NOT NULL\n );\n CREATE INDEX sections_lib ON sections (lib);\n CREATE VIRTUAL TABLE sections_fts USING fts5 (content, heading, tokenize = 'porter unicode61');\n `,\n];\n\nexport interface DocSection {\n file: string;\n heading: string;\n startLine: number;\n endLine: number;\n content: string;\n}\n\ninterface Piece {\n heading: string;\n startLine: number;\n endLine: number;\n content: string;\n}\n\n/** Top-level declarations of a .d.ts file, each with the doc comment right above it. */\nasync function declarationPieces(text: string, file: string): Promise<Piece[]> {\n const lines = text.split('\\n');\n const symbols = (await extractSymbols(text, 'typescript')).filter((s) => s.parent === null);\n return symbols.map((s) => {\n let start = s.startLine;\n while (start > 1 && /^\\s*(\\/\\*\\*|\\*)/.test(lines[start - 2] ?? '')) start--;\n return {\n heading: `${basename(file)} \u203A ${s.namePath}`,\n startLine: start,\n endLine: s.endLine,\n content: lines.slice(start - 1, s.endLine).join('\\n'),\n };\n });\n}\n\n/** METADATA = RFC 822 headers, a blank line, then the long description (usually the README). */\nfunction metadataPieces(text: string): Piece[] {\n const blank = text.indexOf('\\n\\n');\n const offset = blank < 0 ? 0 : text.slice(0, blank).split('\\n').length + 1;\n return splitSections(blank < 0 ? text : text.slice(blank + 2)).map((s) => ({\n ...s,\n startLine: s.startLine + offset,\n endLine: s.endLine + offset,\n }));\n}\n\n/** Installed-version documentation per library, reindexed whenever the version changes. */\nexport class LibDocsStore {\n private constructor(private readonly db: Database) {}\n\n static open(file: string): LibDocsStore {\n mkdirSync(dirname(file), { recursive: true });\n return new LibDocsStore(openModuleDb(file, MIGRATIONS));\n }\n\n close(): void {\n this.db.close();\n }\n\n private key(pkg: InstalledPackage): string {\n return `${pkg.ecosystem}:${pkg.name}`;\n }\n\n /** Indexes the package unless this exact version is already indexed; returns the file list. */\n async ensure(pkg: InstalledPackage, root: string): Promise<string[]> {\n const key = this.key(pkg);\n const row = this.db.prepare('SELECT version, files FROM libs WHERE key = ?').get(key) as\n { version: string; files: string } | undefined;\n if (row?.version === pkg.version) return JSON.parse(row.files) as string[];\n const pieces = await Promise.all(\n pkg.docFiles.map(async (abs) => {\n const text = readFileSync(abs, 'utf8');\n const rel = relative(root, abs).split('\\\\').join('/');\n const parts = /\\.d\\.[mc]?ts$/.test(abs)\n ? await declarationPieces(text, abs)\n : basename(abs) === 'METADATA'\n ? metadataPieces(text)\n : splitSections(text);\n return parts.map((p) => ({ ...p, file: rel }));\n }),\n );\n const files = pkg.docFiles.map((abs) => relative(pkg.dir, abs).split('\\\\').join('/'));\n this.db.transaction(() => {\n for (const { id } of this.db.prepare('SELECT id FROM sections WHERE lib = ?').all(key) as {\n id: number;\n }[]) {\n this.db.prepare('DELETE FROM sections_fts WHERE rowid = ?').run(id);\n }\n this.db.prepare('DELETE FROM sections WHERE lib = ?').run(key);\n const insert = this.db.prepare(\n 'INSERT INTO sections (lib, file, heading, start_line, end_line, content) VALUES (?, ?, ?, ?, ?, ?)',\n );\n const fts = this.db.prepare(\n 'INSERT INTO sections_fts (rowid, content, heading) VALUES (?, ?, ?)',\n );\n for (const p of pieces.flat()) {\n const id = insert.run(\n key,\n p.file,\n p.heading,\n p.startLine,\n p.endLine,\n p.content,\n ).lastInsertRowid;\n fts.run(id, p.content, p.heading);\n }\n this.db\n .prepare(\n 'INSERT OR REPLACE INTO libs (key, version, indexed_at, files) VALUES (?, ?, ?, ?)',\n )\n .run(key, pkg.version, new Date().toISOString(), JSON.stringify(files));\n })();\n return files;\n }\n\n sectionCount(pkg: InstalledPackage): number {\n return (\n this.db.prepare('SELECT COUNT(*) AS n FROM sections WHERE lib = ?').get(this.key(pkg)) as {\n n: number;\n }\n ).n;\n }\n\n query(pkg: InstalledPackage, query: string, limit: number): DocSection[] {\n const fts = toFtsQuery(query);\n if (!fts) return [];\n return (\n this.db\n .prepare(\n `SELECT s.file, s.heading, s.start_line, s.end_line, s.content\n FROM sections_fts JOIN sections s ON s.id = sections_fts.rowid\n WHERE sections_fts MATCH ? AND s.lib = ? ORDER BY bm25(sections_fts, 1.0, 2.0) LIMIT ?`,\n )\n .all(fts, this.key(pkg), limit) as {\n file: string;\n heading: string;\n start_line: number;\n end_line: number;\n content: string;\n }[]\n ).map((r) => ({\n file: r.file,\n heading: r.heading,\n startLine: r.start_line,\n endLine: r.end_line,\n content: r.content,\n }));\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["join", "readFileSync", "readFileSync", "join"]
7
+ }
@@ -0,0 +1,295 @@
1
+ import { createRequire as __yandecodeCreateRequire } from 'node:module';
2
+ const require = __yandecodeCreateRequire(import.meta.url);
3
+ import {
4
+ moduleContext,
5
+ requireWorkspace
6
+ } from "./chunk-QCQC73WX.js";
7
+ import {
8
+ codeModule,
9
+ definitionInput,
10
+ referencesInput,
11
+ repoMapInput,
12
+ searchInput,
13
+ symbolsInput
14
+ } from "./chunk-7L6DD2VD.js";
15
+ import {
16
+ fitRows
17
+ } from "./chunk-OIAMKDTQ.js";
18
+ import {
19
+ CodeIndex
20
+ } from "./chunk-2S6B3DDQ.js";
21
+ import {
22
+ external_exports
23
+ } from "./chunk-Y2MIXROU.js";
24
+
25
+ // packages/cli/src/modules/code/runtime.ts
26
+ import { join as join3 } from "node:path";
27
+
28
+ // packages/cli/src/shared/once.ts
29
+ import { mkdirSync, openSync, closeSync } from "node:fs";
30
+ import { join } from "node:path";
31
+ function firstTimeInSession(yandecodeDir, sessionId, kind) {
32
+ const dir = join(yandecodeDir, "hints");
33
+ mkdirSync(dir, { recursive: true });
34
+ const safe = `${sessionId}.${kind}`.replace(/[^\w.-]/g, "_");
35
+ try {
36
+ closeSync(openSync(join(dir, safe), "wx"));
37
+ return true;
38
+ } catch {
39
+ return false;
40
+ }
41
+ }
42
+
43
+ // packages/cli/src/modules/code/nudge.ts
44
+ import { statSync } from "node:fs";
45
+ import { extname, isAbsolute, join as join2 } from "node:path";
46
+ var CODE_EXTENSIONS = /* @__PURE__ */ new Set([
47
+ ".ts",
48
+ ".tsx",
49
+ ".js",
50
+ ".jsx",
51
+ ".mjs",
52
+ ".cjs",
53
+ ".py",
54
+ ".rs",
55
+ ".go",
56
+ ".java",
57
+ ".kt",
58
+ ".c",
59
+ ".h",
60
+ ".cc",
61
+ ".cpp",
62
+ ".hpp",
63
+ ".cs",
64
+ ".rb",
65
+ ".php",
66
+ ".swift",
67
+ ".scala"
68
+ ]);
69
+ var LARGE_FILE_BYTES = 12e3;
70
+ var SEARCH = {
71
+ kind: "search",
72
+ text: "yandecode: to find where code is defined or handled, `code_search(query)` returns path:line rows with signatures (identifiers, `Class/method`, file fragments or plain words), and `code_references(name)` lists usages \u2014 cheaper than grep/find over source files."
73
+ };
74
+ var READ = {
75
+ kind: "read",
76
+ text: "yandecode: `code_symbols(path)` lists a file\u2019s functions and types with line ranges, and `code_definition(name)` returns just one of them \u2014 read or cat whole source files only when you will edit most of them."
77
+ };
78
+ var isCode = (path) => CODE_EXTENSIONS.has(extname(path).toLowerCase());
79
+ function segments(command) {
80
+ return command.replace(/'[^']*'|"(?:\\.|[^"\\])*"/g, "''").split(/&&|\|\||;|\|/).map((s) => s.trim());
81
+ }
82
+ function bashNudge(command) {
83
+ const parts = segments(command);
84
+ if (parts.some(
85
+ (s) => /^(grep|egrep|rg|ag|ack|git grep)\b/.test(s) || /^find\b.*-(name|path|iname)\b/.test(s)
86
+ )) {
87
+ return SEARCH;
88
+ }
89
+ const reads = /^(cat|head|tail|sed -n|nl|less|more)\b/;
90
+ if (parts.some((s) => reads.test(s)) && [...command.matchAll(/[\w./-]+\.\w+/g)].some((m) => isCode(m[0]))) {
91
+ return READ;
92
+ }
93
+ return null;
94
+ }
95
+ function readNudge(input, root) {
96
+ const path = input.file_path;
97
+ if (typeof path !== "string" || !isCode(path) || input.offset !== void 0 || input.limit !== void 0)
98
+ return null;
99
+ const size = statSync(isAbsolute(path) ? path : join2(root, path), { throwIfNoEntry: false })?.size ?? 0;
100
+ return size > LARGE_FILE_BYTES ? READ : null;
101
+ }
102
+ function nudgeFor(tool, input, root) {
103
+ if (tool === "Grep" || tool === "Glob") return SEARCH;
104
+ if (tool === "Bash" && typeof input.command === "string") return bashNudge(input.command);
105
+ if (tool === "Read") return readNudge(input, root);
106
+ return null;
107
+ }
108
+
109
+ // packages/cli/src/modules/code/runtime.ts
110
+ var SYNC_INTERVAL_MS = 1500;
111
+ var open = /* @__PURE__ */ new Map();
112
+ async function freshIndex(ctx) {
113
+ let entry = open.get(ctx.root);
114
+ if (!entry) {
115
+ entry = {
116
+ index: CodeIndex.open(join3(ctx.paths.yandecodeDir, "code.db"), ctx.root),
117
+ lastSync: 0
118
+ };
119
+ open.set(ctx.root, entry);
120
+ }
121
+ if (Date.now() - entry.lastSync > SYNC_INTERVAL_MS) {
122
+ await entry.index.sync();
123
+ entry.lastSync = Date.now();
124
+ }
125
+ return entry.index;
126
+ }
127
+ var text = (value) => ({ text: value });
128
+ function symbolRow(s) {
129
+ return `${s.path}:${s.startLine}-${s.endLine} ${s.kind} ${s.namePath} \u2014 ${s.signature}`;
130
+ }
131
+ function textRow(h) {
132
+ return `${h.path}:${h.startLine}-${h.endLine}${h.symbol ? ` [${h.symbol}]` : ""} ${h.snippet}`;
133
+ }
134
+ function routeQuery(query) {
135
+ const q = query.trim();
136
+ if (/\s/.test(q)) return ["text"];
137
+ if (/\.[a-z0-9]{1,5}$/i.test(q) || q.includes("/") && q.includes(".")) return ["path"];
138
+ if (q.includes("/")) return ["symbol", "path"];
139
+ return ["symbol", "path", "text"];
140
+ }
141
+ function symbolSection(index, query, path, limit) {
142
+ const filter = path ? { path } : {};
143
+ const exact = index.findSymbols(query, { ...filter, limit });
144
+ return exact.length > 0 ? exact : index.findSymbols(query, { ...filter, substring: true, limit });
145
+ }
146
+ function gather(index, args, modes, auto) {
147
+ const limit = args.limit ?? 10;
148
+ const exact = modes.includes("symbol") ? symbolSection(index, args.query, args.path, limit) : [];
149
+ const echoed = modes.includes("symbol") ? [] : index.findSymbolsByTerms(args.query, { limit: 3 });
150
+ const pathLimit = exact.length > 0 ? Math.min(limit, 3) : limit;
151
+ const wantText = modes.includes("text") && (!auto || exact.length === 0);
152
+ return {
153
+ symbols: [...exact, ...echoed],
154
+ paths: modes.includes("path") ? index.searchPaths(args.query, pathLimit) : [],
155
+ textHits: wantText ? index.searchText(args.query, echoed.length > 0 ? Math.min(limit, 6) : limit) : []
156
+ };
157
+ }
158
+ function section(title, rows) {
159
+ return rows.length > 0 ? [title, ...rows.map((r) => ` ${r}`)] : [];
160
+ }
161
+ async function codeSearch(raw, ctx) {
162
+ const args = external_exports.object(searchInput).parse(raw);
163
+ const index = await freshIndex(ctx);
164
+ const auto = (args.mode ?? "auto") === "auto";
165
+ const modes = auto ? routeQuery(args.query) : [args.mode];
166
+ const found = gather(index, args, modes, auto);
167
+ const rows = [
168
+ ...section("symbols:", found.symbols.map(symbolRow)),
169
+ ...section("files:", found.paths),
170
+ ...section("text:", found.textHits.map(textRow))
171
+ ];
172
+ if (rows.length === 0) {
173
+ return text(
174
+ `No code matches "${args.query}" (strategies: ${modes.join(", ")}). Try other words, a file fragment or mode=text.`
175
+ );
176
+ }
177
+ return text(
178
+ fitRows(`code_search "${args.query}" (${modes.join("+")})`, rows, args.max_chars ?? 4e3)
179
+ );
180
+ }
181
+ async function codeSymbols(raw, ctx) {
182
+ const args = external_exports.object(symbolsInput).parse(raw);
183
+ const index = await freshIndex(ctx);
184
+ const path = args.path.replace(/^\.\//, "");
185
+ const outline = index.outline(path);
186
+ if (outline.length === 0) {
187
+ const similar = index.searchPaths(path, 3);
188
+ return text(
189
+ `No symbols indexed for ${path}.${similar.length > 0 ? ` Did you mean: ${similar.join(", ")}?` : ""}`
190
+ );
191
+ }
192
+ const rows = outline.map(
193
+ (s) => `${" ".repeat(s.namePath.split("/").length - 1)}${s.startLine}-${s.endLine} ${s.kind} ${s.name} \u2014 ${s.signature}`
194
+ );
195
+ return text(fitRows(`${path} (${outline.length} symbols)`, rows, args.max_chars ?? 4e3));
196
+ }
197
+ async function codeDefinition(raw, ctx) {
198
+ const args = external_exports.object(definitionInput).parse(raw);
199
+ const index = await freshIndex(ctx);
200
+ const found = index.definition(args.name_path, args.path);
201
+ if (!found) {
202
+ const near = index.findSymbols(args.name_path.split("/").pop(), { substring: true, limit: 5 });
203
+ return text(
204
+ `Symbol "${args.name_path}" not found.${near.length > 0 ? ` Close matches: ${near.map((s) => s.namePath).join(", ")}` : ""}`
205
+ );
206
+ }
207
+ const others = index.findSymbols(args.name_path, { limit: 6 }).length - 1;
208
+ const ambiguity = others > 0 ? ` (${others} other symbol(s) share this name; pass path= to choose)` : "";
209
+ const header = `${found.path}:${found.startLine}-${found.endLine} ${found.kind} ${found.namePath}${ambiguity}`;
210
+ const numbered = found.body.split("\n").map((line, i) => `${found.startLine + i} ${line}`);
211
+ return text(fitRows(header, numbered, args.max_chars ?? 8e3));
212
+ }
213
+ async function codeReferences(raw, ctx) {
214
+ const args = external_exports.object(referencesInput).parse(raw);
215
+ const index = await freshIndex(ctx);
216
+ const refs = index.references(args.name_path, 200);
217
+ const definition = index.findSymbols(args.name_path, { limit: 1 })[0];
218
+ const rows = refs.map((r) => `${r.path}:${r.line} ${r.text}`);
219
+ const importers = definition ? index.importersOf(definition.path) : [];
220
+ if (definition && importers.length > 0) {
221
+ rows.push(`importers of ${definition.path}: ${importers.join(", ")}`);
222
+ }
223
+ if (rows.length === 0) return text(`No references to "${args.name_path}" found.`);
224
+ return text(
225
+ fitRows(
226
+ `references to ${args.name_path} (${refs.length} lines, lexical)`,
227
+ rows,
228
+ args.max_chars ?? 4e3
229
+ )
230
+ );
231
+ }
232
+ async function repoMap(raw, ctx) {
233
+ const args = external_exports.object(repoMapInput).parse(raw);
234
+ const index = await freshIndex(ctx);
235
+ const focus = args.focus?.replace(/^\.\//, "");
236
+ const map = index.repoMap({ maxChars: args.max_chars ?? 6e3, ...focus ? { focus } : {} });
237
+ return text(map.length > 0 ? map : `No indexed files${focus ? ` under ${focus}` : ""}.`);
238
+ }
239
+ function preToolUse(input, ctx) {
240
+ const nudge = nudgeFor(input.tool_name ?? "", input.tool_input ?? {}, ctx.root);
241
+ if (!nudge || !firstTimeInSession(ctx.paths.yandecodeDir, input.session_id ?? "unknown", nudge.kind)) {
242
+ return Promise.resolve({ kind: "none" });
243
+ }
244
+ ctx.log("nudge", { kind: nudge.kind, tool: input.tool_name });
245
+ return Promise.resolve({ kind: "context", text: nudge.text });
246
+ }
247
+ var runtime = {
248
+ hooks: { PreToolUse: preToolUse },
249
+ tools: {
250
+ code_search: codeSearch,
251
+ code_symbols: codeSymbols,
252
+ code_definition: codeDefinition,
253
+ code_references: codeReferences,
254
+ repo_map: repoMap
255
+ },
256
+ doctor: async (ctx) => {
257
+ const index = await freshIndex(ctx);
258
+ const stats = index.stats();
259
+ return [
260
+ {
261
+ name: "code index",
262
+ status: stats.files > 0 ? "ok" : "warn",
263
+ detail: `${stats.files} files, ${stats.symbols} symbols, ${stats.chunks} chunks`,
264
+ ...stats.files > 0 ? {} : { fix: "no source files found; check .gitignore" }
265
+ }
266
+ ];
267
+ },
268
+ dispose: () => {
269
+ for (const entry of open.values()) entry.index.close();
270
+ open.clear();
271
+ return Promise.resolve();
272
+ }
273
+ };
274
+ async function runIndexCommand(cwd) {
275
+ const ws = requireWorkspace(cwd);
276
+ const index = await freshIndex(moduleContext(ws, codeModule));
277
+ const report = await index.sync();
278
+ const stats = index.stats();
279
+ process.stdout.write(
280
+ `code index: ${stats.files} files, ${stats.symbols} symbols (+${report.added} ~${report.changed} -${report.removed}) in ${report.durationMs} ms
281
+ `
282
+ );
283
+ }
284
+ async function runSearchCommand(cwd, query) {
285
+ const ws = requireWorkspace(cwd);
286
+ const result = await codeSearch({ query }, moduleContext(ws, codeModule));
287
+ process.stdout.write(`${result.text}
288
+ `);
289
+ }
290
+ export {
291
+ runIndexCommand,
292
+ runSearchCommand,
293
+ runtime
294
+ };
295
+ //# sourceMappingURL=runtime-DBNXBOAL.js.map