pando-ai 0.1.1 → 0.1.2

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 (150) hide show
  1. package/dist/cli.js +216 -352
  2. package/dist/watcher-process.js +546 -686
  3. package/dist/workers/chunk-LGZQCDFH.mjs +522 -0
  4. package/dist/workers/{chunk-HQDE7M4W.mjs → chunk-ODST7O2H.mjs} +4 -4
  5. package/dist/workers/indexer-worker.mjs +1 -1
  6. package/dist/workers/snapshot-worker.mjs +3 -3
  7. package/dist/workers/sqlite-writer-worker.mjs +16 -63
  8. package/package.json +10 -6
  9. package/resources/tools/pando-tools.json +832 -429
  10. package/tools/clojure-editor/lib/pando-clojure-editor-standalone.jar +0 -0
  11. package/tools/clojure-indexer/lib/pando-clojure-indexer-standalone.jar +0 -0
  12. package/tools/csharp-indexer/CSharpIndexer.csproj +12 -0
  13. package/tools/csharp-indexer/bin/Release/net10.0/CSharpIndexer +0 -0
  14. package/tools/csharp-indexer/bin/Release/net10.0/CSharpIndexer.deps.json +383 -0
  15. package/tools/csharp-indexer/bin/Release/net10.0/CSharpIndexer.dll +0 -0
  16. package/tools/csharp-indexer/bin/Release/net10.0/CSharpIndexer.pdb +0 -0
  17. package/tools/csharp-indexer/bin/Release/net10.0/CSharpIndexer.runtimeconfig.json +13 -0
  18. package/tools/csharp-indexer/bin/Release/net10.0/Humanizer.dll +0 -0
  19. package/tools/csharp-indexer/bin/Release/net10.0/Microsoft.CodeAnalysis.CSharp.Workspaces.dll +0 -0
  20. package/tools/csharp-indexer/bin/Release/net10.0/Microsoft.CodeAnalysis.CSharp.dll +0 -0
  21. package/tools/csharp-indexer/bin/Release/net10.0/Microsoft.CodeAnalysis.Workspaces.dll +0 -0
  22. package/tools/csharp-indexer/bin/Release/net10.0/Microsoft.CodeAnalysis.dll +0 -0
  23. package/tools/csharp-indexer/bin/Release/net10.0/System.Composition.AttributedModel.dll +0 -0
  24. package/tools/csharp-indexer/bin/Release/net10.0/System.Composition.Convention.dll +0 -0
  25. package/tools/csharp-indexer/bin/Release/net10.0/System.Composition.Hosting.dll +0 -0
  26. package/tools/csharp-indexer/bin/Release/net10.0/System.Composition.Runtime.dll +0 -0
  27. package/tools/csharp-indexer/bin/Release/net10.0/System.Composition.TypedParts.dll +0 -0
  28. package/tools/csharp-indexer/bin/Release/net10.0/cs/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +0 -0
  29. package/tools/csharp-indexer/bin/Release/net10.0/cs/Microsoft.CodeAnalysis.CSharp.resources.dll +0 -0
  30. package/tools/csharp-indexer/bin/Release/net10.0/cs/Microsoft.CodeAnalysis.Workspaces.resources.dll +0 -0
  31. package/tools/csharp-indexer/bin/Release/net10.0/cs/Microsoft.CodeAnalysis.resources.dll +0 -0
  32. package/tools/csharp-indexer/bin/Release/net10.0/de/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +0 -0
  33. package/tools/csharp-indexer/bin/Release/net10.0/de/Microsoft.CodeAnalysis.CSharp.resources.dll +0 -0
  34. package/tools/csharp-indexer/bin/Release/net10.0/de/Microsoft.CodeAnalysis.Workspaces.resources.dll +0 -0
  35. package/tools/csharp-indexer/bin/Release/net10.0/de/Microsoft.CodeAnalysis.resources.dll +0 -0
  36. package/tools/csharp-indexer/bin/Release/net10.0/es/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +0 -0
  37. package/tools/csharp-indexer/bin/Release/net10.0/es/Microsoft.CodeAnalysis.CSharp.resources.dll +0 -0
  38. package/tools/csharp-indexer/bin/Release/net10.0/es/Microsoft.CodeAnalysis.Workspaces.resources.dll +0 -0
  39. package/tools/csharp-indexer/bin/Release/net10.0/es/Microsoft.CodeAnalysis.resources.dll +0 -0
  40. package/tools/csharp-indexer/bin/Release/net10.0/fr/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +0 -0
  41. package/tools/csharp-indexer/bin/Release/net10.0/fr/Microsoft.CodeAnalysis.CSharp.resources.dll +0 -0
  42. package/tools/csharp-indexer/bin/Release/net10.0/fr/Microsoft.CodeAnalysis.Workspaces.resources.dll +0 -0
  43. package/tools/csharp-indexer/bin/Release/net10.0/fr/Microsoft.CodeAnalysis.resources.dll +0 -0
  44. package/tools/csharp-indexer/bin/Release/net10.0/it/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +0 -0
  45. package/tools/csharp-indexer/bin/Release/net10.0/it/Microsoft.CodeAnalysis.CSharp.resources.dll +0 -0
  46. package/tools/csharp-indexer/bin/Release/net10.0/it/Microsoft.CodeAnalysis.Workspaces.resources.dll +0 -0
  47. package/tools/csharp-indexer/bin/Release/net10.0/it/Microsoft.CodeAnalysis.resources.dll +0 -0
  48. package/tools/csharp-indexer/bin/Release/net10.0/ja/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +0 -0
  49. package/tools/csharp-indexer/bin/Release/net10.0/ja/Microsoft.CodeAnalysis.CSharp.resources.dll +0 -0
  50. package/tools/csharp-indexer/bin/Release/net10.0/ja/Microsoft.CodeAnalysis.Workspaces.resources.dll +0 -0
  51. package/tools/csharp-indexer/bin/Release/net10.0/ja/Microsoft.CodeAnalysis.resources.dll +0 -0
  52. package/tools/csharp-indexer/bin/Release/net10.0/ko/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +0 -0
  53. package/tools/csharp-indexer/bin/Release/net10.0/ko/Microsoft.CodeAnalysis.CSharp.resources.dll +0 -0
  54. package/tools/csharp-indexer/bin/Release/net10.0/ko/Microsoft.CodeAnalysis.Workspaces.resources.dll +0 -0
  55. package/tools/csharp-indexer/bin/Release/net10.0/ko/Microsoft.CodeAnalysis.resources.dll +0 -0
  56. package/tools/csharp-indexer/bin/Release/net10.0/pl/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +0 -0
  57. package/tools/csharp-indexer/bin/Release/net10.0/pl/Microsoft.CodeAnalysis.CSharp.resources.dll +0 -0
  58. package/tools/csharp-indexer/bin/Release/net10.0/pl/Microsoft.CodeAnalysis.Workspaces.resources.dll +0 -0
  59. package/tools/csharp-indexer/bin/Release/net10.0/pl/Microsoft.CodeAnalysis.resources.dll +0 -0
  60. package/tools/csharp-indexer/bin/Release/net10.0/pt-BR/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +0 -0
  61. package/tools/csharp-indexer/bin/Release/net10.0/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll +0 -0
  62. package/tools/csharp-indexer/bin/Release/net10.0/pt-BR/Microsoft.CodeAnalysis.Workspaces.resources.dll +0 -0
  63. package/tools/csharp-indexer/bin/Release/net10.0/pt-BR/Microsoft.CodeAnalysis.resources.dll +0 -0
  64. package/tools/csharp-indexer/bin/Release/net10.0/ru/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +0 -0
  65. package/tools/csharp-indexer/bin/Release/net10.0/ru/Microsoft.CodeAnalysis.CSharp.resources.dll +0 -0
  66. package/tools/csharp-indexer/bin/Release/net10.0/ru/Microsoft.CodeAnalysis.Workspaces.resources.dll +0 -0
  67. package/tools/csharp-indexer/bin/Release/net10.0/ru/Microsoft.CodeAnalysis.resources.dll +0 -0
  68. package/tools/csharp-indexer/bin/Release/net10.0/tr/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +0 -0
  69. package/tools/csharp-indexer/bin/Release/net10.0/tr/Microsoft.CodeAnalysis.CSharp.resources.dll +0 -0
  70. package/tools/csharp-indexer/bin/Release/net10.0/tr/Microsoft.CodeAnalysis.Workspaces.resources.dll +0 -0
  71. package/tools/csharp-indexer/bin/Release/net10.0/tr/Microsoft.CodeAnalysis.resources.dll +0 -0
  72. package/tools/csharp-indexer/bin/Release/net10.0/zh-Hans/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +0 -0
  73. package/tools/csharp-indexer/bin/Release/net10.0/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll +0 -0
  74. package/tools/csharp-indexer/bin/Release/net10.0/zh-Hans/Microsoft.CodeAnalysis.Workspaces.resources.dll +0 -0
  75. package/tools/csharp-indexer/bin/Release/net10.0/zh-Hans/Microsoft.CodeAnalysis.resources.dll +0 -0
  76. package/tools/csharp-indexer/bin/Release/net10.0/zh-Hant/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +0 -0
  77. package/tools/csharp-indexer/bin/Release/net10.0/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll +0 -0
  78. package/tools/csharp-indexer/bin/Release/net10.0/zh-Hant/Microsoft.CodeAnalysis.Workspaces.resources.dll +0 -0
  79. package/tools/csharp-indexer/bin/Release/net10.0/zh-Hant/Microsoft.CodeAnalysis.resources.dll +0 -0
  80. package/tools/csharp-indexer/bin/Release/net8.0/CSharpIndexer +0 -0
  81. package/tools/csharp-indexer/bin/Release/net8.0/CSharpIndexer.deps.json +400 -0
  82. package/tools/csharp-indexer/bin/Release/net8.0/CSharpIndexer.dll +0 -0
  83. package/tools/csharp-indexer/bin/Release/net8.0/CSharpIndexer.pdb +0 -0
  84. package/tools/csharp-indexer/bin/Release/net8.0/CSharpIndexer.runtimeconfig.json +13 -0
  85. package/tools/csharp-indexer/bin/Release/net8.0/Humanizer.dll +0 -0
  86. package/tools/csharp-indexer/bin/Release/net8.0/Microsoft.CodeAnalysis.CSharp.Workspaces.dll +0 -0
  87. package/tools/csharp-indexer/bin/Release/net8.0/Microsoft.CodeAnalysis.CSharp.dll +0 -0
  88. package/tools/csharp-indexer/bin/Release/net8.0/Microsoft.CodeAnalysis.Workspaces.dll +0 -0
  89. package/tools/csharp-indexer/bin/Release/net8.0/Microsoft.CodeAnalysis.dll +0 -0
  90. package/tools/csharp-indexer/bin/Release/net8.0/System.Composition.AttributedModel.dll +0 -0
  91. package/tools/csharp-indexer/bin/Release/net8.0/System.Composition.Convention.dll +0 -0
  92. package/tools/csharp-indexer/bin/Release/net8.0/System.Composition.Hosting.dll +0 -0
  93. package/tools/csharp-indexer/bin/Release/net8.0/System.Composition.Runtime.dll +0 -0
  94. package/tools/csharp-indexer/bin/Release/net8.0/System.Composition.TypedParts.dll +0 -0
  95. package/tools/csharp-indexer/bin/Release/net8.0/System.IO.Pipelines.dll +0 -0
  96. package/tools/csharp-indexer/bin/Release/net8.0/cs/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +0 -0
  97. package/tools/csharp-indexer/bin/Release/net8.0/cs/Microsoft.CodeAnalysis.CSharp.resources.dll +0 -0
  98. package/tools/csharp-indexer/bin/Release/net8.0/cs/Microsoft.CodeAnalysis.Workspaces.resources.dll +0 -0
  99. package/tools/csharp-indexer/bin/Release/net8.0/cs/Microsoft.CodeAnalysis.resources.dll +0 -0
  100. package/tools/csharp-indexer/bin/Release/net8.0/de/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +0 -0
  101. package/tools/csharp-indexer/bin/Release/net8.0/de/Microsoft.CodeAnalysis.CSharp.resources.dll +0 -0
  102. package/tools/csharp-indexer/bin/Release/net8.0/de/Microsoft.CodeAnalysis.Workspaces.resources.dll +0 -0
  103. package/tools/csharp-indexer/bin/Release/net8.0/de/Microsoft.CodeAnalysis.resources.dll +0 -0
  104. package/tools/csharp-indexer/bin/Release/net8.0/es/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +0 -0
  105. package/tools/csharp-indexer/bin/Release/net8.0/es/Microsoft.CodeAnalysis.CSharp.resources.dll +0 -0
  106. package/tools/csharp-indexer/bin/Release/net8.0/es/Microsoft.CodeAnalysis.Workspaces.resources.dll +0 -0
  107. package/tools/csharp-indexer/bin/Release/net8.0/es/Microsoft.CodeAnalysis.resources.dll +0 -0
  108. package/tools/csharp-indexer/bin/Release/net8.0/fr/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +0 -0
  109. package/tools/csharp-indexer/bin/Release/net8.0/fr/Microsoft.CodeAnalysis.CSharp.resources.dll +0 -0
  110. package/tools/csharp-indexer/bin/Release/net8.0/fr/Microsoft.CodeAnalysis.Workspaces.resources.dll +0 -0
  111. package/tools/csharp-indexer/bin/Release/net8.0/fr/Microsoft.CodeAnalysis.resources.dll +0 -0
  112. package/tools/csharp-indexer/bin/Release/net8.0/it/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +0 -0
  113. package/tools/csharp-indexer/bin/Release/net8.0/it/Microsoft.CodeAnalysis.CSharp.resources.dll +0 -0
  114. package/tools/csharp-indexer/bin/Release/net8.0/it/Microsoft.CodeAnalysis.Workspaces.resources.dll +0 -0
  115. package/tools/csharp-indexer/bin/Release/net8.0/it/Microsoft.CodeAnalysis.resources.dll +0 -0
  116. package/tools/csharp-indexer/bin/Release/net8.0/ja/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +0 -0
  117. package/tools/csharp-indexer/bin/Release/net8.0/ja/Microsoft.CodeAnalysis.CSharp.resources.dll +0 -0
  118. package/tools/csharp-indexer/bin/Release/net8.0/ja/Microsoft.CodeAnalysis.Workspaces.resources.dll +0 -0
  119. package/tools/csharp-indexer/bin/Release/net8.0/ja/Microsoft.CodeAnalysis.resources.dll +0 -0
  120. package/tools/csharp-indexer/bin/Release/net8.0/ko/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +0 -0
  121. package/tools/csharp-indexer/bin/Release/net8.0/ko/Microsoft.CodeAnalysis.CSharp.resources.dll +0 -0
  122. package/tools/csharp-indexer/bin/Release/net8.0/ko/Microsoft.CodeAnalysis.Workspaces.resources.dll +0 -0
  123. package/tools/csharp-indexer/bin/Release/net8.0/ko/Microsoft.CodeAnalysis.resources.dll +0 -0
  124. package/tools/csharp-indexer/bin/Release/net8.0/pl/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +0 -0
  125. package/tools/csharp-indexer/bin/Release/net8.0/pl/Microsoft.CodeAnalysis.CSharp.resources.dll +0 -0
  126. package/tools/csharp-indexer/bin/Release/net8.0/pl/Microsoft.CodeAnalysis.Workspaces.resources.dll +0 -0
  127. package/tools/csharp-indexer/bin/Release/net8.0/pl/Microsoft.CodeAnalysis.resources.dll +0 -0
  128. package/tools/csharp-indexer/bin/Release/net8.0/pt-BR/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +0 -0
  129. package/tools/csharp-indexer/bin/Release/net8.0/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll +0 -0
  130. package/tools/csharp-indexer/bin/Release/net8.0/pt-BR/Microsoft.CodeAnalysis.Workspaces.resources.dll +0 -0
  131. package/tools/csharp-indexer/bin/Release/net8.0/pt-BR/Microsoft.CodeAnalysis.resources.dll +0 -0
  132. package/tools/csharp-indexer/bin/Release/net8.0/ru/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +0 -0
  133. package/tools/csharp-indexer/bin/Release/net8.0/ru/Microsoft.CodeAnalysis.CSharp.resources.dll +0 -0
  134. package/tools/csharp-indexer/bin/Release/net8.0/ru/Microsoft.CodeAnalysis.Workspaces.resources.dll +0 -0
  135. package/tools/csharp-indexer/bin/Release/net8.0/ru/Microsoft.CodeAnalysis.resources.dll +0 -0
  136. package/tools/csharp-indexer/bin/Release/net8.0/tr/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +0 -0
  137. package/tools/csharp-indexer/bin/Release/net8.0/tr/Microsoft.CodeAnalysis.CSharp.resources.dll +0 -0
  138. package/tools/csharp-indexer/bin/Release/net8.0/tr/Microsoft.CodeAnalysis.Workspaces.resources.dll +0 -0
  139. package/tools/csharp-indexer/bin/Release/net8.0/tr/Microsoft.CodeAnalysis.resources.dll +0 -0
  140. package/tools/csharp-indexer/bin/Release/net8.0/zh-Hans/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +0 -0
  141. package/tools/csharp-indexer/bin/Release/net8.0/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll +0 -0
  142. package/tools/csharp-indexer/bin/Release/net8.0/zh-Hans/Microsoft.CodeAnalysis.Workspaces.resources.dll +0 -0
  143. package/tools/csharp-indexer/bin/Release/net8.0/zh-Hans/Microsoft.CodeAnalysis.resources.dll +0 -0
  144. package/tools/csharp-indexer/bin/Release/net8.0/zh-Hant/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +0 -0
  145. package/tools/csharp-indexer/bin/Release/net8.0/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll +0 -0
  146. package/tools/csharp-indexer/bin/Release/net8.0/zh-Hant/Microsoft.CodeAnalysis.Workspaces.resources.dll +0 -0
  147. package/tools/csharp-indexer/bin/Release/net8.0/zh-Hant/Microsoft.CodeAnalysis.resources.dll +0 -0
  148. package/tools/csharp-indexer/bin/pando-csharp-indexer +32 -0
  149. package/tools/csharp-indexer/bin/pando-csharp-indexer.cmd +17 -0
  150. package/dist/workers/chunk-62Z76NNE.mjs +0 -522
@@ -22,21 +22,30 @@
22
22
  "signatures": [
23
23
  "read-this-first()",
24
24
  "get-project-root()",
25
+ "set-enabled-languages(languages)",
25
26
  "set-project-root(root)",
26
- "find-nodes(q, qMode, name, async, exported, static, private, protected, readonly, abstract, paramCount, exportedOnly, defaultOnly, symbolKinds, hasDecorator, implements, extends, returns, asOf, scopeNode, expectedHash, limit, offset, sort, lang, semanticKind, include, cursor, datalog, boundary, reachabilityDepth, reachabilityOptions)",
27
+ "find-nodes(lang, snapshot, scope, datalog, prefilter, include, page)",
27
28
  "find-references(to, expectedHash, boundary, includeDeclaration, includeStrings, includeComments, limit, offset, relType, sort, reachabilityDepth, reachabilityOptions, asOf)",
28
29
  "find-callers(of, expectedHash, depth, aggregate, boundary, asOf, offset, limit, relType, sort, reachabilityDepth, reachabilityOptions)",
29
- "get-content(target, format, maxBytes, offset)",
30
30
  "get-db-schema(includeColumns)",
31
31
  "query-db(sql, maxRows)",
32
32
  "get-storage-content(bucket, key, offset, maxBytes, encoding, full)",
33
33
  "workspace-overview()",
34
34
  "list-exports(scope, symbolKinds, export_kinds, limit, offset)",
35
35
  "analyze-imports(groupBy, limit, offset)",
36
+ "clojure-namespace-graph(includeExternal, scope, namespacePrefix, edgeKinds, limit, offset)",
37
+ "clojure-namespace-dependencies(namespace, transitive, edgeKinds, limit, offset)",
38
+ "clojure-namespace-dependents(namespace, transitive, edgeKinds, limit, offset)",
39
+ "plan-clojure-namespace-move(namespace, newFile)",
40
+ "plan-clojure-namespace-rename(oldNamespace, newNamespace)",
41
+ "move-clojure-namespace(namespace, newFile)",
42
+ "rename-clojure-namespace(oldNamespace, newNamespace)",
36
43
  "rename(path, newName, expectedHash, boundary, requireConfirmation, confirmed, includeStrings, includeComments, page, reachabilityDepth, reachabilityOptions)",
37
44
  "delete(path, expectedHashes, forceDeleteReferencesMayBreakSyntax, page)",
38
45
  "insert(to, code, replaceExistingNodeAtPath, expectedHash, createFileIfMissing, newFileInitialContent, forceInsertWillBreakSyntax)",
39
46
  "replace(path, expectedHash, with, scope, forceReplaceWillBreakSyntax)",
47
+ "replace-body(path, expectedHash, with, forceReplaceWillBreakSyntax)",
48
+ "change-signature(path, expectedHash, parameters, returnType, makeAsync, makeSyncFromAsync, forceChangeWillBreakSyntax, boundary, batchSaves)",
40
49
  "filter-map-reduce(query, transforms, apply)",
41
50
  "list-snapshots(offset, limit)",
42
51
  "diff-snapshots(head, base, page)",
@@ -54,7 +63,7 @@
54
63
  "name": "read-this-first",
55
64
  "category": "pando",
56
65
  "signature": "read-this-first()",
57
- "description": "Quickstart hints for Pando AST usage. Returns a short help block. Example: {}",
66
+ "description": "pandō tools are the required code surface for supported-language source operations in pandō benchmark runs. Use pandō for supported source-code read, search, navigation, refactor, edit, delete, insert, replace, rename, references, callers, exports, SQL index queries, and filter-map-reduce operations. Supported source languages include TypeScript, JavaScript, Python, C, C++, C#, Dart, Java, Clojure, and ClojureScript files (.cljs via the Clojure language id). Use non-pandō text/shell tools only for non-code files, unsupported languages, shell setup, builds, and tests. Current find-nodes is Datalog-only and accepts { op, lang?, snapshot?, scope, datalog, prefilter?, include?, page? }; legacy fields such as q, qMode, name, symbolKinds, scopeNode, limit, offset, and top-level cursor are rejected. Example find-nodes declaration lookup: { op:'find-nodes', lang:['ts','js'], scope:{workspace:true}, datalog:{query:'[:find ?n :where [?n :node/name \"myFunction\"]]', bindings:['?n'], result:{nodeVar:'?n'}}, include:{self:true, topN:1}, page:{limit:5} }. Then pass the returned path and hash without @ to modifying tools such as rename, replace, replace-body, insert, or delete. pandō modifying tools automatically create snapshots before and after execution; do not manually snapshot before pandō operations. If a pandō operation fails because of a stale path or hash mismatch, call find-nodes again to refresh the current path/hash and retry with pandō.",
58
67
  "parameters": {
59
68
  "type": "object",
60
69
  "properties": {},
@@ -80,6 +89,35 @@
80
89
  {}
81
90
  ]
82
91
  },
92
+ {
93
+ "name": "set-enabled-languages",
94
+ "category": "pando",
95
+ "signature": "set-enabled-languages(languages)",
96
+ "description": "Set or inspect the enabled indexing languages for the selected root. Call with languages omitted to return the current enabledLanguages plus availableLanguages without changing config. Call with an array of language ids to update config, purge indexed files for disabled languages, restart indexing, and return the resulting enabledLanguages plus availableLanguages. If any value is invalid, no config is changed and the response includes invalidLanguages plus availableLanguages. Example: { languages:['ts','js','python'] }",
97
+ "parameters": {
98
+ "type": "object",
99
+ "properties": {
100
+ "languages": {
101
+ "type": "array",
102
+ "items": {
103
+ "type": "string"
104
+ },
105
+ "description": "Language ids to enable. Valid values are returned in availableLanguages when this tool is called with no languages or invalid languages. Current valid values: ts, js, python, c, cpp, csharp, dart, java, clojure."
106
+ }
107
+ },
108
+ "required": [],
109
+ "additionalProperties": false
110
+ },
111
+ "examples": [
112
+ {
113
+ "languages": [
114
+ "ts",
115
+ "js",
116
+ "python"
117
+ ]
118
+ }
119
+ ]
120
+ },
83
121
  {
84
122
  "name": "set-project-root",
85
123
  "category": "pando",
@@ -107,183 +145,11 @@
107
145
  {
108
146
  "name": "find-nodes",
109
147
  "category": "pando",
110
- "signature": "find-nodes(q, qMode, name, async, exported, static, private, protected, readonly, abstract, paramCount, exportedOnly, defaultOnly, symbolKinds, hasDecorator, implements, extends, returns, asOf, scopeNode, expectedHash, limit, offset, sort, lang, semanticKind, include, cursor, datalog, boundary, reachabilityDepth, reachabilityOptions)",
111
- "description": "Search code nodes by symbolKinds/name/text/scope with optional enrichment. qMode: 'fts' searches blob/file content with SQLite FTS5 word-token semantics: quoted phrases, AND/OR/NOT, NEAR, and * are supported; punctuation is not indexed as standalone text, though literal-looking queries like foo.bar are normalized to token searches. Use q:'A|B' as shorthand for A* OR B*. qMode: 'like' uses SQL LIKE with %/_. scopeNode may be a dir, file, or node path 'src/a.ts#10-20:FD'; if it includes '#', expectedHash (no @) is required to verify. limit clamps to 100 per page; offset clamps to >= 0; use limit='all' to stream pages. include can add self/body/parents for topN<=5. Examples: { symbolKinds:['function'], name:'init', limit:10 }, { q:'\"TODO item\"', qMode:'fts', limit:10 }, { q:'register|bootstrap', qMode:'fts', limit:10 }, { scopeNode:'src/services/', limit:10 }",
148
+ "signature": "find-nodes(lang, snapshot, scope, datalog, prefilter, include, page)",
149
+ "description": "Search code nodes with per-file lazy Datalog execution. Candidate files are processed in deterministic order, one file at a time, and execution stops as soon as page.limit items have been emitted. Pagination is cursor-only via page.cursor. page.limit defaults to 5 when omitted and caps at 20. Optional prefilter.fts narrows candidate files before Datalog execution. This operation is per-file structural search only; cross-file Datalog joins are not supported here. For arbitrary unnamed AST nodes, first find a stable enclosing node such as a function/class, then re-run find-nodes with scope.node and use :node/kind, :node/parent, :node/role, :node/index-in-parent, include.self, and include.parents to disambiguate the exact child node before editing.",
112
150
  "parameters": {
113
151
  "type": "object",
114
152
  "properties": {
115
- "q": {
116
- "type": "string",
117
- "description": "Text query. With qMode:'fts', use SQLite FTS5 token syntax over file contents; punctuation is not exact-match searchable. With qMode:'like', use a SQL LIKE pattern."
118
- },
119
- "qMode": {
120
- "type": "string",
121
- "description": "Query mode: 'fts' for content FTS or 'like' for SQL LIKE.",
122
- "enum": [
123
- "fts",
124
- "like"
125
- ]
126
- },
127
- "name": {
128
- "anyOf": [
129
- {
130
- "type": "string",
131
- "description": "Exact name match."
132
- },
133
- {
134
- "type": "object",
135
- "description": "Name filter helpers: like/contains/startsWith/endsWith/in.",
136
- "properties": {
137
- "like": {
138
- "type": "string",
139
- "description": "SQL LIKE pattern, e.g. 'Foo%'"
140
- },
141
- "contains": {
142
- "type": "string",
143
- "description": "Substring match"
144
- },
145
- "startsWith": {
146
- "type": "string"
147
- },
148
- "endsWith": {
149
- "type": "string"
150
- },
151
- "in": {
152
- "type": "array",
153
- "items": {
154
- "type": "string"
155
- }
156
- }
157
- },
158
- "additionalProperties": false
159
- }
160
- ]
161
- },
162
- "async": {
163
- "type": "boolean"
164
- },
165
- "exported": {
166
- "type": "boolean"
167
- },
168
- "static": {
169
- "type": "boolean"
170
- },
171
- "private": {
172
- "type": "boolean"
173
- },
174
- "protected": {
175
- "type": "boolean"
176
- },
177
- "readonly": {
178
- "type": "boolean"
179
- },
180
- "abstract": {
181
- "type": "boolean"
182
- },
183
- "paramCount": {
184
- "type": "object",
185
- "description": "Parameter count filter.",
186
- "properties": {
187
- "op": {
188
- "type": "string",
189
- "description": ">, <, >=, <=, =",
190
- "enum": [
191
- ">",
192
- "<",
193
- ">=",
194
- "<=",
195
- "="
196
- ]
197
- },
198
- "value": {
199
- "type": "integer",
200
- "description": "Non-negative parameter count.",
201
- "minimum": 0
202
- }
203
- },
204
- "additionalProperties": false
205
- },
206
- "exportedOnly": {
207
- "type": "boolean"
208
- },
209
- "defaultOnly": {
210
- "type": "boolean"
211
- },
212
- "symbolKinds": {
213
- "type": "array",
214
- "items": {
215
- "type": "string"
216
- },
217
- "description": "Symbol categories (e.g., function, class)."
218
- },
219
- "hasDecorator": {
220
- "type": "string"
221
- },
222
- "implements": {
223
- "type": "string"
224
- },
225
- "extends": {
226
- "type": "string"
227
- },
228
- "returns": {
229
- "type": "string"
230
- },
231
- "asOf": {
232
- "type": "string",
233
- "description": "SnapshotId for time-travel queries."
234
- },
235
- "scopeNode": {
236
- "type": "string",
237
- "description": "Repo-relative file/dir or node path with #range:KIND."
238
- },
239
- "expectedHash": {
240
- "type": "string",
241
- "description": "Hash (no @) required when scopeNode includes '#'."
242
- },
243
- "limit": {
244
- "anyOf": [
245
- {
246
- "type": "integer",
247
- "minimum": 1,
248
- "maximum": 100
249
- },
250
- {
251
- "type": "string",
252
- "description": "Use 'all' to page through results.",
253
- "enum": [
254
- "all"
255
- ]
256
- }
257
- ]
258
- },
259
- "offset": {
260
- "type": "integer",
261
- "minimum": 0
262
- },
263
- "sort": {
264
- "type": "object",
265
- "description": "Sort results.",
266
- "properties": {
267
- "by": {
268
- "type": "string",
269
- "description": "file | name | path",
270
- "enum": [
271
- "file",
272
- "name",
273
- "path"
274
- ]
275
- },
276
- "direction": {
277
- "type": "string",
278
- "description": "asc | desc",
279
- "enum": [
280
- "asc",
281
- "desc"
282
- ]
283
- }
284
- },
285
- "additionalProperties": false
286
- },
287
153
  "lang": {
288
154
  "anyOf": [
289
155
  {
@@ -295,65 +161,65 @@
295
161
  "type": "string"
296
162
  }
297
163
  }
298
- ]
164
+ ],
165
+ "description": "Optional language filter. Example: ['ts', 'csharp']."
299
166
  },
300
- "semanticKind": {
301
- "anyOf": [
302
- {
303
- "type": "string"
304
- },
305
- {
306
- "type": "array",
307
- "items": {
308
- "type": "string"
309
- }
310
- }
311
- ]
167
+ "snapshot": {
168
+ "type": "string",
169
+ "description": "Optional snapshotId for time-travel queries."
312
170
  },
313
- "include": {
171
+ "scope": {
314
172
  "type": "object",
315
- "description": "Enrich results with node text/parents. Only first topN (max 5) are heavy-enriched.",
173
+ "description": "Exactly one of workspace, dir, files, or node.",
316
174
  "properties": {
317
- "self": {
318
- "type": "boolean",
319
- "description": "Include node code/type/name."
320
- },
321
- "body": {
175
+ "workspace": {
322
176
  "type": "boolean",
323
- "description": "Include body content (if available)."
177
+ "description": "Search all candidate files for the selected languages."
324
178
  },
325
- "parents": {
326
- "type": "boolean",
327
- "description": "Include parent chain metadata."
179
+ "dir": {
180
+ "type": "string",
181
+ "description": "Workspace-relative directory prefix."
328
182
  },
329
- "topN": {
330
- "type": "integer",
331
- "description": "How many results to fully enrich (0-5).",
332
- "minimum": 0,
333
- "maximum": 5
183
+ "files": {
184
+ "type": "array",
185
+ "description": "Explicit workspace-relative candidate files.",
186
+ "items": {
187
+ "type": "string"
188
+ }
334
189
  },
335
- "maxChars": {
336
- "type": "integer",
337
- "description": "Max chars for body/self content before truncation.",
338
- "minimum": 0
190
+ "node": {
191
+ "type": "object",
192
+ "description": "Restrict fact materialization to a verified node subtree/span.",
193
+ "properties": {
194
+ "path": {
195
+ "type": "string",
196
+ "description": "Workspace-relative node path like src/app.ts#10-40:FunctionDeclaration."
197
+ },
198
+ "expectedHash": {
199
+ "type": "string",
200
+ "description": "Hash portion only, without '@'."
201
+ }
202
+ },
203
+ "required": [
204
+ "path",
205
+ "expectedHash"
206
+ ],
207
+ "additionalProperties": false
339
208
  }
340
209
  },
341
210
  "additionalProperties": false
342
211
  },
343
- "cursor": {
344
- "type": "string",
345
- "description": "Opaque cursor (datalog paging)."
346
- },
347
212
  "datalog": {
348
213
  "type": "object",
349
- "description": "Advanced datalog query spec (bypasses standard filters).",
214
+ "description": "Raw Datalog query spec executed per file.",
350
215
  "properties": {
351
216
  "query": {
352
217
  "type": "string",
353
- "description": "Datalog query string."
218
+ "description": "Raw Datalog query string."
354
219
  },
355
220
  "bindings": {
356
221
  "type": "array",
222
+ "description": "Bindings matching the :find clause.",
357
223
  "items": {
358
224
  "type": "string"
359
225
  }
@@ -389,103 +255,198 @@
389
255
  },
390
256
  "result": {
391
257
  "type": "object",
258
+ "description": "Maps the primary node variable and any extra projected columns.",
392
259
  "properties": {
393
260
  "nodeVar": {
394
261
  "type": "string"
395
262
  },
396
- "pathVar": {
397
- "type": "string"
398
- },
399
- "fileVar": {
400
- "type": "string"
401
- },
402
- "kindVar": {
403
- "type": "string"
404
- },
405
- "nameVar": {
406
- "type": "string"
407
- },
408
- "startVar": {
409
- "type": "string"
410
- },
411
- "endVar": {
412
- "type": "string"
263
+ "columns": {
264
+ "type": "object",
265
+ "additionalProperties": {
266
+ "type": "string"
267
+ }
413
268
  }
414
269
  },
270
+ "required": [
271
+ "nodeVar"
272
+ ],
415
273
  "additionalProperties": false
416
274
  }
417
275
  },
418
276
  "required": [
419
- "query"
277
+ "query",
278
+ "bindings",
279
+ "result"
420
280
  ],
421
281
  "additionalProperties": false
422
282
  },
423
- "boundary": {
424
- "type": "string",
425
- "description": "Search boundary: 'project' (default), 'reachable', or 'workspace'.",
426
- "enum": [
427
- "project",
428
- "reachable",
429
- "workspace"
430
- ]
431
- },
432
- "reachabilityDepth": {
433
- "type": "integer",
434
- "description": "Max depth for reachable boundary (integer >= 0).",
435
- "minimum": 0
283
+ "prefilter": {
284
+ "type": "object",
285
+ "description": "Optional candidate-file narrowing applied before per-file Datalog execution.",
286
+ "properties": {
287
+ "fts": {
288
+ "type": "string",
289
+ "description": "SQLite FTS5 MATCH query passed through unchanged after trimming; used only to narrow candidate files."
290
+ }
291
+ },
292
+ "additionalProperties": false
436
293
  },
437
- "reachabilityOptions": {
294
+ "include": {
438
295
  "type": "object",
439
- "description": "Advanced reachability options for boundary='reachable' (maxDepth, includeImportEdges, etc).",
296
+ "description": "Optional response enrichment. Only the first topN items receive heavy enrichment.",
440
297
  "properties": {
441
- "maxDepth": {
442
- "type": "integer",
443
- "minimum": 0
444
- },
445
- "includeImportEdges": {
446
- "type": "boolean"
298
+ "self": {
299
+ "type": "boolean",
300
+ "description": "Include node code/type/name."
447
301
  },
448
- "includeDevDependencies": {
449
- "type": "boolean"
302
+ "body": {
303
+ "type": "boolean",
304
+ "description": "Include body content when available."
450
305
  },
451
- "includePeerDependencies": {
452
- "type": "boolean"
306
+ "parents": {
307
+ "type": "boolean",
308
+ "description": "Include parent chain metadata."
453
309
  },
454
- "respectBoundaries": {
455
- "type": "array",
456
- "items": {
457
- "type": "string"
458
- }
310
+ "arities": {
311
+ "type": "boolean",
312
+ "description": "Include explicit Clojure arity targets when applicable."
459
313
  },
460
- "timeLimitMs": {
314
+ "topN": {
461
315
  "type": "integer",
462
- "minimum": 0
316
+ "minimum": 0,
317
+ "maximum": 5
463
318
  },
464
- "memoryLimitBytes": {
319
+ "maxChars": {
465
320
  "type": "integer",
466
321
  "minimum": 0
467
322
  }
468
323
  },
469
324
  "additionalProperties": false
325
+ },
326
+ "page": {
327
+ "type": "object",
328
+ "description": "Cursor-only pagination.",
329
+ "properties": {
330
+ "limit": {
331
+ "type": "integer",
332
+ "minimum": 1,
333
+ "maximum": 20
334
+ },
335
+ "cursor": {
336
+ "anyOf": [
337
+ {
338
+ "type": "string"
339
+ },
340
+ {
341
+ "type": "null"
342
+ }
343
+ ]
344
+ }
345
+ },
346
+ "additionalProperties": false
470
347
  }
471
348
  },
472
- "required": [],
349
+ "required": [
350
+ "scope",
351
+ "datalog"
352
+ ],
473
353
  "additionalProperties": false
474
354
  },
475
355
  "examples": [
476
356
  {
477
- "type": "function",
478
- "name": "init",
479
- "limit": 10
357
+ "lang": [
358
+ "ts",
359
+ "csharp"
360
+ ],
361
+ "scope": {
362
+ "dir": "src"
363
+ },
364
+ "prefilter": {
365
+ "fts": "register*"
366
+ },
367
+ "datalog": {
368
+ "query": "[:find ?n :where [?n :node/kind \"IfStatement\"]]",
369
+ "bindings": [
370
+ "?n"
371
+ ],
372
+ "result": {
373
+ "nodeVar": "?n"
374
+ }
375
+ },
376
+ "page": {
377
+ "limit": 5,
378
+ "cursor": null
379
+ }
480
380
  },
481
381
  {
482
- "q": "\"TODO\"",
483
- "qMode": "fts",
484
- "limit": 10
382
+ "lang": [
383
+ "ts"
384
+ ],
385
+ "scope": {
386
+ "node": {
387
+ "path": "src/app.ts#120-260:FunctionDeclaration",
388
+ "expectedHash": "p123:c456"
389
+ }
390
+ },
391
+ "datalog": {
392
+ "query": "[:find ?n ?c :where [?n :node/kind \"FunctionDeclaration\"] [?n :node/children ?c]]",
393
+ "bindings": [
394
+ "?n",
395
+ "?c"
396
+ ],
397
+ "result": {
398
+ "nodeVar": "?n",
399
+ "columns": {
400
+ "child": "?c"
401
+ }
402
+ }
403
+ },
404
+ "include": {
405
+ "self": true
406
+ },
407
+ "page": {
408
+ "limit": 5,
409
+ "cursor": null
410
+ }
485
411
  },
486
412
  {
487
- "scopeNode": "src/services/",
488
- "limit": 10
413
+ "lang": [
414
+ "ts",
415
+ "js"
416
+ ],
417
+ "scope": {
418
+ "node": {
419
+ "path": "src/service.ts#120-520:FunctionDeclaration",
420
+ "expectedHash": "p123:c456"
421
+ }
422
+ },
423
+ "datalog": {
424
+ "query": "[:find ?n ?parent ?role ?idx :where [?n :node/kind \"IfStatement\"] [?n :node/parent ?parent] [?n :node/role ?role] [?n :node/index-in-parent ?idx]]",
425
+ "bindings": [
426
+ "?n",
427
+ "?parent",
428
+ "?role",
429
+ "?idx"
430
+ ],
431
+ "result": {
432
+ "nodeVar": "?n",
433
+ "columns": {
434
+ "parent": "?parent",
435
+ "role": "?role",
436
+ "index": "?idx"
437
+ }
438
+ }
439
+ },
440
+ "include": {
441
+ "self": true,
442
+ "parents": true,
443
+ "topN": 5,
444
+ "maxChars": 4000
445
+ },
446
+ "page": {
447
+ "limit": 10,
448
+ "cursor": null
449
+ }
489
450
  }
490
451
  ]
491
452
  },
@@ -724,79 +685,30 @@
724
685
  "respectBoundaries": {
725
686
  "type": "array",
726
687
  "items": {
727
- "type": "string"
728
- }
729
- },
730
- "timeLimitMs": {
731
- "type": "number"
732
- },
733
- "memoryLimitBytes": {
734
- "type": "number"
735
- }
736
- },
737
- "additionalProperties": false
738
- }
739
- },
740
- "required": [
741
- "of",
742
- "expectedHash"
743
- ],
744
- "additionalProperties": false
745
- },
746
- "examples": [
747
- {
748
- "of": "src/service.ts#FD:2",
749
- "expectedHash": "pabc:cdef",
750
- "depth": 2
751
- }
752
- ]
753
- },
754
- {
755
- "name": "get-content",
756
- "category": "pando",
757
- "signature": "get-content(target, format, maxBytes, offset)",
758
- "description": "Read file content (repo-relative or absolute within root). maxBytes defaults to 500000 (clamped 1..2000000). format: 'raw' or 'parsed' (JSON only, offset=0, no truncation). Example: { target:'src/index.ts', maxBytes:2000 }",
759
- "parameters": {
760
- "type": "object",
761
- "properties": {
762
- "target": {
763
- "type": "string",
764
- "description": "Repo-relative path or absolute path under project root."
765
- },
766
- "format": {
767
- "type": "string",
768
- "description": "raw | parsed"
769
- },
770
- "maxBytes": {
771
- "anyOf": [
772
- {
773
- "type": "number"
688
+ "type": "string"
689
+ }
774
690
  },
775
- {
776
- "type": "string"
777
- }
778
- ]
779
- },
780
- "offset": {
781
- "anyOf": [
782
- {
691
+ "timeLimitMs": {
783
692
  "type": "number"
784
693
  },
785
- {
786
- "type": "string"
694
+ "memoryLimitBytes": {
695
+ "type": "number"
787
696
  }
788
- ]
697
+ },
698
+ "additionalProperties": false
789
699
  }
790
700
  },
791
701
  "required": [
792
- "target"
702
+ "of",
703
+ "expectedHash"
793
704
  ],
794
705
  "additionalProperties": false
795
706
  },
796
707
  "examples": [
797
708
  {
798
- "target": "src/index.ts",
799
- "maxBytes": 2000
709
+ "of": "src/service.ts#FD:2",
710
+ "expectedHash": "pabc:cdef",
711
+ "depth": 2
800
712
  }
801
713
  ]
802
714
  },
@@ -804,7 +716,7 @@
804
716
  "name": "get-db-schema",
805
717
  "category": "pando",
806
718
  "signature": "get-db-schema(includeColumns)",
807
- "description": "Return the logical unified index schema only (aggregated across all index chunks, no per-chunk details). includeColumns defaults to true. Example: { includeColumns:true }",
719
+ "description": "Return the logical unified index schema only (aggregated across all index chunks, no per-chunk details). Use this before query-db to discover the real tables and columns available in the current index. For relationships, expect node_references plus dict_kinds/nodes rather than a generic cross-file relationships table. includeColumns defaults to true. Example: { includeColumns:true }",
808
720
  "parameters": {
809
721
  "type": "object",
810
722
  "properties": {
@@ -826,7 +738,7 @@
826
738
  "name": "query-db",
827
739
  "category": "pando",
828
740
  "signature": "query-db(sql, maxRows)",
829
- "description": "Execute passthrough SQL against all index chunks (readonly), then globally merge and apply ORDER BY/LIMIT/OFFSET semantics in code. Chunk identity is intentionally hidden from results. Example: { sql:'SELECT * FROM nodes LIMIT 20' }",
741
+ "description": "Execute passthrough SQL against all index chunks (readonly), then globally merge and apply ORDER BY/LIMIT/OFFSET semantics in code. Chunk identity is intentionally hidden from results. Use get-db-schema first when exploring. For relationship mining, inspect node_references plus dict_kinds; non-TS find-references/find-callers often resolve at query time via target_symbol_key or target_node_id rather than a generic relationships table. Grouped ORDER BY queries must include an explicit LIMIT. Example: { sql:'SELECT * FROM nodes LIMIT 20' }",
830
742
  "parameters": {
831
743
  "type": "object",
832
744
  "properties": {
@@ -916,136 +828,400 @@
916
828
  }
917
829
  },
918
830
  "required": [
919
- "bucket",
920
- "key"
831
+ "bucket",
832
+ "key"
833
+ ],
834
+ "additionalProperties": false
835
+ },
836
+ "examples": [
837
+ {
838
+ "bucket": "tool-results",
839
+ "key": "threads/123/tool-results/abc.json",
840
+ "maxBytes": 200000,
841
+ "encoding": "base64"
842
+ },
843
+ {
844
+ "bucket": "tool-results",
845
+ "key": "threads/123/tool-results/abc.json",
846
+ "maxBytes": 400000
847
+ }
848
+ ]
849
+ },
850
+ {
851
+ "name": "workspace-overview",
852
+ "category": "pando",
853
+ "signature": "workspace-overview()",
854
+ "description": "Summarize workspace files, node counts, modules, artifacts, and indexing status. IMPORTANT: All modifying pando operations (insert, replace, delete, rename, filter-map-reduce, etc.) automatically create snapshots before and after execution - you do NOT need to manually call snapshot-worktree before pando operations. Only use snapshot-worktree for non-pando file modifications (e.g., when using Write, Edit, or Bash tools to modify files). Example: {}",
855
+ "parameters": {
856
+ "type": "object",
857
+ "properties": {},
858
+ "required": [],
859
+ "additionalProperties": false
860
+ },
861
+ "examples": [
862
+ {}
863
+ ]
864
+ },
865
+ {
866
+ "name": "list-exports",
867
+ "category": "pando",
868
+ "signature": "list-exports(scope, symbolKinds, export_kinds, limit, offset)",
869
+ "description": "List exports with optional scope and filters. limit clamps to 100; offset clamps to >= 0. Example: { scope:'packages/ui/', limit:20 }",
870
+ "parameters": {
871
+ "type": "object",
872
+ "properties": {
873
+ "scope": {
874
+ "type": "string",
875
+ "description": "Path prefix to filter by module path."
876
+ },
877
+ "symbolKinds": {
878
+ "type": "array",
879
+ "items": {
880
+ "type": "string"
881
+ },
882
+ "description": "Symbol categories (e.g., function, class)."
883
+ },
884
+ "export_kinds": {
885
+ "type": "array",
886
+ "items": {
887
+ "type": "string"
888
+ },
889
+ "description": "Export kinds (e.g., named, default, reexport, star)."
890
+ },
891
+ "limit": {
892
+ "anyOf": [
893
+ {
894
+ "type": "number"
895
+ },
896
+ {
897
+ "type": "string"
898
+ }
899
+ ]
900
+ },
901
+ "offset": {
902
+ "anyOf": [
903
+ {
904
+ "type": "number"
905
+ },
906
+ {
907
+ "type": "string"
908
+ }
909
+ ]
910
+ }
911
+ },
912
+ "required": [],
913
+ "additionalProperties": false
914
+ },
915
+ "examples": [
916
+ {
917
+ "scope": "packages/ui/",
918
+ "limit": 20
919
+ }
920
+ ]
921
+ },
922
+ {
923
+ "name": "analyze-imports",
924
+ "category": "pando",
925
+ "signature": "analyze-imports(groupBy, limit, offset)",
926
+ "description": "Analyze imports and group by 'module' (default) or 'file'. limit clamps to 100; offset clamps to >= 0. Example: { groupBy:'module' }",
927
+ "parameters": {
928
+ "type": "object",
929
+ "properties": {
930
+ "groupBy": {
931
+ "type": "string",
932
+ "description": "module | file"
933
+ },
934
+ "limit": {
935
+ "anyOf": [
936
+ {
937
+ "type": "number"
938
+ },
939
+ {
940
+ "type": "string"
941
+ }
942
+ ]
943
+ },
944
+ "offset": {
945
+ "anyOf": [
946
+ {
947
+ "type": "number"
948
+ },
949
+ {
950
+ "type": "string"
951
+ }
952
+ ]
953
+ }
954
+ },
955
+ "required": [],
956
+ "additionalProperties": false
957
+ },
958
+ "examples": [
959
+ {
960
+ "groupBy": "module"
961
+ }
962
+ ]
963
+ },
964
+ {
965
+ "name": "clojure-namespace-graph",
966
+ "category": "pando",
967
+ "signature": "clojure-namespace-graph(includeExternal, scope, namespacePrefix, edgeKinds, limit, offset)",
968
+ "description": "Get the Clojure namespace dependency graph for the current workspace. Results are paged and can be filtered by repo-relative path scope, namespacePrefix, and edge kind. scope filters by file path prefix such as 'src/metabase/tracing/', while namespacePrefix filters by namespace name such as 'metabase.tracing'. Returns namespaces and edges with kinds like 'require', 'refer', 'refer-all', 'require-macros', 'refer-macros', 'refer-all-macros', and 'use'. Useful for understanding namespace structure and dependencies before refactoring.",
969
+ "parameters": {
970
+ "type": "object",
971
+ "properties": {
972
+ "includeExternal": {
973
+ "type": "boolean",
974
+ "description": "Include external dependencies like clojure.* namespaces. Default: false (project namespaces only)."
975
+ },
976
+ "scope": {
977
+ "type": "string",
978
+ "description": "Optional repo-relative path prefix filter, e.g. 'src/metabase/tracing/'."
979
+ },
980
+ "namespacePrefix": {
981
+ "type": "string",
982
+ "description": "Optional namespace-name prefix filter, e.g. 'metabase.tracing'."
983
+ },
984
+ "edgeKinds": {
985
+ "type": "array",
986
+ "items": {
987
+ "type": "string"
988
+ },
989
+ "description": "Optional edge kind filter, e.g. ['require', 'refer', 'refer-macros']."
990
+ },
991
+ "limit": {
992
+ "type": "number",
993
+ "description": "Maximum number of namespaces and edges to return per page. Default: 100."
994
+ },
995
+ "offset": {
996
+ "type": "number",
997
+ "description": "Pagination offset for both namespaces and edges. Default: 0."
998
+ }
999
+ },
1000
+ "additionalProperties": false
1001
+ },
1002
+ "examples": [
1003
+ {
1004
+ "scope": "src/metabase/tracing/",
1005
+ "namespacePrefix": "metabase.tracing",
1006
+ "includeExternal": false,
1007
+ "limit": 20,
1008
+ "offset": 0
1009
+ }
1010
+ ]
1011
+ },
1012
+ {
1013
+ "name": "clojure-namespace-dependencies",
1014
+ "category": "pando",
1015
+ "signature": "clojure-namespace-dependencies(namespace, transitive, edgeKinds, limit, offset)",
1016
+ "description": "Get namespaces that the given Clojure namespace depends on. Returns the traversal root, discovered namespaces, and traversed edges. By default this is transitive; set transitive=false for direct dependencies only.",
1017
+ "parameters": {
1018
+ "type": "object",
1019
+ "properties": {
1020
+ "namespace": {
1021
+ "type": "string",
1022
+ "description": "The fully-qualified namespace (e.g., 'myapp.core')."
1023
+ },
1024
+ "transitive": {
1025
+ "type": "boolean",
1026
+ "description": "When false, return only direct dependencies. Default: true."
1027
+ },
1028
+ "edgeKinds": {
1029
+ "type": "array",
1030
+ "items": {
1031
+ "type": "string"
1032
+ },
1033
+ "description": "Optional edge kind filter, e.g. ['require', 'refer', 'refer-macros']."
1034
+ },
1035
+ "limit": {
1036
+ "type": "number",
1037
+ "description": "Maximum number of namespaces and edges to return per page. Default: 100."
1038
+ },
1039
+ "offset": {
1040
+ "type": "number",
1041
+ "description": "Pagination offset for both namespaces and edges. Default: 0."
1042
+ }
1043
+ },
1044
+ "required": [
1045
+ "namespace"
1046
+ ],
1047
+ "additionalProperties": false
1048
+ },
1049
+ "examples": [
1050
+ {
1051
+ "namespace": "myapp.core",
1052
+ "transitive": false,
1053
+ "edgeKinds": [
1054
+ "require",
1055
+ "refer"
1056
+ ],
1057
+ "limit": 100,
1058
+ "offset": 0
1059
+ }
1060
+ ]
1061
+ },
1062
+ {
1063
+ "name": "clojure-namespace-dependents",
1064
+ "category": "pando",
1065
+ "signature": "clojure-namespace-dependents(namespace, transitive, edgeKinds, limit, offset)",
1066
+ "description": "Get namespaces that depend on the given Clojure namespace. Returns the traversal root, discovered namespaces, and traversed edges. By default this is transitive; set transitive=false for direct dependents only.",
1067
+ "parameters": {
1068
+ "type": "object",
1069
+ "properties": {
1070
+ "namespace": {
1071
+ "type": "string",
1072
+ "description": "The fully-qualified namespace (e.g., 'myapp.util')."
1073
+ },
1074
+ "transitive": {
1075
+ "type": "boolean",
1076
+ "description": "When false, return only direct dependents. Default: true."
1077
+ },
1078
+ "edgeKinds": {
1079
+ "type": "array",
1080
+ "items": {
1081
+ "type": "string"
1082
+ },
1083
+ "description": "Optional edge kind filter, e.g. ['require', 'refer', 'refer-macros']."
1084
+ },
1085
+ "limit": {
1086
+ "type": "number",
1087
+ "description": "Maximum number of namespaces and edges to return per page. Default: 100."
1088
+ },
1089
+ "offset": {
1090
+ "type": "number",
1091
+ "description": "Pagination offset for both namespaces and edges. Default: 0."
1092
+ }
1093
+ },
1094
+ "required": [
1095
+ "namespace"
1096
+ ],
1097
+ "additionalProperties": false
1098
+ },
1099
+ "examples": [
1100
+ {
1101
+ "namespace": "myapp.util",
1102
+ "transitive": true,
1103
+ "limit": 100,
1104
+ "offset": 0
1105
+ }
1106
+ ]
1107
+ },
1108
+ {
1109
+ "name": "plan-clojure-namespace-move",
1110
+ "category": "pando",
1111
+ "signature": "plan-clojure-namespace-move(namespace, newFile)",
1112
+ "description": "Plan moving a Clojure namespace to a new file location. Returns a detailed plan including the new namespace name (derived from file path), affected files, and required changes to require statements. Does NOT execute the move - returns a plan only.",
1113
+ "parameters": {
1114
+ "type": "object",
1115
+ "properties": {
1116
+ "namespace": {
1117
+ "type": "string",
1118
+ "description": "The current fully-qualified namespace (e.g., 'myapp.old.location')."
1119
+ },
1120
+ "newFile": {
1121
+ "type": "string",
1122
+ "description": "The new file path (e.g., 'src/myapp/new/location.clj'). The new namespace will be derived from this path."
1123
+ }
1124
+ },
1125
+ "required": [
1126
+ "namespace",
1127
+ "newFile"
921
1128
  ],
922
1129
  "additionalProperties": false
923
1130
  },
924
1131
  "examples": [
925
1132
  {
926
- "bucket": "tool-results",
927
- "key": "threads/123/tool-results/abc.json",
928
- "maxBytes": 200000,
929
- "encoding": "base64"
930
- },
931
- {
932
- "bucket": "tool-results",
933
- "key": "threads/123/tool-results/abc.json",
934
- "maxBytes": 400000
1133
+ "namespace": "myapp.old.location",
1134
+ "newFile": "src/myapp/new/location.clj"
935
1135
  }
936
1136
  ]
937
1137
  },
938
1138
  {
939
- "name": "workspace-overview",
1139
+ "name": "plan-clojure-namespace-rename",
940
1140
  "category": "pando",
941
- "signature": "workspace-overview()",
942
- "description": "Summarize workspace files, node counts, modules, artifacts, and indexing status. Example: {}",
1141
+ "signature": "plan-clojure-namespace-rename(oldNamespace, newNamespace)",
1142
+ "description": "Plan renaming a Clojure namespace (keeping the same file). Returns affected files and required changes to require statements. Does NOT execute the rename; apply the planned changes manually.",
943
1143
  "parameters": {
944
1144
  "type": "object",
945
- "properties": {},
946
- "required": [],
1145
+ "properties": {
1146
+ "oldNamespace": {
1147
+ "type": "string",
1148
+ "description": "The current fully-qualified namespace (e.g., 'myapp.util')."
1149
+ },
1150
+ "newNamespace": {
1151
+ "type": "string",
1152
+ "description": "The new fully-qualified namespace (e.g., 'myapp.helpers')."
1153
+ }
1154
+ },
1155
+ "required": [
1156
+ "oldNamespace",
1157
+ "newNamespace"
1158
+ ],
947
1159
  "additionalProperties": false
948
1160
  },
949
1161
  "examples": [
950
- {}
1162
+ {
1163
+ "oldNamespace": "myapp.util",
1164
+ "newNamespace": "myapp.helpers"
1165
+ }
951
1166
  ]
952
1167
  },
953
1168
  {
954
- "name": "list-exports",
1169
+ "name": "move-clojure-namespace",
955
1170
  "category": "pando",
956
- "signature": "list-exports(scope, symbolKinds, export_kinds, limit, offset)",
957
- "description": "List exports with optional scope and filters. limit clamps to 100; offset clamps to >= 0. Example: { scope:'packages/ui/', limit:20 }",
1171
+ "signature": "move-clojure-namespace(namespace, newFile)",
1172
+ "description": "Rename a Clojure namespace and move its defining file. This uses the indexed namespace graph to plan dependent updates, applies the namespace rename, and then moves the file to newFile.",
958
1173
  "parameters": {
959
1174
  "type": "object",
960
1175
  "properties": {
961
- "scope": {
1176
+ "namespace": {
962
1177
  "type": "string",
963
- "description": "Path prefix to filter by module path."
964
- },
965
- "symbolKinds": {
966
- "type": "array",
967
- "items": {
968
- "type": "string"
969
- },
970
- "description": "Symbol categories (e.g., function, class)."
971
- },
972
- "export_kinds": {
973
- "type": "array",
974
- "items": {
975
- "type": "string"
976
- },
977
- "description": "Export kinds (e.g., named, default, reexport, star)."
978
- },
979
- "limit": {
980
- "anyOf": [
981
- {
982
- "type": "number"
983
- },
984
- {
985
- "type": "string"
986
- }
987
- ]
1178
+ "description": "The current fully-qualified namespace (e.g., 'myapp.old.location')."
988
1179
  },
989
- "offset": {
990
- "anyOf": [
991
- {
992
- "type": "number"
993
- },
994
- {
995
- "type": "string"
996
- }
997
- ]
1180
+ "newFile": {
1181
+ "type": "string",
1182
+ "description": "The destination file path (e.g., 'src/myapp/new/location.clj')."
998
1183
  }
999
1184
  },
1000
- "required": [],
1185
+ "required": [
1186
+ "namespace",
1187
+ "newFile"
1188
+ ],
1001
1189
  "additionalProperties": false
1002
1190
  },
1003
1191
  "examples": [
1004
1192
  {
1005
- "scope": "packages/ui/",
1006
- "limit": 20
1193
+ "namespace": "myapp.old.location",
1194
+ "newFile": "src/myapp/new/location.clj"
1007
1195
  }
1008
1196
  ]
1009
1197
  },
1010
1198
  {
1011
- "name": "analyze-imports",
1199
+ "name": "rename-clojure-namespace",
1012
1200
  "category": "pando",
1013
- "signature": "analyze-imports(groupBy, limit, offset)",
1014
- "description": "Analyze imports and group by 'module' (default) or 'file'. limit clamps to 100; offset clamps to >= 0. Example: { groupBy:'module' }",
1201
+ "signature": "rename-clojure-namespace(oldNamespace, newNamespace)",
1202
+ "description": "Rename a Clojure namespace across the workspace using the normal rename machinery. This updates the namespace declaration and dependent references, but does not move the file.",
1015
1203
  "parameters": {
1016
1204
  "type": "object",
1017
1205
  "properties": {
1018
- "groupBy": {
1206
+ "oldNamespace": {
1019
1207
  "type": "string",
1020
- "description": "module | file"
1021
- },
1022
- "limit": {
1023
- "anyOf": [
1024
- {
1025
- "type": "number"
1026
- },
1027
- {
1028
- "type": "string"
1029
- }
1030
- ]
1208
+ "description": "The current fully-qualified namespace (e.g., 'myapp.util')."
1031
1209
  },
1032
- "offset": {
1033
- "anyOf": [
1034
- {
1035
- "type": "number"
1036
- },
1037
- {
1038
- "type": "string"
1039
- }
1040
- ]
1210
+ "newNamespace": {
1211
+ "type": "string",
1212
+ "description": "The new fully-qualified namespace (e.g., 'myapp.helpers')."
1041
1213
  }
1042
1214
  },
1043
- "required": [],
1215
+ "required": [
1216
+ "oldNamespace",
1217
+ "newNamespace"
1218
+ ],
1044
1219
  "additionalProperties": false
1045
1220
  },
1046
1221
  "examples": [
1047
1222
  {
1048
- "groupBy": "module"
1223
+ "oldNamespace": "myapp.util",
1224
+ "newNamespace": "myapp.helpers"
1049
1225
  }
1050
1226
  ]
1051
1227
  },
@@ -1343,7 +1519,7 @@
1343
1519
  "name": "replace",
1344
1520
  "category": "pando",
1345
1521
  "signature": "replace(path, expectedHash, with, scope, forceReplaceWillBreakSyntax)",
1346
- "description": "Replace a node. scope='node' replaces the entire node (default). scope='body' replaces only the inner body (no braces) and fails if the target has no body. Requires expectedHash (no @). Example: { path:'src/app.ts#FD:0', expectedHash:'p123:c456', with:'function x() {}' }",
1522
+ "description": "Replace a node. scope='node' replaces the entire node (default). scope='body' replaces only the inner body span and fails if the target has no body. For scope='body', provide body contents only, not enclosing delimiters; body replacement is pass-through and preserves the exact whitespace you provide. Requires expectedHash (no @). Example: { path:'src/app.ts#FD:0', expectedHash:'p123:c456', with:'function x() {}' }",
1347
1523
  "parameters": {
1348
1524
  "type": "object",
1349
1525
  "properties": {
@@ -1361,7 +1537,7 @@
1361
1537
  },
1362
1538
  "scope": {
1363
1539
  "type": "string",
1364
- "description": "Replacement scope: 'node' (default) or 'body' (inner body only).",
1540
+ "description": "Replacement scope: 'node' (default) or 'body' (inner body only, no enclosing delimiters).",
1365
1541
  "enum": [
1366
1542
  "node",
1367
1543
  "body"
@@ -1393,11 +1569,223 @@
1393
1569
  }
1394
1570
  ]
1395
1571
  },
1572
+ {
1573
+ "name": "replace-body",
1574
+ "category": "pando",
1575
+ "signature": "replace-body(path, expectedHash, with, forceReplaceWillBreakSyntax)",
1576
+ "description": "Replace only a node body. This is equivalent to pando_replace with scope='body', but exposed as a dedicated tool for callers that need an explicit replace-body operation. Provide body contents only, not enclosing delimiters; the replacement text is written as-is, including indentation and leading/trailing whitespace. Requires expectedHash (no @). Example: { path:'src/app.ts#FD:0', expectedHash:'p123:c456', with:'console.log(1);' }",
1577
+ "parameters": {
1578
+ "type": "object",
1579
+ "properties": {
1580
+ "path": {
1581
+ "type": "string",
1582
+ "description": "Node path (file#nodePath) without @hash."
1583
+ },
1584
+ "expectedHash": {
1585
+ "type": "string",
1586
+ "description": "Hash portion only (no @)."
1587
+ },
1588
+ "with": {
1589
+ "type": "string",
1590
+ "description": "Replacement text for the inner body only. Do not include enclosing delimiters; whitespace is preserved exactly as provided."
1591
+ },
1592
+ "forceReplaceWillBreakSyntax": {
1593
+ "type": "boolean",
1594
+ "description": "Allow syntax errors after replacement."
1595
+ }
1596
+ },
1597
+ "required": [
1598
+ "path",
1599
+ "expectedHash",
1600
+ "with"
1601
+ ],
1602
+ "additionalProperties": false
1603
+ },
1604
+ "examples": [
1605
+ {
1606
+ "path": "src/app.ts#FD:0",
1607
+ "expectedHash": "p123:c456",
1608
+ "with": "console.log(1);"
1609
+ }
1610
+ ]
1611
+ },
1612
+ {
1613
+ "name": "change-signature",
1614
+ "category": "pando",
1615
+ "signature": "change-signature(path, expectedHash, parameters, returnType, makeAsync, makeSyncFromAsync, forceChangeWillBreakSyntax, boundary, batchSaves)",
1616
+ "description": "Modify a function or method signature with best-effort call-site updates. Supports parameter add/remove/modify/reorder, return type changes, and async/sync conversion. Requires path and expectedHash (no @). Writes create automatic snapshots before and after the operation.",
1617
+ "parameters": {
1618
+ "type": "object",
1619
+ "properties": {
1620
+ "path": {
1621
+ "type": "string",
1622
+ "description": "Node path without @hash (file#nodePath)."
1623
+ },
1624
+ "expectedHash": {
1625
+ "type": "string",
1626
+ "description": "Hash portion only (no @)."
1627
+ },
1628
+ "parameters": {
1629
+ "type": "object",
1630
+ "description": "Parameter changes to apply.",
1631
+ "properties": {
1632
+ "add": {
1633
+ "type": "array",
1634
+ "description": "Parameters to insert. position defaults to the end.",
1635
+ "items": {
1636
+ "type": "object",
1637
+ "properties": {
1638
+ "name": {
1639
+ "type": "string"
1640
+ },
1641
+ "type": {
1642
+ "type": "string"
1643
+ },
1644
+ "defaultValue": {
1645
+ "type": "string"
1646
+ },
1647
+ "position": {
1648
+ "type": "integer",
1649
+ "minimum": 0
1650
+ },
1651
+ "callSiteArg": {
1652
+ "type": "string",
1653
+ "description": "Optional expression to insert at rewritten call sites for the new parameter."
1654
+ }
1655
+ },
1656
+ "required": [
1657
+ "name"
1658
+ ],
1659
+ "additionalProperties": false
1660
+ }
1661
+ },
1662
+ "remove": {
1663
+ "type": "array",
1664
+ "description": "Parameters to remove by name or zero-based index.",
1665
+ "items": {
1666
+ "anyOf": [
1667
+ {
1668
+ "type": "string"
1669
+ },
1670
+ {
1671
+ "type": "integer",
1672
+ "minimum": 0
1673
+ }
1674
+ ]
1675
+ }
1676
+ },
1677
+ "modify": {
1678
+ "type": "array",
1679
+ "description": "Parameters to modify by name or zero-based index.",
1680
+ "items": {
1681
+ "type": "object",
1682
+ "properties": {
1683
+ "target": {
1684
+ "anyOf": [
1685
+ {
1686
+ "type": "string"
1687
+ },
1688
+ {
1689
+ "type": "integer",
1690
+ "minimum": 0
1691
+ }
1692
+ ]
1693
+ },
1694
+ "newName": {
1695
+ "type": "string"
1696
+ },
1697
+ "newType": {
1698
+ "type": "string"
1699
+ },
1700
+ "newDefaultValue": {
1701
+ "type": "string"
1702
+ }
1703
+ },
1704
+ "required": [
1705
+ "target"
1706
+ ],
1707
+ "additionalProperties": false
1708
+ }
1709
+ },
1710
+ "reorder": {
1711
+ "type": "array",
1712
+ "description": "New parameter order by zero-based indices.",
1713
+ "items": {
1714
+ "type": "integer",
1715
+ "minimum": 0
1716
+ }
1717
+ }
1718
+ },
1719
+ "additionalProperties": false
1720
+ },
1721
+ "returnType": {
1722
+ "type": "string",
1723
+ "description": "New declared return type."
1724
+ },
1725
+ "makeAsync": {
1726
+ "type": "boolean",
1727
+ "description": "Set the target function to async."
1728
+ },
1729
+ "makeSyncFromAsync": {
1730
+ "type": "boolean",
1731
+ "description": "Attempt to remove async from the target function."
1732
+ },
1733
+ "forceChangeWillBreakSyntax": {
1734
+ "type": "boolean",
1735
+ "description": "Allow syntax-breaking changes without rollback."
1736
+ },
1737
+ "boundary": {
1738
+ "type": "string",
1739
+ "description": "Search boundary: 'project' (default), 'reachable', or 'workspace'.",
1740
+ "enum": [
1741
+ "project",
1742
+ "reachable",
1743
+ "workspace"
1744
+ ]
1745
+ },
1746
+ "batchSaves": {
1747
+ "type": "boolean",
1748
+ "description": "Batch writes until the operation completes."
1749
+ }
1750
+ },
1751
+ "required": [
1752
+ "path",
1753
+ "expectedHash"
1754
+ ],
1755
+ "additionalProperties": false
1756
+ },
1757
+ "examples": [
1758
+ {
1759
+ "path": "src/app.ts#FD:0",
1760
+ "expectedHash": "p123:c456",
1761
+ "parameters": {
1762
+ "add": [
1763
+ {
1764
+ "name": "options",
1765
+ "type": "Options",
1766
+ "position": 1
1767
+ }
1768
+ ]
1769
+ }
1770
+ },
1771
+ {
1772
+ "path": "src/app.ts#FD:0",
1773
+ "expectedHash": "p123:c456",
1774
+ "parameters": {
1775
+ "remove": [
1776
+ "oldParam",
1777
+ 1
1778
+ ]
1779
+ },
1780
+ "returnType": "Promise<void>"
1781
+ }
1782
+ ]
1783
+ },
1396
1784
  {
1397
1785
  "name": "filter-map-reduce",
1398
1786
  "category": "pando",
1399
1787
  "signature": "filter-map-reduce(query, transforms, apply)",
1400
- "description": "Batch apply transforms to matches selected by the query. query accepts the same parameters as find-nodes; see find-nodes documentation. Supported transforms: insert, delete, replace (use scope:'body' for body-only). Transforms must NOT include expectedHash (hashes are derived from matches). Matches are applied per-file in descending start offset order to reduce drift. Anchors accept $MATCH, $LABEL(name), and $CREATED[idx] (negative idx allowed). apply.pageSize clamps to 100. apply.maxMatches can cap total matches. Example: { query:{ symbolKinds:['function'], name:'foo' }, transforms:[{ op:'insert', to:{ bodyEndOf:'$MATCH' }, code:'\\nreturn 1;', replaceExistingNodeAtPath:false }] }",
1788
+ "description": "Batch apply transforms to matches selected by query. query uses the same current Datalog-only shape as find-nodes: { op?, lang?, snapshot?, scope, datalog, prefilter?, include?, page? }. Do not use legacy query fields such as type, name, q, qMode, symbolKinds, scopeNode, limit, offset, or cursor at top level. Supported transforms: insert, delete, replace (use scope:'body' for body-only). filter-map-reduce does NOT take caller-supplied hashes: do NOT pass expectedHash or expectedHashes anywhere in this request or inside transforms. Hashes are derived automatically from matched nodes. Matches are applied per-file in descending start offset order to reduce drift. Anchors accept $MATCH, $LABEL(name), and $CREATED[idx] (negative idx allowed). apply.pageSize clamps to 100. apply.maxMatches can cap total matches. Example: { query:{ op:'find-nodes', lang:['ts','js'], scope:{workspace:true}, datalog:{query:'[:find ?n :where [?n :node/name \"foo\"]]', bindings:['?n'], result:{nodeVar:'?n'}} }, transforms:[{ op:'insert', to:{ bodyEndOf:'$MATCH' }, code:'\\nreturn 1;', replaceExistingNodeAtPath:false }] }",
1401
1789
  "parameters": {
1402
1790
  "type": "object",
1403
1791
  "properties": {
@@ -1595,8 +1983,23 @@
1595
1983
  "examples": [
1596
1984
  {
1597
1985
  "query": {
1598
- "type": "function",
1599
- "name": "foo"
1986
+ "op": "find-nodes",
1987
+ "lang": [
1988
+ "ts",
1989
+ "js"
1990
+ ],
1991
+ "scope": {
1992
+ "workspace": true
1993
+ },
1994
+ "datalog": {
1995
+ "query": "[:find ?n :where [?n :node/name \"foo\"]]",
1996
+ "bindings": [
1997
+ "?n"
1998
+ ],
1999
+ "result": {
2000
+ "nodeVar": "?n"
2001
+ }
2002
+ }
1600
2003
  },
1601
2004
  "transforms": [
1602
2005
  {
@@ -1778,7 +2181,7 @@
1778
2181
  "name": "snapshot-worktree",
1779
2182
  "category": "pando",
1780
2183
  "signature": "snapshot-worktree(message, trailers)",
1781
- "description": "Snapshot current git worktree changes. If no changes, returns snapshotSkipped=true. message and trailers are optional. Example: { message:'checkpoint', trailers:{ ticket:'ABC-123' } }",
2184
+ "description": "Manually snapshot current git worktree changes. Use ONLY for non-pando file modifications (e.g., when using Write, Edit, or Bash tools). DO NOT use before pando operations (insert, replace, delete, rename, filter-map-reduce) - they automatically create snapshots before and after. If no changes, returns snapshotSkipped=true. message and trailers are optional. Example: { message:'checkpoint', trailers:{ ticket:'ABC-123' } }",
1782
2185
  "parameters": {
1783
2186
  "type": "object",
1784
2187
  "properties": {