@nuomiji/agentbox 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/LICENSE +21 -0
- package/README.md +253 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +43 -0
- package/dist/cli.js.map +1 -0
- package/dist/collector/collector.d.ts +15 -0
- package/dist/collector/collector.js +118 -0
- package/dist/collector/collector.js.map +1 -0
- package/dist/collector/known-layers.d.ts +2 -0
- package/dist/collector/known-layers.js +15 -0
- package/dist/collector/known-layers.js.map +1 -0
- package/dist/collector/probe.d.ts +19 -0
- package/dist/collector/probe.js +2 -0
- package/dist/collector/probe.js.map +1 -0
- package/dist/commands/apply.d.ts +10 -0
- package/dist/commands/apply.js +234 -0
- package/dist/commands/apply.js.map +1 -0
- package/dist/commands/bind.d.ts +8 -0
- package/dist/commands/bind.js +78 -0
- package/dist/commands/bind.js.map +1 -0
- package/dist/commands/collect.d.ts +8 -0
- package/dist/commands/collect.js +22 -0
- package/dist/commands/collect.js.map +1 -0
- package/dist/commands/export.d.ts +6 -0
- package/dist/commands/export.js +24 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/import-simple.d.ts +6 -0
- package/dist/commands/import-simple.js +96 -0
- package/dist/commands/import-simple.js.map +1 -0
- package/dist/commands/import.d.ts +8 -0
- package/dist/commands/import.js +108 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/inspect.d.ts +1 -0
- package/dist/commands/inspect.js +21 -0
- package/dist/commands/inspect.js.map +1 -0
- package/dist/commands/install-skills.d.ts +11 -0
- package/dist/commands/install-skills.js +316 -0
- package/dist/commands/install-skills.js.map +1 -0
- package/dist/commands/pack.d.ts +4 -0
- package/dist/commands/pack.js +37 -0
- package/dist/commands/pack.js.map +1 -0
- package/dist/commands/preview.d.ts +8 -0
- package/dist/commands/preview.js +108 -0
- package/dist/commands/preview.js.map +1 -0
- package/dist/commands/unpack.d.ts +4 -0
- package/dist/commands/unpack.js +45 -0
- package/dist/commands/unpack.js.map +1 -0
- package/dist/core/archive.d.ts +2 -0
- package/dist/core/archive.js +46 -0
- package/dist/core/archive.js.map +1 -0
- package/dist/core/bindings.d.ts +22 -0
- package/dist/core/bindings.js +46 -0
- package/dist/core/bindings.js.map +1 -0
- package/dist/core/env.d.ts +13 -0
- package/dist/core/env.js +49 -0
- package/dist/core/env.js.map +1 -0
- package/dist/core/fs.d.ts +12 -0
- package/dist/core/fs.js +233 -0
- package/dist/core/fs.js.map +1 -0
- package/dist/core/materialize.d.ts +10 -0
- package/dist/core/materialize.js +54 -0
- package/dist/core/materialize.js.map +1 -0
- package/dist/core/redaction.d.ts +25 -0
- package/dist/core/redaction.js +184 -0
- package/dist/core/redaction.js.map +1 -0
- package/dist/core/schemas.d.ts +9 -0
- package/dist/core/schemas.js +60 -0
- package/dist/core/schemas.js.map +1 -0
- package/dist/core/types.d.ts +125 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/yaml.d.ts +1 -0
- package/dist/core/yaml.js +8 -0
- package/dist/core/yaml.js.map +1 -0
- package/dist/import/claude-code.d.ts +3 -0
- package/dist/import/claude-code.js +182 -0
- package/dist/import/claude-code.js.map +1 -0
- package/dist/import/codex.d.ts +3 -0
- package/dist/import/codex.js +162 -0
- package/dist/import/codex.js.map +1 -0
- package/dist/import/compatibility.d.ts +42 -0
- package/dist/import/compatibility.js +99 -0
- package/dist/import/compatibility.js.map +1 -0
- package/dist/import/install-plan.d.ts +43 -0
- package/dist/import/install-plan.js +125 -0
- package/dist/import/install-plan.js.map +1 -0
- package/dist/import/openclaw.d.ts +3 -0
- package/dist/import/openclaw.js +128 -0
- package/dist/import/openclaw.js.map +1 -0
- package/dist/import/portable.d.ts +6 -0
- package/dist/import/portable.js +394 -0
- package/dist/import/portable.js.map +1 -0
- package/dist/import/types.d.ts +21 -0
- package/dist/import/types.js +2 -0
- package/dist/import/types.js.map +1 -0
- package/dist/probes/claude-code.d.ts +9 -0
- package/dist/probes/claude-code.js +244 -0
- package/dist/probes/claude-code.js.map +1 -0
- package/dist/probes/codex.d.ts +10 -0
- package/dist/probes/codex.js +219 -0
- package/dist/probes/codex.js.map +1 -0
- package/dist/probes/cursor.d.ts +9 -0
- package/dist/probes/cursor.js +102 -0
- package/dist/probes/cursor.js.map +1 -0
- package/dist/probes/openclaw.d.ts +9 -0
- package/dist/probes/openclaw.js +52 -0
- package/dist/probes/openclaw.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { createWriteStream } from "node:fs";
|
|
2
|
+
import { mkdir, readdir, stat } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import AdmZip from "adm-zip";
|
|
5
|
+
import { ZipFile } from "yazl";
|
|
6
|
+
export async function createArchiveFromDirectory(inputDir, outputFile) {
|
|
7
|
+
await mkdir(path.dirname(outputFile), { recursive: true });
|
|
8
|
+
const zip = new ZipFile();
|
|
9
|
+
const output = createWriteStream(outputFile);
|
|
10
|
+
const completion = new Promise((resolve, reject) => {
|
|
11
|
+
output.on("close", () => resolve());
|
|
12
|
+
output.on("error", reject);
|
|
13
|
+
zip.outputStream.on("error", reject);
|
|
14
|
+
});
|
|
15
|
+
zip.outputStream.pipe(output);
|
|
16
|
+
await addDirectoryToArchive(zip, inputDir, inputDir);
|
|
17
|
+
zip.end();
|
|
18
|
+
await completion;
|
|
19
|
+
}
|
|
20
|
+
export async function extractArchiveToDirectory(inputFile, outputDir) {
|
|
21
|
+
await mkdir(outputDir, { recursive: true });
|
|
22
|
+
const zip = new AdmZip(inputFile);
|
|
23
|
+
zip.extractAllTo(outputDir, true);
|
|
24
|
+
}
|
|
25
|
+
async function addDirectoryToArchive(zip, rootDir, currentDir) {
|
|
26
|
+
const entries = await readdir(currentDir, { withFileTypes: true });
|
|
27
|
+
for (const entry of entries) {
|
|
28
|
+
const fullPath = path.join(currentDir, entry.name);
|
|
29
|
+
const relativePath = toPosix(path.relative(rootDir, fullPath));
|
|
30
|
+
if (entry.isDirectory()) {
|
|
31
|
+
zip.addEmptyDirectory(relativePath);
|
|
32
|
+
await addDirectoryToArchive(zip, rootDir, fullPath);
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (entry.isFile()) {
|
|
36
|
+
const info = await stat(fullPath);
|
|
37
|
+
zip.addFile(fullPath, relativePath, {
|
|
38
|
+
mtime: info.mtime
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function toPosix(value) {
|
|
44
|
+
return value.split(path.sep).join("/");
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=archive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/core/archive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,QAAgB,EAAE,UAAkB;IACnF,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE3D,MAAM,GAAG,GAAG,IAAI,OAAO,EAAE,CAAC;IAC1B,MAAM,MAAM,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAE7C,MAAM,UAAU,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACvD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QACpC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC3B,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9B,MAAM,qBAAqB,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACrD,GAAG,CAAC,GAAG,EAAE,CAAC;IAEV,MAAM,UAAU,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,SAAiB,EAAE,SAAiB;IAClF,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC;IAClC,GAAG,CAAC,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AACpC,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,GAAY,EAAE,OAAe,EAAE,UAAkB;IACpF,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACnE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACnD,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC/D,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,GAAG,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;YACpC,MAAM,qBAAqB,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YACpD,SAAS;QACX,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACnB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;YAClC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,YAAY,EAAE;gBAClC,KAAK,EAAE,IAAI,CAAC,KAAK;aAClB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,KAAa;IAC5B,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { BindingRequirement } from "./types.js";
|
|
2
|
+
export interface BindingResolutionSource {
|
|
3
|
+
kind: "explicit" | "env-file" | "process-env" | "template-empty";
|
|
4
|
+
name: string;
|
|
5
|
+
values: Record<string, string | undefined>;
|
|
6
|
+
}
|
|
7
|
+
export interface BindingResolutionEntry {
|
|
8
|
+
key: string;
|
|
9
|
+
kind: BindingRequirement["kind"];
|
|
10
|
+
required: boolean;
|
|
11
|
+
description: string;
|
|
12
|
+
value: string;
|
|
13
|
+
provided: boolean;
|
|
14
|
+
source: BindingResolutionSource["kind"];
|
|
15
|
+
}
|
|
16
|
+
export interface BindingResolutionResult {
|
|
17
|
+
entries: BindingResolutionEntry[];
|
|
18
|
+
values: Record<string, string>;
|
|
19
|
+
missingRequired: BindingResolutionEntry[];
|
|
20
|
+
providedCount: number;
|
|
21
|
+
}
|
|
22
|
+
export declare function resolveBindings(requirements: BindingRequirement[], templateEntries: Record<string, string>, sources: BindingResolutionSource[]): BindingResolutionResult;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export function resolveBindings(requirements, templateEntries, sources) {
|
|
2
|
+
const requirementMap = new Map(requirements.map((binding) => [binding.key, binding]));
|
|
3
|
+
const allKeys = new Set([
|
|
4
|
+
...Object.keys(templateEntries),
|
|
5
|
+
...requirements.map((binding) => binding.key)
|
|
6
|
+
]);
|
|
7
|
+
const entries = [];
|
|
8
|
+
const values = {};
|
|
9
|
+
for (const key of Array.from(allKeys).sort()) {
|
|
10
|
+
const requirement = requirementMap.get(key);
|
|
11
|
+
const resolved = resolveBindingValue(key, sources);
|
|
12
|
+
const value = resolved?.value ?? templateEntries[key] ?? "";
|
|
13
|
+
const entry = {
|
|
14
|
+
key,
|
|
15
|
+
kind: requirement?.kind ?? "secret",
|
|
16
|
+
required: requirement?.required ?? false,
|
|
17
|
+
description: requirement?.description ?? `Binding required by template key "${key}"`,
|
|
18
|
+
value,
|
|
19
|
+
provided: value.length > 0,
|
|
20
|
+
source: resolved?.source ?? "template-empty"
|
|
21
|
+
};
|
|
22
|
+
entries.push(entry);
|
|
23
|
+
values[key] = value;
|
|
24
|
+
}
|
|
25
|
+
const missingRequired = entries.filter((entry) => entry.required && !entry.provided);
|
|
26
|
+
const providedCount = entries.filter((entry) => entry.provided).length;
|
|
27
|
+
return {
|
|
28
|
+
entries,
|
|
29
|
+
values,
|
|
30
|
+
missingRequired,
|
|
31
|
+
providedCount
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function resolveBindingValue(key, sources) {
|
|
35
|
+
for (const source of sources) {
|
|
36
|
+
const value = source.values[key];
|
|
37
|
+
if (value !== undefined && value.length > 0) {
|
|
38
|
+
return {
|
|
39
|
+
value,
|
|
40
|
+
source: source.kind
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=bindings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bindings.js","sourceRoot":"","sources":["../../src/core/bindings.ts"],"names":[],"mappings":"AAyBA,MAAM,UAAU,eAAe,CAC7B,YAAkC,EAClC,eAAuC,EACvC,OAAkC;IAElC,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACtF,MAAM,OAAO,GAAG,IAAI,GAAG,CAAS;QAC9B,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC;QAC/B,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC;KAC9C,CAAC,CAAC;IAEH,MAAM,OAAO,GAA6B,EAAE,CAAC;IAC7C,MAAM,MAAM,GAA2B,EAAE,CAAC;IAE1C,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAC7C,MAAM,WAAW,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,mBAAmB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,QAAQ,EAAE,KAAK,IAAI,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAC5D,MAAM,KAAK,GAA2B;YACpC,GAAG;YACH,IAAI,EAAE,WAAW,EAAE,IAAI,IAAI,QAAQ;YACnC,QAAQ,EAAE,WAAW,EAAE,QAAQ,IAAI,KAAK;YACxC,WAAW,EAAE,WAAW,EAAE,WAAW,IAAI,qCAAqC,GAAG,GAAG;YACpF,KAAK;YACL,QAAQ,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC;YAC1B,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,gBAAgB;SAC7C,CAAC;QAEF,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpB,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACtB,CAAC;IAED,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACrF,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;IAEvE,OAAO;QACL,OAAO;QACP,MAAM;QACN,eAAe;QACf,aAAa;KACd,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAC1B,GAAW,EACX,OAAkC;IAElC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5C,OAAO;gBACL,KAAK;gBACL,MAAM,EAAE,MAAM,CAAC,IAAI;aACpB,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface ParsedEnvLine {
|
|
2
|
+
kind: "entry" | "comment" | "blank";
|
|
3
|
+
raw: string;
|
|
4
|
+
key?: string;
|
|
5
|
+
value?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function parseEnvTemplate(input: string): ParsedEnvLine[];
|
|
8
|
+
export declare function parseEnvObject(input: string): Record<string, string>;
|
|
9
|
+
export declare function serializeEnvObject(values: Record<string, string>): string;
|
|
10
|
+
export declare function parseKeyValueArg(input: string): {
|
|
11
|
+
key: string;
|
|
12
|
+
value: string;
|
|
13
|
+
};
|
package/dist/core/env.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export function parseEnvTemplate(input) {
|
|
2
|
+
return input.split(/\r?\n/).map((line) => {
|
|
3
|
+
if (line.trim() === "") {
|
|
4
|
+
return { kind: "blank", raw: line };
|
|
5
|
+
}
|
|
6
|
+
if (line.trimStart().startsWith("#")) {
|
|
7
|
+
return { kind: "comment", raw: line };
|
|
8
|
+
}
|
|
9
|
+
const equalsIndex = line.indexOf("=");
|
|
10
|
+
if (equalsIndex === -1) {
|
|
11
|
+
return { kind: "comment", raw: line };
|
|
12
|
+
}
|
|
13
|
+
const key = line.slice(0, equalsIndex).trim();
|
|
14
|
+
const value = line.slice(equalsIndex + 1);
|
|
15
|
+
return {
|
|
16
|
+
kind: "entry",
|
|
17
|
+
raw: line,
|
|
18
|
+
key,
|
|
19
|
+
value
|
|
20
|
+
};
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
export function parseEnvObject(input) {
|
|
24
|
+
const result = {};
|
|
25
|
+
for (const line of parseEnvTemplate(input)) {
|
|
26
|
+
if (line.kind === "entry" && line.key) {
|
|
27
|
+
result[line.key] = line.value ?? "";
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return result;
|
|
31
|
+
}
|
|
32
|
+
export function serializeEnvObject(values) {
|
|
33
|
+
const keys = Object.keys(values).sort();
|
|
34
|
+
if (keys.length === 0) {
|
|
35
|
+
return "# No bindings supplied.\n";
|
|
36
|
+
}
|
|
37
|
+
return `${keys.map((key) => `${key}=${values[key] ?? ""}`).join("\n")}\n`;
|
|
38
|
+
}
|
|
39
|
+
export function parseKeyValueArg(input) {
|
|
40
|
+
const equalsIndex = input.indexOf("=");
|
|
41
|
+
if (equalsIndex <= 0) {
|
|
42
|
+
throw new Error(`Invalid --set value "${input}". Expected KEY=VALUE.`);
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
key: input.slice(0, equalsIndex).trim(),
|
|
46
|
+
value: input.slice(equalsIndex + 1)
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/core/env.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,OAAO,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAgB,CAAC,IAAI,EAAE,EAAE;QACtD,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACvB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;QACtC,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;QACxC,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,WAAW,KAAK,CAAC,CAAC,EAAE,CAAC;YACvB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;QACxC,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;QAC1C,OAAO;YACL,IAAI,EAAE,OAAO;YACb,GAAG,EAAE,IAAI;YACT,GAAG;YACH,KAAK;SACN,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3C,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QACtC,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAA8B;IAC/D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IACxC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,2BAA2B,CAAC;IACrC,CAAC;IAED,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,wBAAwB,KAAK,wBAAwB,CAAC,CAAC;IACzE,CAAC;IACD,OAAO;QACL,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,IAAI,EAAE;QACvC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC;KACpC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare function pathExists(targetPath: string): Promise<boolean>;
|
|
2
|
+
export declare function readJsonIfExists<T>(targetPath: string): Promise<T | null>;
|
|
3
|
+
export declare function readTextIfExists(targetPath: string): Promise<string | null>;
|
|
4
|
+
export declare function countDirectoryEntries(targetPath: string, kind?: "file" | "directory" | "any"): Promise<number>;
|
|
5
|
+
export declare function listDirectoryNames(targetPath: string, limit?: number): Promise<string[]>;
|
|
6
|
+
export declare function listFileNames(targetPath: string, limit?: number): Promise<string[]>;
|
|
7
|
+
export declare function listMarkdownFilesRecursive(targetPath: string, limit?: number): Promise<string[]>;
|
|
8
|
+
export declare function listFilesRecursive(targetPath: string, limit?: number, filter?: (entryPath: string) => boolean): Promise<string[]>;
|
|
9
|
+
export declare function listRecentFiles(targetPath: string, limit?: number, extensions?: string[]): Promise<string[]>;
|
|
10
|
+
export declare function readTextPreview(targetPath: string, maxChars?: number): Promise<string | null>;
|
|
11
|
+
export declare function readJsonlTail<T>(targetPath: string, limit?: number): Promise<T[]>;
|
|
12
|
+
export declare function detectFormat(targetPath: string): Promise<"file" | "directory" | "json" | "yaml" | "toml" | "markdown" | "sqlite" | "unknown">;
|
package/dist/core/fs.js
ADDED
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { access, readdir, readFile, stat } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
export async function pathExists(targetPath) {
|
|
4
|
+
try {
|
|
5
|
+
await access(targetPath);
|
|
6
|
+
return true;
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export async function readJsonIfExists(targetPath) {
|
|
13
|
+
try {
|
|
14
|
+
if (!(await pathExists(targetPath))) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
const raw = await readFile(targetPath, "utf8");
|
|
18
|
+
return JSON.parse(raw);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export async function readTextIfExists(targetPath) {
|
|
25
|
+
try {
|
|
26
|
+
if (!(await pathExists(targetPath))) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
return await readFile(targetPath, "utf8");
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export async function countDirectoryEntries(targetPath, kind = "any") {
|
|
36
|
+
try {
|
|
37
|
+
if (!(await pathExists(targetPath))) {
|
|
38
|
+
return 0;
|
|
39
|
+
}
|
|
40
|
+
const entries = await readdir(targetPath, { withFileTypes: true });
|
|
41
|
+
if (kind === "any") {
|
|
42
|
+
return entries.length;
|
|
43
|
+
}
|
|
44
|
+
return entries.filter((entry) => (kind === "file" ? entry.isFile() : entry.isDirectory())).length;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return 0;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
export async function listDirectoryNames(targetPath, limit = 50) {
|
|
51
|
+
try {
|
|
52
|
+
if (!(await pathExists(targetPath))) {
|
|
53
|
+
return [];
|
|
54
|
+
}
|
|
55
|
+
const entries = await readdir(targetPath, { withFileTypes: true });
|
|
56
|
+
return entries
|
|
57
|
+
.filter((entry) => entry.isDirectory())
|
|
58
|
+
.slice(0, limit)
|
|
59
|
+
.map((entry) => entry.name);
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return [];
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
export async function listFileNames(targetPath, limit = 50) {
|
|
66
|
+
try {
|
|
67
|
+
if (!(await pathExists(targetPath))) {
|
|
68
|
+
return [];
|
|
69
|
+
}
|
|
70
|
+
const entries = await readdir(targetPath, { withFileTypes: true });
|
|
71
|
+
return entries
|
|
72
|
+
.filter((entry) => entry.isFile())
|
|
73
|
+
.slice(0, limit)
|
|
74
|
+
.map((entry) => entry.name);
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return [];
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
export async function listMarkdownFilesRecursive(targetPath, limit = 100) {
|
|
81
|
+
try {
|
|
82
|
+
if (!(await pathExists(targetPath))) {
|
|
83
|
+
return [];
|
|
84
|
+
}
|
|
85
|
+
const results = [];
|
|
86
|
+
await walk(targetPath, async (entryPath, isDirectory) => {
|
|
87
|
+
if (results.length >= limit) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
if (!isDirectory && entryPath.toLowerCase().endsWith(".md")) {
|
|
91
|
+
results.push(entryPath);
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
return results;
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return [];
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
export async function listFilesRecursive(targetPath, limit = 100, filter) {
|
|
101
|
+
try {
|
|
102
|
+
if (!(await pathExists(targetPath))) {
|
|
103
|
+
return [];
|
|
104
|
+
}
|
|
105
|
+
const results = [];
|
|
106
|
+
await walk(targetPath, async (entryPath, isDirectory) => {
|
|
107
|
+
if (results.length >= limit || isDirectory) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
if (!filter || filter(entryPath)) {
|
|
111
|
+
results.push(entryPath);
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
return results;
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
return [];
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
export async function listRecentFiles(targetPath, limit = 20, extensions) {
|
|
121
|
+
try {
|
|
122
|
+
if (!(await pathExists(targetPath))) {
|
|
123
|
+
return [];
|
|
124
|
+
}
|
|
125
|
+
const files = await listFilesRecursive(targetPath, Math.max(limit * 5, limit), (entryPath) => {
|
|
126
|
+
if (!extensions || extensions.length === 0) {
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
const lower = entryPath.toLowerCase();
|
|
130
|
+
return extensions.some((extension) => lower.endsWith(extension.toLowerCase()));
|
|
131
|
+
});
|
|
132
|
+
const withStats = await Promise.all(files.map(async (filePath) => {
|
|
133
|
+
try {
|
|
134
|
+
return { filePath, mtimeMs: (await stat(filePath)).mtimeMs };
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
return { filePath, mtimeMs: 0 };
|
|
138
|
+
}
|
|
139
|
+
}));
|
|
140
|
+
return withStats
|
|
141
|
+
.filter((entry) => entry.mtimeMs > 0)
|
|
142
|
+
.sort((left, right) => right.mtimeMs - left.mtimeMs)
|
|
143
|
+
.slice(0, limit)
|
|
144
|
+
.map((entry) => entry.filePath);
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
return [];
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
export async function readTextPreview(targetPath, maxChars = 600) {
|
|
151
|
+
try {
|
|
152
|
+
if (!(await pathExists(targetPath))) {
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
const raw = await readFile(targetPath, "utf8");
|
|
156
|
+
const normalized = raw.replace(/\r\n/g, "\n").trim();
|
|
157
|
+
if (!normalized) {
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
return normalized.length > maxChars ? `${normalized.slice(0, maxChars - 3)}...` : normalized;
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
export async function readJsonlTail(targetPath, limit = 20) {
|
|
167
|
+
try {
|
|
168
|
+
if (!(await pathExists(targetPath))) {
|
|
169
|
+
return [];
|
|
170
|
+
}
|
|
171
|
+
const raw = await readFile(targetPath, "utf8");
|
|
172
|
+
const lines = raw
|
|
173
|
+
.split(/\r?\n/)
|
|
174
|
+
.map((line) => line.trim())
|
|
175
|
+
.filter((line) => line.length > 0)
|
|
176
|
+
.slice(-limit);
|
|
177
|
+
const results = [];
|
|
178
|
+
for (const line of lines) {
|
|
179
|
+
try {
|
|
180
|
+
results.push(JSON.parse(line));
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
// Ignore malformed lines for best-effort history extraction.
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return results;
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
return [];
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
export async function detectFormat(targetPath) {
|
|
193
|
+
try {
|
|
194
|
+
if (!(await pathExists(targetPath))) {
|
|
195
|
+
return "unknown";
|
|
196
|
+
}
|
|
197
|
+
const info = await stat(targetPath);
|
|
198
|
+
if (info.isDirectory()) {
|
|
199
|
+
return "directory";
|
|
200
|
+
}
|
|
201
|
+
const lower = targetPath.toLowerCase();
|
|
202
|
+
if (lower.endsWith(".json")) {
|
|
203
|
+
return "json";
|
|
204
|
+
}
|
|
205
|
+
if (lower.endsWith(".yaml") || lower.endsWith(".yml")) {
|
|
206
|
+
return "yaml";
|
|
207
|
+
}
|
|
208
|
+
if (lower.endsWith(".toml")) {
|
|
209
|
+
return "toml";
|
|
210
|
+
}
|
|
211
|
+
if (lower.endsWith(".md")) {
|
|
212
|
+
return "markdown";
|
|
213
|
+
}
|
|
214
|
+
if (lower.endsWith(".sqlite") || lower.endsWith(".db")) {
|
|
215
|
+
return "sqlite";
|
|
216
|
+
}
|
|
217
|
+
return "file";
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
return "unknown";
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
async function walk(root, visit) {
|
|
224
|
+
const entries = await readdir(root, { withFileTypes: true });
|
|
225
|
+
for (const entry of entries) {
|
|
226
|
+
const entryPath = path.join(root, entry.name);
|
|
227
|
+
await visit(entryPath, entry.isDirectory());
|
|
228
|
+
if (entry.isDirectory()) {
|
|
229
|
+
await walk(entryPath, visit);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=fs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/core/fs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { SupportedHost } from "./types.js";
|
|
2
|
+
export type InstallScope = "user" | "project";
|
|
3
|
+
export interface PathResolutionContext {
|
|
4
|
+
mode: "sandbox" | "real-home";
|
|
5
|
+
targetRoot?: string;
|
|
6
|
+
projectRoot?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function getDefaultInstallScope(targetHost: SupportedHost): InstallScope;
|
|
9
|
+
export declare function resolvePortablePath(portablePath: string, context: PathResolutionContext): string;
|
|
10
|
+
export declare function describeMaterializationMode(context: PathResolutionContext): string;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { homedir } from "node:os";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
export function getDefaultInstallScope(targetHost) {
|
|
4
|
+
return "user";
|
|
5
|
+
}
|
|
6
|
+
export function resolvePortablePath(portablePath, context) {
|
|
7
|
+
const portable = portablePath.replace(/\//g, "\\");
|
|
8
|
+
if (context.mode === "real-home") {
|
|
9
|
+
if (portable.startsWith("{{HOME}}")) {
|
|
10
|
+
return path.join(homedir(), portable.slice("{{HOME}}".length).replace(/^\\+/, ""));
|
|
11
|
+
}
|
|
12
|
+
if (portable.startsWith("{{PROJECT_ROOT}}")) {
|
|
13
|
+
if (!context.projectRoot) {
|
|
14
|
+
throw new Error(`Portable path requires project root but none was provided: ${portablePath}`);
|
|
15
|
+
}
|
|
16
|
+
return path.join(path.resolve(context.projectRoot), portable.slice("{{PROJECT_ROOT}}".length).replace(/^\\+/, ""));
|
|
17
|
+
}
|
|
18
|
+
if (portable.startsWith("{{TARGET_SKILLS_ROOT}}")) {
|
|
19
|
+
throw new Error("{{TARGET_SKILLS_ROOT}} cannot be resolved in real-home mode without an explicit sandbox target root.");
|
|
20
|
+
}
|
|
21
|
+
if (path.isAbsolute(portable)) {
|
|
22
|
+
return portable;
|
|
23
|
+
}
|
|
24
|
+
if (!context.projectRoot) {
|
|
25
|
+
throw new Error(`Relative portable path requires project root in real-home mode: ${portablePath}`);
|
|
26
|
+
}
|
|
27
|
+
return path.join(path.resolve(context.projectRoot), portable);
|
|
28
|
+
}
|
|
29
|
+
if (!context.targetRoot) {
|
|
30
|
+
throw new Error("Sandbox path resolution requires targetRoot.");
|
|
31
|
+
}
|
|
32
|
+
const targetRoot = path.resolve(context.targetRoot);
|
|
33
|
+
if (portable.startsWith("{{HOME}}")) {
|
|
34
|
+
return path.join(targetRoot, "home", portable.slice("{{HOME}}".length).replace(/^\\+/, ""));
|
|
35
|
+
}
|
|
36
|
+
if (portable.startsWith("{{PROJECT_ROOT}}")) {
|
|
37
|
+
return path.join(targetRoot, "project", portable.slice("{{PROJECT_ROOT}}".length).replace(/^\\+/, ""));
|
|
38
|
+
}
|
|
39
|
+
if (portable.startsWith("{{TARGET_SKILLS_ROOT}}")) {
|
|
40
|
+
return path.join(targetRoot, "skills", portable.slice("{{TARGET_SKILLS_ROOT}}".length).replace(/^\\+/, ""));
|
|
41
|
+
}
|
|
42
|
+
if (path.isAbsolute(portable)) {
|
|
43
|
+
const driveSanitized = portable.replace(/[:\\\/]/g, "_");
|
|
44
|
+
return path.join(targetRoot, "absolute", driveSanitized);
|
|
45
|
+
}
|
|
46
|
+
return path.join(targetRoot, portable);
|
|
47
|
+
}
|
|
48
|
+
export function describeMaterializationMode(context) {
|
|
49
|
+
if (context.mode === "real-home") {
|
|
50
|
+
return context.projectRoot ? `real-home (project root: ${path.resolve(context.projectRoot)})` : "real-home";
|
|
51
|
+
}
|
|
52
|
+
return `sandbox (${path.resolve(context.targetRoot ?? ".")})`;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=materialize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"materialize.js","sourceRoot":"","sources":["../../src/core/materialize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ResolvedSnapshot, SourceSnapshot } from "./types.js";
|
|
2
|
+
export interface RedactionEvent {
|
|
3
|
+
kind: "path" | "token-like" | "url-credential" | "binding-template";
|
|
4
|
+
location: string;
|
|
5
|
+
beforePreview: string;
|
|
6
|
+
afterPreview: string;
|
|
7
|
+
reason: string;
|
|
8
|
+
}
|
|
9
|
+
export interface SecurityAudit {
|
|
10
|
+
generatedAt: string;
|
|
11
|
+
rulesVersion: string;
|
|
12
|
+
eventCount: number;
|
|
13
|
+
events: RedactionEvent[];
|
|
14
|
+
}
|
|
15
|
+
export interface RedactionContext {
|
|
16
|
+
homeDir: string;
|
|
17
|
+
cwd: string;
|
|
18
|
+
}
|
|
19
|
+
export interface RedactionResult {
|
|
20
|
+
resolved: ResolvedSnapshot;
|
|
21
|
+
sources: SourceSnapshot;
|
|
22
|
+
audit: SecurityAudit;
|
|
23
|
+
bindingsTemplate: string;
|
|
24
|
+
}
|
|
25
|
+
export declare function redactCollectedData(context: RedactionContext, resolved: ResolvedSnapshot, sources: SourceSnapshot): RedactionResult;
|