skyloom 1.14.6 → 1.15.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/.github/workflows/ci.yml +2 -2
- package/.github/workflows/publish.yml +74 -0
- package/CONVERSION_PLAN.md +191 -191
- package/README.md +523 -220
- package/config/default.yaml +46 -43
- package/config/models.yaml +928 -155
- package/config/providers.yaml +109 -6
- package/dist/agents/snow.d.ts +2 -0
- package/dist/agents/snow.d.ts.map +1 -1
- package/dist/agents/snow.js +36 -5
- package/dist/agents/snow.js.map +1 -1
- package/dist/cli/loom_chat.d.ts.map +1 -1
- package/dist/cli/loom_chat.js +207 -1
- package/dist/cli/loom_chat.js.map +1 -1
- package/dist/cli/main.js +190 -40
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/tui.d.ts.map +1 -1
- package/dist/cli/tui.js +6 -31
- package/dist/cli/tui.js.map +1 -1
- package/dist/core/agent.d.ts +6 -4
- package/dist/core/agent.d.ts.map +1 -1
- package/dist/core/agent.js +61 -20
- package/dist/core/agent.js.map +1 -1
- package/dist/core/catalog.d.ts.map +1 -1
- package/dist/core/catalog.js +30 -9
- package/dist/core/catalog.js.map +1 -1
- package/dist/core/commands.d.ts +110 -0
- package/dist/core/commands.d.ts.map +1 -0
- package/dist/core/commands.js +633 -0
- package/dist/core/commands.js.map +1 -0
- package/dist/core/concurrency.d.ts +38 -0
- package/dist/core/concurrency.d.ts.map +1 -0
- package/dist/core/concurrency.js +65 -0
- package/dist/core/concurrency.js.map +1 -0
- package/dist/core/factory.js +16 -16
- package/dist/core/file_checkpoint.d.ts +9 -0
- package/dist/core/file_checkpoint.d.ts.map +1 -1
- package/dist/core/file_checkpoint.js +33 -1
- package/dist/core/file_checkpoint.js.map +1 -1
- package/dist/core/llm.d.ts.map +1 -1
- package/dist/core/llm.js +66 -13
- package/dist/core/llm.js.map +1 -1
- package/dist/core/memory.js +51 -51
- package/dist/core/schemas.d.ts +16 -0
- package/dist/core/schemas.d.ts.map +1 -1
- package/dist/core/schemas.js +32 -0
- package/dist/core/schemas.js.map +1 -1
- package/dist/core/security.d.ts.map +1 -1
- package/dist/core/security.js +27 -0
- package/dist/core/security.js.map +1 -1
- package/dist/core/skymd.js +14 -14
- package/dist/core/trace.d.ts +105 -0
- package/dist/core/trace.d.ts.map +1 -0
- package/dist/core/trace.js +213 -0
- package/dist/core/trace.js.map +1 -0
- package/dist/tools/builtin.d.ts +2 -6
- package/dist/tools/builtin.d.ts.map +1 -1
- package/dist/tools/builtin.js +180 -125
- package/dist/tools/builtin.js.map +1 -1
- package/dist/tools/extra.d.ts +13 -0
- package/dist/tools/extra.d.ts.map +1 -0
- package/dist/tools/extra.js +827 -0
- package/dist/tools/extra.js.map +1 -0
- package/dist/tools/guards.d.ts +12 -0
- package/dist/tools/guards.d.ts.map +1 -0
- package/dist/tools/guards.js +143 -0
- package/dist/tools/guards.js.map +1 -0
- package/dist/tools/model_tool.d.ts.map +1 -1
- package/dist/tools/model_tool.js +24 -4
- package/dist/tools/model_tool.js.map +1 -1
- package/dist/web/markdown.d.ts +32 -0
- package/dist/web/markdown.d.ts.map +1 -0
- package/dist/web/markdown.js +202 -0
- package/dist/web/markdown.js.map +1 -0
- package/dist/web/server.d.ts +4 -0
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +14 -582
- package/dist/web/server.js.map +1 -1
- package/dist/web/ui.d.ts +31 -0
- package/dist/web/ui.d.ts.map +1 -0
- package/dist/web/ui.js +1009 -0
- package/dist/web/ui.js.map +1 -0
- package/docs/AESTHETIC_DESIGN.md +152 -152
- package/docs/OPTIMIZATION_PLAN.md +178 -178
- package/package.json +68 -68
- package/src/agents/snow.ts +38 -5
- package/src/cli/commands_md.ts +112 -112
- package/src/cli/input_macros.ts +83 -83
- package/src/cli/loom.ts +1041 -1041
- package/src/cli/loom_chat.ts +772 -603
- package/src/cli/main.ts +853 -723
- package/src/cli/tui.ts +264 -289
- package/src/core/agent/guard.ts +133 -133
- package/src/core/agent/task.ts +100 -100
- package/src/core/agent.ts +1630 -1590
- package/src/core/agent_helpers.ts +500 -500
- package/src/core/bus.ts +221 -221
- package/src/core/cache.ts +153 -153
- package/src/core/catalog.ts +199 -178
- package/src/core/circuit_breaker.ts +119 -119
- package/src/core/commands.ts +704 -0
- package/src/core/concurrency.ts +73 -0
- package/src/core/config.ts +365 -365
- package/src/core/constants.ts +95 -95
- package/src/core/factory.ts +656 -656
- package/src/core/file_checkpoint.ts +163 -136
- package/src/core/hooks.ts +126 -126
- package/src/core/llm.ts +972 -915
- package/src/core/logger.ts +143 -143
- package/src/core/mcp.ts +1001 -1001
- package/src/core/memory.ts +1201 -1201
- package/src/core/middleware.ts +350 -350
- package/src/core/model_config.ts +159 -159
- package/src/core/pipelines.ts +424 -424
- package/src/core/schemas.ts +319 -282
- package/src/core/security.ts +27 -0
- package/src/core/semantic.ts +211 -211
- package/src/core/skill.ts +384 -384
- package/src/core/skymd.ts +143 -143
- package/src/core/theme.ts +65 -65
- package/src/core/tool.ts +457 -457
- package/src/core/trace.ts +236 -0
- package/src/core/verify.ts +71 -71
- package/src/plugins/loader.ts +91 -91
- package/src/skills/loader.ts +75 -75
- package/src/tools/builtin.ts +571 -493
- package/src/tools/computer.ts +279 -279
- package/src/tools/extra.ts +662 -0
- package/src/tools/guards.ts +82 -0
- package/src/tools/model_tool.ts +93 -74
- package/src/tools/todo.ts +76 -76
- package/src/web/markdown.ts +193 -0
- package/src/web/server.ts +117 -693
- package/src/web/ui.ts +949 -0
- package/tests/agent.test.ts +211 -159
- package/tests/agent_helpers.test.ts +48 -48
- package/tests/catalog.test.ts +86 -86
- package/tests/checkpoint_commands.test.ts +124 -124
- package/tests/claude_compat.test.ts +110 -110
- package/tests/commands.test.ts +103 -0
- package/tests/concurrency.test.ts +102 -0
- package/tests/config.test.ts +41 -41
- package/tests/extra_tools.test.ts +212 -0
- package/tests/fence_plugin.test.ts +52 -52
- package/tests/guard.test.ts +75 -75
- package/tests/loom.test.ts +337 -337
- package/tests/memory.test.ts +170 -170
- package/tests/model_config.test.ts +109 -109
- package/tests/skymd.test.ts +146 -146
- package/tests/ssrf.test.ts +38 -38
- package/tests/structured_retry.test.ts +87 -0
- package/tests/task.test.ts +60 -60
- package/tests/todo_toolstats.test.ts +94 -94
- package/tests/trace.test.ts +128 -0
- package/tests/tui.test.ts +67 -67
- package/tests/web.test.ts +169 -0
- package/tsconfig.json +38 -38
package/src/core/logger.ts
CHANGED
|
@@ -1,143 +1,143 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Structured logging for Skyloom.
|
|
3
|
-
*
|
|
4
|
-
* Usage:
|
|
5
|
-
* const log = getLogger("fog");
|
|
6
|
-
* log.info("chat_request", { userMessage: "hello", agent: "fog" });
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
export enum LogLevel {
|
|
10
|
-
DEBUG = 0,
|
|
11
|
-
INFO = 1,
|
|
12
|
-
WARN = 2,
|
|
13
|
-
ERROR = 3,
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export interface LogEntry {
|
|
17
|
-
ts: string;
|
|
18
|
-
level: string;
|
|
19
|
-
logger: string;
|
|
20
|
-
msg: string;
|
|
21
|
-
request_id?: string;
|
|
22
|
-
[key: string]: unknown;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Logger instance for structured logging
|
|
27
|
-
*/
|
|
28
|
-
export class Logger {
|
|
29
|
-
private name: string;
|
|
30
|
-
private minLevel: LogLevel;
|
|
31
|
-
|
|
32
|
-
constructor(name: string, minLevel: LogLevel = LogLevel.INFO) {
|
|
33
|
-
this.name = name;
|
|
34
|
-
this.minLevel = minLevel;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
private formatEntry(
|
|
38
|
-
levelName: string,
|
|
39
|
-
msg: string,
|
|
40
|
-
extra?: Record<string, unknown>
|
|
41
|
-
): LogEntry {
|
|
42
|
-
const entry: LogEntry = {
|
|
43
|
-
ts: new Date().toISOString(),
|
|
44
|
-
level: levelName.toLowerCase(),
|
|
45
|
-
logger: this.name,
|
|
46
|
-
msg,
|
|
47
|
-
...extra,
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
return entry;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
private output(level: LogLevel, levelName: string, msg: string, extra?: Record<string, unknown>) {
|
|
54
|
-
if (level < this.minLevel) return;
|
|
55
|
-
|
|
56
|
-
const entry = this.formatEntry(levelName, msg, extra);
|
|
57
|
-
const line = JSON.stringify(entry, (_key, value) => {
|
|
58
|
-
// Ensure dates are serializable
|
|
59
|
-
if (value instanceof Date) {
|
|
60
|
-
return value.toISOString();
|
|
61
|
-
}
|
|
62
|
-
if (value instanceof Error) {
|
|
63
|
-
return {
|
|
64
|
-
name: value.name,
|
|
65
|
-
message: value.message,
|
|
66
|
-
stack: value.stack,
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
return value;
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
// Write all logs to stderr to keep stdout clean for chat/TUI
|
|
73
|
-
process.stderr.write(line + "\n");
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
debug(msg: string, extra?: Record<string, unknown>) {
|
|
77
|
-
this.output(LogLevel.DEBUG, "DEBUG", msg, extra);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
info(msg: string, extra?: Record<string, unknown>) {
|
|
81
|
-
this.output(LogLevel.INFO, "INFO", msg, extra);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
warn(msg: string, extra?: Record<string, unknown>) {
|
|
85
|
-
this.output(LogLevel.WARN, "WARN", msg, extra);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
error(msg: string, extra?: Record<string, unknown>) {
|
|
89
|
-
this.output(LogLevel.ERROR, "ERROR", msg, extra);
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
setLevel(level: LogLevel) {
|
|
93
|
-
this.minLevel = level;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* Global logger instances
|
|
99
|
-
*/
|
|
100
|
-
const loggers = new Map<string, Logger>();
|
|
101
|
-
let requestId: string | null = null;
|
|
102
|
-
let defaultLogLevel = LogLevel.WARN; // Only warnings+errors by default
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* Get or create a logger for a component
|
|
106
|
-
*/
|
|
107
|
-
export function getLogger(name: string): Logger {
|
|
108
|
-
if (!loggers.has(name)) {
|
|
109
|
-
loggers.set(name, new Logger(name, defaultLogLevel));
|
|
110
|
-
}
|
|
111
|
-
return loggers.get(name)!;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
/**
|
|
115
|
-
* Set the global request ID for tracing
|
|
116
|
-
*/
|
|
117
|
-
export function setRequestId(id: string | null) {
|
|
118
|
-
requestId = id;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
/**
|
|
122
|
-
* Get the current request ID
|
|
123
|
-
*/
|
|
124
|
-
export function getRequestId(): string | null {
|
|
125
|
-
return requestId;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
/**
|
|
129
|
-
* Set the global default log level
|
|
130
|
-
*/
|
|
131
|
-
export function setDefaultLogLevel(level: LogLevel) {
|
|
132
|
-
defaultLogLevel = level;
|
|
133
|
-
loggers.forEach((logger) => {
|
|
134
|
-
logger.setLevel(level);
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
/**
|
|
139
|
-
* Get the current default log level
|
|
140
|
-
*/
|
|
141
|
-
export function getDefaultLogLevel(): LogLevel {
|
|
142
|
-
return defaultLogLevel;
|
|
143
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Structured logging for Skyloom.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* const log = getLogger("fog");
|
|
6
|
+
* log.info("chat_request", { userMessage: "hello", agent: "fog" });
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export enum LogLevel {
|
|
10
|
+
DEBUG = 0,
|
|
11
|
+
INFO = 1,
|
|
12
|
+
WARN = 2,
|
|
13
|
+
ERROR = 3,
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface LogEntry {
|
|
17
|
+
ts: string;
|
|
18
|
+
level: string;
|
|
19
|
+
logger: string;
|
|
20
|
+
msg: string;
|
|
21
|
+
request_id?: string;
|
|
22
|
+
[key: string]: unknown;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Logger instance for structured logging
|
|
27
|
+
*/
|
|
28
|
+
export class Logger {
|
|
29
|
+
private name: string;
|
|
30
|
+
private minLevel: LogLevel;
|
|
31
|
+
|
|
32
|
+
constructor(name: string, minLevel: LogLevel = LogLevel.INFO) {
|
|
33
|
+
this.name = name;
|
|
34
|
+
this.minLevel = minLevel;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
private formatEntry(
|
|
38
|
+
levelName: string,
|
|
39
|
+
msg: string,
|
|
40
|
+
extra?: Record<string, unknown>
|
|
41
|
+
): LogEntry {
|
|
42
|
+
const entry: LogEntry = {
|
|
43
|
+
ts: new Date().toISOString(),
|
|
44
|
+
level: levelName.toLowerCase(),
|
|
45
|
+
logger: this.name,
|
|
46
|
+
msg,
|
|
47
|
+
...extra,
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
return entry;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
private output(level: LogLevel, levelName: string, msg: string, extra?: Record<string, unknown>) {
|
|
54
|
+
if (level < this.minLevel) return;
|
|
55
|
+
|
|
56
|
+
const entry = this.formatEntry(levelName, msg, extra);
|
|
57
|
+
const line = JSON.stringify(entry, (_key, value) => {
|
|
58
|
+
// Ensure dates are serializable
|
|
59
|
+
if (value instanceof Date) {
|
|
60
|
+
return value.toISOString();
|
|
61
|
+
}
|
|
62
|
+
if (value instanceof Error) {
|
|
63
|
+
return {
|
|
64
|
+
name: value.name,
|
|
65
|
+
message: value.message,
|
|
66
|
+
stack: value.stack,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
return value;
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
// Write all logs to stderr to keep stdout clean for chat/TUI
|
|
73
|
+
process.stderr.write(line + "\n");
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
debug(msg: string, extra?: Record<string, unknown>) {
|
|
77
|
+
this.output(LogLevel.DEBUG, "DEBUG", msg, extra);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
info(msg: string, extra?: Record<string, unknown>) {
|
|
81
|
+
this.output(LogLevel.INFO, "INFO", msg, extra);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
warn(msg: string, extra?: Record<string, unknown>) {
|
|
85
|
+
this.output(LogLevel.WARN, "WARN", msg, extra);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
error(msg: string, extra?: Record<string, unknown>) {
|
|
89
|
+
this.output(LogLevel.ERROR, "ERROR", msg, extra);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
setLevel(level: LogLevel) {
|
|
93
|
+
this.minLevel = level;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Global logger instances
|
|
99
|
+
*/
|
|
100
|
+
const loggers = new Map<string, Logger>();
|
|
101
|
+
let requestId: string | null = null;
|
|
102
|
+
let defaultLogLevel = LogLevel.WARN; // Only warnings+errors by default
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Get or create a logger for a component
|
|
106
|
+
*/
|
|
107
|
+
export function getLogger(name: string): Logger {
|
|
108
|
+
if (!loggers.has(name)) {
|
|
109
|
+
loggers.set(name, new Logger(name, defaultLogLevel));
|
|
110
|
+
}
|
|
111
|
+
return loggers.get(name)!;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Set the global request ID for tracing
|
|
116
|
+
*/
|
|
117
|
+
export function setRequestId(id: string | null) {
|
|
118
|
+
requestId = id;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Get the current request ID
|
|
123
|
+
*/
|
|
124
|
+
export function getRequestId(): string | null {
|
|
125
|
+
return requestId;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Set the global default log level
|
|
130
|
+
*/
|
|
131
|
+
export function setDefaultLogLevel(level: LogLevel) {
|
|
132
|
+
defaultLogLevel = level;
|
|
133
|
+
loggers.forEach((logger) => {
|
|
134
|
+
logger.setLevel(level);
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Get the current default log level
|
|
140
|
+
*/
|
|
141
|
+
export function getDefaultLogLevel(): LogLevel {
|
|
142
|
+
return defaultLogLevel;
|
|
143
|
+
}
|