aihand 0.0.1 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +136 -2
- package/dist/chunk-2NTK7H4W.js +10 -0
- package/dist/chunk-3X4FTHLC.cjs +369 -0
- package/dist/chunk-BXVNR4E2.js +399 -0
- package/dist/chunk-C7DGE6MY.cjs +1456 -0
- package/dist/chunk-DUUCVLC3.cjs +254 -0
- package/dist/chunk-FAHI53KO.cjs +125 -0
- package/dist/chunk-G7KVJ7NF.js +369 -0
- package/dist/chunk-GNEUSRGP.js +52 -0
- package/dist/chunk-IGNEAOLT.cjs +130 -0
- package/dist/chunk-IS5XFUDB.js +125 -0
- package/dist/chunk-JLYC76XL.js +2448 -0
- package/dist/chunk-KQOABC2O.cjs +52 -0
- package/dist/chunk-OVMK33AC.cjs +104 -0
- package/dist/chunk-OWYK2IGV.js +250 -0
- package/dist/chunk-PQSQN4CN.js +126 -0
- package/dist/chunk-QF6AG3M5.cjs +410 -0
- package/dist/chunk-QSAMLXML.js +1456 -0
- package/dist/chunk-VEKYRKPF.cjs +399 -0
- package/dist/chunk-Y6H7W7PI.cjs +2451 -0
- package/dist/chunk-YKSYW77R.js +410 -0
- package/dist/chunk-Z2Y65YOY.cjs +7 -0
- package/dist/chunk-ZJQRNIK7.js +104 -0
- package/dist/cli-FDS2C2CZ.cjs +651 -0
- package/dist/cli-HHRGYPSM.js +649 -0
- package/dist/cli-JQEIE7RQ.js +120 -0
- package/dist/cli-K3OS2QQH.cjs +122 -0
- package/dist/cli-OSYG6LJD.cjs +89 -0
- package/dist/cli-TXRW5PG6.js +89 -0
- package/dist/cli.cjs +81 -0
- package/dist/cli.js +81 -0
- package/dist/config-5KEQLN6L.cjs +13 -0
- package/dist/config-PJPYKDLQ.js +13 -0
- package/dist/graph-IH56SCPK.js +8 -0
- package/dist/graph-ZUXXCJ5A.cjs +8 -0
- package/dist/index.cjs +481 -0
- package/dist/index.d.cts +461 -0
- package/dist/index.d.ts +461 -0
- package/dist/index.js +479 -0
- package/dist/locate-5XFSXJ5J.cjs +15 -0
- package/dist/locate-NKSUGL3A.js +15 -0
- package/dist/refactor-5FWSZIBN.cjs +19 -0
- package/dist/refactor-BOB3SZSA.js +19 -0
- package/dist/scan-4R7GQG2W.cjs +9 -0
- package/dist/scan-VF54GAAX.js +9 -0
- package/dist/ui/probe/server.cjs +505 -0
- package/dist/ui/probe/server.js +507 -0
- package/dist/vite.cjs +12 -0
- package/dist/vite.d.cts +12 -0
- package/dist/vite.d.ts +12 -0
- package/dist/vite.js +12 -0
- package/package.json +82 -9
- package/src/cli.ts +107 -0
- package/src/index.ts +54 -0
- package/src/read/cli.ts +650 -0
- package/src/read/compact.ts +286 -0
- package/src/read/config.ts +62 -0
- package/src/read/graph.ts +182 -0
- package/src/read/index.ts +12 -0
- package/src/read/inject.ts +121 -0
- package/src/read/locate.ts +104 -0
- package/src/read/panel.ts +335 -0
- package/src/read/pipeline.ts +78 -0
- package/src/read/refactor.ts +576 -0
- package/src/read/render.ts +1118 -0
- package/src/read/scan.ts +61 -0
- package/src/read/seam.ts +0 -0
- package/src/read/security.ts +171 -0
- package/src/read/signals.ts +333 -0
- package/src/read/state.ts +71 -0
- package/src/read/stategraph.ts +205 -0
- package/src/read/types.ts +162 -0
- package/src/read/vite.ts +77 -0
- package/src/ui/babel/line-profiler.ts +197 -0
- package/src/ui/babel/source-loc.ts +68 -0
- package/src/ui/bridge/cdp-bridge.ts +138 -0
- package/src/ui/bridge/compile-probe.ts +80 -0
- package/src/ui/bridge/transport.ts +26 -0
- package/src/ui/bridge/vite-bridge.ts +116 -0
- package/src/ui/client/client-patch.ts +899 -0
- package/src/ui/client/client.ts +2562 -0
- package/src/ui/core/action.ts +747 -0
- package/src/ui/core/candidates.ts +348 -0
- package/src/ui/core/canvas.ts +305 -0
- package/src/ui/core/check.ts +34 -0
- package/src/ui/core/compact.ts +314 -0
- package/src/ui/core/detail.ts +244 -0
- package/src/ui/core/diff.ts +253 -0
- package/src/ui/core/emit.ts +198 -0
- package/src/ui/core/knob-exec.ts +137 -0
- package/src/ui/core/perf.ts +254 -0
- package/src/ui/core/types.ts +164 -0
- package/src/ui/core/util.ts +221 -0
- package/src/ui/index.ts +5 -0
- package/src/ui/probe/cli.ts +139 -0
- package/src/ui/probe/server.ts +468 -0
- package/src/ui/self/act.ts +47 -0
- package/src/ui/self/discover.ts +101 -0
- package/src/ui/self/grow.ts +121 -0
- package/src/ui/self/install.ts +100 -0
- package/src/ui/self/probe.ts +105 -0
- package/src/ui/self/screen-hook.ts +44 -0
- package/src/ui/self/self.ts +48 -0
- package/src/ui/self/store-refs.ts +123 -0
- package/src/ui/self/store-schema.ts +65 -0
- package/src/ui/self/synth.ts +37 -0
- package/src/ui/server/cli.ts +102 -0
- package/src/ui/server/dispatch.ts +276 -0
- package/src/ui/server/help-text.ts +237 -0
- package/src/ui/server/knob-schema.ts +87 -0
- package/src/ui/server/plugin.ts +1151 -0
- package/src/vite.ts +39 -0
- package/index.js +0 -2
|
@@ -0,0 +1,651 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
var _chunkC7DGE6MYcjs = require('./chunk-C7DGE6MY.cjs');
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
var _chunk3X4FTHLCcjs = require('./chunk-3X4FTHLC.cjs');
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
var _chunkIGNEAOLTcjs = require('./chunk-IGNEAOLT.cjs');
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
var _chunkKQOABC2Ocjs = require('./chunk-KQOABC2O.cjs');
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
var _chunkFAHI53KOcjs = require('./chunk-FAHI53KO.cjs');
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
var _chunkDUUCVLC3cjs = require('./chunk-DUUCVLC3.cjs');
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
var _chunkOVMK33ACcjs = require('./chunk-OVMK33AC.cjs');
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
var _chunkZ2Y65YOYcjs = require('./chunk-Z2Y65YOY.cjs');
|
|
50
|
+
|
|
51
|
+
// src/read/cli.ts
|
|
52
|
+
var _fs = require('fs');
|
|
53
|
+
var _path = require('path');
|
|
54
|
+
var _process = require('process'); var _process2 = _interopRequireDefault(_process);
|
|
55
|
+
var _url = require('url');
|
|
56
|
+
var _picocolors = require('picocolors'); var _picocolors2 = _interopRequireDefault(_picocolors);
|
|
57
|
+
var _webtreesitter = require('web-tree-sitter');
|
|
58
|
+
|
|
59
|
+
// package.json
|
|
60
|
+
var package_default = {
|
|
61
|
+
name: "aihand",
|
|
62
|
+
version: "0.1.0",
|
|
63
|
+
description: "The hand of AI \u2014 read code, drive the live UI, and refactor source from one CLI (fuses repodex + aipeek + AST refactor)",
|
|
64
|
+
type: "module",
|
|
65
|
+
main: "./dist/index.cjs",
|
|
66
|
+
module: "./dist/index.js",
|
|
67
|
+
types: "./dist/index.d.ts",
|
|
68
|
+
bin: {
|
|
69
|
+
aihand: "dist/cli.js"
|
|
70
|
+
},
|
|
71
|
+
exports: {
|
|
72
|
+
".": {
|
|
73
|
+
types: "./dist/index.d.ts",
|
|
74
|
+
import: "./dist/index.js",
|
|
75
|
+
require: "./dist/index.cjs"
|
|
76
|
+
},
|
|
77
|
+
"./vite": {
|
|
78
|
+
types: "./dist/vite.d.ts",
|
|
79
|
+
import: "./dist/vite.js",
|
|
80
|
+
require: "./dist/vite.cjs"
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
files: [
|
|
84
|
+
"dist",
|
|
85
|
+
"src",
|
|
86
|
+
"README.md"
|
|
87
|
+
],
|
|
88
|
+
scripts: {
|
|
89
|
+
typecheck: "tsc --noEmit",
|
|
90
|
+
build: "tsc --noEmit && tsup",
|
|
91
|
+
test: "vitest run",
|
|
92
|
+
"test:watch": "vitest",
|
|
93
|
+
prepublishOnly: "bun run build"
|
|
94
|
+
},
|
|
95
|
+
dependencies: {
|
|
96
|
+
"@babel/core": "^7.27.0",
|
|
97
|
+
"@repomix/tree-sitter-wasms": "^0.1.17",
|
|
98
|
+
esbuild: "^0.25.0",
|
|
99
|
+
glob: "^13.0.6",
|
|
100
|
+
"html-to-image": "^1.11.13",
|
|
101
|
+
ignore: "^7.0.5",
|
|
102
|
+
jiti: "^2.7.0",
|
|
103
|
+
"launch-ide": "^1.0.0",
|
|
104
|
+
"mdast-util-from-markdown": "^2.0.3",
|
|
105
|
+
"node-html-parser": "^7.1.0",
|
|
106
|
+
picocolors: "^1.1.1",
|
|
107
|
+
"playwright-core": "^1.61.1",
|
|
108
|
+
postcss: "^8.5.3",
|
|
109
|
+
"postcss-less": "^6.0.0",
|
|
110
|
+
"postcss-scss": "^4.0.9",
|
|
111
|
+
"ts-morph": "^28.0.0",
|
|
112
|
+
"web-tree-sitter": "0.26.8",
|
|
113
|
+
yaml: "^2.8.3"
|
|
114
|
+
},
|
|
115
|
+
peerDependencies: {
|
|
116
|
+
vite: ">=5.0.0"
|
|
117
|
+
},
|
|
118
|
+
peerDependenciesMeta: {
|
|
119
|
+
vite: {
|
|
120
|
+
optional: true
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
devDependencies: {
|
|
124
|
+
"@babel/types": "^7.27.0",
|
|
125
|
+
"@types/babel__core": "^7.20.5",
|
|
126
|
+
"@types/mdast": "^4.0.4",
|
|
127
|
+
"@types/postcss-less": "^4.0.7",
|
|
128
|
+
jsdom: "^29.1.1",
|
|
129
|
+
teact: "file:../teact",
|
|
130
|
+
tsup: "^8.4.0",
|
|
131
|
+
typescript: "~5.7.2",
|
|
132
|
+
vitest: "^3.1.2"
|
|
133
|
+
},
|
|
134
|
+
keywords: [
|
|
135
|
+
"aihand",
|
|
136
|
+
"aidev",
|
|
137
|
+
"codemap",
|
|
138
|
+
"refactor",
|
|
139
|
+
"ts-morph",
|
|
140
|
+
"ai-tools"
|
|
141
|
+
],
|
|
142
|
+
license: "MIT"
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
// src/read/pipeline.ts
|
|
146
|
+
var _ignore = require('ignore'); var _ignore2 = _interopRequireDefault(_ignore);
|
|
147
|
+
var estimateTokens = (s) => Math.ceil(s.length / 4);
|
|
148
|
+
function computeOverviewTokens(rootBlocks) {
|
|
149
|
+
return rootBlocks.reduce((sum, b) => sum + estimateTokens(b.content.trim()), 0);
|
|
150
|
+
}
|
|
151
|
+
function computeSignaturesBudget(maxTokens, overviewTokens, rootFileCount, headerTokens = 30) {
|
|
152
|
+
const rootTreeTokens = rootFileCount * 4;
|
|
153
|
+
return maxTokens - overviewTokens - rootTreeTokens - headerTokens;
|
|
154
|
+
}
|
|
155
|
+
function computePinnedSet(filePaths, fileDetailLevel) {
|
|
156
|
+
const globs = Object.keys(fileDetailLevel);
|
|
157
|
+
if (!globs.length)
|
|
158
|
+
return /* @__PURE__ */ new Set();
|
|
159
|
+
const matcher = _ignore2.default.call(void 0, ).add(globs);
|
|
160
|
+
return new Set(filePaths.filter((p) => matcher.ignores(p)));
|
|
161
|
+
}
|
|
162
|
+
function selectSignatureBlocks(srcBlocks, classifyDisplay) {
|
|
163
|
+
return srcBlocks.filter((b) => classifyDisplay(b.path) === "compact");
|
|
164
|
+
}
|
|
165
|
+
function selectFullBlocks(paths, contents, classifyDisplay) {
|
|
166
|
+
return paths.filter((p) => classifyDisplay(p) === "full" && _optionalChain([contents, 'access', _ => _.get, 'call', _2 => _2(p), 'optionalAccess', _3 => _3.trim, 'call', _4 => _4()])).map((p) => ({ path: p, level: "full", content: contents.get(p) }));
|
|
167
|
+
}
|
|
168
|
+
function formatOverview(blocks) {
|
|
169
|
+
return blocks.map((b) => ({ path: b.path, content: b.content.trim() })).filter((b) => b.content).map((b) => {
|
|
170
|
+
const lines = b.content.split("\n");
|
|
171
|
+
return lines.length > 1 ? `${b.path}:
|
|
172
|
+
${lines.join("\n ")}` : `${b.path}: ${b.content}`;
|
|
173
|
+
}).join("\n");
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// src/read/cli.ts
|
|
177
|
+
var args = _process2.default.argv.slice(2);
|
|
178
|
+
var ESC = String.fromCharCode(27);
|
|
179
|
+
function visibleLen(s) {
|
|
180
|
+
let n = 0;
|
|
181
|
+
for (let i = 0; i < s.length; i++) {
|
|
182
|
+
if (s[i] === ESC && s[i + 1] === "[") {
|
|
183
|
+
i += 2;
|
|
184
|
+
while (i < s.length && s[i] >= "0" && s[i] <= "9") i++;
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
n++;
|
|
188
|
+
}
|
|
189
|
+
return n;
|
|
190
|
+
}
|
|
191
|
+
function pad(s, len) {
|
|
192
|
+
return s + " ".repeat(Math.max(0, len - visibleLen(s)));
|
|
193
|
+
}
|
|
194
|
+
var looksLikeFile = (root) => !root.endsWith("/") && (_nullishCoalesce(root.split("/").pop(), () => ( ""))).includes(".");
|
|
195
|
+
var SELF_PATH = _url.fileURLToPath.call(void 0, _chunkZ2Y65YOYcjs.importMetaUrl);
|
|
196
|
+
var VERSION = `v${package_default.version}${SELF_PATH.includes("/src/") ? "+src" : ""}`;
|
|
197
|
+
var BANNER = `${_picocolors2.default.bold(_picocolors2.default.magenta("aihand"))} ${_picocolors2.default.dim(VERSION)}`;
|
|
198
|
+
function cdToRoot() {
|
|
199
|
+
let dir = _process2.default.cwd();
|
|
200
|
+
while (true) {
|
|
201
|
+
if (_fs.existsSync.call(void 0, _path.join.call(void 0, dir, _chunkIGNEAOLTcjs.CONFIG_PATH))) {
|
|
202
|
+
if (dir !== _process2.default.cwd())
|
|
203
|
+
_process2.default.chdir(dir);
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
const parent = _path.dirname.call(void 0, dir);
|
|
207
|
+
if (parent === dir)
|
|
208
|
+
return;
|
|
209
|
+
dir = parent;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
async function initConfig() {
|
|
213
|
+
console.log(`
|
|
214
|
+
${BANNER} ${_picocolors2.default.dim("first run setup")}`);
|
|
215
|
+
const ALL_TARGETS = ["CLAUDE.md", "AGENTS.md", "GEMINI.md", ".cursorrules", ".github/copilot-instructions.md", ".windsurfrules"];
|
|
216
|
+
const existing = ALL_TARGETS.filter((f) => _fs.existsSync.call(void 0, f));
|
|
217
|
+
const targets = existing.length ? existing : ["CLAUDE.md"];
|
|
218
|
+
const rows = [];
|
|
219
|
+
for (const file of targets) {
|
|
220
|
+
const result = _chunkC7DGE6MYcjs.ensureMarkers.call(void 0, file);
|
|
221
|
+
const meta = result === "created" ? "created with markers" : result === "marked" ? "markers added" : "already has markers";
|
|
222
|
+
rows.push({ file, meta });
|
|
223
|
+
}
|
|
224
|
+
printTable(rows);
|
|
225
|
+
const body = _chunkIGNEAOLTcjs.configTemplate.call(void 0, );
|
|
226
|
+
_fs.writeFileSync.call(void 0, _chunkIGNEAOLTcjs.CONFIG_PATH, `import { defineConfig } from 'aihand'
|
|
227
|
+
|
|
228
|
+
export default defineConfig({
|
|
229
|
+
${body}
|
|
230
|
+
})
|
|
231
|
+
`);
|
|
232
|
+
console.log(` ${_picocolors2.default.green("\u2713")} Created ${_chunkIGNEAOLTcjs.CONFIG_PATH}`);
|
|
233
|
+
await bindVitePlugin();
|
|
234
|
+
const list = targets.map((f) => _picocolors2.default.cyan(f)).join(", ");
|
|
235
|
+
console.log(`
|
|
236
|
+
${_picocolors2.default.bold("About to inject a codemap")} into ${list}
|
|
237
|
+
${_picocolors2.default.dim("\u2014 a compact repo index for your AI assistant, not for you to read.")}
|
|
238
|
+
|
|
239
|
+
${_picocolors2.default.dim("It lives between")} ${_picocolors2.default.yellow("<!-- AIDEV:START -->")} ${_picocolors2.default.dim("\u2026")} ${_picocolors2.default.yellow("END")} ${_picocolors2.default.dim("markers \u2014 safe to delete anytime; it regenerates.")}
|
|
240
|
+
${_picocolors2.default.dim("Too big? Lower")} ${_picocolors2.default.cyan("maxTokens")} ${_picocolors2.default.dim("in")} ${_picocolors2.default.cyan(_chunkIGNEAOLTcjs.CONFIG_PATH)}${_picocolors2.default.dim(", or set")} ${_picocolors2.default.cyan("injectDetailLevel: 'tree'")} ${_picocolors2.default.dim("for names only.")}
|
|
241
|
+
`);
|
|
242
|
+
return targets;
|
|
243
|
+
}
|
|
244
|
+
async function bindVitePlugin() {
|
|
245
|
+
const snippet = `${_picocolors2.default.dim("Add to your")} ${_picocolors2.default.cyan("vite.config")}${_picocolors2.default.dim(":")}
|
|
246
|
+
${_picocolors2.default.cyan("import { aihand } from 'aihand/vite'")}
|
|
247
|
+
${_picocolors2.default.dim("// then inside plugins: [ ... ]")}
|
|
248
|
+
${_picocolors2.default.cyan("aihand(),")} ${_picocolors2.default.dim("// apply: 'serve' built in \u2014 no isServe guard needed")}`;
|
|
249
|
+
const fail = (cfg2) => console.log(` ${_picocolors2.default.yellow("!")} couldn't auto-wire ${cfg2}.
|
|
250
|
+
${snippet}
|
|
251
|
+
`);
|
|
252
|
+
const cfg = ["vite.config.ts", "vite.config.mts", "vite.config.js", "vite.config.mjs"].find(_fs.existsSync);
|
|
253
|
+
if (!cfg)
|
|
254
|
+
return;
|
|
255
|
+
const src = _fs.readFileSync.call(void 0, cfg, "utf-8");
|
|
256
|
+
if (src.includes("aihand")) {
|
|
257
|
+
console.log(` ${_picocolors2.default.green("\u2713")} vite plugin already wired in ${cfg}`);
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
await _webtreesitter.Parser.init();
|
|
261
|
+
const parser = new (0, _webtreesitter.Parser)();
|
|
262
|
+
const lang = await _chunkDUUCVLC3cjs.getLang.call(void 0, cfg.slice(cfg.lastIndexOf(".")));
|
|
263
|
+
if (!lang)
|
|
264
|
+
return fail(cfg);
|
|
265
|
+
parser.setLanguage(lang);
|
|
266
|
+
const tree = parser.parse(src);
|
|
267
|
+
if (!tree)
|
|
268
|
+
return fail(cfg);
|
|
269
|
+
let lastImportEnd = -1;
|
|
270
|
+
let pluginsBracketEnd = -1;
|
|
271
|
+
const visit = (node) => {
|
|
272
|
+
if (node.type === "import_statement")
|
|
273
|
+
lastImportEnd = node.endIndex;
|
|
274
|
+
if (node.type === "pair") {
|
|
275
|
+
const key = node.childForFieldName("key");
|
|
276
|
+
const value = node.childForFieldName("value");
|
|
277
|
+
if (_optionalChain([key, 'optionalAccess', _5 => _5.text]) === "plugins" && _optionalChain([value, 'optionalAccess', _6 => _6.type]) === "array")
|
|
278
|
+
pluginsBracketEnd = value.startIndex + 1;
|
|
279
|
+
}
|
|
280
|
+
for (const child of node.children)
|
|
281
|
+
child && visit(child);
|
|
282
|
+
};
|
|
283
|
+
visit(tree.rootNode);
|
|
284
|
+
if (pluginsBracketEnd === -1 || lastImportEnd === -1 || lastImportEnd > pluginsBracketEnd)
|
|
285
|
+
return fail(cfg);
|
|
286
|
+
let indent = "";
|
|
287
|
+
for (let i = pluginsBracketEnd; src[i] === "\n" || src[i] === " " || src[i] === " "; i++)
|
|
288
|
+
indent = src[i] === "\n" ? "" : indent + src[i];
|
|
289
|
+
const withPlugin = `${src.slice(0, pluginsBracketEnd)}
|
|
290
|
+
${indent}aihand(),${src.slice(pluginsBracketEnd)}`;
|
|
291
|
+
const importLine = `
|
|
292
|
+
import { aihand } from 'aihand/vite'`;
|
|
293
|
+
const wired = `${withPlugin.slice(0, lastImportEnd)}${importLine}${withPlugin.slice(lastImportEnd)}`;
|
|
294
|
+
_fs.writeFileSync.call(void 0, cfg, wired);
|
|
295
|
+
console.log(` ${_picocolors2.default.green("\u2713")} Wired vite plugin into ${cfg}`);
|
|
296
|
+
}
|
|
297
|
+
function fmtTokens(n) {
|
|
298
|
+
if (n >= 1e6)
|
|
299
|
+
return `${(n / 1e6).toFixed(1)}M`;
|
|
300
|
+
if (n >= 1e3)
|
|
301
|
+
return `${(n / 1e3).toFixed(1)}K`;
|
|
302
|
+
return String(n);
|
|
303
|
+
}
|
|
304
|
+
function printTable(rows) {
|
|
305
|
+
const colFile = Math.max(...rows.map((r) => r.file.length)) + 2;
|
|
306
|
+
for (const r of rows) {
|
|
307
|
+
const file = pad(r.file, colFile);
|
|
308
|
+
const extra = r.info ? _picocolors2.default.dim(r.info) : r.meta ? _picocolors2.default.dim(r.meta) : "";
|
|
309
|
+
console.log(` ${_picocolors2.default.green("\u2713")} ${file}${extra}`);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
function readAll(paths) {
|
|
313
|
+
const contents = /* @__PURE__ */ new Map();
|
|
314
|
+
for (const p of paths) {
|
|
315
|
+
try {
|
|
316
|
+
contents.set(p, _fs.readFileSync.call(void 0, p, "utf-8"));
|
|
317
|
+
} catch (e) {
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
return contents;
|
|
321
|
+
}
|
|
322
|
+
async function run(config, opts = {}) {
|
|
323
|
+
const toStdout = args.includes("--stdout");
|
|
324
|
+
const { quiet = toStdout } = opts;
|
|
325
|
+
const perf = !quiet && args.includes("--perf");
|
|
326
|
+
const t0 = performance.now();
|
|
327
|
+
const mark = (label) => {
|
|
328
|
+
if (perf) {
|
|
329
|
+
const elapsed = (performance.now() - t0).toFixed(0);
|
|
330
|
+
console.log(_picocolors2.default.dim(` [${elapsed}ms] ${label}`));
|
|
331
|
+
}
|
|
332
|
+
};
|
|
333
|
+
if (!toStdout) {
|
|
334
|
+
for (const target of config.read.injectTargetFiles)
|
|
335
|
+
_chunkC7DGE6MYcjs.ensureMarkers.call(void 0, target);
|
|
336
|
+
}
|
|
337
|
+
mark("ensureMarkers");
|
|
338
|
+
const paths = _chunkKQOABC2Ocjs.scan.call(void 0, config);
|
|
339
|
+
mark(`scan (${paths.length} files)`);
|
|
340
|
+
if (!quiet)
|
|
341
|
+
console.log(`${BANNER} ${_picocolors2.default.dim(`${paths.length} files`)}`);
|
|
342
|
+
const contents = readAll(paths);
|
|
343
|
+
mark("readAll");
|
|
344
|
+
const classifyExtract = _chunkC7DGE6MYcjs.buildClassifier.call(void 0, config.read.fileDetailLevel, "compact");
|
|
345
|
+
const classifyDisplay = _chunkC7DGE6MYcjs.buildClassifier.call(void 0, config.read.fileDetailLevel, config.read.injectDetailLevel);
|
|
346
|
+
const blocks = await _chunkC7DGE6MYcjs.buildBlocks.call(void 0, paths, config, void 0, classifyExtract, contents);
|
|
347
|
+
mark("buildBlocks (compress)");
|
|
348
|
+
const rootBlocks = blocks.filter((b) => !b.path.includes("/"));
|
|
349
|
+
const srcBlocks = blocks.filter((b) => b.path.includes("/"));
|
|
350
|
+
const hasSignatures = srcBlocks.some((b) => classifyDisplay(b.path) !== "tree");
|
|
351
|
+
const knobs = await _chunk3X4FTHLCcjs.buildPanel.call(void 0, paths, contents);
|
|
352
|
+
const panel = knobs.length ? _chunk3X4FTHLCcjs.formatPanel.call(void 0, knobs) : void 0;
|
|
353
|
+
const panelTokens = panel ? estimateTokens(panel) : 0;
|
|
354
|
+
mark(`panel (${knobs.length} knobs)`);
|
|
355
|
+
const storeStates = await _chunkC7DGE6MYcjs.buildState.call(void 0, paths, config.runtime.storeMarker);
|
|
356
|
+
const stateFieldCount = storeStates.reduce((n, s) => n + s.fields.length, 0);
|
|
357
|
+
const state = storeStates.length ? _chunkC7DGE6MYcjs.formatState.call(void 0, storeStates) : void 0;
|
|
358
|
+
const stateTokens = state ? estimateTokens(state) : 0;
|
|
359
|
+
mark(`state (${stateFieldCount} fields)`);
|
|
360
|
+
const starred = /* @__PURE__ */ new Set([...knobs.map((k) => k.filePath), ...storeStates.map((s) => s.filePath)]);
|
|
361
|
+
const treeOpts = { skeletonOnly: hasSignatures, starred };
|
|
362
|
+
const activePaths = paths;
|
|
363
|
+
const starredMode = starred.size > 0;
|
|
364
|
+
let tree = starredMode ? _chunkC7DGE6MYcjs.formatStarredTree.call(void 0, activePaths, starred) : _chunkC7DGE6MYcjs.formatTree.call(void 0, activePaths, config.read.treeFoldThreshold, treeOpts);
|
|
365
|
+
let treeTokens = estimateTokens(tree);
|
|
366
|
+
mark("formatTree");
|
|
367
|
+
let allocLevels;
|
|
368
|
+
const overviewTokens = computeOverviewTokens(rootBlocks);
|
|
369
|
+
if (config.read.maxTokens) {
|
|
370
|
+
const rootFileCount = paths.filter((p) => !p.includes("/")).length;
|
|
371
|
+
const sigBudget = computeSignaturesBudget(config.read.maxTokens, overviewTokens, rootFileCount);
|
|
372
|
+
const filePaths = srcBlocks.map((b) => b.path);
|
|
373
|
+
const recency = _chunkC7DGE6MYcjs.computeRecency.call(void 0, filePaths);
|
|
374
|
+
const importGraph = _chunkC7DGE6MYcjs.buildImportGraph.call(void 0, srcBlocks);
|
|
375
|
+
const centrality = _chunkC7DGE6MYcjs.computeCentrality.call(void 0, filePaths, importGraph);
|
|
376
|
+
const pinned = computePinnedSet(filePaths, config.read.fileDetailLevel);
|
|
377
|
+
const result = _chunkC7DGE6MYcjs.allocate.call(void 0, srcBlocks, recency, centrality, sigBudget, pinned, (p) => classifyDisplay(p) === "tree");
|
|
378
|
+
allocLevels = result.levels;
|
|
379
|
+
mark("allocate");
|
|
380
|
+
let collapsedCount = 0;
|
|
381
|
+
const sigTokens2 = estimateTokens(_chunkC7DGE6MYcjs.formatXml.call(void 0, selectSignatureBlocks(srcBlocks, classifyDisplay), result.levels));
|
|
382
|
+
if (!starredMode && treeTokens + sigTokens2 > sigBudget) {
|
|
383
|
+
const srcPaths = srcBlocks.map((b) => b.path);
|
|
384
|
+
const { kept, collapsedDirs } = _chunkC7DGE6MYcjs.expandByBudget.call(void 0, srcPaths, result.scores, result.contentTokens, sigBudget, result.treeEntryTokens);
|
|
385
|
+
collapsedCount = collapsedDirs.size;
|
|
386
|
+
tree = _chunkC7DGE6MYcjs.formatTree.call(void 0, activePaths, config.read.treeFoldThreshold, { ...treeOpts, kept, collapsedDirs });
|
|
387
|
+
treeTokens = estimateTokens(tree);
|
|
388
|
+
mark("expandByBudget");
|
|
389
|
+
}
|
|
390
|
+
if (result.downgraded > 0 || collapsedCount > 0) {
|
|
391
|
+
const parts = [];
|
|
392
|
+
if (result.downgraded > 0)
|
|
393
|
+
parts.push(`${result.downgraded} downgraded`);
|
|
394
|
+
if (collapsedCount > 0)
|
|
395
|
+
parts.push(`${collapsedCount} dirs collapsed`);
|
|
396
|
+
if (!quiet)
|
|
397
|
+
console.log(` ${_picocolors2.default.cyan("Smart allocation")} ${_picocolors2.default.dim(`${fmtTokens(result.totalBefore)} \u2192 ${fmtTokens(result.totalAfter)} tokens (${parts.join(", ")})`)}`);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
const overview = formatOverview(rootBlocks);
|
|
401
|
+
const signatureBlocks = selectSignatureBlocks(srcBlocks, classifyDisplay);
|
|
402
|
+
const signatures = _chunkC7DGE6MYcjs.formatXml.call(void 0, signatureBlocks, allocLevels);
|
|
403
|
+
const sigTokens = estimateTokens(signatures);
|
|
404
|
+
mark("formatXml (signatures)");
|
|
405
|
+
const fullOnlyBlocks = selectFullBlocks(paths, contents, classifyDisplay);
|
|
406
|
+
const full = fullOnlyBlocks.length ? _chunkC7DGE6MYcjs.formatXml.call(void 0, fullOnlyBlocks) : void 0;
|
|
407
|
+
const fullBlocks = paths.filter((p) => classifyDisplay(p) !== "tree" && _optionalChain([contents, 'access', _7 => _7.get, 'call', _8 => _8(p), 'optionalAccess', _9 => _9.trim, 'call', _10 => _10()])).map((p) => ({ path: p, level: "full", content: contents.get(p) }));
|
|
408
|
+
mark("full blocks");
|
|
409
|
+
let fullTokens = 0;
|
|
410
|
+
for (const [, v] of contents) fullTokens += estimateTokens(v);
|
|
411
|
+
const data = {
|
|
412
|
+
overview,
|
|
413
|
+
...panel ? { panel } : {},
|
|
414
|
+
...state ? { state } : {},
|
|
415
|
+
tree,
|
|
416
|
+
signatures,
|
|
417
|
+
...full ? { full } : {}
|
|
418
|
+
};
|
|
419
|
+
mark("done");
|
|
420
|
+
const rows = [
|
|
421
|
+
{ file: "overview", info: `${fmtTokens(overviewTokens)} tokens` }
|
|
422
|
+
];
|
|
423
|
+
let totalTokens = overviewTokens + treeTokens;
|
|
424
|
+
if (panel) {
|
|
425
|
+
rows.push({ file: "panel", info: `${knobs.length} knobs \xB7 ${fmtTokens(panelTokens)} tokens` });
|
|
426
|
+
totalTokens += panelTokens;
|
|
427
|
+
}
|
|
428
|
+
if (state) {
|
|
429
|
+
rows.push({ file: "state", info: `${stateFieldCount} fields \xB7 ${fmtTokens(stateTokens)} tokens` });
|
|
430
|
+
totalTokens += stateTokens;
|
|
431
|
+
}
|
|
432
|
+
rows.push({ file: "tree", info: `${fmtTokens(treeTokens)} tokens` });
|
|
433
|
+
if (signatures) {
|
|
434
|
+
rows.push({ file: "signatures", info: `${fmtTokens(sigTokens)} tokens` });
|
|
435
|
+
totalTokens += sigTokens;
|
|
436
|
+
}
|
|
437
|
+
if (full) {
|
|
438
|
+
const fullXmlTokens = estimateTokens(full);
|
|
439
|
+
rows.push({ file: "full", info: `${fmtTokens(fullXmlTokens)} tokens` });
|
|
440
|
+
totalTokens += fullXmlTokens;
|
|
441
|
+
}
|
|
442
|
+
if (!quiet) {
|
|
443
|
+
console.log(_picocolors2.default.bold(" Sections"));
|
|
444
|
+
printTable(rows);
|
|
445
|
+
}
|
|
446
|
+
let injected = [];
|
|
447
|
+
if (toStdout) {
|
|
448
|
+
_process2.default.stdout.write(`${_chunkC7DGE6MYcjs.renderSections.call(void 0, { ...config, read: { ...config.read, injectCodemap: true } }, data)}
|
|
449
|
+
`);
|
|
450
|
+
} else {
|
|
451
|
+
injected = _chunkC7DGE6MYcjs.injectAll.call(void 0, config, data, config.read.injectTargetFiles);
|
|
452
|
+
if (injected.length && !quiet) {
|
|
453
|
+
console.log(_picocolors2.default.bold("\n Injected"));
|
|
454
|
+
printTable(injected.map((f) => ({ file: f, meta: `injectDetailLevel=${config.read.injectDetailLevel}` })));
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
mark("inject");
|
|
458
|
+
const secrets = _chunkC7DGE6MYcjs.scanSecrets.call(void 0, fullBlocks);
|
|
459
|
+
if (secrets.length && !quiet) {
|
|
460
|
+
console.log(`
|
|
461
|
+
${_picocolors2.default.bold(_picocolors2.default.red(`\u26A0 ${secrets.length} potential secret(s) in full output:`))}`);
|
|
462
|
+
for (const s of secrets)
|
|
463
|
+
console.log(` ${_picocolors2.default.yellow(`${s.path}:${s.line}`)} ${_picocolors2.default.dim(s.pattern)}`);
|
|
464
|
+
}
|
|
465
|
+
if (perf) {
|
|
466
|
+
const allBlocks = [...rootBlocks, ...srcBlocks];
|
|
467
|
+
if (allBlocks.length > 3) {
|
|
468
|
+
const dirTokens = /* @__PURE__ */ new Map();
|
|
469
|
+
for (const b of allBlocks) {
|
|
470
|
+
const parts = b.path.split("/");
|
|
471
|
+
const dir = parts.length > 2 ? `${parts[0]}/${parts[1]}/` : parts.length > 1 ? `${parts[0]}/` : "(root)";
|
|
472
|
+
dirTokens.set(dir, (_nullishCoalesce(dirTokens.get(dir), () => ( 0))) + estimateTokens(b.content));
|
|
473
|
+
}
|
|
474
|
+
const topDirs = [...dirTokens.entries()].sort((a, b) => b[1] - a[1]).slice(0, 6);
|
|
475
|
+
console.log(_picocolors2.default.bold("\n Token distribution"));
|
|
476
|
+
const colDir = Math.max(...topDirs.map(([d]) => d.length)) + 2;
|
|
477
|
+
for (const [dir, tokens] of topDirs) {
|
|
478
|
+
const pct = totalTokens > 0 ? (tokens / totalTokens * 100).toFixed(0) : "0";
|
|
479
|
+
console.log(` ${pad(dir, colDir)}${fmtTokens(tokens).padStart(6)} ${_picocolors2.default.dim(`${pct}%`)}`);
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
if (!quiet) {
|
|
484
|
+
const savedPct = fullTokens > 0 ? ((1 - totalTokens / fullTokens) * 100).toFixed(1) : "0.0";
|
|
485
|
+
console.log(`
|
|
486
|
+
${_picocolors2.default.green(`${fmtTokens(totalTokens)} tokens injected`)} ${_picocolors2.default.dim(`\u2014 saved ${savedPct}% (${fmtTokens(fullTokens)} raw \u2192 ${fmtTokens(totalTokens)})`)}
|
|
487
|
+
`);
|
|
488
|
+
}
|
|
489
|
+
return { paths, totalTokens, injected: injected.length };
|
|
490
|
+
}
|
|
491
|
+
async function main() {
|
|
492
|
+
const initHere = _fs.existsSync.call(void 0, "package.json") && !_fs.existsSync.call(void 0, _chunkIGNEAOLTcjs.CONFIG_PATH);
|
|
493
|
+
if (!initHere)
|
|
494
|
+
cdToRoot();
|
|
495
|
+
const useJson = args.includes("--json");
|
|
496
|
+
if (args[0] === "move-file") {
|
|
497
|
+
if (!args[1] || !args[2]) {
|
|
498
|
+
console.error("Usage: aihand refactor move-file <src> <dest> [--dry]");
|
|
499
|
+
_process2.default.exit(1);
|
|
500
|
+
}
|
|
501
|
+
const { moveFile } = await Promise.resolve().then(() => _interopRequireWildcard(require("./refactor-5FWSZIBN.cjs")));
|
|
502
|
+
await moveFile(args[1], args[2], args.includes("--dry"));
|
|
503
|
+
return;
|
|
504
|
+
}
|
|
505
|
+
if (args[0] === "rename") {
|
|
506
|
+
if (!args[1] || !args[2] || !args[3]) {
|
|
507
|
+
console.error("Usage: aihand refactor rename <file> <oldName> <newName> [--dry]");
|
|
508
|
+
_process2.default.exit(1);
|
|
509
|
+
}
|
|
510
|
+
const { renameSymbol } = await Promise.resolve().then(() => _interopRequireWildcard(require("./refactor-5FWSZIBN.cjs")));
|
|
511
|
+
await renameSymbol(args[1], args[2], args[3], args.includes("--dry"));
|
|
512
|
+
return;
|
|
513
|
+
}
|
|
514
|
+
if (args[0] === "move-symbol") {
|
|
515
|
+
if (!args[1] || !args[2] || !args[3]) {
|
|
516
|
+
console.error("Usage: aihand refactor move-symbol <fromFile> <name> <toFile> [--dry]");
|
|
517
|
+
_process2.default.exit(1);
|
|
518
|
+
}
|
|
519
|
+
const { moveSymbol } = await Promise.resolve().then(() => _interopRequireWildcard(require("./refactor-5FWSZIBN.cjs")));
|
|
520
|
+
await moveSymbol(args[1], args[2], args[3], args.includes("--dry"));
|
|
521
|
+
return;
|
|
522
|
+
}
|
|
523
|
+
if (args[0] === "source") {
|
|
524
|
+
const config2 = await _chunkIGNEAOLTcjs.loadConfig.call(void 0, );
|
|
525
|
+
const paths = _chunkKQOABC2Ocjs.scan.call(void 0, config2);
|
|
526
|
+
const tsFiles = paths.filter(_chunkIGNEAOLTcjs.isTsFile);
|
|
527
|
+
const graph = await _chunkFAHI53KOcjs.buildCallGraph.call(void 0, tsFiles);
|
|
528
|
+
if (!args[1]) {
|
|
529
|
+
console.error("Usage: aihand read source <file:line> (file:line \u53EF\u76F4\u63A5\u662F /dom \u7684 data-insp-path)");
|
|
530
|
+
_process2.default.exit(1);
|
|
531
|
+
}
|
|
532
|
+
const { file, line } = _chunkOVMK33ACcjs.parseInspPath.call(void 0, args[1]);
|
|
533
|
+
if (!file || !Number.isFinite(line)) {
|
|
534
|
+
console.error(`Bad location: ${args[1]} \u2014 expected file:line (or data-insp-path)`);
|
|
535
|
+
_process2.default.exit(1);
|
|
536
|
+
}
|
|
537
|
+
const result = _chunkOVMK33ACcjs.locate.call(void 0, graph, file, line);
|
|
538
|
+
if (!result) {
|
|
539
|
+
console.error(`No symbol covers ${file}:${line} (\u662F\u5426 scan \u8303\u56F4\u5185\u7684\u6587\u4EF6?\u884C\u53F7\u662F\u5426\u5728\u67D0\u7B26\u53F7\u533A\u95F4\u5185?)`);
|
|
540
|
+
_process2.default.exit(1);
|
|
541
|
+
}
|
|
542
|
+
console.log(_chunkOVMK33ACcjs.renderLocate.call(void 0, result, useJson));
|
|
543
|
+
return;
|
|
544
|
+
}
|
|
545
|
+
if (args[0] === "tree") {
|
|
546
|
+
const config2 = await _chunkIGNEAOLTcjs.loadConfig.call(void 0, );
|
|
547
|
+
console.log(_chunkC7DGE6MYcjs.formatTree.call(void 0, _chunkKQOABC2Ocjs.scan.call(void 0, config2), config2.read.treeFoldThreshold));
|
|
548
|
+
return;
|
|
549
|
+
}
|
|
550
|
+
if (args[0] === "panel") {
|
|
551
|
+
const config2 = await _chunkIGNEAOLTcjs.loadConfig.call(void 0, );
|
|
552
|
+
const staticKnobs = await _chunk3X4FTHLCcjs.buildPanel.call(void 0, _chunkKQOABC2Ocjs.scan.call(void 0, config2));
|
|
553
|
+
const liveFlag = args.find((a) => a === "--live" || a.startsWith("--live="));
|
|
554
|
+
let knobs = staticKnobs;
|
|
555
|
+
let liveCount = 0;
|
|
556
|
+
if (liveFlag) {
|
|
557
|
+
const port = Number(liveFlag.includes("=") ? liveFlag.split("=")[1] : 5173);
|
|
558
|
+
const runtime = await _chunkOVMK33ACcjs.fetchRuntimeKnobs.call(void 0, port);
|
|
559
|
+
const joined = _chunkOVMK33ACcjs.joinPanel.call(void 0, staticKnobs, runtime);
|
|
560
|
+
knobs = joined;
|
|
561
|
+
liveCount = joined.filter((k) => k.live).length;
|
|
562
|
+
}
|
|
563
|
+
if (useJson) {
|
|
564
|
+
console.log(JSON.stringify(knobs, null, 2));
|
|
565
|
+
return;
|
|
566
|
+
}
|
|
567
|
+
const byFile = /* @__PURE__ */ new Map();
|
|
568
|
+
for (const k of knobs) {
|
|
569
|
+
const arr = _nullishCoalesce(byFile.get(k.filePath), () => ( []));
|
|
570
|
+
arr.push(k);
|
|
571
|
+
byFile.set(k.filePath, arr);
|
|
572
|
+
}
|
|
573
|
+
const head = liveFlag ? `\u63A7\u5236\u9762 \u2014 ${knobs.length} \u4E2A\u65CB\u94AE\uFF0C${liveCount} \u4E2A\u6B64\u523B\u5DF2\u6E32\u67D3\uFF08\u25CF live\uFF09\uFF0C${byFile.size} \u4E2A\u6587\u4EF6
|
|
574
|
+
` : `\u63A7\u5236\u9762 \u2014 ${knobs.length} \u4E2A\u65CB\u94AE\uFF0C${byFile.size} \u4E2A\u6587\u4EF6
|
|
575
|
+
`;
|
|
576
|
+
console.log(_picocolors2.default.bold(head));
|
|
577
|
+
for (const [file, ks] of byFile) {
|
|
578
|
+
console.log(_picocolors2.default.cyan(file));
|
|
579
|
+
for (const k of ks) {
|
|
580
|
+
const dot = !liveFlag ? "" : k.live ? `${_picocolors2.default.green("\u25CF")} ` : `${_picocolors2.default.dim("\u25CB")} `;
|
|
581
|
+
const name = k.label ? `\u300C${k.label}\u300D` : _picocolors2.default.dim(`<${k.tag}>`);
|
|
582
|
+
console.log(` ${dot}${name} ${_picocolors2.default.dim(`${k.event} \u2192`)} ${k.store}.{ ${_chunk3X4FTHLCcjs.fmtTransitions.call(void 0, k.transitions)} } ${_picocolors2.default.dim(`@${k.line}`)}`);
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
return;
|
|
586
|
+
}
|
|
587
|
+
const watchMode = args.includes("--watch") || args.includes("-w");
|
|
588
|
+
if (!_fs.existsSync.call(void 0, _chunkIGNEAOLTcjs.CONFIG_PATH)) {
|
|
589
|
+
await initConfig();
|
|
590
|
+
}
|
|
591
|
+
const config = await _chunkIGNEAOLTcjs.loadConfig.call(void 0, );
|
|
592
|
+
const { paths: files, totalTokens: initialTokens } = await run(config);
|
|
593
|
+
let lastTokens = initialTokens;
|
|
594
|
+
if (!watchMode)
|
|
595
|
+
return;
|
|
596
|
+
const parentAtLaunch = _process2.default.ppid;
|
|
597
|
+
setInterval(() => {
|
|
598
|
+
if (_process2.default.ppid !== parentAtLaunch)
|
|
599
|
+
_process2.default.exit(0);
|
|
600
|
+
}, 2e3).unref();
|
|
601
|
+
const watchRoots = /* @__PURE__ */ new Set();
|
|
602
|
+
for (const f of files) {
|
|
603
|
+
const seg = f.split("/")[0];
|
|
604
|
+
watchRoots.add(seg);
|
|
605
|
+
}
|
|
606
|
+
watchRoots.add(_chunkIGNEAOLTcjs.CONFIG_PATH);
|
|
607
|
+
const ignored = new Set(config.read.injectTargetFiles.map((f) => f.split("/").pop()));
|
|
608
|
+
const timeFmt = new Intl.DateTimeFormat(void 0, { hour: "numeric", minute: "numeric", second: "numeric" });
|
|
609
|
+
let timer = null;
|
|
610
|
+
const changed = /* @__PURE__ */ new Set();
|
|
611
|
+
const onChange = (filename, root, rootIsFile) => {
|
|
612
|
+
const fname = _nullishCoalesce(_optionalChain([filename, 'optionalAccess', _11 => _11.toString, 'call', _12 => _12()]), () => ( ""));
|
|
613
|
+
const path = rootIsFile ? root : fname ? `${root}/${fname}` : root;
|
|
614
|
+
if (ignored.has(path.split("/").pop()))
|
|
615
|
+
return;
|
|
616
|
+
changed.add(path);
|
|
617
|
+
if (timer)
|
|
618
|
+
clearTimeout(timer);
|
|
619
|
+
timer = setTimeout(async () => {
|
|
620
|
+
const fresh = await _chunkIGNEAOLTcjs.loadConfig.call(void 0, );
|
|
621
|
+
const t0 = performance.now();
|
|
622
|
+
const { totalTokens, injected } = await run(fresh, { quiet: true });
|
|
623
|
+
const list = [...changed];
|
|
624
|
+
changed.clear();
|
|
625
|
+
if (!injected)
|
|
626
|
+
return;
|
|
627
|
+
const ms = (performance.now() - t0).toFixed(0);
|
|
628
|
+
const time = timeFmt.format(/* @__PURE__ */ new Date());
|
|
629
|
+
const summary = list.join(", ");
|
|
630
|
+
const diff = totalTokens - lastTokens;
|
|
631
|
+
lastTokens = totalTokens;
|
|
632
|
+
const diffStr = diff === 0 ? _picocolors2.default.dim("\xB10") : (diff > 0 ? _picocolors2.default.yellow : _picocolors2.default.cyan)(`${diff > 0 ? "+" : "-"}${fmtTokens(Math.abs(diff))}`);
|
|
633
|
+
console.log(`${_picocolors2.default.dim(time)} ${_picocolors2.default.dim(`[aihand ${VERSION}]`)} ${_picocolors2.default.green("update")} ${_picocolors2.default.dim(summary)} ${_picocolors2.default.dim(`${ms}ms`)} ${_picocolors2.default.dim("\xB7")} ${_picocolors2.default.green(fmtTokens(totalTokens))} ${diffStr}`);
|
|
634
|
+
}, 300);
|
|
635
|
+
};
|
|
636
|
+
for (const root of watchRoots) {
|
|
637
|
+
if (!_fs.existsSync.call(void 0, root))
|
|
638
|
+
continue;
|
|
639
|
+
const isFile = looksLikeFile(root);
|
|
640
|
+
_fs.watch.call(void 0, root, isFile ? {} : { recursive: true }, (_e, f) => onChange(f, root, isFile));
|
|
641
|
+
}
|
|
642
|
+
console.log(_picocolors2.default.dim(` watching ${[...watchRoots].join(", ")}...
|
|
643
|
+
`));
|
|
644
|
+
}
|
|
645
|
+
async function runCli(argv) {
|
|
646
|
+
args = argv;
|
|
647
|
+
await main();
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
|
|
651
|
+
exports.runCli = runCli;
|