itermbot 1.0.2 → 1.0.4
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/.github/workflows/ci.yml +15 -20
- package/.github/workflows/release.yml +32 -20
- package/README.md +11 -20
- package/cleanup-unused.patch +108 -0
- package/config/app.yaml +32 -13
- package/config/memory.yaml +38 -31
- package/config/model.yaml +33 -0
- package/config/skill.yaml +8 -0
- package/config/tool.yaml +50 -17
- package/config/tsconfig.json +4 -1
- package/dist/chat/builtin-commands.d.ts +8 -0
- package/dist/chat/builtin-commands.d.ts.map +1 -0
- package/dist/chat/builtin-commands.js +53 -0
- package/dist/chat/builtin-commands.js.map +1 -0
- package/dist/chat/progress.d.ts +3 -0
- package/dist/chat/progress.d.ts.map +1 -0
- package/dist/chat/progress.js +23 -0
- package/dist/chat/progress.js.map +1 -0
- package/dist/chat/response-safety.d.ts +8 -0
- package/dist/chat/response-safety.d.ts.map +1 -0
- package/dist/chat/response-safety.js +126 -0
- package/dist/chat/response-safety.js.map +1 -0
- package/dist/chat/step-display.d.ts +2 -0
- package/dist/chat/step-display.d.ts.map +1 -0
- package/dist/chat/step-display.js +50 -0
- package/dist/chat/step-display.js.map +1 -0
- package/dist/chat/tool-result.d.ts +4 -0
- package/dist/chat/tool-result.d.ts.map +1 -0
- package/dist/chat/tool-result.js +24 -0
- package/dist/chat/tool-result.js.map +1 -0
- package/dist/config.d.ts +11 -6
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +26 -12
- package/dist/config.js.map +1 -1
- package/dist/index.js +308 -151
- package/dist/index.js.map +1 -1
- package/dist/iterm/direct-command-router.d.ts +24 -0
- package/dist/iterm/direct-command-router.d.ts.map +1 -0
- package/dist/iterm/direct-command-router.js +213 -0
- package/dist/iterm/direct-command-router.js.map +1 -0
- package/dist/iterm/session-hint.d.ts +10 -0
- package/dist/iterm/session-hint.d.ts.map +1 -0
- package/dist/iterm/session-hint.js +43 -0
- package/dist/iterm/session-hint.js.map +1 -0
- package/dist/iterm/target-panel-policy.d.ts +12 -0
- package/dist/iterm/target-panel-policy.d.ts.map +1 -0
- package/dist/iterm/target-panel-policy.js +287 -0
- package/dist/iterm/target-panel-policy.js.map +1 -0
- package/dist/runtime/text-tool-call-recovery.d.ts +23 -0
- package/dist/runtime/text-tool-call-recovery.d.ts.map +1 -0
- package/dist/runtime/text-tool-call-recovery.js +211 -0
- package/dist/runtime/text-tool-call-recovery.js.map +1 -0
- package/dist/startup/colors.d.ts +37 -0
- package/dist/startup/colors.d.ts.map +1 -0
- package/dist/{startup-colors.js → startup/colors.js} +30 -15
- package/dist/startup/colors.js.map +1 -0
- package/dist/startup/diagnostics.d.ts +8 -0
- package/dist/startup/diagnostics.d.ts.map +1 -0
- package/dist/startup/diagnostics.js +18 -0
- package/dist/startup/diagnostics.js.map +1 -0
- package/dist/startup/os.d.ts +10 -0
- package/dist/startup/os.d.ts.map +1 -0
- package/dist/startup/os.js +67 -0
- package/dist/startup/os.js.map +1 -0
- package/dist/startup/ui.d.ts +11 -0
- package/dist/startup/ui.d.ts.map +1 -0
- package/dist/startup/ui.js +49 -0
- package/dist/startup/ui.js.map +1 -0
- package/package.json +23 -13
- package/scripts/internal-package-refs.mjs +158 -0
- package/scripts/patch-buildin-cache.sh +1 -4
- package/scripts/resolve-deps.js +5 -0
- package/scripts/test-llm.mjs +11 -5
- package/skills/gpu-ssh-monitor/SKILL.md +22 -3
- package/src/chat/builtin-commands.ts +70 -0
- package/src/chat/progress.ts +26 -0
- package/src/chat/response-safety.ts +134 -0
- package/src/chat/step-display.ts +54 -0
- package/src/chat/tool-result.ts +22 -0
- package/src/config.ts +48 -21
- package/src/index.ts +377 -167
- package/src/iterm/direct-command-router.ts +274 -0
- package/src/iterm/session-hint.ts +49 -0
- package/src/iterm/target-panel-policy.ts +341 -0
- package/src/runtime/text-tool-call-recovery.ts +257 -0
- package/src/{startup-colors.ts → startup/colors.ts} +42 -27
- package/src/startup/diagnostics.ts +25 -0
- package/src/startup/os.ts +63 -0
- package/src/startup/ui.ts +56 -0
- package/src/types/marked-terminal.d.ts +3 -0
- package/test/builtin-commands.test.mjs +50 -0
- package/test/chat-flow.integration.test.mjs +235 -0
- package/test/chat-progress.test.mjs +83 -0
- package/test/config.test.mjs +22 -0
- package/test/diagnostics.test.mjs +45 -0
- package/test/direct-command-router.test.mjs +149 -0
- package/test/live-iterm-llm.integration.test.mjs +153 -0
- package/test/response-safety.test.mjs +44 -0
- package/test/session-hint.test.mjs +78 -0
- package/test/startup-colors.test.mjs +145 -0
- package/test/target-panel-policy.test.mjs +180 -0
- package/test/tool-call-recovery.test.mjs +199 -0
- package/config/agent.yaml +0 -121
- package/config/models.yaml +0 -36
- package/config/skills.yaml +0 -4
- package/dist/agent.d.ts +0 -14
- package/dist/agent.d.ts.map +0 -1
- package/dist/agent.js +0 -16
- package/dist/agent.js.map +0 -1
- package/dist/context.d.ts +0 -12
- package/dist/context.d.ts.map +0 -1
- package/dist/context.js +0 -20
- package/dist/context.js.map +0 -1
- package/dist/session-hint.d.ts +0 -4
- package/dist/session-hint.d.ts.map +0 -1
- package/dist/session-hint.js +0 -25
- package/dist/session-hint.js.map +0 -1
- package/dist/startup-colors.d.ts +0 -26
- package/dist/startup-colors.d.ts.map +0 -1
- package/dist/startup-colors.js.map +0 -1
- package/dist/target-routing.d.ts +0 -15
- package/dist/target-routing.d.ts.map +0 -1
- package/dist/target-routing.js +0 -355
- package/dist/target-routing.js.map +0 -1
- package/src/agent.ts +0 -35
- package/src/context.ts +0 -35
- package/src/session-hint.ts +0 -28
- package/src/target-routing.ts +0 -419
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type ResponseSafetyMode = "off" | "balanced" | "strict";
|
|
2
|
+
export type ResponseSafetyOptions = {
|
|
3
|
+
evidenceText?: string;
|
|
4
|
+
targetOs?: string;
|
|
5
|
+
};
|
|
6
|
+
export declare function enforceResponseSafety(text: string): string;
|
|
7
|
+
export declare function enforceResponseSafetyWithMode(text: string, mode?: ResponseSafetyMode, options?: ResponseSafetyOptions): string;
|
|
8
|
+
//# sourceMappingURL=response-safety.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-safety.d.ts","sourceRoot":"","sources":["../../src/chat/response-safety.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,UAAU,GAAG,QAAQ,CAAC;AAC/D,MAAM,MAAM,qBAAqB,GAAG;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAsCF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAI1D;AAoDD,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,kBAA+B,EACrC,OAAO,CAAC,EAAE,qBAAqB,GAC9B,MAAM,CA+BR"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
function containsDangerousCommand(text) {
|
|
2
|
+
const patterns = [
|
|
3
|
+
/\brm\s+-rf\b/i,
|
|
4
|
+
/\bsudo\s+rm\b/i,
|
|
5
|
+
/\bmkfs(\.| )/i,
|
|
6
|
+
/\bdd\s+if=/i,
|
|
7
|
+
/\bdiskutil\s+erase/i,
|
|
8
|
+
];
|
|
9
|
+
return patterns.some((re) => re.test(text));
|
|
10
|
+
}
|
|
11
|
+
function redactDangerousCommands(text) {
|
|
12
|
+
return text
|
|
13
|
+
.replace(/\brm\s+-rf\b/gi, "[redacted-destructive-command]")
|
|
14
|
+
.replace(/\bsudo\s+rm\b/gi, "[redacted-destructive-command]")
|
|
15
|
+
.replace(/\bmkfs(\.| )\S*/gi, "[redacted-destructive-command]")
|
|
16
|
+
.replace(/\bdd\s+if=\S+/gi, "[redacted-destructive-command]")
|
|
17
|
+
.replace(/\bdiskutil\s+erase\S*/gi, "[redacted-destructive-command]");
|
|
18
|
+
}
|
|
19
|
+
function removeRedactedSuggestionLines(text) {
|
|
20
|
+
const lines = text
|
|
21
|
+
.split("\n")
|
|
22
|
+
.filter((line) => !line.includes("[redacted-destructive-command]"));
|
|
23
|
+
return lines.join("\n").trim();
|
|
24
|
+
}
|
|
25
|
+
function buildGenericSafeGuidance() {
|
|
26
|
+
return [
|
|
27
|
+
"Safety-preserving workflow:",
|
|
28
|
+
"1. Start with non-destructive inspection and validation.",
|
|
29
|
+
"2. Propose reversible actions before irreversible ones.",
|
|
30
|
+
"3. Ask for explicit confirmation before destructive operations.",
|
|
31
|
+
].join("\n");
|
|
32
|
+
}
|
|
33
|
+
export function enforceResponseSafety(text) {
|
|
34
|
+
const trimmed = text.trim();
|
|
35
|
+
if (!trimmed)
|
|
36
|
+
return trimmed;
|
|
37
|
+
return enforceResponseSafetyWithMode(trimmed, "balanced");
|
|
38
|
+
}
|
|
39
|
+
function extractAbsolutePaths(text) {
|
|
40
|
+
// Restrict path tokens to common path chars so we don't capture markup like "<parameter=...>".
|
|
41
|
+
const matches = text.match(/(?:^|[^A-Za-z0-9_])((?:\/[A-Za-z0-9._-]+)+)/g) ?? [];
|
|
42
|
+
const paths = matches
|
|
43
|
+
.map((raw) => raw.replace(/^[^/]+/, "").trim())
|
|
44
|
+
.map((p) => p.replace(/[.?!]+$/, ""))
|
|
45
|
+
.filter((p) => p.startsWith("/") && p.length > 1);
|
|
46
|
+
return Array.from(new Set(paths));
|
|
47
|
+
}
|
|
48
|
+
function hasEvidencePathOverlap(path, evidencePaths) {
|
|
49
|
+
for (const ev of evidencePaths) {
|
|
50
|
+
if (path === ev)
|
|
51
|
+
return true;
|
|
52
|
+
if (path.startsWith(`${ev}/`))
|
|
53
|
+
return true;
|
|
54
|
+
if (ev.startsWith(`${path}/`))
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
function replaceUngroundedPaths(text, options) {
|
|
60
|
+
const evidence = options?.evidenceText?.trim() ?? "";
|
|
61
|
+
if (!evidence)
|
|
62
|
+
return { text, replaced: 0 };
|
|
63
|
+
const responsePaths = extractAbsolutePaths(text);
|
|
64
|
+
if (responsePaths.length === 0)
|
|
65
|
+
return { text, replaced: 0 };
|
|
66
|
+
const evidencePaths = new Set(extractAbsolutePaths(evidence));
|
|
67
|
+
if (evidencePaths.size === 0)
|
|
68
|
+
return { text, replaced: 0 };
|
|
69
|
+
let out = text;
|
|
70
|
+
let replaced = 0;
|
|
71
|
+
for (const path of responsePaths) {
|
|
72
|
+
if (hasEvidencePathOverlap(path, evidencePaths))
|
|
73
|
+
continue;
|
|
74
|
+
const escaped = path.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
75
|
+
const re = new RegExp(escaped, "g");
|
|
76
|
+
if (re.test(out)) {
|
|
77
|
+
out = out.replace(re, "(not detected from evidence)");
|
|
78
|
+
replaced += 1;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Extra guard for macOS: '/home/*' is usually ungrounded unless explicitly present in evidence.
|
|
82
|
+
if ((options?.targetOs ?? "").toLowerCase() === "darwin" && !Array.from(evidencePaths).some((p) => p.startsWith("/home/"))) {
|
|
83
|
+
const homeRe = /\/home\/[A-Za-z0-9._-]+/g;
|
|
84
|
+
if (homeRe.test(out)) {
|
|
85
|
+
out = out.replace(homeRe, "(not detected from evidence)");
|
|
86
|
+
replaced += 1;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return { text: out, replaced };
|
|
90
|
+
}
|
|
91
|
+
export function enforceResponseSafetyWithMode(text, mode = "balanced", options) {
|
|
92
|
+
const trimmed = text.trim();
|
|
93
|
+
if (!trimmed)
|
|
94
|
+
return trimmed;
|
|
95
|
+
if (mode === "off")
|
|
96
|
+
return trimmed;
|
|
97
|
+
const grounded = replaceUngroundedPaths(trimmed, options);
|
|
98
|
+
if (!containsDangerousCommand(grounded.text)) {
|
|
99
|
+
if (grounded.replaced === 0)
|
|
100
|
+
return grounded.text;
|
|
101
|
+
return `${grounded.text}\n\nSafety note: some paths were replaced because they were not found in tool evidence.`;
|
|
102
|
+
}
|
|
103
|
+
const redacted = redactDangerousCommands(grounded.text);
|
|
104
|
+
if (mode === "balanced") {
|
|
105
|
+
const out = [
|
|
106
|
+
redacted,
|
|
107
|
+
"",
|
|
108
|
+
"Safety note: destructive command suggestions were redacted. Proceed only with explicit confirmation.",
|
|
109
|
+
].join("\n");
|
|
110
|
+
if (grounded.replaced === 0)
|
|
111
|
+
return out;
|
|
112
|
+
return `${out}\nSafety note: some paths were replaced because they were not found in tool evidence.`;
|
|
113
|
+
}
|
|
114
|
+
const cleaned = removeRedactedSuggestionLines(redacted);
|
|
115
|
+
const safetyNote = [
|
|
116
|
+
"Safety note: destructive command suggestions were redacted.",
|
|
117
|
+
"Prefer non-destructive validation first.",
|
|
118
|
+
"Proceed with destructive operations only after explicit confirmation.",
|
|
119
|
+
].join(" ");
|
|
120
|
+
const body = cleaned.length > 0 ? cleaned : "Potentially destructive suggestions were removed.";
|
|
121
|
+
const strictOut = `${body}\n\n${buildGenericSafeGuidance()}\n\n${safetyNote}`;
|
|
122
|
+
if (grounded.replaced === 0)
|
|
123
|
+
return strictOut;
|
|
124
|
+
return `${strictOut}\nSafety note: some paths were replaced because they were not found in tool evidence.`;
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=response-safety.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-safety.js","sourceRoot":"","sources":["../../src/chat/response-safety.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step-display.d.ts","sourceRoot":"","sources":["../../src/chat/step-display.ts"],"names":[],"mappings":"AAaA,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAwCnD"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
function supportsColor() {
|
|
2
|
+
return Boolean(process.stdout.isTTY) && !process.env.NO_COLOR;
|
|
3
|
+
}
|
|
4
|
+
function colorize(text, code) {
|
|
5
|
+
if (!supportsColor())
|
|
6
|
+
return text;
|
|
7
|
+
return `${code}${text}\x1b[0m`;
|
|
8
|
+
}
|
|
9
|
+
function trimStepPrefix(line) {
|
|
10
|
+
return line.replace(/^ {4}/, "");
|
|
11
|
+
}
|
|
12
|
+
export function renderStepLine(line) {
|
|
13
|
+
if (!line)
|
|
14
|
+
return "";
|
|
15
|
+
if (line.startsWith("=== Steps: ")) {
|
|
16
|
+
return colorize(`╭─ ${line.replace(/^===\s*/, "").replace(/\s*===$/, "")}`, "\x1b[1m\x1b[36m");
|
|
17
|
+
}
|
|
18
|
+
if (line.startsWith("=== Steps complete: ")) {
|
|
19
|
+
return colorize(`╰─ ${line.replace(/^===\s*/, "").replace(/\s*===$/, "")}`, "\x1b[1m\x1b[32m");
|
|
20
|
+
}
|
|
21
|
+
if (/^\[\d{2}\] ▶ /.test(line)) {
|
|
22
|
+
return colorize(`├─ ${line}`, "\x1b[33m");
|
|
23
|
+
}
|
|
24
|
+
if (/^\[\d{2}\] ✓ /.test(line)) {
|
|
25
|
+
return colorize(`├─ ${line}`, "\x1b[32m");
|
|
26
|
+
}
|
|
27
|
+
if (/^\[\d{2}\] ✖ /.test(line)) {
|
|
28
|
+
return colorize(`├─ ${line}`, "\x1b[31m");
|
|
29
|
+
}
|
|
30
|
+
if (line.startsWith(" reason: ")) {
|
|
31
|
+
return colorize(`│ ${trimStepPrefix(line)}`, "\x1b[2m");
|
|
32
|
+
}
|
|
33
|
+
if (line.startsWith(" error: ")) {
|
|
34
|
+
return colorize(`│ ${trimStepPrefix(line)}`, "\x1b[31m");
|
|
35
|
+
}
|
|
36
|
+
if (line.startsWith(" progress ")) {
|
|
37
|
+
return colorize(`│ ${trimStepPrefix(line)}`, "\x1b[34m");
|
|
38
|
+
}
|
|
39
|
+
if (line.startsWith(" skill: ")) {
|
|
40
|
+
return colorize(`│ ${trimStepPrefix(line)}`, "\x1b[35m");
|
|
41
|
+
}
|
|
42
|
+
if (line.startsWith(" memory: ")) {
|
|
43
|
+
return colorize(`│ ${trimStepPrefix(line)}`, "\x1b[2m");
|
|
44
|
+
}
|
|
45
|
+
if (line.startsWith(" context: ") || line.startsWith(" planning retry: ")) {
|
|
46
|
+
return colorize(`│ ${trimStepPrefix(line)}`, "\x1b[2m");
|
|
47
|
+
}
|
|
48
|
+
return line;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=step-display.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step-display.js","sourceRoot":"","sources":["../../src/chat/step-display.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-result.d.ts","sourceRoot":"","sources":["../../src/chat/tool-result.ts"],"names":[],"mappings":"AAEA,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAE/D;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAMlE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAO1D"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { asRecord } from "@easynet/agent-common/utils";
|
|
2
|
+
export function normalizeToolInvokeResult(raw) {
|
|
3
|
+
return raw;
|
|
4
|
+
}
|
|
5
|
+
export function toolResultOutputText(value) {
|
|
6
|
+
const root = asRecord(value);
|
|
7
|
+
const result = asRecord(root?.result);
|
|
8
|
+
if (typeof result?.output === "string")
|
|
9
|
+
return result.output;
|
|
10
|
+
if (typeof root?.output === "string")
|
|
11
|
+
return root.output;
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
export function stringifyToolResult(value) {
|
|
15
|
+
if (typeof value === "string")
|
|
16
|
+
return value;
|
|
17
|
+
try {
|
|
18
|
+
return JSON.stringify(value, null, 2);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return String(value);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=tool-result.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-result.js","sourceRoot":"","sources":["../../src/chat/tool-result.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAEvD,MAAM,UAAU,yBAAyB,CAAC,GAAY;IACpD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC7B,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACtC,IAAI,OAAO,MAAM,EAAE,MAAM,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC;IAC7D,IAAI,OAAO,IAAI,EAAE,MAAM,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,MAAM,CAAC;IACzD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
|
package/dist/config.d.ts
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
export
|
|
5
|
-
export
|
|
6
|
-
|
|
1
|
+
export type PromptTemplates = {
|
|
2
|
+
systemPrompt?: string;
|
|
3
|
+
};
|
|
4
|
+
export type ResponseSafetyMode = "off" | "balanced" | "strict";
|
|
5
|
+
export type AppConfig = {
|
|
6
|
+
printSteps?: boolean;
|
|
7
|
+
maxSteps?: number;
|
|
8
|
+
promptTemplates?: PromptTemplates;
|
|
9
|
+
responseSafetyMode?: ResponseSafetyMode;
|
|
10
|
+
};
|
|
11
|
+
export declare function loadAppConfig(configPath: string): Promise<AppConfig>;
|
|
7
12
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,eAAe,GAAG;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,UAAU,GAAG,QAAQ,CAAC;AAE/D,MAAM,MAAM,SAAS,GAAG;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;CACzC,CAAC;AAEF,wBAAsB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAqC1E"}
|
package/dist/config.js
CHANGED
|
@@ -1,15 +1,29 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { resolveKindResourceFile, asObject } from "@easynet/agent-common/config";
|
|
2
2
|
export async function loadAppConfig(configPath) {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
3
|
+
try {
|
|
4
|
+
const resource = await resolveKindResourceFile(configPath, {
|
|
5
|
+
baseDir: process.cwd(),
|
|
6
|
+
expectedApiVersion: "easynet.world/v1",
|
|
7
|
+
expectedKind: "AppConfig",
|
|
8
|
+
});
|
|
9
|
+
const spec = asObject(resource.spec);
|
|
10
|
+
const modeRaw = typeof spec?.responseSafetyMode === "string" ? spec.responseSafetyMode.trim().toLowerCase() : "";
|
|
11
|
+
const responseSafetyMode = modeRaw === "off" || modeRaw === "balanced" || modeRaw === "strict"
|
|
12
|
+
? modeRaw
|
|
13
|
+
: undefined;
|
|
14
|
+
const printSteps = typeof spec?.printSteps === "boolean" ? spec.printSteps : undefined;
|
|
15
|
+
const maxSteps = typeof spec?.maxSteps === "number" && Number.isFinite(spec.maxSteps)
|
|
16
|
+
? Math.max(1, Math.floor(spec.maxSteps))
|
|
17
|
+
: undefined;
|
|
18
|
+
return {
|
|
19
|
+
printSteps,
|
|
20
|
+
maxSteps,
|
|
21
|
+
promptTemplates: spec?.promptTemplates,
|
|
22
|
+
responseSafetyMode,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return {};
|
|
27
|
+
}
|
|
14
28
|
}
|
|
15
29
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAejF,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,UAAkB;IACpD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,uBAAuB,CAK3C,UAAU,EAAE;YACb,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE;YACtB,kBAAkB,EAAE,kBAAkB;YACtC,YAAY,EAAE,WAAW;SAC1B,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAKtB,CAAC;QACd,MAAM,OAAO,GAAG,OAAO,IAAI,EAAE,kBAAkB,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjH,MAAM,kBAAkB,GACtB,OAAO,KAAK,KAAK,IAAI,OAAO,KAAK,UAAU,IAAI,OAAO,KAAK,QAAQ;YACjE,CAAC,CAAE,OAA8B;YACjC,CAAC,CAAC,SAAS,CAAC;QAChB,MAAM,UAAU,GAAG,OAAO,IAAI,EAAE,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;QACvF,MAAM,QAAQ,GACZ,OAAO,IAAI,EAAE,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;YAClE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACxC,CAAC,CAAC,SAAS,CAAC;QAChB,OAAO;YACL,UAAU;YACV,QAAQ;YACR,eAAe,EAAE,IAAI,EAAE,eAAe;YACtC,kBAAkB;SACnB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
|