@aria-cli/tools 1.0.9 → 1.0.11

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 (241) hide show
  1. package/package.json +9 -5
  2. package/src/__tests__/web-fetch-download.test.ts +0 -433
  3. package/src/__tests__/web-tools.test.ts +0 -619
  4. package/src/ask-user-interaction.ts +0 -33
  5. package/src/cache/web-cache.ts +0 -110
  6. package/src/definitions/arion.ts +0 -118
  7. package/src/definitions/browser/browser.ts +0 -502
  8. package/src/definitions/browser/index.ts +0 -5
  9. package/src/definitions/browser/pw-downloads.ts +0 -142
  10. package/src/definitions/browser/pw-interactions.ts +0 -282
  11. package/src/definitions/browser/pw-responses.ts +0 -98
  12. package/src/definitions/browser/pw-session.ts +0 -405
  13. package/src/definitions/browser/pw-shared.ts +0 -85
  14. package/src/definitions/browser/pw-snapshot.ts +0 -383
  15. package/src/definitions/browser/pw-state.ts +0 -101
  16. package/src/definitions/browser/types.ts +0 -203
  17. package/src/definitions/code-intelligence.ts +0 -526
  18. package/src/definitions/core.ts +0 -118
  19. package/src/definitions/delegation.ts +0 -567
  20. package/src/definitions/deploy.ts +0 -73
  21. package/src/definitions/filesystem.ts +0 -217
  22. package/src/definitions/frg.ts +0 -67
  23. package/src/definitions/index.ts +0 -28
  24. package/src/definitions/memory.ts +0 -150
  25. package/src/definitions/messaging.ts +0 -734
  26. package/src/definitions/meta.ts +0 -392
  27. package/src/definitions/network.ts +0 -179
  28. package/src/definitions/outlook.ts +0 -318
  29. package/src/definitions/patch/apply-patch.ts +0 -235
  30. package/src/definitions/patch/fuzzy-match.ts +0 -217
  31. package/src/definitions/patch/index.ts +0 -1
  32. package/src/definitions/patch/patch-parser.ts +0 -297
  33. package/src/definitions/patch/sandbox-paths.ts +0 -129
  34. package/src/definitions/process/index.ts +0 -5
  35. package/src/definitions/process/process-registry.ts +0 -303
  36. package/src/definitions/process/process.ts +0 -456
  37. package/src/definitions/process/pty-keys.ts +0 -298
  38. package/src/definitions/process/session-slug.ts +0 -147
  39. package/src/definitions/quip.ts +0 -225
  40. package/src/definitions/search.ts +0 -67
  41. package/src/definitions/session-history.ts +0 -79
  42. package/src/definitions/shell.ts +0 -202
  43. package/src/definitions/slack.ts +0 -211
  44. package/src/definitions/web.ts +0 -119
  45. package/src/executors/apply-patch.ts +0 -1035
  46. package/src/executors/arion.ts +0 -199
  47. package/src/executors/code-intelligence.ts +0 -1179
  48. package/src/executors/deploy.ts +0 -1066
  49. package/src/executors/filesystem.ts +0 -1428
  50. package/src/executors/frg-freshness.ts +0 -743
  51. package/src/executors/frg.ts +0 -394
  52. package/src/executors/index.ts +0 -280
  53. package/src/executors/learning-meta.ts +0 -1367
  54. package/src/executors/lsp-client.ts +0 -355
  55. package/src/executors/memory.ts +0 -978
  56. package/src/executors/meta.ts +0 -293
  57. package/src/executors/process-registry.ts +0 -570
  58. package/src/executors/pty-session-store.ts +0 -43
  59. package/src/executors/pty.ts +0 -342
  60. package/src/executors/restart.ts +0 -133
  61. package/src/executors/search-freshness.ts +0 -249
  62. package/src/executors/search-types.ts +0 -98
  63. package/src/executors/search.ts +0 -89
  64. package/src/executors/self-diagnose.ts +0 -552
  65. package/src/executors/session-history.ts +0 -435
  66. package/src/executors/shell-safety.ts +0 -519
  67. package/src/executors/shell.ts +0 -1243
  68. package/src/executors/utils.ts +0 -40
  69. package/src/executors/web.ts +0 -786
  70. package/src/extraction/content-extraction.ts +0 -281
  71. package/src/extraction/index.ts +0 -5
  72. package/src/headless-control-contract.ts +0 -1149
  73. package/src/index.ts +0 -788
  74. package/src/local-control-http-auth.ts +0 -2
  75. package/src/mcp/client.ts +0 -218
  76. package/src/mcp/connection.ts +0 -568
  77. package/src/mcp/index.ts +0 -11
  78. package/src/mcp/jsonrpc.ts +0 -195
  79. package/src/mcp/types.ts +0 -199
  80. package/src/network-control-adapter.ts +0 -88
  81. package/src/network-runtime/address-types.ts +0 -218
  82. package/src/network-runtime/db-owner-fencing.ts +0 -91
  83. package/src/network-runtime/delivery-receipts.ts +0 -372
  84. package/src/network-runtime/direct-endpoint-authority.ts +0 -35
  85. package/src/network-runtime/index.ts +0 -316
  86. package/src/network-runtime/local-control-contract.ts +0 -784
  87. package/src/network-runtime/node-store-contract.ts +0 -46
  88. package/src/network-runtime/pair-route-contract.ts +0 -97
  89. package/src/network-runtime/peer-capabilities.ts +0 -48
  90. package/src/network-runtime/peer-principal-ref.ts +0 -20
  91. package/src/network-runtime/peer-state-machine.ts +0 -160
  92. package/src/network-runtime/protocol-schemas.ts +0 -265
  93. package/src/network-runtime/runtime-bootstrap-contract.ts +0 -83
  94. package/src/outlook/desktop-session.ts +0 -409
  95. package/src/policy.ts +0 -171
  96. package/src/providers/brave.ts +0 -80
  97. package/src/providers/duckduckgo.ts +0 -199
  98. package/src/providers/exa.ts +0 -85
  99. package/src/providers/firecrawl.ts +0 -77
  100. package/src/providers/index.ts +0 -8
  101. package/src/providers/jina.ts +0 -70
  102. package/src/providers/router.ts +0 -121
  103. package/src/providers/search-provider.ts +0 -74
  104. package/src/providers/tavily.ts +0 -74
  105. package/src/quip/desktop-session.ts +0 -435
  106. package/src/registry/index.ts +0 -1
  107. package/src/registry/registry.ts +0 -905
  108. package/src/runtime-socket-local-control-client.ts +0 -632
  109. package/src/security/dns-normalization.ts +0 -34
  110. package/src/security/dns-pinning.ts +0 -138
  111. package/src/security/external-content.ts +0 -129
  112. package/src/security/ssrf.ts +0 -207
  113. package/src/slack/desktop-session.ts +0 -493
  114. package/src/tool-factory.ts +0 -91
  115. package/src/types.ts +0 -1341
  116. package/src/utils/retry.ts +0 -163
  117. package/src/utils/safe-parse-json.ts +0 -176
  118. package/src/utils/url.ts +0 -20
  119. package/tests/benchmarks/registry.bench.ts +0 -57
  120. package/tests/cache/web-cache.test.ts +0 -147
  121. package/tests/critical-integration.test.ts +0 -1465
  122. package/tests/definitions/apply-patch.test.ts +0 -586
  123. package/tests/definitions/browser.test.ts +0 -495
  124. package/tests/definitions/delegation-pause-resume.test.ts +0 -758
  125. package/tests/definitions/execution.test.ts +0 -671
  126. package/tests/definitions/messaging-inbox-scope.test.ts +0 -229
  127. package/tests/definitions/messaging.test.ts +0 -1468
  128. package/tests/definitions/outlook.test.ts +0 -30
  129. package/tests/definitions/process.test.ts +0 -469
  130. package/tests/definitions/slack.test.ts +0 -28
  131. package/tests/definitions/tool-inventory.test.ts +0 -218
  132. package/tests/e2e/delegation-quest-orchestration.e2e.test.ts +0 -433
  133. package/tests/e2e/memory-tool-discovery-contract.e2e.test.ts +0 -81
  134. package/tests/executors/apply-patch.test.ts +0 -538
  135. package/tests/executors/arion.test.ts +0 -309
  136. package/tests/executors/conversation-primitives.test.ts +0 -250
  137. package/tests/executors/deploy.test.ts +0 -746
  138. package/tests/executors/filesystem-tools.test.ts +0 -357
  139. package/tests/executors/filesystem.test.ts +0 -959
  140. package/tests/executors/frg-freshness.test.ts +0 -136
  141. package/tests/executors/frg-merge.test.ts +0 -70
  142. package/tests/executors/frg-session-content.test.ts +0 -40
  143. package/tests/executors/frg.test.ts +0 -56
  144. package/tests/executors/memory-bugfixes.test.ts +0 -257
  145. package/tests/executors/memory-real-memoria.integration.test.ts +0 -316
  146. package/tests/executors/memory.test.ts +0 -853
  147. package/tests/executors/meta-tools.test.ts +0 -411
  148. package/tests/executors/meta.test.ts +0 -683
  149. package/tests/executors/path-containment.test.ts +0 -51
  150. package/tests/executors/process-registry.test.ts +0 -505
  151. package/tests/executors/pty.test.ts +0 -664
  152. package/tests/executors/quest-security.test.ts +0 -249
  153. package/tests/executors/read-file-media.test.ts +0 -230
  154. package/tests/executors/recall-knowledge-schema.test.ts +0 -209
  155. package/tests/executors/recall-tags.test.ts +0 -278
  156. package/tests/executors/remember-null-safety.contract.test.ts +0 -41
  157. package/tests/executors/restart.test.ts +0 -67
  158. package/tests/executors/search-unified.test.ts +0 -381
  159. package/tests/executors/session-history.test.ts +0 -340
  160. package/tests/executors/session-transcript.test.ts +0 -561
  161. package/tests/executors/shell-abort.test.ts +0 -416
  162. package/tests/executors/shell-env-blocklist.test.ts +0 -648
  163. package/tests/executors/shell-env-process.test.ts +0 -245
  164. package/tests/executors/shell-process-registry.test.ts +0 -334
  165. package/tests/executors/shell-tools.test.ts +0 -393
  166. package/tests/executors/shell.test.ts +0 -690
  167. package/tests/executors/web-abort-vs-timeout.test.ts +0 -213
  168. package/tests/executors/web-integration.test.ts +0 -633
  169. package/tests/executors/web-symlink.test.ts +0 -18
  170. package/tests/executors/web.test.ts +0 -1400
  171. package/tests/executors/write-stdin.test.ts +0 -145
  172. package/tests/extraction/content-extraction.test.ts +0 -153
  173. package/tests/guards/tools-default-test-lane.integration.test.ts +0 -21
  174. package/tests/guards/tools-package-test-commands.e2e.test.ts +0 -43
  175. package/tests/guards/tools-test-lane-manifest.contract.test.ts +0 -76
  176. package/tests/guards/tools-vitest-workspace-alias.contract.test.ts +0 -63
  177. package/tests/helpers/async-waits.ts +0 -53
  178. package/tests/integration/headless-control-contract.integration.test.ts +0 -153
  179. package/tests/integration/memory-tool-schema-parity.integration.test.ts +0 -67
  180. package/tests/integration/meta-tools-round-trip.integration.test.ts +0 -506
  181. package/tests/integration/quest-round-trip.test.ts +0 -303
  182. package/tests/integration/registry-executor-flow.test.ts +0 -85
  183. package/tests/integration.test.ts +0 -177
  184. package/tests/loading-tier.test.ts +0 -126
  185. package/tests/mcp/client-reconnect.test.ts +0 -267
  186. package/tests/mcp/connection.test.ts +0 -846
  187. package/tests/mcp/injectable-logger.test.ts +0 -83
  188. package/tests/mcp/jsonrpc.test.ts +0 -109
  189. package/tests/mcp/lifecycle.test.ts +0 -879
  190. package/tests/network-runtime/address-types.contract.test.ts +0 -143
  191. package/tests/network-runtime/continuity-bind-schema.contract.test.ts +0 -203
  192. package/tests/network-runtime/local-control-contract.test.ts +0 -869
  193. package/tests/network-runtime/local-control-invite-token.contract.test.ts +0 -146
  194. package/tests/network-runtime/node-store-contract.test.ts +0 -11
  195. package/tests/network-runtime/pair-protocol-nodeid.contract.test.ts +0 -15
  196. package/tests/network-runtime/peer-state-machine.contract.test.ts +0 -148
  197. package/tests/network-runtime/protocol-schemas.contract.test.ts +0 -512
  198. package/tests/network-runtime/relay-pending-nodeid.contract.test.ts +0 -62
  199. package/tests/network-runtime/runtime-bootstrap-contract.test.ts +0 -227
  200. package/tests/network-runtime/runtime-socket-local-control-client.test.ts +0 -621
  201. package/tests/network-runtime/wait-for-message-script.test.ts +0 -288
  202. package/tests/parallel.test.ts +0 -71
  203. package/tests/policy.test.ts +0 -184
  204. package/tests/print-default-test-lane.ts +0 -14
  205. package/tests/print-test-lane-manifest.ts +0 -22
  206. package/tests/providers/brave.test.ts +0 -159
  207. package/tests/providers/duckduckgo.test.ts +0 -207
  208. package/tests/providers/exa.test.ts +0 -175
  209. package/tests/providers/firecrawl.test.ts +0 -168
  210. package/tests/providers/jina.test.ts +0 -144
  211. package/tests/providers/router.test.ts +0 -328
  212. package/tests/providers/tavily.test.ts +0 -165
  213. package/tests/registry/discovery.test.ts +0 -154
  214. package/tests/registry/injectable-logger.test.ts +0 -230
  215. package/tests/registry/input-validation.test.ts +0 -361
  216. package/tests/registry/interface-completeness.test.ts +0 -85
  217. package/tests/registry/mcp-integration.test.ts +0 -103
  218. package/tests/registry/mcp-read-only-hint.test.ts +0 -60
  219. package/tests/registry/memoria-discovery.test.ts +0 -390
  220. package/tests/registry/nested-validation.test.ts +0 -283
  221. package/tests/registry/pseudo-tool-filtering.test.ts +0 -258
  222. package/tests/registry/registration-lifecycle.test.ts +0 -133
  223. package/tests/registry-validation.test.ts +0 -424
  224. package/tests/registry.test.ts +0 -460
  225. package/tests/security/dns-pinning.test.ts +0 -162
  226. package/tests/security/external-content.test.ts +0 -144
  227. package/tests/security/ssrf.test.ts +0 -118
  228. package/tests/shell-safety-integration.test.ts +0 -32
  229. package/tests/shell-safety.test.ts +0 -365
  230. package/tests/slack/desktop-session.test.ts +0 -50
  231. package/tests/test-lane-manifest.ts +0 -440
  232. package/tests/test-utils.ts +0 -27
  233. package/tests/tool-factory.test.ts +0 -188
  234. package/tests/utils/retry.test.ts +0 -231
  235. package/tests/utils/url.test.ts +0 -63
  236. package/tsconfig.cjs.json +0 -24
  237. package/tsconfig.json +0 -12
  238. package/vitest.config.ts +0 -55
  239. package/vitest.e2e.config.ts +0 -24
  240. package/vitest.integration.config.ts +0 -24
  241. package/vitest.native.config.ts +0 -24
@@ -1,249 +0,0 @@
1
- /**
2
- * Freshness tracker for aria-search (code_search tool).
3
- *
4
- * Mirrors frg-freshness.ts patterns to close the freshness gaps:
5
- * 1. Tracks file mutations from ARIA tool writes (session overlay)
6
- * 2. Reconciles git-dirty files on each search
7
- * 3. Generates session overlay for the napi search() call
8
- *
9
- * The session overlay gives 0ms visibility for pending mutations —
10
- * files written by agents/users appear in search results immediately
11
- * without waiting for an index rebuild or hot.log sync.
12
- */
13
-
14
- import * as fsSync from "node:fs";
15
- import * as nodePath from "node:path";
16
- import { execFileSync } from "node:child_process";
17
-
18
- export type SearchMutationOperation = "write" | "delete";
19
-
20
- export interface SearchMutationRecord {
21
- path: string;
22
- operation: SearchMutationOperation;
23
- content?: string;
24
- sequence: number;
25
- }
26
-
27
- export interface SearchSessionOverlay {
28
- sessionWrites: Array<{ path: string; content: string }>;
29
- sessionDeletes: string[];
30
- }
31
-
32
- // ---------------------------------------------------------------------------
33
- // In-memory state (per repo root)
34
- // ---------------------------------------------------------------------------
35
-
36
- interface RepoState {
37
- sequence: number;
38
- pending: Map<string, SearchMutationRecord>;
39
- lastGitReconcileMs: number;
40
- }
41
-
42
- const repoStates = new Map<string, RepoState>();
43
-
44
- /** Minimum interval between git-dirty reconciliations (avoid hammering git). */
45
- const GIT_RECONCILE_INTERVAL_MS = 2_000;
46
-
47
- /** Max content size to cache in memory per file. */
48
- const MAX_CACHED_CONTENT_BYTES = 256 * 1024;
49
-
50
- function norm(p: string): string {
51
- return nodePath.resolve(p);
52
- }
53
-
54
- function getState(root: string): RepoState {
55
- const key = norm(root);
56
- let state = repoStates.get(key);
57
- if (!state) {
58
- state = { sequence: 0, pending: new Map(), lastGitReconcileMs: 0 };
59
- repoStates.set(key, state);
60
- }
61
- return state;
62
- }
63
-
64
- // ---------------------------------------------------------------------------
65
- // Public API — called from filesystem/patch executors
66
- // ---------------------------------------------------------------------------
67
-
68
- /**
69
- * Record a file mutation from an ARIA tool write/edit/delete.
70
- * Called alongside recordFrgMutation in filesystem.ts and apply-patch.ts.
71
- */
72
- export function recordSearchMutation(
73
- filePath: string,
74
- operation: SearchMutationOperation,
75
- content?: string,
76
- ): void {
77
- // Find the git repo root to scope mutations correctly
78
- const repoRoot = findGitRepoRoot(filePath);
79
- if (!repoRoot) return;
80
-
81
- const state = getState(repoRoot);
82
- state.sequence += 1;
83
- const normalizedPath = norm(filePath);
84
-
85
- state.pending.set(normalizedPath, {
86
- path: normalizedPath,
87
- operation,
88
- content:
89
- typeof content === "string" && Buffer.byteLength(content, "utf8") <= MAX_CACHED_CONTENT_BYTES
90
- ? content
91
- : undefined,
92
- sequence: state.sequence,
93
- });
94
- }
95
-
96
- // ---------------------------------------------------------------------------
97
- // Public API — called from search executor
98
- // ---------------------------------------------------------------------------
99
-
100
- /**
101
- * Reconcile git-dirty files into the pending mutations map.
102
- * Runs `git diff --name-status -z HEAD` and `git ls-files -o --exclude-standard -z`
103
- * to detect files modified/created/deleted by external agents or the user.
104
- *
105
- * Throttled to at most once per GIT_RECONCILE_INTERVAL_MS to avoid
106
- * hammering git on rapid sequential searches.
107
- */
108
- export function reconcileSearchGitDirty(root: string): void {
109
- const state = getState(root);
110
- const now = Date.now();
111
- if (now - state.lastGitReconcileMs < GIT_RECONCILE_INTERVAL_MS) {
112
- return; // Throttled — recent reconciliation is still fresh enough
113
- }
114
- state.lastGitReconcileMs = now;
115
-
116
- const normalizedRoot = norm(root);
117
-
118
- // Tracked modified/deleted files
119
- const trackedOutput = runGit(normalizedRoot, ["diff", "--name-status", "-z", "HEAD", "--"]);
120
- if (trackedOutput) {
121
- const tokens = trackedOutput.split("\0").filter(Boolean);
122
- for (let i = 0; i < tokens.length; i++) {
123
- const status = tokens[i] ?? "";
124
- if (status.startsWith("R")) {
125
- // Rename: old path deleted, new path written
126
- const oldPath = tokens[++i];
127
- const newPath = tokens[++i];
128
- if (oldPath) addGitDirtyMutation(state, normalizedRoot, oldPath, "delete");
129
- if (newPath) addGitDirtyMutation(state, normalizedRoot, newPath, "write");
130
- continue;
131
- }
132
- const filePath = tokens[++i];
133
- if (!filePath) continue;
134
- addGitDirtyMutation(
135
- state,
136
- normalizedRoot,
137
- filePath,
138
- status.startsWith("D") ? "delete" : "write",
139
- );
140
- }
141
- }
142
-
143
- // Untracked new files
144
- const untrackedOutput = runGit(normalizedRoot, ["ls-files", "-o", "--exclude-standard", "-z"]);
145
- if (untrackedOutput) {
146
- for (const token of untrackedOutput.split("\0").filter(Boolean)) {
147
- addGitDirtyMutation(state, normalizedRoot, token, "write");
148
- }
149
- }
150
- }
151
-
152
- function addGitDirtyMutation(
153
- state: RepoState,
154
- root: string,
155
- relativePath: string,
156
- operation: SearchMutationOperation,
157
- ): void {
158
- const absPath = norm(nodePath.join(root, relativePath));
159
- const existing = state.pending.get(absPath);
160
- // Don't overwrite ARIA-sourced mutations (which have cached content)
161
- if (existing?.content) return;
162
- if (existing?.operation === operation) return;
163
-
164
- state.sequence += 1;
165
- state.pending.set(absPath, {
166
- path: absPath,
167
- operation,
168
- content: undefined, // Will be read from disk in getSearchSessionOverlay
169
- sequence: state.sequence,
170
- });
171
- }
172
-
173
- /**
174
- * Generate the session overlay for the napi search() call.
175
- * Reads content from disk for mutations without cached content.
176
- */
177
- export function getSearchSessionOverlay(root: string): SearchSessionOverlay {
178
- const state = getState(root);
179
- const sessionWrites: Array<{ path: string; content: string }> = [];
180
- const sessionDeletes: string[] = [];
181
-
182
- for (const mutation of state.pending.values()) {
183
- if (mutation.operation === "delete") {
184
- sessionDeletes.push(mutation.path);
185
- continue;
186
- }
187
-
188
- let content = mutation.content;
189
- if (typeof content !== "string") {
190
- // Read from disk — closes the gap where git-dirty files have no cached content
191
- try {
192
- const buf = fsSync.readFileSync(mutation.path);
193
- if (!buf.subarray(0, Math.min(buf.length, 8192)).includes(0)) {
194
- content = buf.toString("utf8");
195
- }
196
- } catch {
197
- continue; // Unreadable — skip
198
- }
199
- }
200
-
201
- if (typeof content === "string") {
202
- sessionWrites.push({ path: mutation.path, content });
203
- }
204
- }
205
-
206
- return { sessionWrites, sessionDeletes };
207
- }
208
-
209
- /**
210
- * Clear all pending mutations for a repo root.
211
- * Called after a full index rebuild (all mutations are now in the base index).
212
- */
213
- export function clearSearchMutations(root: string): void {
214
- const key = norm(root);
215
- repoStates.delete(key);
216
- }
217
-
218
- // ---------------------------------------------------------------------------
219
- // Helpers
220
- // ---------------------------------------------------------------------------
221
-
222
- function findGitRepoRoot(startPath: string): string | null {
223
- let current = norm(startPath);
224
- try {
225
- if (!fsSync.statSync(current).isDirectory()) {
226
- current = nodePath.dirname(current);
227
- }
228
- } catch {
229
- current = nodePath.dirname(current);
230
- }
231
- while (true) {
232
- if (fsSync.existsSync(nodePath.join(current, ".git"))) return current;
233
- const parent = nodePath.dirname(current);
234
- if (parent === current) return null;
235
- current = parent;
236
- }
237
- }
238
-
239
- function runGit(cwd: string, args: string[]): string | null {
240
- try {
241
- return execFileSync("git", args, {
242
- cwd,
243
- encoding: "utf8",
244
- stdio: ["ignore", "pipe", "ignore"],
245
- }).trim();
246
- } catch {
247
- return null;
248
- }
249
- }
@@ -1,98 +0,0 @@
1
- /**
2
- * Shared types and utilities for the unified search tool.
3
- *
4
- * Used by:
5
- * - Base executor in @aria/tools (learning-meta.ts)
6
- * - Runner wrapper in @aria/aria (search-wrapper.ts)
7
- * - Tests
8
- */
9
-
10
- /** Tagged search result — every result carries runnability info. */
11
- export interface SearchResult {
12
- kind: "tool" | "skill" | "memory";
13
- name: string;
14
- description: string;
15
- source:
16
- | "memoria"
17
- | "local"
18
- | "local_cli"
19
- | "builtin"
20
- | "skills.sh"
21
- | "clawhub"
22
- | "npm"
23
- | "brew"
24
- | "web";
25
- runnable: boolean;
26
- action: "call" | "bash" | "read_skill" | "install" | "recall";
27
- id?: string;
28
- path?: string;
29
- url?: string;
30
- installCmd?: string;
31
- installs?: number;
32
- version?: string;
33
- usageHint?: string;
34
- /** Schema for injection (builtin source only, consumed by runner wrapper). */
35
- _schema?: { name: string; description: string; parameters?: unknown };
36
- }
37
-
38
- /** OS context for platform-aware search and result metadata. */
39
- export interface OSContext {
40
- os: "macos" | "linux" | "windows";
41
- arch: string;
42
- distro?: string;
43
- }
44
-
45
- /** Input for the unified search tool. */
46
- export interface SearchInput {
47
- query: string;
48
- sources?: Array<"memoria" | "local" | "local_cli" | "builtin" | "registry" | "web">;
49
- limit?: number;
50
- learn?: boolean;
51
- adopt?: boolean;
52
- rebuild_index?: boolean;
53
- }
54
-
55
- // ---------------------------------------------------------------------------
56
- // Shared dedup logic — single source of truth for both base executor and wrapper
57
- // ---------------------------------------------------------------------------
58
-
59
- /** Source priority for dedup (lower = higher priority). */
60
- export const SOURCE_PRIORITY: Record<SearchResult["source"], number> = {
61
- builtin: 0,
62
- local_cli: 1,
63
- memoria: 2,
64
- local: 3,
65
- "skills.sh": 4,
66
- clawhub: 5,
67
- npm: 6,
68
- brew: 7,
69
- web: 8,
70
- };
71
-
72
- /**
73
- * Dedup search results by name with source priority.
74
- * When the same name appears from multiple sources, keep the higher-priority one.
75
- */
76
- export function dedupSearchResults(results: SearchResult[], limit: number): SearchResult[] {
77
- const deduped = new Map<string, SearchResult>();
78
- for (const item of results) {
79
- const normalizedName = item.name.trim().toLowerCase();
80
- const existing = deduped.get(normalizedName);
81
- if (!existing) {
82
- deduped.set(normalizedName, item);
83
- } else {
84
- const existingPriority = SOURCE_PRIORITY[existing.source] ?? 99;
85
- const newPriority = SOURCE_PRIORITY[item.source] ?? 99;
86
- if (newPriority < existingPriority) {
87
- deduped.set(normalizedName, item);
88
- }
89
- }
90
- }
91
- const sorted = [...deduped.values()].sort((a, b) => {
92
- const aPriority = SOURCE_PRIORITY[a.source] ?? 99;
93
- const bPriority = SOURCE_PRIORITY[b.source] ?? 99;
94
- if (aPriority !== bPriority) return aPriority - bPriority;
95
- return a.name.localeCompare(b.name);
96
- });
97
- return sorted.slice(0, limit);
98
- }
@@ -1,89 +0,0 @@
1
- /**
2
- * Executor for the native indexed regex search tool.
3
- *
4
- * Freshness architecture (frg parity):
5
- * 1. ARIA tool writes → recordSearchMutation → session overlay (0ms visibility)
6
- * 2. External edits → reconcileSearchGitDirty → session overlay (0ms visibility)
7
- * 3. Commit/version change → syncIndex or buildIndex (incremental/full)
8
- * 4. Session overlay passed to napi search() — no index rebuild needed
9
- */
10
-
11
- import * as nodePath from "node:path";
12
- import { buildIndex, syncIndex, indexStatus, search } from "@aria-cli/search";
13
- import { success, fail } from "./utils.js";
14
- import type { ToolContext, ToolResult } from "../types.js";
15
- import {
16
- reconcileSearchGitDirty,
17
- getSearchSessionOverlay,
18
- clearSearchMutations,
19
- } from "./search-freshness.js";
20
-
21
- interface SearchInput {
22
- pattern: string;
23
- directory?: string;
24
- fileGlob?: string;
25
- fileType?: string;
26
- caseSensitive?: boolean;
27
- literal?: boolean;
28
- maxResults?: number;
29
- context?: number;
30
- }
31
-
32
- export async function executeSearch(input: unknown, ctx: ToolContext): Promise<ToolResult> {
33
- const opts = input as SearchInput;
34
- const dir = nodePath.resolve(ctx.workingDir, opts.directory || ".");
35
-
36
- try {
37
- // Step 1: Index management — build or sync base index if needed.
38
- const status = indexStatus(dir);
39
- if (status.state === "none") {
40
- buildIndex(dir);
41
- clearSearchMutations(dir); // fresh index includes everything
42
- } else if (status.state === "stale") {
43
- // Commit or binary version changed — incremental sync is sufficient
44
- // (syncIndex rebuilds hot.log from git diff, much cheaper than full build).
45
- // Only fall back to full build if sync fails.
46
- try {
47
- syncIndex(dir);
48
- } catch {
49
- buildIndex(dir);
50
- }
51
- clearSearchMutations(dir);
52
- }
53
- // "ready" — base index is fresh, session overlay handles uncommitted changes
54
-
55
- // Step 2: Reconcile git-dirty files into pending mutations.
56
- // Detects files modified/created/deleted by external agents or the user.
57
- // Throttled to avoid hammering git on rapid sequential searches.
58
- reconcileSearchGitDirty(dir);
59
-
60
- // Step 3: Generate session overlay from pending mutations.
61
- // This gives 0ms visibility for ARIA tool writes and external edits —
62
- // no index rebuild needed. The overlay is applied in-memory by the
63
- // Rust search engine on top of the base index + hot.log.
64
- const overlay = getSearchSessionOverlay(dir);
65
-
66
- // Step 4: Search with overlay.
67
- const results = search({
68
- pattern: opts.pattern,
69
- directory: dir,
70
- maxResults: opts.maxResults ?? 1000,
71
- fileGlob: opts.fileGlob,
72
- fileType: opts.fileType,
73
- caseSensitive: opts.caseSensitive ?? true,
74
- literal: opts.literal ?? false,
75
- context: opts.context ?? 0,
76
- sessionWrites: overlay.sessionWrites,
77
- sessionDeletes: overlay.sessionDeletes,
78
- });
79
-
80
- const truncated = results.length >= (opts.maxResults ?? 1000);
81
- return success(
82
- `Found ${results.length} matches for "${opts.pattern}"${truncated ? " (truncated)" : ""}`,
83
- { matches: results, truncated },
84
- );
85
- } catch (err) {
86
- const reason = err instanceof Error ? err.message : String(err);
87
- return fail(`Search failed: ${reason}`);
88
- }
89
- }