@tpsdev-ai/cli 0.1.0 → 0.3.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 +46 -60
- package/bin/tps.cjs +22 -0
- package/bin/tps.ts +435 -0
- package/nono-profiles/tps-backup.toml +18 -0
- package/nono-profiles/tps-bootstrap.toml +20 -0
- package/nono-profiles/tps-office-manager.toml +21 -0
- package/nono-profiles/tps-restore.toml +18 -0
- package/nono-profiles/tps-status.toml +19 -0
- package/package.json +19 -15
- package/LICENSE +0 -201
- package/dist/bin/tps.d.ts +0 -3
- package/dist/bin/tps.d.ts.map +0 -1
- package/dist/bin/tps.js +0 -267
- package/dist/bin/tps.js.map +0 -1
- package/dist/src/cli/hire.d.ts +0 -16
- package/dist/src/cli/hire.d.ts.map +0 -1
- package/dist/src/cli/hire.js +0 -176
- package/dist/src/cli/hire.js.map +0 -1
- package/dist/src/cli/office.d.ts +0 -7
- package/dist/src/cli/office.d.ts.map +0 -1
- package/dist/src/cli/office.js +0 -51
- package/dist/src/cli/office.js.map +0 -1
- package/dist/src/cli/review.d.ts +0 -9
- package/dist/src/cli/review.d.ts.map +0 -1
- package/dist/src/cli/review.js +0 -109
- package/dist/src/cli/review.js.map +0 -1
- package/dist/src/cli/roster.d.ts +0 -6
- package/dist/src/cli/roster.d.ts.map +0 -1
- package/dist/src/cli/roster.js +0 -60
- package/dist/src/cli/roster.js.map +0 -1
- package/dist/src/commands/branch.d.ts +0 -14
- package/dist/src/commands/branch.d.ts.map +0 -1
- package/dist/src/commands/branch.js +0 -395
- package/dist/src/commands/branch.js.map +0 -1
- package/dist/src/commands/context.d.ts +0 -9
- package/dist/src/commands/context.d.ts.map +0 -1
- package/dist/src/commands/context.js +0 -57
- package/dist/src/commands/context.js.map +0 -1
- package/dist/src/commands/identity.d.ts +0 -13
- package/dist/src/commands/identity.d.ts.map +0 -1
- package/dist/src/commands/identity.js +0 -231
- package/dist/src/commands/identity.js.map +0 -1
- package/dist/src/commands/mail.d.ts +0 -12
- package/dist/src/commands/mail.d.ts.map +0 -1
- package/dist/src/commands/mail.js +0 -225
- package/dist/src/commands/mail.js.map +0 -1
- package/dist/src/commands/office.d.ts +0 -19
- package/dist/src/commands/office.d.ts.map +0 -1
- package/dist/src/commands/office.js +0 -598
- package/dist/src/commands/office.js.map +0 -1
- package/dist/src/commands/roster.d.ts +0 -10
- package/dist/src/commands/roster.d.ts.map +0 -1
- package/dist/src/commands/roster.js +0 -143
- package/dist/src/commands/roster.js.map +0 -1
- package/dist/src/generators/claude-code.d.ts +0 -17
- package/dist/src/generators/claude-code.d.ts.map +0 -1
- package/dist/src/generators/claude-code.js +0 -80
- package/dist/src/generators/claude-code.js.map +0 -1
- package/dist/src/generators/codex.d.ts +0 -22
- package/dist/src/generators/codex.d.ts.map +0 -1
- package/dist/src/generators/codex.js +0 -78
- package/dist/src/generators/codex.js.map +0 -1
- package/dist/src/generators/ollama.d.ts +0 -18
- package/dist/src/generators/ollama.d.ts.map +0 -1
- package/dist/src/generators/ollama.js +0 -97
- package/dist/src/generators/ollama.js.map +0 -1
- package/dist/src/generators/openclaw.d.ts +0 -15
- package/dist/src/generators/openclaw.d.ts.map +0 -1
- package/dist/src/generators/openclaw.js +0 -103
- package/dist/src/generators/openclaw.js.map +0 -1
- package/dist/src/generators/registry.d.ts +0 -36
- package/dist/src/generators/registry.d.ts.map +0 -1
- package/dist/src/generators/registry.js +0 -99
- package/dist/src/generators/registry.js.map +0 -1
- package/dist/src/schema/manifest.d.ts +0 -140
- package/dist/src/schema/manifest.d.ts.map +0 -1
- package/dist/src/schema/manifest.js +0 -62
- package/dist/src/schema/manifest.js.map +0 -1
- package/dist/src/schema/report.d.ts +0 -166
- package/dist/src/schema/report.d.ts.map +0 -1
- package/dist/src/schema/report.js +0 -90
- package/dist/src/schema/report.js.map +0 -1
- package/dist/src/schema/sanitizer.d.ts +0 -30
- package/dist/src/schema/sanitizer.d.ts.map +0 -1
- package/dist/src/schema/sanitizer.js +0 -97
- package/dist/src/schema/sanitizer.js.map +0 -1
- package/dist/src/soundstage/mock-llm.d.ts +0 -3
- package/dist/src/soundstage/mock-llm.d.ts.map +0 -1
- package/dist/src/soundstage/mock-llm.js +0 -68
- package/dist/src/soundstage/mock-llm.js.map +0 -1
- package/dist/src/utils/agent-info.d.ts +0 -28
- package/dist/src/utils/agent-info.d.ts.map +0 -1
- package/dist/src/utils/agent-info.js +0 -102
- package/dist/src/utils/agent-info.js.map +0 -1
- package/dist/src/utils/archive.d.ts +0 -27
- package/dist/src/utils/archive.d.ts.map +0 -1
- package/dist/src/utils/archive.js +0 -80
- package/dist/src/utils/archive.js.map +0 -1
- package/dist/src/utils/config-inject.d.ts +0 -27
- package/dist/src/utils/config-inject.d.ts.map +0 -1
- package/dist/src/utils/config-inject.js +0 -83
- package/dist/src/utils/config-inject.js.map +0 -1
- package/dist/src/utils/config.d.ts +0 -30
- package/dist/src/utils/config.d.ts.map +0 -1
- package/dist/src/utils/config.js +0 -55
- package/dist/src/utils/config.js.map +0 -1
- package/dist/src/utils/connection-state.d.ts +0 -27
- package/dist/src/utils/connection-state.d.ts.map +0 -1
- package/dist/src/utils/connection-state.js +0 -81
- package/dist/src/utils/connection-state.js.map +0 -1
- package/dist/src/utils/context.d.ts +0 -14
- package/dist/src/utils/context.d.ts.map +0 -1
- package/dist/src/utils/context.js +0 -68
- package/dist/src/utils/context.js.map +0 -1
- package/dist/src/utils/github-webhook.d.ts +0 -3
- package/dist/src/utils/github-webhook.d.ts.map +0 -1
- package/dist/src/utils/github-webhook.js +0 -105
- package/dist/src/utils/github-webhook.js.map +0 -1
- package/dist/src/utils/identity.d.ts +0 -114
- package/dist/src/utils/identity.d.ts.map +0 -1
- package/dist/src/utils/identity.js +0 -341
- package/dist/src/utils/identity.js.map +0 -1
- package/dist/src/utils/internal-mail.d.ts +0 -18
- package/dist/src/utils/internal-mail.d.ts.map +0 -1
- package/dist/src/utils/internal-mail.js +0 -75
- package/dist/src/utils/internal-mail.js.map +0 -1
- package/dist/src/utils/loop-detector.d.ts +0 -27
- package/dist/src/utils/loop-detector.d.ts.map +0 -1
- package/dist/src/utils/loop-detector.js +0 -42
- package/dist/src/utils/loop-detector.js.map +0 -1
- package/dist/src/utils/mail-handler.d.ts +0 -19
- package/dist/src/utils/mail-handler.d.ts.map +0 -1
- package/dist/src/utils/mail-handler.js +0 -94
- package/dist/src/utils/mail-handler.js.map +0 -1
- package/dist/src/utils/mail.d.ts +0 -22
- package/dist/src/utils/mail.d.ts.map +0 -1
- package/dist/src/utils/mail.js +0 -111
- package/dist/src/utils/mail.js.map +0 -1
- package/dist/src/utils/manifest.d.ts +0 -36
- package/dist/src/utils/manifest.d.ts.map +0 -1
- package/dist/src/utils/manifest.js +0 -91
- package/dist/src/utils/manifest.js.map +0 -1
- package/dist/src/utils/noise-ik-transport.d.ts +0 -18
- package/dist/src/utils/noise-ik-transport.d.ts.map +0 -1
- package/dist/src/utils/noise-ik-transport.js +0 -357
- package/dist/src/utils/noise-ik-transport.js.map +0 -1
- package/dist/src/utils/nono.d.ts +0 -72
- package/dist/src/utils/nono.d.ts.map +0 -1
- package/dist/src/utils/nono.js +0 -166
- package/dist/src/utils/nono.js.map +0 -1
- package/dist/src/utils/outbox.d.ts +0 -10
- package/dist/src/utils/outbox.d.ts.map +0 -1
- package/dist/src/utils/outbox.js +0 -29
- package/dist/src/utils/outbox.js.map +0 -1
- package/dist/src/utils/output.d.ts +0 -17
- package/dist/src/utils/output.d.ts.map +0 -1
- package/dist/src/utils/output.js +0 -83
- package/dist/src/utils/output.js.map +0 -1
- package/dist/src/utils/plain-tcp-transport.d.ts +0 -10
- package/dist/src/utils/plain-tcp-transport.d.ts.map +0 -1
- package/dist/src/utils/plain-tcp-transport.js +0 -209
- package/dist/src/utils/plain-tcp-transport.js.map +0 -1
- package/dist/src/utils/provision.d.ts +0 -2
- package/dist/src/utils/provision.d.ts.map +0 -1
- package/dist/src/utils/provision.js +0 -186
- package/dist/src/utils/provision.js.map +0 -1
- package/dist/src/utils/relay.d.ts +0 -30
- package/dist/src/utils/relay.d.ts.map +0 -1
- package/dist/src/utils/relay.js +0 -539
- package/dist/src/utils/relay.js.map +0 -1
- package/dist/src/utils/sandbox.d.ts +0 -37
- package/dist/src/utils/sandbox.d.ts.map +0 -1
- package/dist/src/utils/sandbox.js +0 -126
- package/dist/src/utils/sandbox.js.map +0 -1
- package/dist/src/utils/transport.d.ts +0 -62
- package/dist/src/utils/transport.d.ts.map +0 -1
- package/dist/src/utils/transport.js +0 -75
- package/dist/src/utils/transport.js.map +0 -1
- package/dist/src/utils/wall.d.ts +0 -5
- package/dist/src/utils/wall.d.ts.map +0 -1
- package/dist/src/utils/wall.js +0 -51
- package/dist/src/utils/wall.js.map +0 -1
- package/dist/src/utils/wire-delivery.d.ts +0 -10
- package/dist/src/utils/wire-delivery.d.ts.map +0 -1
- package/dist/src/utils/wire-delivery.js +0 -57
- package/dist/src/utils/wire-delivery.js.map +0 -1
- package/dist/src/utils/wire-frame.d.ts +0 -10
- package/dist/src/utils/wire-frame.d.ts.map +0 -1
- package/dist/src/utils/wire-frame.js +0 -66
- package/dist/src/utils/wire-frame.js.map +0 -1
- package/dist/src/utils/wire-mail.d.ts +0 -54
- package/dist/src/utils/wire-mail.d.ts.map +0 -1
- package/dist/src/utils/wire-mail.js +0 -24
- package/dist/src/utils/wire-mail.js.map +0 -1
- package/dist/src/utils/ws-noise-transport.d.ts +0 -18
- package/dist/src/utils/ws-noise-transport.d.ts.map +0 -1
- package/dist/src/utils/ws-noise-transport.js +0 -356
- package/dist/src/utils/ws-noise-transport.js.map +0 -1
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Sanitize an identifier string.
|
|
3
|
-
* Allows only alphanumeric characters, underscores, and hyphens.
|
|
4
|
-
* Replaces invalid characters with hyphens.
|
|
5
|
-
* Truncates to max length (default 64).
|
|
6
|
-
*/
|
|
7
|
-
export function sanitizeIdentifier(value, maxLength = 64) {
|
|
8
|
-
if (!value)
|
|
9
|
-
return "unknown";
|
|
10
|
-
// Replace anything not allowed with '-'
|
|
11
|
-
let sanitized = value.replace(/[^a-zA-Z0-9_-]/g, "-");
|
|
12
|
-
// Collapse multiple hyphens
|
|
13
|
-
sanitized = sanitized.replace(/-+/g, "-");
|
|
14
|
-
// Trim leading/trailing hyphens
|
|
15
|
-
sanitized = sanitized.replace(/^-+|-+$/g, "");
|
|
16
|
-
// Default if empty after trim
|
|
17
|
-
if (!sanitized)
|
|
18
|
-
return "unknown";
|
|
19
|
-
// Truncate
|
|
20
|
-
return sanitized.slice(0, maxLength);
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Sanitize a model identifier string (e.g. provider/model:tag).
|
|
24
|
-
* Allows alphanumeric, underscores, hyphens, slashes, dots, and colons.
|
|
25
|
-
*/
|
|
26
|
-
export function sanitizeModelIdentifier(value, maxLength = 128) {
|
|
27
|
-
if (!value)
|
|
28
|
-
return "unknown-model";
|
|
29
|
-
// Allow a-z, 0-9, _, -, /, ., :
|
|
30
|
-
const sanitized = value.replace(/[^a-zA-Z0-9_\-/.:]/g, "");
|
|
31
|
-
// Truncate
|
|
32
|
-
return sanitized.slice(0, maxLength);
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Sanitize free text to prevent shell injection.
|
|
36
|
-
* Escapes characters that have special meaning in shell contexts.
|
|
37
|
-
* Note: This is aggressive and might impact readability in some contexts,
|
|
38
|
-
* but safety is priority.
|
|
39
|
-
*/
|
|
40
|
-
export function sanitizeFreeText(value) {
|
|
41
|
-
if (!value)
|
|
42
|
-
return "";
|
|
43
|
-
// Shell metacharacters to escape: $ ` " \
|
|
44
|
-
// We'll replace them with their escaped versions or safe alternatives.
|
|
45
|
-
// For Markdown/HTML contexts, Handlebars handles escaping.
|
|
46
|
-
// This is specifically for preventing command injection if text is passed to shell.
|
|
47
|
-
return value
|
|
48
|
-
.replace(/\\/g, "\\\\") // Escape backslashes first
|
|
49
|
-
.replace(/\$/g, "\\$") // Escape dollar signs
|
|
50
|
-
.replace(/`/g, "\\`") // Escape backticks
|
|
51
|
-
.replace(/"/g, '\\"') // Escape double quotes
|
|
52
|
-
.replace(/;/g, "\\;") // Escape semicolons
|
|
53
|
-
.replace(/\|/g, "\\|") // Escape pipes
|
|
54
|
-
.replace(/&/g, "\\&") // Escape ampersands
|
|
55
|
-
.replace(/\(/g, "\\(") // Escape parentheses
|
|
56
|
-
.replace(/\)/g, "\\)"); // Escape parentheses
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Sanitize an array of strings using the identifier rules.
|
|
60
|
-
*/
|
|
61
|
-
export function sanitizeStringArray(arr) {
|
|
62
|
-
if (!arr)
|
|
63
|
-
return [];
|
|
64
|
-
return arr.map((item) => sanitizeIdentifier(item));
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Main sanitizer function for TPS Reports.
|
|
68
|
-
* Returns a new, sanitized report object.
|
|
69
|
-
*/
|
|
70
|
-
export function sanitizeTPSReport(report) {
|
|
71
|
-
// Deep clone to avoid mutating original
|
|
72
|
-
const sanitized = JSON.parse(JSON.stringify(report));
|
|
73
|
-
// Sanitize Top-level fields
|
|
74
|
-
sanitized.name = sanitizeIdentifier(sanitized.name);
|
|
75
|
-
sanitized.description = sanitizeFreeText(sanitized.description);
|
|
76
|
-
// Sanitize Identity fields
|
|
77
|
-
sanitized.identity.default_name = sanitizeIdentifier(sanitized.identity.default_name);
|
|
78
|
-
sanitized.identity.personality = sanitizeFreeText(sanitized.identity.personality);
|
|
79
|
-
sanitized.identity.communication_style = sanitizeFreeText(sanitized.identity.communication_style);
|
|
80
|
-
sanitized.identity.emoji = sanitizeFreeText(sanitized.identity.emoji); // Emojis are text? Usually safe but let's be careful.
|
|
81
|
-
// Sanitize Arrays (Identifiers)
|
|
82
|
-
sanitized.flair = sanitizeStringArray(sanitized.flair);
|
|
83
|
-
sanitized.tools.required = sanitizeStringArray(sanitized.tools.required);
|
|
84
|
-
sanitized.tools.optional = sanitizeStringArray(sanitized.tools.optional);
|
|
85
|
-
sanitized.communication.channels = sanitizeStringArray(sanitized.communication.channels);
|
|
86
|
-
sanitized.communication.handoff_targets = sanitizeStringArray(sanitized.communication.handoff_targets);
|
|
87
|
-
sanitized.memory.shared_read = sanitizeStringArray(sanitized.memory.shared_read);
|
|
88
|
-
sanitized.memory.shared_write = sanitizeStringArray(sanitized.memory.shared_write);
|
|
89
|
-
// Sanitize Model (Identifier)
|
|
90
|
-
sanitized.model.default = sanitizeIdentifier(sanitized.model.default);
|
|
91
|
-
// Sanitize OpenClaw fields
|
|
92
|
-
sanitized.openclaw.model = sanitizeModelIdentifier(sanitized.openclaw.model);
|
|
93
|
-
sanitized.openclaw.thinking = sanitizeIdentifier(sanitized.openclaw.thinking);
|
|
94
|
-
sanitized.openclaw.channel = sanitizeIdentifier(sanitized.openclaw.channel);
|
|
95
|
-
return sanitized;
|
|
96
|
-
}
|
|
97
|
-
//# sourceMappingURL=sanitizer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sanitizer.js","sourceRoot":"","sources":["../../../src/schema/sanitizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mock-llm.d.ts","sourceRoot":"","sources":["../../../src/soundstage/mock-llm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAwBzC,wBAAgB,YAAY,CAAC,IAAI,SAAQ,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CA4C/F"}
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import { createServer } from "node:http";
|
|
2
|
-
import { readFileSync, existsSync } from "node:fs";
|
|
3
|
-
const DEFAULT_RESPONSES = [
|
|
4
|
-
"I'll check my mail now.",
|
|
5
|
-
"Task received. Working on it.",
|
|
6
|
-
"Work complete. Sending results.",
|
|
7
|
-
"HEARTBEAT_OK",
|
|
8
|
-
];
|
|
9
|
-
function loadScript(scriptPath) {
|
|
10
|
-
if (scriptPath && existsSync(scriptPath)) {
|
|
11
|
-
try {
|
|
12
|
-
const raw = JSON.parse(readFileSync(scriptPath, "utf-8"));
|
|
13
|
-
if (Array.isArray(raw))
|
|
14
|
-
return raw.map((r) => r.content || String(r));
|
|
15
|
-
}
|
|
16
|
-
catch { }
|
|
17
|
-
}
|
|
18
|
-
return DEFAULT_RESPONSES;
|
|
19
|
-
}
|
|
20
|
-
export function startMockLLM(port = 11434, scriptPath) {
|
|
21
|
-
const responses = loadScript(scriptPath);
|
|
22
|
-
let index = 0;
|
|
23
|
-
const server = createServer((req, res) => {
|
|
24
|
-
if (req.method === "POST" && req.url?.includes("/v1/chat/completions")) {
|
|
25
|
-
// Consume request body but don't use it (no echo — security invariant)
|
|
26
|
-
const chunks = [];
|
|
27
|
-
req.on("data", (chunk) => chunks.push(chunk));
|
|
28
|
-
req.on("end", () => {
|
|
29
|
-
const response = responses[index % responses.length];
|
|
30
|
-
index++;
|
|
31
|
-
const body = JSON.stringify({
|
|
32
|
-
id: `mock-${Date.now()}`,
|
|
33
|
-
object: "chat.completion",
|
|
34
|
-
created: Math.floor(Date.now() / 1000),
|
|
35
|
-
model: "mock-soundstage",
|
|
36
|
-
choices: [{
|
|
37
|
-
index: 0,
|
|
38
|
-
message: { role: "assistant", content: response },
|
|
39
|
-
finish_reason: "stop",
|
|
40
|
-
}],
|
|
41
|
-
usage: { prompt_tokens: 10, completion_tokens: 20, total_tokens: 30 },
|
|
42
|
-
});
|
|
43
|
-
res.writeHead(200, { "Content-Type": "application/json" });
|
|
44
|
-
res.end(body);
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
else if (req.method === "GET" && req.url === "/health") {
|
|
48
|
-
res.writeHead(200);
|
|
49
|
-
res.end("ok");
|
|
50
|
-
}
|
|
51
|
-
else {
|
|
52
|
-
res.writeHead(404);
|
|
53
|
-
res.end("Not found");
|
|
54
|
-
}
|
|
55
|
-
});
|
|
56
|
-
// SECURITY: bind to loopback only, never 0.0.0.0
|
|
57
|
-
server.listen(port, "127.0.0.1", () => {
|
|
58
|
-
console.log(`Mock LLM listening on http://127.0.0.1:${port}/v1`);
|
|
59
|
-
});
|
|
60
|
-
return server;
|
|
61
|
-
}
|
|
62
|
-
// CLI mode: run standalone
|
|
63
|
-
if (import.meta.url === `file://${process.argv[1]}` || process.argv[1]?.endsWith("mock-llm.ts")) {
|
|
64
|
-
const port = Number(process.env.MOCK_LLM_PORT || 11434);
|
|
65
|
-
const script = process.env.MOCK_LLM_SCRIPT;
|
|
66
|
-
startMockLLM(port, script);
|
|
67
|
-
}
|
|
68
|
-
//# sourceMappingURL=mock-llm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mock-llm.js","sourceRoot":"","sources":["../../../src/soundstage/mock-llm.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
export interface AgentProfile {
|
|
2
|
-
role?: string;
|
|
3
|
-
creature?: string;
|
|
4
|
-
emoji?: string;
|
|
5
|
-
vibe?: string;
|
|
6
|
-
}
|
|
7
|
-
export interface MailStats {
|
|
8
|
-
unread: number;
|
|
9
|
-
read: number;
|
|
10
|
-
total: number;
|
|
11
|
-
}
|
|
12
|
-
export interface MemoryInfo {
|
|
13
|
-
fileCount: number;
|
|
14
|
-
latestFile?: string;
|
|
15
|
-
latestDate?: string;
|
|
16
|
-
}
|
|
17
|
-
export interface AgentInfo {
|
|
18
|
-
profile: AgentProfile;
|
|
19
|
-
mail: MailStats;
|
|
20
|
-
memory: MemoryInfo;
|
|
21
|
-
workspaceFileCount: number;
|
|
22
|
-
workspaceSize: number;
|
|
23
|
-
}
|
|
24
|
-
export declare function readProfile(workspacePath: string): AgentProfile;
|
|
25
|
-
export declare function getMailStats(agentId: string): MailStats;
|
|
26
|
-
export declare function getMemoryInfo(workspacePath: string): MemoryInfo;
|
|
27
|
-
export declare function getAgentInfo(agentId: string, workspacePath?: string): AgentInfo;
|
|
28
|
-
//# sourceMappingURL=agent-info.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent-info.d.ts","sourceRoot":"","sources":["../../../src/utils/agent-info.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,YAAY,CAAC;IACtB,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,UAAU,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;CACvB;AAaD,wBAAgB,WAAW,CAAC,aAAa,EAAE,MAAM,GAAG,YAAY,CAsB/D;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAgBvD;AAED,wBAAgB,aAAa,CAAC,aAAa,EAAE,MAAM,GAAG,UAAU,CAkB/D;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAuB/E"}
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agent info enrichment — reads workspace files and mail stats
|
|
3
|
-
* to provide richer context for roster show and review commands.
|
|
4
|
-
*/
|
|
5
|
-
import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
|
|
6
|
-
import { join } from "node:path";
|
|
7
|
-
import { getInbox } from "./mail.js";
|
|
8
|
-
import { sanitizeIdentifier } from "../schema/sanitizer.js";
|
|
9
|
-
/**
|
|
10
|
-
* Parse key-value frontmatter from IDENTITY.md or SOUL.md.
|
|
11
|
-
* Looks for lines like "**Name:** Flint" or "- **Role:** Strategy"
|
|
12
|
-
*/
|
|
13
|
-
function extractField(content, field) {
|
|
14
|
-
// Match "**Field:** value" pattern
|
|
15
|
-
const re = new RegExp(`\\*\\*${field}:\\*\\*\\s*(.+)`, "i");
|
|
16
|
-
const match = content.match(re);
|
|
17
|
-
return match?.[1]?.trim();
|
|
18
|
-
}
|
|
19
|
-
export function readProfile(workspacePath) {
|
|
20
|
-
const profile = {};
|
|
21
|
-
const identityPath = join(workspacePath, "IDENTITY.md");
|
|
22
|
-
if (existsSync(identityPath)) {
|
|
23
|
-
try {
|
|
24
|
-
const content = readFileSync(identityPath, "utf-8");
|
|
25
|
-
profile.creature = extractField(content, "Creature");
|
|
26
|
-
profile.emoji = extractField(content, "Emoji");
|
|
27
|
-
profile.vibe = extractField(content, "Vibe");
|
|
28
|
-
}
|
|
29
|
-
catch { /* ignore */ }
|
|
30
|
-
}
|
|
31
|
-
const soulPath = join(workspacePath, "SOUL.md");
|
|
32
|
-
if (existsSync(soulPath)) {
|
|
33
|
-
try {
|
|
34
|
-
const content = readFileSync(soulPath, "utf-8");
|
|
35
|
-
profile.role = extractField(content, "Role");
|
|
36
|
-
}
|
|
37
|
-
catch { /* ignore */ }
|
|
38
|
-
}
|
|
39
|
-
return profile;
|
|
40
|
-
}
|
|
41
|
-
export function getMailStats(agentId) {
|
|
42
|
-
const safe = sanitizeIdentifier(agentId);
|
|
43
|
-
if (safe !== agentId)
|
|
44
|
-
return { unread: 0, read: 0, total: 0 };
|
|
45
|
-
try {
|
|
46
|
-
const inbox = getInbox(agentId);
|
|
47
|
-
const unread = existsSync(inbox.fresh)
|
|
48
|
-
? readdirSync(inbox.fresh).filter((f) => f.endsWith(".json")).length
|
|
49
|
-
: 0;
|
|
50
|
-
const read = existsSync(inbox.cur)
|
|
51
|
-
? readdirSync(inbox.cur).filter((f) => f.endsWith(".json")).length
|
|
52
|
-
: 0;
|
|
53
|
-
return { unread, read, total: unread + read };
|
|
54
|
-
}
|
|
55
|
-
catch {
|
|
56
|
-
return { unread: 0, read: 0, total: 0 };
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
export function getMemoryInfo(workspacePath) {
|
|
60
|
-
const memoryDir = join(workspacePath, "memory");
|
|
61
|
-
if (!existsSync(memoryDir))
|
|
62
|
-
return { fileCount: 0 };
|
|
63
|
-
try {
|
|
64
|
-
const files = readdirSync(memoryDir)
|
|
65
|
-
.filter((f) => /^\d{4}-\d{2}-\d{2}\.md$/.test(f))
|
|
66
|
-
.sort()
|
|
67
|
-
.reverse();
|
|
68
|
-
return {
|
|
69
|
-
fileCount: files.length,
|
|
70
|
-
latestFile: files[0],
|
|
71
|
-
latestDate: files[0]?.replace(".md", ""),
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
catch {
|
|
75
|
-
return { fileCount: 0 };
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
export function getAgentInfo(agentId, workspacePath) {
|
|
79
|
-
const profile = workspacePath ? readProfile(workspacePath) : {};
|
|
80
|
-
const mail = getMailStats(agentId);
|
|
81
|
-
const memory = workspacePath ? getMemoryInfo(workspacePath) : { fileCount: 0 };
|
|
82
|
-
let workspaceFileCount = 0;
|
|
83
|
-
let workspaceSize = 0;
|
|
84
|
-
if (workspacePath && existsSync(workspacePath)) {
|
|
85
|
-
try {
|
|
86
|
-
const entries = readdirSync(workspacePath);
|
|
87
|
-
for (const e of entries) {
|
|
88
|
-
try {
|
|
89
|
-
const s = statSync(join(workspacePath, e));
|
|
90
|
-
if (s.isFile()) {
|
|
91
|
-
workspaceFileCount++;
|
|
92
|
-
workspaceSize += s.size;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
catch { /* ignore */ }
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
catch { /* ignore */ }
|
|
99
|
-
}
|
|
100
|
-
return { profile, mail, memory, workspaceFileCount, workspaceSize };
|
|
101
|
-
}
|
|
102
|
-
//# sourceMappingURL=agent-info.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent-info.js","sourceRoot":"","sources":["../../../src/utils/agent-info.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
export interface ArchiveEvent {
|
|
2
|
-
event: "sent" | "read" | "listed";
|
|
3
|
-
timestamp: string;
|
|
4
|
-
from: string;
|
|
5
|
-
to: string;
|
|
6
|
-
messageId: string;
|
|
7
|
-
bodyPreview?: string;
|
|
8
|
-
}
|
|
9
|
-
export interface ArchiveQuery {
|
|
10
|
-
agent?: string;
|
|
11
|
-
since?: string;
|
|
12
|
-
until?: string;
|
|
13
|
-
event?: "sent" | "read" | "listed";
|
|
14
|
-
limit?: number;
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Append an event to the archive. Fire-and-forget — archive failures
|
|
18
|
-
* never block mail operations.
|
|
19
|
-
*/
|
|
20
|
-
export declare function logEvent(event: Omit<ArchiveEvent, "timestamp">, body?: string): void;
|
|
21
|
-
/**
|
|
22
|
-
* Query the archive with optional filters.
|
|
23
|
-
* Reads the full file and filters in memory — fine for reasonable volumes.
|
|
24
|
-
* For massive archives, we'd add rotation or indexing later.
|
|
25
|
-
*/
|
|
26
|
-
export declare function queryArchive(query?: ArchiveQuery): ArchiveEvent[];
|
|
27
|
-
//# sourceMappingURL=archive.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../../src/utils/archive.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAaD;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAcpF;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,GAAE,YAAiB,GAAG,YAAY,EAAE,CAuCrE"}
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Communication archive — append-only JSONL log of all mail events.
|
|
3
|
-
*
|
|
4
|
-
* Every send, read, and list operation appends one line to archive.jsonl.
|
|
5
|
-
* This creates a searchable, complete audit trail of agent communication.
|
|
6
|
-
*/
|
|
7
|
-
import { appendFileSync, readFileSync, existsSync, mkdirSync } from "node:fs";
|
|
8
|
-
import { join } from "node:path";
|
|
9
|
-
import { homedir } from "node:os";
|
|
10
|
-
function getArchivePath() {
|
|
11
|
-
const dir = process.env.TPS_MAIL_DIR || join(process.env.HOME || homedir(), ".tps", "mail");
|
|
12
|
-
mkdirSync(dir, { recursive: true });
|
|
13
|
-
return join(dir, "archive.jsonl");
|
|
14
|
-
}
|
|
15
|
-
function makePreview(body, maxLen = 100) {
|
|
16
|
-
const firstLine = body.split("\n")[0] || "";
|
|
17
|
-
return firstLine.length > maxLen ? firstLine.slice(0, maxLen) + "…" : firstLine;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Append an event to the archive. Fire-and-forget — archive failures
|
|
21
|
-
* never block mail operations.
|
|
22
|
-
*/
|
|
23
|
-
export function logEvent(event, body) {
|
|
24
|
-
try {
|
|
25
|
-
const entry = {
|
|
26
|
-
...event,
|
|
27
|
-
timestamp: new Date().toISOString(),
|
|
28
|
-
};
|
|
29
|
-
if (body) {
|
|
30
|
-
entry.bodyPreview = makePreview(body);
|
|
31
|
-
}
|
|
32
|
-
const line = JSON.stringify(entry) + "\n";
|
|
33
|
-
appendFileSync(getArchivePath(), line, "utf-8");
|
|
34
|
-
}
|
|
35
|
-
catch {
|
|
36
|
-
// Archive is best-effort. Never break mail for logging.
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Query the archive with optional filters.
|
|
41
|
-
* Reads the full file and filters in memory — fine for reasonable volumes.
|
|
42
|
-
* For massive archives, we'd add rotation or indexing later.
|
|
43
|
-
*/
|
|
44
|
-
export function queryArchive(query = {}) {
|
|
45
|
-
const archivePath = getArchivePath();
|
|
46
|
-
if (!existsSync(archivePath))
|
|
47
|
-
return [];
|
|
48
|
-
const raw = readFileSync(archivePath, "utf-8");
|
|
49
|
-
const lines = raw.trim().split("\n").filter(Boolean);
|
|
50
|
-
let events = [];
|
|
51
|
-
for (const line of lines) {
|
|
52
|
-
try {
|
|
53
|
-
events.push(JSON.parse(line));
|
|
54
|
-
}
|
|
55
|
-
catch {
|
|
56
|
-
// Skip malformed lines
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
// Apply filters
|
|
60
|
-
if (query.agent) {
|
|
61
|
-
const a = query.agent;
|
|
62
|
-
events = events.filter((e) => e.from === a || e.to === a);
|
|
63
|
-
}
|
|
64
|
-
if (query.event) {
|
|
65
|
-
events = events.filter((e) => e.event === query.event);
|
|
66
|
-
}
|
|
67
|
-
if (query.since) {
|
|
68
|
-
events = events.filter((e) => e.timestamp >= query.since);
|
|
69
|
-
}
|
|
70
|
-
if (query.until) {
|
|
71
|
-
events = events.filter((e) => e.timestamp <= query.until);
|
|
72
|
-
}
|
|
73
|
-
// Sort newest first
|
|
74
|
-
events.sort((a, b) => (a.timestamp < b.timestamp ? 1 : -1));
|
|
75
|
-
if (query.limit && query.limit > 0) {
|
|
76
|
-
events = events.slice(0, query.limit);
|
|
77
|
-
}
|
|
78
|
-
return events;
|
|
79
|
-
}
|
|
80
|
-
//# sourceMappingURL=archive.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"archive.js","sourceRoot":"","sources":["../../../src/utils/archive.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
export interface InjectAgentEntry {
|
|
2
|
-
id: string;
|
|
3
|
-
name?: string;
|
|
4
|
-
workspace?: string;
|
|
5
|
-
agentDir?: string;
|
|
6
|
-
model?: unknown;
|
|
7
|
-
heartbeat?: unknown;
|
|
8
|
-
[key: string]: unknown;
|
|
9
|
-
}
|
|
10
|
-
export interface InjectResult {
|
|
11
|
-
success: boolean;
|
|
12
|
-
backupPath: string;
|
|
13
|
-
agentId: string;
|
|
14
|
-
error?: string;
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Inject an agent entry into openclaw.json's agents.list array.
|
|
18
|
-
*
|
|
19
|
-
* Safety guarantees:
|
|
20
|
-
* 1. Reads original file and computes hash
|
|
21
|
-
* 2. Writes backup to <path>.bak
|
|
22
|
-
* 3. Reads backup back and verifies hash matches original
|
|
23
|
-
* 4. Only then modifies and writes the config
|
|
24
|
-
* 5. If agent ID already exists, aborts (no duplicates)
|
|
25
|
-
*/
|
|
26
|
-
export declare function injectAgent(configPath: string, agent: InjectAgentEntry): InjectResult;
|
|
27
|
-
//# sourceMappingURL=config-inject.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config-inject.d.ts","sourceRoot":"","sources":["../../../src/utils/config-inject.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,GAAG,YAAY,CAuErF"}
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Safe config injection for openclaw.json.
|
|
3
|
-
*
|
|
4
|
-
* Pattern: read → backup → verify backup → modify → write
|
|
5
|
-
* If backup verification fails, abort. No exceptions.
|
|
6
|
-
*/
|
|
7
|
-
import { readFileSync, writeFileSync, copyFileSync, existsSync } from "node:fs";
|
|
8
|
-
import { createHash } from "node:crypto";
|
|
9
|
-
function sha256(content) {
|
|
10
|
-
return createHash("sha256").update(content).digest("hex");
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Inject an agent entry into openclaw.json's agents.list array.
|
|
14
|
-
*
|
|
15
|
-
* Safety guarantees:
|
|
16
|
-
* 1. Reads original file and computes hash
|
|
17
|
-
* 2. Writes backup to <path>.bak
|
|
18
|
-
* 3. Reads backup back and verifies hash matches original
|
|
19
|
-
* 4. Only then modifies and writes the config
|
|
20
|
-
* 5. If agent ID already exists, aborts (no duplicates)
|
|
21
|
-
*/
|
|
22
|
-
export function injectAgent(configPath, agent) {
|
|
23
|
-
const backupPath = configPath + ".bak";
|
|
24
|
-
// Step 1: Read original
|
|
25
|
-
if (!existsSync(configPath)) {
|
|
26
|
-
return { success: false, backupPath, agentId: agent.id, error: `Config not found: ${configPath}` };
|
|
27
|
-
}
|
|
28
|
-
const original = readFileSync(configPath, "utf-8");
|
|
29
|
-
const originalHash = sha256(original);
|
|
30
|
-
// Step 2: Parse and validate structure
|
|
31
|
-
let config;
|
|
32
|
-
try {
|
|
33
|
-
config = JSON.parse(original);
|
|
34
|
-
}
|
|
35
|
-
catch {
|
|
36
|
-
return { success: false, backupPath, agentId: agent.id, error: "Config is not valid JSON" };
|
|
37
|
-
}
|
|
38
|
-
if (!config.agents || typeof config.agents !== "object") {
|
|
39
|
-
return { success: false, backupPath, agentId: agent.id, error: "Config missing agents section" };
|
|
40
|
-
}
|
|
41
|
-
const agents = config.agents;
|
|
42
|
-
if (!Array.isArray(agents.list)) {
|
|
43
|
-
agents.list = [];
|
|
44
|
-
}
|
|
45
|
-
const list = agents.list;
|
|
46
|
-
// Step 3: Check for duplicates
|
|
47
|
-
if (list.some((a) => a.id === agent.id)) {
|
|
48
|
-
return { success: false, backupPath, agentId: agent.id, error: `Agent "${agent.id}" already exists in config` };
|
|
49
|
-
}
|
|
50
|
-
// Step 4: Write backup
|
|
51
|
-
copyFileSync(configPath, backupPath);
|
|
52
|
-
// Step 5: Verify backup matches original (the critical step)
|
|
53
|
-
const backupContent = readFileSync(backupPath, "utf-8");
|
|
54
|
-
const backupHash = sha256(backupContent);
|
|
55
|
-
if (backupHash !== originalHash) {
|
|
56
|
-
return {
|
|
57
|
-
success: false,
|
|
58
|
-
backupPath,
|
|
59
|
-
agentId: agent.id,
|
|
60
|
-
error: `Backup verification failed! Original hash ${originalHash} !== backup hash ${backupHash}. Aborting — config NOT modified.`,
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
// Step 6: Inject and write
|
|
64
|
-
list.push(agent);
|
|
65
|
-
const updated = JSON.stringify(config, null, 2) + "\n";
|
|
66
|
-
writeFileSync(configPath, updated, "utf-8");
|
|
67
|
-
// Step 7: Verify write is valid JSON
|
|
68
|
-
try {
|
|
69
|
-
JSON.parse(readFileSync(configPath, "utf-8"));
|
|
70
|
-
}
|
|
71
|
-
catch {
|
|
72
|
-
// Restore from backup immediately
|
|
73
|
-
copyFileSync(backupPath, configPath);
|
|
74
|
-
return {
|
|
75
|
-
success: false,
|
|
76
|
-
backupPath,
|
|
77
|
-
agentId: agent.id,
|
|
78
|
-
error: "Written config was invalid JSON — restored from backup.",
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
return { success: true, backupPath, agentId: agent.id };
|
|
82
|
-
}
|
|
83
|
-
//# sourceMappingURL=config-inject.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config-inject.js","sourceRoot":"","sources":["../../../src/utils/config-inject.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
export interface OpenClawAgent {
|
|
2
|
-
id: string;
|
|
3
|
-
name?: string;
|
|
4
|
-
model?: string | Record<string, unknown>;
|
|
5
|
-
thinking?: string;
|
|
6
|
-
workspace?: string;
|
|
7
|
-
agentDir?: string;
|
|
8
|
-
channel?: string;
|
|
9
|
-
[key: string]: unknown;
|
|
10
|
-
}
|
|
11
|
-
export interface OpenClawConfig {
|
|
12
|
-
agents?: {
|
|
13
|
-
defaults?: Record<string, unknown>;
|
|
14
|
-
list?: OpenClawAgent[];
|
|
15
|
-
};
|
|
16
|
-
[key: string]: unknown;
|
|
17
|
-
}
|
|
18
|
-
export declare function getAgentList(config: OpenClawConfig): OpenClawAgent[];
|
|
19
|
-
export declare function getDefaults(config: OpenClawConfig): Record<string, unknown>;
|
|
20
|
-
/**
|
|
21
|
-
* Resolve an agent's workspace, falling back to agents.defaults.workspace.
|
|
22
|
-
*/
|
|
23
|
-
export declare function resolveWorkspace(agent: OpenClawAgent, config: OpenClawConfig): string | undefined;
|
|
24
|
-
export declare function findOpenClawConfig(startDir?: string): string | null;
|
|
25
|
-
export declare function readOpenClawConfig(configPath: string): OpenClawConfig;
|
|
26
|
-
/**
|
|
27
|
-
* Resolve config path: use explicit path if given, otherwise auto-discover.
|
|
28
|
-
*/
|
|
29
|
-
export declare function resolveConfigPath(explicit?: string): string | null;
|
|
30
|
-
//# sourceMappingURL=config.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/utils/config.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE;QACP,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACnC,IAAI,CAAC,EAAE,aAAa,EAAE,CAAC;KACxB,CAAC;IACF,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,aAAa,EAAE,CAEpE;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAE3E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS,CAIjG;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAoBnE;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,CAGrE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQlE"}
|