@agent-loom/loom 1.0.1 → 1.0.3
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 +69 -0
- package/dist/acp/client.d.ts +182 -0
- package/dist/acp/client.d.ts.map +1 -0
- package/dist/acp/client.js +432 -0
- package/dist/acp/client.js.map +1 -0
- package/dist/acp/index.d.ts +5 -0
- package/dist/acp/index.d.ts.map +1 -0
- package/dist/acp/index.js +3 -0
- package/dist/acp/index.js.map +1 -0
- package/dist/acp/run.d.ts +41 -0
- package/dist/acp/run.d.ts.map +1 -0
- package/dist/acp/run.js +32 -0
- package/dist/acp/run.js.map +1 -0
- package/dist/apply.d.ts +17 -6
- package/dist/apply.d.ts.map +1 -1
- package/dist/apply.js +85 -47
- package/dist/apply.js.map +1 -1
- package/dist/chat/chat.d.ts +108 -0
- package/dist/chat/chat.d.ts.map +1 -0
- package/dist/chat/chat.js +221 -0
- package/dist/chat/chat.js.map +1 -0
- package/dist/chat/discovery.d.ts +30 -0
- package/dist/chat/discovery.d.ts.map +1 -0
- package/dist/chat/discovery.js +68 -0
- package/dist/chat/discovery.js.map +1 -0
- package/dist/chat/frontmatter.d.ts +12 -0
- package/dist/chat/frontmatter.d.ts.map +1 -0
- package/dist/chat/frontmatter.js +11 -0
- package/dist/chat/frontmatter.js.map +1 -0
- package/dist/chat/index.d.ts +16 -0
- package/dist/chat/index.d.ts.map +1 -0
- package/dist/chat/index.js +11 -0
- package/dist/chat/index.js.map +1 -0
- package/dist/chat/registry.d.ts +73 -0
- package/dist/chat/registry.d.ts.map +1 -0
- package/dist/chat/registry.js +118 -0
- package/dist/chat/registry.js.map +1 -0
- package/dist/chat/resolve-agent.d.ts +39 -0
- package/dist/chat/resolve-agent.d.ts.map +1 -0
- package/dist/chat/resolve-agent.js +36 -0
- package/dist/chat/resolve-agent.js.map +1 -0
- package/dist/chat/suggest.d.ts +20 -0
- package/dist/chat/suggest.d.ts.map +1 -0
- package/dist/chat/suggest.js +55 -0
- package/dist/chat/suggest.js.map +1 -0
- package/dist/cli.js +628 -75
- package/dist/cli.js.map +1 -1
- package/dist/clone.d.ts +21 -3
- package/dist/clone.d.ts.map +1 -1
- package/dist/clone.js +240 -12
- package/dist/clone.js.map +1 -1
- package/dist/copilot/mcp.d.ts +48 -0
- package/dist/copilot/mcp.d.ts.map +1 -0
- package/dist/copilot/mcp.js +146 -0
- package/dist/copilot/mcp.js.map +1 -0
- package/dist/copilot/resolve.d.ts +33 -0
- package/dist/copilot/resolve.d.ts.map +1 -0
- package/dist/copilot/resolve.js +96 -0
- package/dist/copilot/resolve.js.map +1 -0
- package/dist/copilot/spawn.d.ts +51 -0
- package/dist/copilot/spawn.d.ts.map +1 -0
- package/dist/copilot/spawn.js +132 -0
- package/dist/copilot/spawn.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/launch/index.d.ts +10 -0
- package/dist/launch/index.d.ts.map +1 -0
- package/dist/launch/index.js +9 -0
- package/dist/launch/index.js.map +1 -0
- package/dist/launch/stage.d.ts +62 -0
- package/dist/launch/stage.d.ts.map +1 -0
- package/dist/launch/stage.js +108 -0
- package/dist/launch/stage.js.map +1 -0
- package/dist/manifest.d.ts +165 -18
- package/dist/manifest.d.ts.map +1 -1
- package/dist/manifest.js +980 -225
- package/dist/manifest.js.map +1 -1
- package/dist/renderers/claude.d.ts +5 -0
- package/dist/renderers/claude.d.ts.map +1 -1
- package/dist/renderers/claude.js +17 -3
- package/dist/renderers/claude.js.map +1 -1
- package/dist/renderers/copilot.d.ts +1 -1
- package/dist/renderers/copilot.d.ts.map +1 -1
- package/dist/renderers/copilot.js +205 -22
- package/dist/renderers/copilot.js.map +1 -1
- package/dist/repo-clone.js +17 -11
- package/dist/repo-clone.js.map +1 -1
- package/dist/resolve-template.d.ts +12 -4
- package/dist/resolve-template.d.ts.map +1 -1
- package/dist/resolve-template.js +39 -8
- package/dist/resolve-template.js.map +1 -1
- package/dist/run/index.d.ts +4 -0
- package/dist/run/index.d.ts.map +1 -0
- package/dist/run/index.js +2 -0
- package/dist/run/index.js.map +1 -0
- package/dist/run/run.d.ts +143 -0
- package/dist/run/run.d.ts.map +1 -0
- package/dist/run/run.js +406 -0
- package/dist/run/run.js.map +1 -0
- package/dist/search-registry.d.ts +10 -3
- package/dist/search-registry.d.ts.map +1 -1
- package/dist/search-registry.js +16 -16
- package/dist/search-registry.js.map +1 -1
- package/dist/sessions/index.d.ts +16 -0
- package/dist/sessions/index.d.ts.map +1 -0
- package/dist/sessions/index.js +15 -0
- package/dist/sessions/index.js.map +1 -0
- package/dist/sessions/store.d.ts +56 -0
- package/dist/sessions/store.d.ts.map +1 -0
- package/dist/sessions/store.js +220 -0
- package/dist/sessions/store.js.map +1 -0
- package/dist/sessions/types.d.ts +62 -0
- package/dist/sessions/types.d.ts.map +1 -0
- package/dist/sessions/types.js +5 -0
- package/dist/sessions/types.js.map +1 -0
- package/dist/skill-fetcher.d.ts.map +1 -1
- package/dist/skill-fetcher.js +5 -6
- package/dist/skill-fetcher.js.map +1 -1
- package/dist/types.d.ts +123 -41
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +12 -0
- package/dist/types.js.map +1 -1
- package/dist/util/binary-cache.d.ts +53 -0
- package/dist/util/binary-cache.d.ts.map +1 -0
- package/dist/util/binary-cache.js +211 -0
- package/dist/util/binary-cache.js.map +1 -0
- package/dist/util/frontmatter.d.ts +53 -0
- package/dist/util/frontmatter.d.ts.map +1 -0
- package/dist/util/frontmatter.js +85 -0
- package/dist/util/frontmatter.js.map +1 -0
- package/dist/util/loom-home.d.ts +19 -0
- package/dist/util/loom-home.d.ts.map +1 -0
- package/dist/util/loom-home.js +37 -0
- package/dist/util/loom-home.js.map +1 -0
- package/dist/util/workspace-folder.d.ts +29 -0
- package/dist/util/workspace-folder.d.ts.map +1 -0
- package/dist/util/workspace-folder.js +43 -0
- package/dist/util/workspace-folder.js.map +1 -0
- package/dist/validate.d.ts +7 -1
- package/dist/validate.d.ts.map +1 -1
- package/dist/validate.js +90 -17
- package/dist/validate.js.map +1 -1
- package/package.json +31 -2
package/dist/repo-clone.js
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* Directory junctions are only created when a user provides an external path
|
|
14
14
|
* for a large/ADO repo — not for repos cloned directly into the workspace.
|
|
15
15
|
*/
|
|
16
|
-
import { stat,
|
|
16
|
+
import { stat, lstat } from 'node:fs/promises';
|
|
17
17
|
import { join } from 'node:path';
|
|
18
18
|
import { exec as execCb } from 'node:child_process';
|
|
19
19
|
import { promisify } from 'node:util';
|
|
@@ -123,7 +123,7 @@ export async function cloneManifestRepos(options) {
|
|
|
123
123
|
// User provided an external path → validate and create junction
|
|
124
124
|
if (await dirExists(answer)) {
|
|
125
125
|
const linkPath = await createRepoLink(answer, dirName, workspaceDir, linkFn);
|
|
126
|
-
result.cloned.push({ repo, path: answer, linkPath });
|
|
126
|
+
result.cloned.push({ repo, path: linkPath ?? answer, linkPath });
|
|
127
127
|
}
|
|
128
128
|
else {
|
|
129
129
|
result.deferred.push({ repo, reason: `User-provided path not found: ${answer}` });
|
|
@@ -199,19 +199,25 @@ async function dirExists(path) {
|
|
|
199
199
|
}
|
|
200
200
|
}
|
|
201
201
|
/**
|
|
202
|
-
* Create a directory junction/symlink at
|
|
203
|
-
*
|
|
202
|
+
* Create a directory junction/symlink at `<workspace>/<dirName>` pointing to the target.
|
|
203
|
+
* This matches the direct-clone path and `${workspaceFolder:<repo>}` expansion.
|
|
204
|
+
* Returns the link path if created, or undefined if linkFn is not provided.
|
|
204
205
|
*/
|
|
205
206
|
async function createRepoLink(target, dirName, workspaceDir, linkFn) {
|
|
206
207
|
if (!linkFn)
|
|
207
208
|
return undefined;
|
|
208
|
-
const
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
209
|
+
const linkPath = join(workspaceDir, dirName);
|
|
210
|
+
try {
|
|
211
|
+
const existing = await lstat(linkPath);
|
|
212
|
+
if (existing.isSymbolicLink())
|
|
213
|
+
return linkPath;
|
|
214
|
+
throw new Error(`Cannot link repo "${dirName}" to ${target}: ${linkPath} already exists. ` +
|
|
215
|
+
`Remove it or choose a workspace without that directory.`);
|
|
216
|
+
}
|
|
217
|
+
catch (err) {
|
|
218
|
+
if (err.code !== 'ENOENT')
|
|
219
|
+
throw err;
|
|
220
|
+
}
|
|
215
221
|
await linkFn(target, linkPath);
|
|
216
222
|
return linkPath;
|
|
217
223
|
}
|
package/dist/repo-clone.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repo-clone.js","sourceRoot":"","sources":["../src/repo-clone.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,IAAI,
|
|
1
|
+
{"version":3,"file":"repo-clone.js","sourceRoot":"","sources":["../src/repo-clone.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Resolve Template Source
|
|
2
|
+
* Resolve Template Source - auto-resolves a template argument to a local path.
|
|
3
3
|
*
|
|
4
4
|
* When `loom apply <template>` is called without --registry:
|
|
5
|
-
* 1. Check if <template> is a local path containing manifest.yaml
|
|
5
|
+
* 1. Check if <template> is a local path containing manifest.yaml or
|
|
6
|
+
* dobby.yaml -> use directly
|
|
6
7
|
* 2. If not, search ~/.loom/config.yaml registries for a matching template
|
|
7
8
|
* 3. Clone the matching registry and resolve the template path
|
|
9
|
+
*
|
|
10
|
+
* Per U6 the manifest probe is unified: any directory that contains
|
|
11
|
+
* either `manifest.yaml` (canonical) or `dobby.yaml` (legacy alias)
|
|
12
|
+
* is treated as a template.
|
|
8
13
|
*/
|
|
14
|
+
import type { GitExecFn, LegacyExecFn } from './clone.js';
|
|
9
15
|
import type { RegistryConfig } from './types.js';
|
|
10
16
|
export interface ResolveResult {
|
|
11
17
|
templateDir: string;
|
|
@@ -20,8 +26,10 @@ export interface ResolveOptions {
|
|
|
20
26
|
loadConfigFn?: () => Promise<{
|
|
21
27
|
registries: RegistryConfig[];
|
|
22
28
|
}>;
|
|
23
|
-
/**
|
|
24
|
-
|
|
29
|
+
/** Git override for registry clone/refresh (for testing) */
|
|
30
|
+
gitFn?: GitExecFn;
|
|
31
|
+
/** @deprecated Use gitFn for argument-array based injection. */
|
|
32
|
+
execFn?: LegacyExecFn;
|
|
25
33
|
}
|
|
26
34
|
/**
|
|
27
35
|
* Resolve a template argument to a local directory path.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-template.d.ts","sourceRoot":"","sources":["../src/resolve-template.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"resolve-template.d.ts","sourceRoot":"","sources":["../src/resolve-template.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,mFAAmF;IACnF,YAAY,EAAE,OAAO,CAAC;IACtB,sDAAsD;IACtD,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC;QAAE,UAAU,EAAE,cAAc,EAAE,CAAA;KAAE,CAAC,CAAC;IAC/D,4DAA4D;IAC5D,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,gEAAgE;IAChE,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,oBAAoB,CAAC,EAAE,MAAM,EAC7B,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,aAAa,CAAC,CAwExB"}
|
package/dist/resolve-template.js
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Resolve Template Source
|
|
2
|
+
* Resolve Template Source - auto-resolves a template argument to a local path.
|
|
3
3
|
*
|
|
4
4
|
* When `loom apply <template>` is called without --registry:
|
|
5
|
-
* 1. Check if <template> is a local path containing manifest.yaml
|
|
5
|
+
* 1. Check if <template> is a local path containing manifest.yaml or
|
|
6
|
+
* dobby.yaml -> use directly
|
|
6
7
|
* 2. If not, search ~/.loom/config.yaml registries for a matching template
|
|
7
8
|
* 3. Clone the matching registry and resolve the template path
|
|
9
|
+
*
|
|
10
|
+
* Per U6 the manifest probe is unified: any directory that contains
|
|
11
|
+
* either `manifest.yaml` (canonical) or `dobby.yaml` (legacy alias)
|
|
12
|
+
* is treated as a template.
|
|
8
13
|
*/
|
|
9
14
|
import { stat } from 'node:fs/promises';
|
|
10
15
|
import { join } from 'node:path';
|
|
@@ -16,21 +21,36 @@ import { cloneRegistry, resolveTemplatePath } from './clone.js';
|
|
|
16
21
|
* Falls back to configured registries when the template is not a local path.
|
|
17
22
|
*/
|
|
18
23
|
export async function resolveTemplateSource(template, workspaceDir, registryRootOverride, options) {
|
|
19
|
-
// 1. Check if template is a local path with manifest
|
|
20
|
-
if (await
|
|
24
|
+
// 1. Check if template is a local path with a recognized manifest
|
|
25
|
+
if (await hasManifest(template)) {
|
|
21
26
|
return {
|
|
22
27
|
templateDir: template,
|
|
23
28
|
registryRoot: registryRootOverride ?? template.replace(/[/\\]templates[/\\].*$/, ''),
|
|
24
29
|
fromRegistry: false,
|
|
25
30
|
};
|
|
26
31
|
}
|
|
27
|
-
// 2.
|
|
32
|
+
// 2. If --registry-root was supplied and template is a bare id,
|
|
33
|
+
// try resolving against that local registry tree before falling back
|
|
34
|
+
// to ~/.loom/config.yaml registries. Lets test harnesses point at a
|
|
35
|
+
// pre-cloned registry root without needing the full templates/<id>
|
|
36
|
+
// path on every invocation.
|
|
37
|
+
if (registryRootOverride) {
|
|
38
|
+
const candidate = resolveTemplatePath(registryRootOverride, template);
|
|
39
|
+
if (await hasManifest(candidate)) {
|
|
40
|
+
return {
|
|
41
|
+
templateDir: candidate,
|
|
42
|
+
registryRoot: registryRootOverride,
|
|
43
|
+
fromRegistry: false,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// 3. Search configured registries
|
|
28
48
|
const config = options?.loadConfigFn
|
|
29
49
|
? await options.loadConfigFn()
|
|
30
50
|
: await loadConfig();
|
|
31
51
|
if (config.registries.length === 0) {
|
|
32
52
|
throw new Error(`Template "${template}" is not a local path and no registries are configured.\n` +
|
|
33
|
-
` Add a registry: loom registry add <name> <url>\n` +
|
|
53
|
+
` Add a registry: loom config registry add <name> <url>\n` +
|
|
34
54
|
` Or provide a URL: loom apply ${template} --registry <url>`);
|
|
35
55
|
}
|
|
36
56
|
// Try to find and clone a registry that contains this template
|
|
@@ -40,10 +60,11 @@ export async function resolveTemplateSource(template, workspaceDir, registryRoot
|
|
|
40
60
|
workspaceDir,
|
|
41
61
|
url: reg.url,
|
|
42
62
|
name: reg.name,
|
|
63
|
+
gitFn: options?.gitFn,
|
|
43
64
|
execFn: options?.execFn,
|
|
44
65
|
});
|
|
45
66
|
const candidatePath = resolveTemplatePath(cloneResult.registryDir, template);
|
|
46
|
-
if (await
|
|
67
|
+
if (await hasManifest(candidatePath)) {
|
|
47
68
|
return {
|
|
48
69
|
templateDir: candidatePath,
|
|
49
70
|
registryRoot: cloneResult.registryDir,
|
|
@@ -53,7 +74,7 @@ export async function resolveTemplateSource(template, workspaceDir, registryRoot
|
|
|
53
74
|
}
|
|
54
75
|
}
|
|
55
76
|
catch {
|
|
56
|
-
// Clone failed for this registry
|
|
77
|
+
// Clone failed for this registry - try next
|
|
57
78
|
continue;
|
|
58
79
|
}
|
|
59
80
|
}
|
|
@@ -63,6 +84,16 @@ export async function resolveTemplateSource(template, workspaceDir, registryRoot
|
|
|
63
84
|
` Check available templates: loom search ${template}\n` +
|
|
64
85
|
` Or provide a registry URL: loom apply ${template} --registry <url>`);
|
|
65
86
|
}
|
|
87
|
+
/**
|
|
88
|
+
* Probe whether a directory contains a recognized manifest filename.
|
|
89
|
+
* Returns true for either canonical (manifest.yaml) or legacy alias
|
|
90
|
+
* (dobby.yaml) -- the actual filename pick happens later in
|
|
91
|
+
* resolveManifestPath.
|
|
92
|
+
*/
|
|
93
|
+
async function hasManifest(dir) {
|
|
94
|
+
return ((await fileExists(join(dir, 'manifest.yaml'))) ||
|
|
95
|
+
(await fileExists(join(dir, 'dobby.yaml'))));
|
|
96
|
+
}
|
|
66
97
|
async function fileExists(path) {
|
|
67
98
|
try {
|
|
68
99
|
const s = await stat(path);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-template.js","sourceRoot":"","sources":["../src/resolve-template.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"resolve-template.js","sourceRoot":"","sources":["../src/resolve-template.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/run/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AACvD,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAGtD,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/run/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `loom run` — headless single-agent execution.
|
|
3
|
+
*
|
|
4
|
+
* Designed for orchestrators (scripts, CI, supervisor processes) that need to:
|
|
5
|
+
* 1. Apply a template + agent into a workspace
|
|
6
|
+
* 2. Run the agent non-interactively against a prompt
|
|
7
|
+
* 3. Collect artifacts (report / session / progress) and an exit code
|
|
8
|
+
*
|
|
9
|
+
* This is the headless counterpart to `loom <agent>` (interactive chat).
|
|
10
|
+
* Where chat inherits the parent tty and lets a human talk to Copilot,
|
|
11
|
+
* `run` captures stdout, honors a hard timeout, and returns structured results.
|
|
12
|
+
*/
|
|
13
|
+
import { spawn } from 'node:child_process';
|
|
14
|
+
import { applyTemplate } from '../apply.js';
|
|
15
|
+
import { resolveTemplateSource } from '../resolve-template.js';
|
|
16
|
+
import { type McpServerConfig } from '../copilot/mcp.js';
|
|
17
|
+
/**
|
|
18
|
+
* Default timeout for `run()` when callers don't supply one (5 minutes).
|
|
19
|
+
* Exported so `loom run` and SDK consumers stay in sync — programmatic
|
|
20
|
+
* callers can omit `timeoutMs` and still get a sane bound.
|
|
21
|
+
*/
|
|
22
|
+
export declare const DEFAULT_RUN_TIMEOUT_MS: number;
|
|
23
|
+
export type RunLockWriteFn = (path: string, data: string, options: {
|
|
24
|
+
flag: 'wx';
|
|
25
|
+
encoding: 'utf-8';
|
|
26
|
+
}) => void;
|
|
27
|
+
export interface RunOptions {
|
|
28
|
+
/** Template ref (registry-resolved) or absolute path to a template directory. */
|
|
29
|
+
template: string;
|
|
30
|
+
/** Agent id within the template. */
|
|
31
|
+
agent: string;
|
|
32
|
+
/** Working directory. Created if missing. Becomes Copilot's cwd. */
|
|
33
|
+
workDir: string;
|
|
34
|
+
/** Prompt text (string) OR a leading-`@` followed by a file path. */
|
|
35
|
+
prompt: string;
|
|
36
|
+
/** Used for artifact filename conventions and `task-<taskId>.json` write. */
|
|
37
|
+
taskId?: string;
|
|
38
|
+
/** Verbatim contents written to `task-<taskId>.json` if both `taskId` and this are set. */
|
|
39
|
+
taskData?: string;
|
|
40
|
+
/** Map of `<dirname-in-workspace>` to absolute local repo path. Junctioned in. */
|
|
41
|
+
sharedRepos?: Record<string, string>;
|
|
42
|
+
/** MCP servers to merge in addition to whatever the template emits. */
|
|
43
|
+
mcpExtras?: Record<string, McpServerConfig>;
|
|
44
|
+
/** MCP server names to drop from the rendered config. */
|
|
45
|
+
mcpRemove?: string[];
|
|
46
|
+
/**
|
|
47
|
+
* Hard timeout in ms for the spawned agent process. When omitted, defaults
|
|
48
|
+
* to `DEFAULT_RUN_TIMEOUT_MS` (5 minutes). Pass `0` to disable (not
|
|
49
|
+
* recommended; orchestrators that want unlimited runtime should supervise
|
|
50
|
+
* the process themselves).
|
|
51
|
+
*/
|
|
52
|
+
timeoutMs?: number;
|
|
53
|
+
/** Optional model override (forwarded to copilot --model). */
|
|
54
|
+
model?: string;
|
|
55
|
+
/** When true, rm the workspace on success. Default false (caller owns cleanup). */
|
|
56
|
+
cleanup?: boolean;
|
|
57
|
+
/** Inject spawn for tests. Default uses node:child_process spawn. */
|
|
58
|
+
spawnFn?: typeof spawn;
|
|
59
|
+
/** Inject applyTemplate for tests. */
|
|
60
|
+
applyFn?: typeof applyTemplate;
|
|
61
|
+
/** Inject template resolver for tests. */
|
|
62
|
+
resolveFn?: typeof resolveTemplateSource;
|
|
63
|
+
/**
|
|
64
|
+
* Inject the lock-file writer for tests. Lets a test force `EEXIST` on
|
|
65
|
+
* the first `wx` attempt and assert the one-shot EEXIST retry branch in
|
|
66
|
+
* `acquireRunLock` behaves correctly (reclaim-if-dead, fail-if-alive).
|
|
67
|
+
* Default uses `node:fs` `writeFileSync`.
|
|
68
|
+
*/
|
|
69
|
+
writeFn?: RunLockWriteFn;
|
|
70
|
+
/** Cap on captured stdout returned in stdoutTail (default 16KB). */
|
|
71
|
+
stdoutTailBytes?: number;
|
|
72
|
+
/**
|
|
73
|
+
* Hard cap on bytes retained in memory per stream (stdout, stderr) during
|
|
74
|
+
* the spawn. Older bytes are discarded (FIFO). Default 1MB. The returned
|
|
75
|
+
* `stdoutTail` / `stderrTail` are then sliced from this. Prevents OOM when
|
|
76
|
+
* an agent prints gigabytes of stdout (a real failure mode for e.g. a
|
|
77
|
+
* runaway loop).
|
|
78
|
+
*/
|
|
79
|
+
captureBytesCap?: number;
|
|
80
|
+
/**
|
|
81
|
+
* Initialize an empty `git` repo in `workDir` if one is not already present.
|
|
82
|
+
* Some agents assume their cwd is a git repo (for diffs, blame, hooks).
|
|
83
|
+
* Off by default to avoid a hard dep on the `git` binary and to keep
|
|
84
|
+
* `run()` side-effect-free when callers don't need it. Auto-enabled when
|
|
85
|
+
* `sharedRepos` are junctioned in.
|
|
86
|
+
*/
|
|
87
|
+
initGit?: boolean;
|
|
88
|
+
/**
|
|
89
|
+
* Extra directories (relative to `workDir` or absolute) to search for a
|
|
90
|
+
* `REPORT-<taskId>.md` artifact, in addition to the default `workDir/REPORT-<taskId>.md`.
|
|
91
|
+
* First match wins.
|
|
92
|
+
*/
|
|
93
|
+
reportSearchDirs?: string[];
|
|
94
|
+
}
|
|
95
|
+
export interface RunResult {
|
|
96
|
+
exitCode: number;
|
|
97
|
+
durationMs: number;
|
|
98
|
+
workspacePath: string;
|
|
99
|
+
/** True when the run hit timeoutMs. */
|
|
100
|
+
timedOut: boolean;
|
|
101
|
+
/** Contents of the agent's session share, if produced. */
|
|
102
|
+
session?: string;
|
|
103
|
+
/** Contents of `REPORT-<taskId>.md`, if found. */
|
|
104
|
+
report?: string;
|
|
105
|
+
/** Contents of `PROGRESS-<taskId>.md`, if found. */
|
|
106
|
+
progress?: string;
|
|
107
|
+
/** Where artifacts live on disk. */
|
|
108
|
+
artifactPaths: {
|
|
109
|
+
session?: string;
|
|
110
|
+
report?: string;
|
|
111
|
+
progress?: string;
|
|
112
|
+
mcpConfig?: string;
|
|
113
|
+
prompt?: string;
|
|
114
|
+
};
|
|
115
|
+
/** Last N bytes of captured stdout. Default 16KB. */
|
|
116
|
+
stdoutTail?: string;
|
|
117
|
+
/** Last N bytes of captured stderr. Default 16KB. */
|
|
118
|
+
stderrTail?: string;
|
|
119
|
+
/**
|
|
120
|
+
* Non-fatal advisory messages produced during the run (e.g. reclaimed
|
|
121
|
+
* stale lock). `run()` itself always populates this (possibly empty), but
|
|
122
|
+
* it remains optional so existing SDK consumers that construct `RunResult`
|
|
123
|
+
* test doubles do not need a breaking type update.
|
|
124
|
+
* Set `LOOM_RUN_DEBUG=1` to also mirror these to stderr at runtime.
|
|
125
|
+
*/
|
|
126
|
+
warnings?: string[];
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Run a single agent headlessly and return structured results.
|
|
130
|
+
*
|
|
131
|
+
* Steps: workspace prep -> shared-repo junctions -> applyTemplate ->
|
|
132
|
+
* mcp config merge -> task data + prompt -> spawn copilot (captured stdio)
|
|
133
|
+
* -> artifact collection -> optional cleanup.
|
|
134
|
+
*
|
|
135
|
+
* Per-`workDir` exclusivity is enforced by a cooperative lock file
|
|
136
|
+
* (`.loom-run.lock`). Concurrent invocations against the same `workDir`
|
|
137
|
+
* fail fast instead of racing on `prompt.txt` / `mcp-config.json` /
|
|
138
|
+
* `SESSION-*.md` writes. The lock is released in a `finally` so a crashed
|
|
139
|
+
* process doesn't strand the workspace; stale locks (PID no longer alive)
|
|
140
|
+
* are detected and reclaimed automatically.
|
|
141
|
+
*/
|
|
142
|
+
export declare function run(options: RunOptions): Promise<RunResult>;
|
|
143
|
+
//# sourceMappingURL=run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/run/run.ts"],"names":[],"mappings":"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"}
|