@tpsdev-ai/cli 0.2.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 +65 -0
- package/bin/tps.cjs +22 -0
- package/bin/tps.ts +435 -0
- package/package.json +29 -5
- package/dist/bin/tps.d.ts +0 -3
- package/dist/bin/tps.d.ts.map +0 -1
- package/dist/bin/tps.js +0 -414
- 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/backup.d.ts +0 -19
- package/dist/src/commands/backup.d.ts.map +0 -1
- package/dist/src/commands/backup.js +0 -595
- package/dist/src/commands/backup.js.map +0 -1
- package/dist/src/commands/bootstrap.d.ts +0 -7
- package/dist/src/commands/bootstrap.d.ts.map +0 -1
- package/dist/src/commands/bootstrap.js +0 -255
- package/dist/src/commands/bootstrap.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/git.d.ts +0 -8
- package/dist/src/commands/git.d.ts.map +0 -1
- package/dist/src/commands/git.js +0 -53
- package/dist/src/commands/git.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 -251
- package/dist/src/commands/mail.js.map +0 -1
- package/dist/src/commands/office-manager.d.ts +0 -147
- package/dist/src/commands/office-manager.d.ts.map +0 -1
- package/dist/src/commands/office-manager.js +0 -171
- package/dist/src/commands/office-manager.js.map +0 -1
- package/dist/src/commands/office.d.ts +0 -12
- package/dist/src/commands/office.d.ts.map +0 -1
- package/dist/src/commands/office.js +0 -480
- 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/commands/secrets.d.ts +0 -9
- package/dist/src/commands/secrets.d.ts.map +0 -1
- package/dist/src/commands/secrets.js +0 -54
- package/dist/src/commands/secrets.js.map +0 -1
- package/dist/src/commands/status.d.ts +0 -33
- package/dist/src/commands/status.d.ts.map +0 -1
- package/dist/src/commands/status.js +0 -407
- package/dist/src/commands/status.js.map +0 -1
- package/dist/src/generators/brief.d.ts +0 -6
- package/dist/src/generators/brief.d.ts.map +0 -1
- package/dist/src/generators/brief.js +0 -33
- package/dist/src/generators/brief.js.map +0 -1
- package/dist/src/generators/claude-code.d.ts +0 -18
- package/dist/src/generators/claude-code.d.ts.map +0 -1
- package/dist/src/generators/claude-code.js +0 -85
- package/dist/src/generators/claude-code.js.map +0 -1
- package/dist/src/generators/codex.d.ts +0 -23
- package/dist/src/generators/codex.d.ts.map +0 -1
- package/dist/src/generators/codex.js +0 -83
- 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 -107
- 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 -287
- package/dist/src/schema/manifest.d.ts.map +0 -1
- package/dist/src/schema/manifest.js +0 -65
- 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 -99
- 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 -20
- package/dist/src/utils/archive.d.ts.map +0 -1
- package/dist/src/utils/archive.js +0 -108
- 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 -124
- package/dist/src/utils/identity.d.ts.map +0 -1
- package/dist/src/utils/identity.js +0 -434
- 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 -94
- 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 -193
- 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/vault.d.ts +0 -21
- package/dist/src/utils/vault.d.ts.map +0 -1
- package/dist/src/utils/vault.js +0 -67
- package/dist/src/utils/vault.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/workspace.d.ts +0 -14
- package/dist/src/utils/workspace.d.ts.map +0 -1
- package/dist/src/utils/workspace.js +0 -53
- package/dist/src/utils/workspace.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,99 +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
|
-
.replace(/</g, "\\<") // Escape redirects
|
|
58
|
-
.replace(/>/g, "\\>"); // Escape redirects
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Sanitize an array of strings using the identifier rules.
|
|
62
|
-
*/
|
|
63
|
-
export function sanitizeStringArray(arr) {
|
|
64
|
-
if (!arr)
|
|
65
|
-
return [];
|
|
66
|
-
return arr.map((item) => sanitizeIdentifier(item));
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Main sanitizer function for TPS Reports.
|
|
70
|
-
* Returns a new, sanitized report object.
|
|
71
|
-
*/
|
|
72
|
-
export function sanitizeTPSReport(report) {
|
|
73
|
-
// Deep clone to avoid mutating original
|
|
74
|
-
const sanitized = JSON.parse(JSON.stringify(report));
|
|
75
|
-
// Sanitize Top-level fields
|
|
76
|
-
sanitized.name = sanitizeIdentifier(sanitized.name);
|
|
77
|
-
sanitized.description = sanitizeFreeText(sanitized.description);
|
|
78
|
-
// Sanitize Identity fields
|
|
79
|
-
sanitized.identity.default_name = sanitizeIdentifier(sanitized.identity.default_name);
|
|
80
|
-
sanitized.identity.personality = sanitizeFreeText(sanitized.identity.personality);
|
|
81
|
-
sanitized.identity.communication_style = sanitizeFreeText(sanitized.identity.communication_style);
|
|
82
|
-
sanitized.identity.emoji = sanitizeFreeText(sanitized.identity.emoji); // Emojis are text? Usually safe but let's be careful.
|
|
83
|
-
// Sanitize Arrays (Identifiers)
|
|
84
|
-
sanitized.flair = sanitizeStringArray(sanitized.flair);
|
|
85
|
-
sanitized.tools.required = sanitizeStringArray(sanitized.tools.required);
|
|
86
|
-
sanitized.tools.optional = sanitizeStringArray(sanitized.tools.optional);
|
|
87
|
-
sanitized.communication.channels = sanitizeStringArray(sanitized.communication.channels);
|
|
88
|
-
sanitized.communication.handoff_targets = sanitizeStringArray(sanitized.communication.handoff_targets);
|
|
89
|
-
sanitized.memory.shared_read = sanitizeStringArray(sanitized.memory.shared_read);
|
|
90
|
-
sanitized.memory.shared_write = sanitizeStringArray(sanitized.memory.shared_write);
|
|
91
|
-
// Sanitize Model (Identifier)
|
|
92
|
-
sanitized.model.default = sanitizeIdentifier(sanitized.model.default);
|
|
93
|
-
// Sanitize OpenClaw fields
|
|
94
|
-
sanitized.openclaw.model = sanitizeModelIdentifier(sanitized.openclaw.model);
|
|
95
|
-
sanitized.openclaw.thinking = sanitizeIdentifier(sanitized.openclaw.thinking);
|
|
96
|
-
sanitized.openclaw.channel = sanitizeIdentifier(sanitized.openclaw.channel);
|
|
97
|
-
return sanitized;
|
|
98
|
-
}
|
|
99
|
-
//# 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"); // nosemgrep: detect-non-literal-regexp — field is from internal hardcoded calls only
|
|
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,20 +0,0 @@
|
|
|
1
|
-
export interface ArchiveEvent {
|
|
2
|
-
event: "sent" | "read" | "listed";
|
|
3
|
-
timestamp: string;
|
|
4
|
-
from: string;
|
|
5
|
-
to: string;
|
|
6
|
-
messageId: string;
|
|
7
|
-
body?: string;
|
|
8
|
-
bodyPreview?: string;
|
|
9
|
-
}
|
|
10
|
-
export interface ArchiveQuery {
|
|
11
|
-
agent?: string;
|
|
12
|
-
since?: string;
|
|
13
|
-
until?: string;
|
|
14
|
-
event?: "sent" | "read" | "listed";
|
|
15
|
-
search?: string;
|
|
16
|
-
limit?: number;
|
|
17
|
-
}
|
|
18
|
-
export declare function logEvent(event: Omit<ArchiveEvent, "timestamp">, body?: string): void;
|
|
19
|
-
export declare function queryArchive(query?: ArchiveQuery): ArchiveEvent[];
|
|
20
|
-
//# sourceMappingURL=archive.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../../src/utils/archive.ts"],"names":[],"mappings":"AAMA,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,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,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,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAwCD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAcpF;AAED,wBAAgB,YAAY,CAAC,KAAK,GAAE,YAAiB,GAAG,YAAY,EAAE,CAoDrE"}
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
import { join } from "node:path";
|
|
2
|
-
import { homedir } from "node:os";
|
|
3
|
-
import { mkdirSync } from "node:fs";
|
|
4
|
-
// @ts-ignore
|
|
5
|
-
import { Database } from "bun:sqlite";
|
|
6
|
-
function getDb() {
|
|
7
|
-
const dir = process.env.TPS_MAIL_DIR || join(process.env.HOME || homedir(), ".tps", "mail");
|
|
8
|
-
mkdirSync(dir, { recursive: true });
|
|
9
|
-
const dbPath = join(dir, "archive.db");
|
|
10
|
-
const db = new Database(dbPath, { create: true });
|
|
11
|
-
db.exec(`
|
|
12
|
-
CREATE TABLE IF NOT EXISTS archive (
|
|
13
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
14
|
-
event TEXT,
|
|
15
|
-
timestamp TEXT,
|
|
16
|
-
sender TEXT,
|
|
17
|
-
recipient TEXT,
|
|
18
|
-
messageId TEXT,
|
|
19
|
-
body TEXT
|
|
20
|
-
);
|
|
21
|
-
CREATE VIRTUAL TABLE IF NOT EXISTS archive_fts USING fts5(body, content='archive', content_rowid='id');
|
|
22
|
-
|
|
23
|
-
DROP TRIGGER IF EXISTS archive_ai;
|
|
24
|
-
CREATE TRIGGER archive_ai AFTER INSERT ON archive BEGIN
|
|
25
|
-
INSERT INTO archive_fts(rowid, body) VALUES (new.id, new.body);
|
|
26
|
-
END;
|
|
27
|
-
|
|
28
|
-
DROP TRIGGER IF EXISTS archive_ad;
|
|
29
|
-
CREATE TRIGGER archive_ad AFTER DELETE ON archive BEGIN
|
|
30
|
-
INSERT INTO archive_fts(archive_fts, rowid, body) VALUES('delete', old.id, old.body);
|
|
31
|
-
END;
|
|
32
|
-
|
|
33
|
-
DROP TRIGGER IF EXISTS archive_au;
|
|
34
|
-
CREATE TRIGGER archive_au AFTER UPDATE ON archive BEGIN
|
|
35
|
-
INSERT INTO archive_fts(archive_fts, rowid, body) VALUES('delete', old.id, old.body);
|
|
36
|
-
INSERT INTO archive_fts(rowid, body) VALUES (new.id, new.body);
|
|
37
|
-
END;
|
|
38
|
-
`);
|
|
39
|
-
return db;
|
|
40
|
-
}
|
|
41
|
-
export function logEvent(event, body) {
|
|
42
|
-
let db = null;
|
|
43
|
-
try {
|
|
44
|
-
db = getDb();
|
|
45
|
-
const stmt = db.prepare(`
|
|
46
|
-
INSERT INTO archive (event, timestamp, sender, recipient, messageId, body)
|
|
47
|
-
VALUES (?, ?, ?, ?, ?, ?)
|
|
48
|
-
`);
|
|
49
|
-
stmt.run(event.event, new Date().toISOString(), event.from, event.to, event.messageId, body || null);
|
|
50
|
-
}
|
|
51
|
-
catch (err) {
|
|
52
|
-
// Best-effort audit logging.
|
|
53
|
-
}
|
|
54
|
-
finally {
|
|
55
|
-
db?.close();
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
export function queryArchive(query = {}) {
|
|
59
|
-
let db = null;
|
|
60
|
-
try {
|
|
61
|
-
db = getDb();
|
|
62
|
-
let sql = "SELECT archive.event, archive.timestamp, archive.sender as 'from', archive.recipient as 'to', archive.messageId, archive.body FROM archive";
|
|
63
|
-
const conditions = [];
|
|
64
|
-
const params = [];
|
|
65
|
-
if (query.search) {
|
|
66
|
-
sql += " JOIN archive_fts ON archive.id = archive_fts.rowid";
|
|
67
|
-
conditions.push("archive_fts MATCH ?");
|
|
68
|
-
params.push(query.search);
|
|
69
|
-
}
|
|
70
|
-
if (query.agent) {
|
|
71
|
-
conditions.push("(archive.sender = ? OR archive.recipient = ?)");
|
|
72
|
-
params.push(query.agent, query.agent);
|
|
73
|
-
}
|
|
74
|
-
if (query.event) {
|
|
75
|
-
conditions.push("archive.event = ?");
|
|
76
|
-
params.push(query.event);
|
|
77
|
-
}
|
|
78
|
-
if (query.since) {
|
|
79
|
-
conditions.push("archive.timestamp >= ?");
|
|
80
|
-
params.push(query.since);
|
|
81
|
-
}
|
|
82
|
-
if (query.until) {
|
|
83
|
-
conditions.push("archive.timestamp <= ?");
|
|
84
|
-
params.push(query.until);
|
|
85
|
-
}
|
|
86
|
-
if (conditions.length > 0) {
|
|
87
|
-
sql += " WHERE " + conditions.join(" AND ");
|
|
88
|
-
}
|
|
89
|
-
sql += " ORDER BY archive.timestamp DESC";
|
|
90
|
-
if (query.limit && query.limit > 0) {
|
|
91
|
-
sql += " LIMIT ?";
|
|
92
|
-
params.push(query.limit);
|
|
93
|
-
}
|
|
94
|
-
const stmt = db.prepare(sql);
|
|
95
|
-
const results = stmt.all(...params);
|
|
96
|
-
return results.map(r => ({
|
|
97
|
-
...r,
|
|
98
|
-
bodyPreview: r.body ? (r.body.length > 100 ? r.body.slice(0, 100) + "..." : r.body) : undefined
|
|
99
|
-
}));
|
|
100
|
-
}
|
|
101
|
-
catch (err) {
|
|
102
|
-
return [];
|
|
103
|
-
}
|
|
104
|
-
finally {
|
|
105
|
-
db?.close();
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
//# sourceMappingURL=archive.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"archive.js","sourceRoot":"","sources":["../../../src/utils/archive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,aAAa;AACb,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAqBtC,SAAS,KAAK;IACZ,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5F,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IACvC,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAElD,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BP,CAAC,CAAC;IAEH,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAsC,EAAE,IAAa;IAC5E,IAAI,EAAE,GAAe,IAAI,CAAC;IAC1B,IAAI,CAAC;QACH,EAAE,GAAG,KAAK,EAAE,CAAC;QACb,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;KAGvB,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,SAAS,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC;IACvG,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,6BAA6B;IAC/B,CAAC;YAAS,CAAC;QACT,EAAE,EAAE,KAAK,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAsB,EAAE;IACnD,IAAI,EAAE,GAAe,IAAI,CAAC;IAC1B,IAAI,CAAC;QACH,EAAE,GAAG,KAAK,EAAE,CAAC;QACb,IAAI,GAAG,GAAG,4IAA4I,CAAC;QACvJ,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,MAAM,MAAM,GAAU,EAAE,CAAC;QAEzB,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,GAAG,IAAI,qDAAqD,CAAC;YAC7D,UAAU,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YACvC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC;QACD,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,UAAU,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;YACjE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,UAAU,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;QACD,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,UAAU,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YAC1C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;QACD,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,UAAU,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YAC1C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,GAAG,IAAI,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9C,CAAC;QACD,GAAG,IAAI,kCAAkC,CAAC;QAE1C,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;YACnC,GAAG,IAAI,UAAU,CAAC;YAClB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;QAED,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAU,CAAC;QAE7C,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACvB,GAAG,CAAC;YACJ,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SAChG,CAAC,CAAmB,CAAC;IACxB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,CAAC;IACZ,CAAC;YAAS,CAAC;QACT,EAAE,EAAE,KAAK,EAAE,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -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"}
|