@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
package/README.md CHANGED
@@ -45,6 +45,58 @@ Apply the functions-dev template to this workspace
45
45
 
46
46
  The agent handles the whole workflow — searching, selecting, and applying the template to your workspace.
47
47
 
48
+ ## Launch an agent (`loom <agent>`)
49
+
50
+ Once a template is applied (or in any workspace with `.github/agents/<id>.agent.md` files), start a single agent in your terminal:
51
+
52
+ ```bash
53
+ # From inside a workspace (walks up to find .github/agents/)
54
+ loom my-agent
55
+
56
+ # Pass extra args through to the runtime after `--`
57
+ loom my-agent -- --model=claude-sonnet-4.5
58
+
59
+ # Or use the dedicated --model / --add-dir flags directly:
60
+ loom my-agent --model=claude-sonnet-4.5
61
+
62
+ # Launch from anywhere by pointing at a workspace
63
+ loom my-agent --workspace /path/to/workspace
64
+
65
+ # Launch an agent that isn't in any local workspace — stages it from a
66
+ # configured registry into ~/.loom/sessions/<id>/workspace/
67
+ loom some-registry-agent
68
+
69
+ # Headless single-shot execution (no TTY): give a prompt, exit when done
70
+ loom my-agent -p "investigate failing test" --no-interactive
71
+ ```
72
+
73
+ The verb-less form (`loom <agent>`) is the **interactive** surface — it inherits
74
+ your tty and lets you talk to the agent (mirrors the `copilot` CLI). For
75
+ **scripted / structured** one-shot execution, use either the `loom run`
76
+ subcommand or the `run()` SDK from `@agent-loom/loom/run`, both of which
77
+ capture stdout, honor a hard timeout, and return structured results
78
+ (`SESSION:`, `REPORT:`, `PROGRESS:` artifact paths).
79
+
80
+ ```bash
81
+ # Run a template-instantiated agent headlessly and collect artifacts
82
+ loom run my-template my-agent \
83
+ --prompt "what's broken?" \
84
+ --work-dir /tmp/loom-run-1 \
85
+ --timeout-ms 300000
86
+ ```
87
+
88
+ Every launch is recorded under `~/.loom/sessions/<id>/`. Inspect past runs:
89
+
90
+ ```bash
91
+ loom sessions list # recent sessions
92
+ loom sessions show <id> # full metadata
93
+ loom sessions tag <id> bug-repro
94
+ loom sessions note <id> "this one reproduced #1234"
95
+ ```
96
+
97
+ Escape hatches: `--no-session` (skip recording), `--no-registry-fallback`
98
+ (disable the registry fallback), `--registry <name>` (restrict to one registry).
99
+
48
100
  ## Available Skills
49
101
 
50
102
  Loom ships with 5 skills that teach your coding agent how to use the system:
@@ -139,6 +191,23 @@ npm test
139
191
  node dist/cli.js --help
140
192
  ```
141
193
 
194
+ ### Working on a branch
195
+
196
+ To dogfood a local build globally:
197
+
198
+ ```bash
199
+ cd <your-loom-worktree>
200
+ npm run build
201
+ npm link # exposes `loom` from this worktree on PATH
202
+ loom some-agent # uses your local build
203
+
204
+ # When done:
205
+ npm unlink -g @agent-loom/loom # restore the published `loom`
206
+ ```
207
+
208
+ `npm link` pins `loom` to the current worktree path. If you switch branches or
209
+ blow away `node_modules`, re-run `npm run build` (no need to re-link).
210
+
142
211
  ## License
143
212
 
144
213
  ISC
@@ -0,0 +1,182 @@
1
+ export interface SpecialistSession {
2
+ sessionId: string;
3
+ agentId: string;
4
+ response: string;
5
+ activity: string;
6
+ plan: Array<{
7
+ content: string;
8
+ priority: string;
9
+ status: string;
10
+ }>;
11
+ toolCalls: Map<string, {
12
+ title: string;
13
+ status: string;
14
+ }>;
15
+ done: boolean;
16
+ stopReason: string | null;
17
+ startTime: number;
18
+ }
19
+ /**
20
+ * MCP server config consumed by `AcpClient.newSession` / `loadSession`.
21
+ *
22
+ * **Note:** This is intentionally distinct from the canonical
23
+ * `McpServerConfig` exported from `@agent-loom/loom` (which lives in
24
+ * `src/copilot/mcp.ts`). The two shapes differ — Copilot expects a map
25
+ * keyed by name with `env` as a `Record<string, string>`; ACP expects an
26
+ * array of entries with `name` as a field and `env` as `[{name,value}]`.
27
+ * Don't try to unify them — the divergence is in the underlying protocols.
28
+ */
29
+ export interface AcpMcpServerConfig {
30
+ name: string;
31
+ command?: string;
32
+ args?: string[];
33
+ env?: Array<{
34
+ name: string;
35
+ value: string;
36
+ }>;
37
+ type?: string;
38
+ url?: string;
39
+ }
40
+ /**
41
+ * Discriminated update surfaced through `onSessionUpdate`. One callback sees
42
+ * every notification -- consumers filter by `type`. Text-only consumers
43
+ * (console, headless agents) care about `'message'`; chat consumers
44
+ * switch on all variants to render tool calls, thoughts, and plans.
45
+ */
46
+ export type SessionUpdateEvent = {
47
+ type: 'message';
48
+ text: string;
49
+ } | {
50
+ type: 'thought';
51
+ text: string;
52
+ } | {
53
+ type: 'tool_call';
54
+ toolCallId: string;
55
+ title: string;
56
+ status: string;
57
+ } | {
58
+ type: 'tool_update';
59
+ toolCallId: string;
60
+ status: string;
61
+ title?: string;
62
+ } | {
63
+ type: 'plan';
64
+ entries: Array<{
65
+ content: string;
66
+ priority: string;
67
+ status: string;
68
+ }>;
69
+ };
70
+ export interface AcpClientOptions {
71
+ /** Path to an MCP config JSON file passed via `--additional-mcp-config @<path>`. */
72
+ additionalMcpConfigPath?: string;
73
+ /** Copilot CLI `--agent <id>` value. Selects the agent definition at spawn time. */
74
+ agentId?: string;
75
+ /**
76
+ * Per-protocol-call timeout in milliseconds. Applied to `initialize`,
77
+ * `newSession`, `loadSession`, and `prompt`. When a call exceeds the
78
+ * budget the returned promise rejects with `AcpTimeoutError` and the
79
+ * client is left for the caller to `dispose()`. `undefined` or `0`
80
+ * disables the timeout (default -- matches pre-0.x behaviour).
81
+ */
82
+ timeoutMs?: number;
83
+ }
84
+ /** Thrown when the child CLI exits or errors while a protocol call is in flight. */
85
+ export declare class AcpConnectionClosedError extends Error {
86
+ constructor(message: string);
87
+ }
88
+ /** Thrown when a protocol call exceeds its `timeoutMs` budget. */
89
+ export declare class AcpTimeoutError extends Error {
90
+ constructor(message: string);
91
+ }
92
+ /**
93
+ * Drives an Agent Client Protocol (ACP) compatible CLI (e.g. `copilot --acp`)
94
+ * over stdio. Owns the child process, the JSON-RPC connection, and per-session
95
+ * state. One `AcpClient` instance = one child process; create multiple clients
96
+ * to run multiple CLIs in parallel.
97
+ *
98
+ * **Security posture (interim):** the client currently advertises
99
+ * `fs.readTextFile` / `fs.writeTextFile` capabilities unconditionally and
100
+ * auto-allows every `requestPermission`. This is safe for the trusted
101
+ * consumers shipping today (in-tree CLIs and the smoke script) but will not
102
+ * generalise. A pluggable `AcpClientOptions.policy` surface is being designed
103
+ * in serverless-paas-balam/loom#64 and will replace these defaults once the
104
+ * first external consumer lands.
105
+ *
106
+ * Typical flow:
107
+ * const client = new AcpClient('copilot', { agentId: 'my-agent' });
108
+ * await client.connect();
109
+ * const session = await client.newSession('my-agent', cwd, mcpServers);
110
+ * const unsubscribe = client.onSessionUpdate(session.sessionId, (u) => {
111
+ * if (u.type === 'message') process.stdout.write(u.text);
112
+ * });
113
+ * await client.prompt(session.sessionId, 'Investigate X');
114
+ * unsubscribe();
115
+ * client.dispose();
116
+ */
117
+ export declare class AcpClient {
118
+ private process;
119
+ private connection;
120
+ private sessions;
121
+ /** Per-session subscribers for full session update events. */
122
+ private updateSubscribers;
123
+ /**
124
+ * Tracks in-flight protocol calls (`connect`, `newSession`, `loadSession`,
125
+ * `prompt`) so we can reject them if the child process exits or errors
126
+ * before they complete. Without this, any caller awaiting the promise
127
+ * hangs forever on crash.
128
+ */
129
+ private inFlight;
130
+ private _isClosed;
131
+ private cliBin;
132
+ private opts;
133
+ /**
134
+ * @param cliBin Path or command name of the ACP-capable CLI (e.g. `copilot`).
135
+ * @param opts Constructor options. For back-compat a bare string in the
136
+ * second position is treated as `additionalMcpConfigPath`.
137
+ */
138
+ constructor(cliBin: string, opts?: AcpClientOptions | string);
139
+ get isClosed(): boolean;
140
+ /**
141
+ * Spawn the CLI with `--acp`, wire up the ACP JSON-RPC stream, and complete
142
+ * protocol initialization. Must be called before any session operation.
143
+ * Throws if the client has already connected or been disposed -- one
144
+ * `AcpClient` instance owns exactly one child process for its lifetime.
145
+ */
146
+ connect(): Promise<void>;
147
+ /** Create a new session rooted at `cwd` with the given MCP servers. */
148
+ newSession(agentId: string, cwd: string, mcpServers: AcpMcpServerConfig[]): Promise<SpecialistSession>;
149
+ /**
150
+ * Resume an existing CLI session by ID. Requires `loadSession` capability.
151
+ * Throws on failure -- callers should fall back to `newSession()`.
152
+ */
153
+ loadSession(sessionId: string, agentId: string, cwd: string, mcpServers: AcpMcpServerConfig[]): Promise<SpecialistSession>;
154
+ /**
155
+ * Send a prompt to an existing session and block until the turn completes.
156
+ * Live deltas arrive via `onSessionUpdate` subscribers during the await.
157
+ * Rejects with `AcpConnectionClosedError` if the child exits mid-turn.
158
+ */
159
+ prompt(sessionId: string, text: string): Promise<SpecialistSession>;
160
+ /** Cancel an in-flight prompt on the given session. Safe if already closed. */
161
+ cancelSession(sessionId: string): Promise<void>;
162
+ getSession(sessionId: string): SpecialistSession | undefined;
163
+ /**
164
+ * Subscribe to all session updates (message/thought chunks, tool calls,
165
+ * plans) for one session. Consumers filter by `event.type`.
166
+ */
167
+ onSessionUpdate(sessionId: string, cb: (event: SessionUpdateEvent) => void): () => void;
168
+ /** Kill the child process and release all state. Idempotent. */
169
+ dispose(): void;
170
+ /**
171
+ * Wrap a protocol promise so that if the child process ends before it
172
+ * settles, the returned promise rejects instead of hanging. When
173
+ * `opts.timeoutMs` is set, also rejects with `AcpTimeoutError` after the
174
+ * configured budget.
175
+ */
176
+ private withInFlight;
177
+ /** Invoked on child exit, process error, or ACP stream close. Idempotent. */
178
+ private handleProcessEnd;
179
+ private emit;
180
+ private createClient;
181
+ }
182
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/acp/client.ts"],"names":[],"mappings":"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"}