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
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bounded-concurrency task runner with cooperative cancellation.
|
|
3
|
+
*
|
|
4
|
+
* Why this exists: the agent tool-execution loop previously fired every tool
|
|
5
|
+
* call in a round at once via `Promise.all`. With Skyloom's now-large tool
|
|
6
|
+
* surface, a single LLM round can request many parallel side-effecting tools
|
|
7
|
+
* (http_request, download_file, port_check, file writes) — unbounded, that can
|
|
8
|
+
* exhaust sockets, file descriptors, or CPU on the host. This caps how many run
|
|
9
|
+
* at once while preserving result order.
|
|
10
|
+
*
|
|
11
|
+
* Cancellation is *cooperative*: JavaScript can't preempt a running promise, so
|
|
12
|
+
* when the AbortSignal fires we stop *starting* queued tasks. In-flight tasks
|
|
13
|
+
* are left to settle. The worker is told, per item, whether the signal had
|
|
14
|
+
* already aborted when its turn came up, so the caller can short-circuit a
|
|
15
|
+
* not-yet-started unit to a "cancelled" result instead of executing it.
|
|
16
|
+
*
|
|
17
|
+
* Pure and dependency-free → fully unit-testable.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
export interface BoundedOptions {
|
|
21
|
+
/** Maximum tasks running at once. Values < 1 are clamped to 1. */
|
|
22
|
+
concurrency: number;
|
|
23
|
+
/** When aborted, queued (not-yet-started) tasks receive `aborted: true`. */
|
|
24
|
+
signal?: AbortSignal;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Map `items` through `worker` with at most `concurrency` running concurrently,
|
|
29
|
+
* preserving input order in the returned array.
|
|
30
|
+
*
|
|
31
|
+
* `worker(item, index, aborted)` — `aborted` is the signal's state checked
|
|
32
|
+
* immediately before this item is dispatched. A worker that respects it can
|
|
33
|
+
* return a cancelled placeholder for queued items once the user interrupts.
|
|
34
|
+
*/
|
|
35
|
+
export async function mapBounded<T, R>(
|
|
36
|
+
items: T[],
|
|
37
|
+
worker: (item: T, index: number, aborted: boolean) => Promise<R>,
|
|
38
|
+
opts: BoundedOptions,
|
|
39
|
+
): Promise<R[]> {
|
|
40
|
+
const n = items.length;
|
|
41
|
+
const results = new Array<R>(n);
|
|
42
|
+
if (n === 0) return results;
|
|
43
|
+
|
|
44
|
+
const limit = Math.max(1, Math.floor(opts.concurrency) || 1);
|
|
45
|
+
let next = 0;
|
|
46
|
+
|
|
47
|
+
const runner = async (): Promise<void> => {
|
|
48
|
+
// Each runner pulls the next index until the queue drains. A shared cursor
|
|
49
|
+
// (`next`) is safe here because there is no `await` between read and
|
|
50
|
+
// increment — the single-threaded event loop makes `next++` atomic.
|
|
51
|
+
while (true) {
|
|
52
|
+
const i = next++;
|
|
53
|
+
if (i >= n) return;
|
|
54
|
+
const aborted = opts.signal?.aborted ?? false;
|
|
55
|
+
results[i] = await worker(items[i], i, aborted);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
const runners = Array.from({ length: Math.min(limit, n) }, () => runner());
|
|
60
|
+
await Promise.all(runners);
|
|
61
|
+
return results;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** Default parallel-tool cap when none is configured. Conservative but not serial. */
|
|
65
|
+
export const DEFAULT_TOOL_CONCURRENCY = 4;
|
|
66
|
+
|
|
67
|
+
/** Resolve a sane concurrency limit from a possibly-undefined config value. */
|
|
68
|
+
export function resolveConcurrency(raw: unknown, fallback = DEFAULT_TOOL_CONCURRENCY): number {
|
|
69
|
+
const n = Number(raw);
|
|
70
|
+
if (!Number.isFinite(n) || n < 1) return fallback;
|
|
71
|
+
// Cap the ceiling so a fat-fingered config can't reintroduce the unbounded blowup.
|
|
72
|
+
return Math.min(Math.floor(n), 32);
|
|
73
|
+
}
|