@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.
Files changed (145) hide show
  1. package/README.md +69 -0
  2. package/dist/acp/client.d.ts +182 -0
  3. package/dist/acp/client.d.ts.map +1 -0
  4. package/dist/acp/client.js +432 -0
  5. package/dist/acp/client.js.map +1 -0
  6. package/dist/acp/index.d.ts +5 -0
  7. package/dist/acp/index.d.ts.map +1 -0
  8. package/dist/acp/index.js +3 -0
  9. package/dist/acp/index.js.map +1 -0
  10. package/dist/acp/run.d.ts +41 -0
  11. package/dist/acp/run.d.ts.map +1 -0
  12. package/dist/acp/run.js +32 -0
  13. package/dist/acp/run.js.map +1 -0
  14. package/dist/apply.d.ts +17 -6
  15. package/dist/apply.d.ts.map +1 -1
  16. package/dist/apply.js +85 -47
  17. package/dist/apply.js.map +1 -1
  18. package/dist/chat/chat.d.ts +108 -0
  19. package/dist/chat/chat.d.ts.map +1 -0
  20. package/dist/chat/chat.js +221 -0
  21. package/dist/chat/chat.js.map +1 -0
  22. package/dist/chat/discovery.d.ts +30 -0
  23. package/dist/chat/discovery.d.ts.map +1 -0
  24. package/dist/chat/discovery.js +68 -0
  25. package/dist/chat/discovery.js.map +1 -0
  26. package/dist/chat/frontmatter.d.ts +12 -0
  27. package/dist/chat/frontmatter.d.ts.map +1 -0
  28. package/dist/chat/frontmatter.js +11 -0
  29. package/dist/chat/frontmatter.js.map +1 -0
  30. package/dist/chat/index.d.ts +16 -0
  31. package/dist/chat/index.d.ts.map +1 -0
  32. package/dist/chat/index.js +11 -0
  33. package/dist/chat/index.js.map +1 -0
  34. package/dist/chat/registry.d.ts +73 -0
  35. package/dist/chat/registry.d.ts.map +1 -0
  36. package/dist/chat/registry.js +118 -0
  37. package/dist/chat/registry.js.map +1 -0
  38. package/dist/chat/resolve-agent.d.ts +39 -0
  39. package/dist/chat/resolve-agent.d.ts.map +1 -0
  40. package/dist/chat/resolve-agent.js +36 -0
  41. package/dist/chat/resolve-agent.js.map +1 -0
  42. package/dist/chat/suggest.d.ts +20 -0
  43. package/dist/chat/suggest.d.ts.map +1 -0
  44. package/dist/chat/suggest.js +55 -0
  45. package/dist/chat/suggest.js.map +1 -0
  46. package/dist/cli.js +628 -75
  47. package/dist/cli.js.map +1 -1
  48. package/dist/clone.d.ts +21 -3
  49. package/dist/clone.d.ts.map +1 -1
  50. package/dist/clone.js +240 -12
  51. package/dist/clone.js.map +1 -1
  52. package/dist/copilot/mcp.d.ts +48 -0
  53. package/dist/copilot/mcp.d.ts.map +1 -0
  54. package/dist/copilot/mcp.js +146 -0
  55. package/dist/copilot/mcp.js.map +1 -0
  56. package/dist/copilot/resolve.d.ts +33 -0
  57. package/dist/copilot/resolve.d.ts.map +1 -0
  58. package/dist/copilot/resolve.js +96 -0
  59. package/dist/copilot/resolve.js.map +1 -0
  60. package/dist/copilot/spawn.d.ts +51 -0
  61. package/dist/copilot/spawn.d.ts.map +1 -0
  62. package/dist/copilot/spawn.js +132 -0
  63. package/dist/copilot/spawn.js.map +1 -0
  64. package/dist/index.d.ts +19 -0
  65. package/dist/index.d.ts.map +1 -0
  66. package/dist/index.js +15 -0
  67. package/dist/index.js.map +1 -0
  68. package/dist/launch/index.d.ts +10 -0
  69. package/dist/launch/index.d.ts.map +1 -0
  70. package/dist/launch/index.js +9 -0
  71. package/dist/launch/index.js.map +1 -0
  72. package/dist/launch/stage.d.ts +62 -0
  73. package/dist/launch/stage.d.ts.map +1 -0
  74. package/dist/launch/stage.js +108 -0
  75. package/dist/launch/stage.js.map +1 -0
  76. package/dist/manifest.d.ts +165 -18
  77. package/dist/manifest.d.ts.map +1 -1
  78. package/dist/manifest.js +980 -225
  79. package/dist/manifest.js.map +1 -1
  80. package/dist/renderers/claude.d.ts +5 -0
  81. package/dist/renderers/claude.d.ts.map +1 -1
  82. package/dist/renderers/claude.js +17 -3
  83. package/dist/renderers/claude.js.map +1 -1
  84. package/dist/renderers/copilot.d.ts +1 -1
  85. package/dist/renderers/copilot.d.ts.map +1 -1
  86. package/dist/renderers/copilot.js +205 -22
  87. package/dist/renderers/copilot.js.map +1 -1
  88. package/dist/repo-clone.js +17 -11
  89. package/dist/repo-clone.js.map +1 -1
  90. package/dist/resolve-template.d.ts +12 -4
  91. package/dist/resolve-template.d.ts.map +1 -1
  92. package/dist/resolve-template.js +39 -8
  93. package/dist/resolve-template.js.map +1 -1
  94. package/dist/run/index.d.ts +4 -0
  95. package/dist/run/index.d.ts.map +1 -0
  96. package/dist/run/index.js +2 -0
  97. package/dist/run/index.js.map +1 -0
  98. package/dist/run/run.d.ts +143 -0
  99. package/dist/run/run.d.ts.map +1 -0
  100. package/dist/run/run.js +406 -0
  101. package/dist/run/run.js.map +1 -0
  102. package/dist/search-registry.d.ts +10 -3
  103. package/dist/search-registry.d.ts.map +1 -1
  104. package/dist/search-registry.js +16 -16
  105. package/dist/search-registry.js.map +1 -1
  106. package/dist/sessions/index.d.ts +16 -0
  107. package/dist/sessions/index.d.ts.map +1 -0
  108. package/dist/sessions/index.js +15 -0
  109. package/dist/sessions/index.js.map +1 -0
  110. package/dist/sessions/store.d.ts +56 -0
  111. package/dist/sessions/store.d.ts.map +1 -0
  112. package/dist/sessions/store.js +220 -0
  113. package/dist/sessions/store.js.map +1 -0
  114. package/dist/sessions/types.d.ts +62 -0
  115. package/dist/sessions/types.d.ts.map +1 -0
  116. package/dist/sessions/types.js +5 -0
  117. package/dist/sessions/types.js.map +1 -0
  118. package/dist/skill-fetcher.d.ts.map +1 -1
  119. package/dist/skill-fetcher.js +5 -6
  120. package/dist/skill-fetcher.js.map +1 -1
  121. package/dist/types.d.ts +123 -41
  122. package/dist/types.d.ts.map +1 -1
  123. package/dist/types.js +12 -0
  124. package/dist/types.js.map +1 -1
  125. package/dist/util/binary-cache.d.ts +53 -0
  126. package/dist/util/binary-cache.d.ts.map +1 -0
  127. package/dist/util/binary-cache.js +211 -0
  128. package/dist/util/binary-cache.js.map +1 -0
  129. package/dist/util/frontmatter.d.ts +53 -0
  130. package/dist/util/frontmatter.d.ts.map +1 -0
  131. package/dist/util/frontmatter.js +85 -0
  132. package/dist/util/frontmatter.js.map +1 -0
  133. package/dist/util/loom-home.d.ts +19 -0
  134. package/dist/util/loom-home.d.ts.map +1 -0
  135. package/dist/util/loom-home.js +37 -0
  136. package/dist/util/loom-home.js.map +1 -0
  137. package/dist/util/workspace-folder.d.ts +29 -0
  138. package/dist/util/workspace-folder.d.ts.map +1 -0
  139. package/dist/util/workspace-folder.js +43 -0
  140. package/dist/util/workspace-folder.js.map +1 -0
  141. package/dist/validate.d.ts +7 -1
  142. package/dist/validate.d.ts.map +1 -1
  143. package/dist/validate.js +90 -17
  144. package/dist/validate.js.map +1 -1
  145. package/package.json +31 -2
@@ -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, mkdir } from 'node:fs/promises';
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 `repos/<dirName>` pointing to the target.
203
- * Returns the link path if created, or undefined if linkFn is not provided or link already exists.
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 reposDir = join(workspaceDir, 'repos');
209
- const linkPath = join(reposDir, dirName);
210
- // Skip if link already exists
211
- if (await dirExists(linkPath))
212
- return linkPath;
213
- // Ensure repos/ directory exists
214
- await mkdir(reposDir, { recursive: true });
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
  }
@@ -1 +1 @@
1
- {"version":3,"file":"repo-clone.js","sourceRoot":"","sources":["../src/repo-clone.ts"],"names":[],"mappings":"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"}
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 auto-resolves a template argument to a local path.
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 → use directly
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
- /** Exec override for git clone (for testing) */
24
- execFn?: (cmd: string) => void;
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;;;;;;;GAOG;AAMH,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,gDAAgD;IAChD,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC;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,CAuDxB"}
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"}
@@ -1,10 +1,15 @@
1
1
  /**
2
- * Resolve Template Source auto-resolves a template argument to a local path.
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 → use directly
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.yaml
20
- if (await fileExists(join(template, 'manifest.yaml'))) {
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. Search configured registries
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 fileExists(join(candidatePath, 'manifest.yaml'))) {
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 try next
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;;;;;;;GAOG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAmBhE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,QAAgB,EAChB,YAAoB,EACpB,oBAA6B,EAC7B,OAAwB;IAExB,0DAA0D;IAC1D,IAAI,MAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC;QACtD,OAAO;YACL,WAAW,EAAE,QAAQ;YACrB,YAAY,EAAE,oBAAoB,IAAI,QAAQ,CAAC,OAAO,CAAC,wBAAwB,EAAE,EAAE,CAAC;YACpF,YAAY,EAAE,KAAK;SACpB,CAAC;IACJ,CAAC;IAED,kCAAkC;IAClC,MAAM,MAAM,GAAG,OAAO,EAAE,YAAY;QAClC,CAAC,CAAC,MAAM,OAAO,CAAC,YAAY,EAAE;QAC9B,CAAC,CAAC,MAAM,UAAU,EAAE,CAAC;IAEvB,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CACb,aAAa,QAAQ,2DAA2D;YAChF,oDAAoD;YACpD,kCAAkC,QAAQ,mBAAmB,CAC9D,CAAC;IACJ,CAAC;IAED,+DAA+D;IAC/D,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,aAAa,CAAC;gBACtC,YAAY;gBACZ,GAAG,EAAE,GAAG,CAAC,GAAG;gBACZ,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,MAAM,EAAE,OAAO,EAAE,MAAM;aACxB,CAAC,CAAC;YAEH,MAAM,aAAa,GAAG,mBAAmB,CAAC,WAAW,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;YAC7E,IAAI,MAAM,UAAU,CAAC,IAAI,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC;gBAC3D,OAAO;oBACL,WAAW,EAAE,aAAa;oBAC1B,YAAY,EAAE,WAAW,CAAC,WAAW;oBACrC,YAAY,EAAE,IAAI;oBAClB,aAAa,EAAE,WAAW,CAAC,aAAa;iBACzC,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,4CAA4C;YAC5C,SAAS;QACX,CAAC;IACH,CAAC;IAED,mCAAmC;IACnC,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjE,MAAM,IAAI,KAAK,CACb,aAAa,QAAQ,sDAAsD,QAAQ,MAAM;QACzF,4CAA4C,QAAQ,IAAI;QACxD,2CAA2C,QAAQ,mBAAmB,CACvE,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,IAAY;IACpC,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"resolve-template.js","sourceRoot":"","sources":["../src/resolve-template.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { run, DEFAULT_RUN_TIMEOUT_MS } from './run.js';
2
+ export type { RunOptions, RunResult } from './run.js';
3
+ export type { McpServerConfig } from '../copilot/mcp.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -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,2 @@
1
+ export { run, DEFAULT_RUN_TIMEOUT_MS } from './run.js';
2
+ //# sourceMappingURL=index.js.map
@@ -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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"}