@openspoon/subtask2 0.2.5 → 0.2.7

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 CHANGED
@@ -1,16 +1,29 @@
1
- ![subtask2 header](media/header.webp)
1
+ ## A stronger opencode /command handler
2
+
3
+ Subtask2 extends opencode commands into a powerful orchestration system. Instead of giving you an opinionated monster like some plugins do, it lets you easily build your own (but simple is fine too).
4
+
5
+ ![citation](media/quote.webp)
2
6
 
3
- # A stronger opencode /command handler
7
+ ### TL:DR - Less entropic agentic loop, more control
4
8
 
5
- ### TL:DR - More agency, control and capabilities for commands
9
+ This plugin allows your `/commands` to:
6
10
 
7
- This plugin affects how opencode handles slash commands with additional frontmatter parameters and enables chaining as well as parallel command execution. It's simple to use and designed to allow better orchestration, steerability and lifespan of the agentic loop. Compose as simple or complex a workflow as you want. If you already know how opencode commands work, you'll be right at home.
11
+ - Queue-up `prompts` or other `/commands` and `subagents` with arguments
12
+ - Parallelize the parts you want
13
+ - Pass session context to subagents
14
+ - Steer the agentic flow from start to finish
15
+
16
+ If you already know opencode commands, you'll be right at home.
17
+
18
+ ![subtask2 header](media/header.webp)
19
+ `@openspoon/subtask2@latest`
8
20
 
9
21
  ### Key features
10
22
 
11
23
  - `return` instruct main session on **command/subtask(s)** result - _can be chained, supports /commands_
12
24
  - `parallel` run subtasks concurrently - _pending PR merge ⚠️_
13
25
  - `arguments` pass arguments with command frontmatter or `||` message pipe
26
+ - `$TURN[n]` pipe the last N conversation turns into your command
14
27
 
15
28
  Requires [this PR](https://github.com/sst/opencode/pull/6478) for `parallel` features, as well as proper model inheritance (piping the right model and agent to the right subtask and back) to work.
16
29
 
@@ -56,32 +69,36 @@ Design the auth system for $ARGUMENTS
56
69
  By default, opencode injects a user message after a `subtask: true` completes, asking the model to "summarize the task tool output..." - Subtask2 replaces that message with the `return` prompt
57
70
 
58
71
  - **First** `return` replaces opencode's "summarize" message or fires as a follow-up
59
- - **Any additional** `return` fire sequentially after each LLM turn completes
72
+ - **Any additional** `return` fire sequentially after each LLM turn completes - _accepts /commands_
60
73
  - **Commands** (starting with `/`) are executed as full commands with their own `parallel` and `return`
61
74
 
75
+ **Note:** The first `return` of a `subtask: true` command cannot be a slash command as it subsitutes the opencode injected message (as a string)
76
+
62
77
  ### 2. `parallel` - Run multiple subtasks concurrently ⚠️ **PENDING PR**
63
78
 
64
79
  Spawn additional command subtasks alongside the main one:
65
80
 
81
+ `plan.md`
82
+
66
83
  ```yaml
67
84
  subtask: true
68
85
  parallel:
69
- - /security-review
70
- - /perf-review
86
+ - /plan-gemini
87
+ - /plan-opus
71
88
  return:
72
- - Synthesize all review results and create a unified action plan
73
- - Critically review the plan directly against the codebase, then revise or implement
89
+ - Compare and challenge the plans, keep the best bits and make a unified proposal
90
+ - Critically review the plan directly against what reddit has to say about it
74
91
  ---
75
- Review this code for correctness.
92
+ Plan a trip to $ARGUMENTS.
76
93
  ```
77
94
 
78
95
  This runs 3 subtasks in parallel:
79
96
 
80
- 1. The main command (correctness review)
81
- 2. `security-review` command
82
- 3. `perf-review` command
97
+ 1. The main command (`plan.md`)
98
+ 2. `plan-gemini`
99
+ 3. `plan-opus`
83
100
 
84
- When ALL complete, the main session gets the `return` prompt of the main command
101
+ When ALL complete, the main session receives the `return` prompt of the main command
85
102
 
86
103
  ### With custom arguments per command
87
104
 
@@ -144,6 +161,53 @@ Configure in `~/.config/opencode/subtask2.jsonc`:
144
161
 
145
162
  #### Priority: `return` param > config `generic_return` > built-in default > opencode original
146
163
 
164
+ ### 4. `$TURN[n]` - Reference previous conversation turns
165
+
166
+ Use `$TURN[n]` to inject the last N conversation turns (user + assistant messages) into your command. This is powerful for commands that need context from the ongoing conversation.
167
+
168
+ ```yaml
169
+ ---
170
+ description: summarize our conversation so far
171
+ subtask: true
172
+ ---
173
+ Review the following conversation and provide a concise summary:
174
+
175
+ $TURN[10]
176
+ ```
177
+
178
+ **Usage in arguments:**
179
+
180
+ ```bash
181
+ /my-command analyze this $TURN[5]
182
+ ```
183
+
184
+ **Syntax:**
185
+
186
+ - `$TURN[12]` - last 12 messages (turns, not parts)
187
+ - `$TURN[:3]` - just the 3rd message from the end
188
+ - `$TURN[:2:5:8]` - specific messages at indices 2, 5, and 8 from the end
189
+
190
+ **Format output:**
191
+
192
+ ```
193
+ --- USER ---
194
+ What's the best way to implement auth?
195
+
196
+ --- ASSISTANT ---
197
+ I'd recommend using JWT tokens with...
198
+
199
+ --- USER ---
200
+ Can you show me an example?
201
+ ...
202
+ ```
203
+
204
+ Works in:
205
+
206
+ - Command body templates
207
+ - Command arguments
208
+ - Parallel command prompts
209
+ - Piped arguments (`||`)
210
+
147
211
  </details>
148
212
 
149
213
  <details>
@@ -260,16 +324,18 @@ say the word "$ARGUMENTS" 3 times
260
324
 
261
325
  </details>
262
326
 
263
- ---
264
-
327
+ <details>
328
+ <summary><strong>Installation</strong></summary>
265
329
  To install, add subtask2 to your opencode config plugin array
266
330
 
267
331
  ```json
268
332
  {
269
- "plugins": ["@openspoon/subtask2"]
333
+ "plugins": ["@openspoon/subtask2@latest"]
270
334
  }
271
335
  ```
272
336
 
337
+ </details>
338
+
273
339
  ---
274
340
 
275
341
  ![Watch demo](media/demo.gif)
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,qBAAqB,CAAC;AAiHhD,QAAA,MAAM,MAAM,EAAE,MAuUb,CAAC;AAEF,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,qBAAqB,CAAC;AAiRhD,QAAA,MAAM,MAAM,EAAE,MAkSb,CAAC;AAEF,eAAe,MAAM,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { loadConfig, DEFAULT_PROMPT } from "./src/config";
2
- import { parseFrontmatter, getTemplateBody, parseParallelConfig, } from "./src/parser";
3
- import { loadCommandFile, buildManifest } from "./src/commands";
2
+ import { parseFrontmatter, getTemplateBody, parseParallelConfig, extractTurnReferences, hasTurnReferences, replaceTurnReferences, } from "./src/parser";
3
+ import { loadCommandFile, buildManifest, getConfig } from "./src/commands";
4
4
  import { log, clearLog } from "./src/logger";
5
5
  // Session state
6
6
  let configs = {};
@@ -14,8 +14,142 @@ const pipedArgsQueue = new Map();
14
14
  const returnArgsState = pipedArgsQueue; // alias for backward compat
15
15
  const sessionMainCommand = new Map();
16
16
  const executedReturns = new Set();
17
+ // Track the first return prompt per session (replaces "Summarize..." in $SESSION)
18
+ const firstReturnPrompt = new Map();
19
+ // Track parent session for commands called via executeReturn
20
+ // Simple variable: set before command call, used by tool.execute.before
21
+ let pendingParentSession = null;
17
22
  let hasActiveSubtask = false;
18
23
  const OPENCODE_GENERIC = "Summarize the task tool output above and continue with your task.";
24
+ /**
25
+ * Fetch and format session messages
26
+ * @param sessionID - The session to fetch from
27
+ * @param lastN - Get the last N messages (optional)
28
+ * @param specificIndices - Get specific messages by index from end, 1-based (optional)
29
+ */
30
+ async function fetchSessionMessages(sessionID, lastN, specificIndices) {
31
+ if (!client) {
32
+ log("fetchSessionMessages: no client available");
33
+ return "[TURN: client not available]";
34
+ }
35
+ try {
36
+ const result = await client.session.messages({
37
+ path: { id: sessionID },
38
+ });
39
+ const messages = result.data;
40
+ log(`fetchSessionMessages: got ${messages?.length ?? 0} messages from ${sessionID}`);
41
+ if (!messages?.length) {
42
+ return "[TURN: no messages found]";
43
+ }
44
+ // Log all messages for debugging
45
+ log(`All messages:`, messages.map((m, i) => ({
46
+ idx: i,
47
+ role: m.info.role,
48
+ partsCount: m.parts?.length,
49
+ textParts: m.parts?.filter((p) => p.type === 'text').map((p) => p.text?.substring(0, 30))
50
+ })));
51
+ // Filter out trailing empty messages (from current command being initiated)
52
+ let effectiveMessages = messages;
53
+ while (effectiveMessages.length > 0) {
54
+ const last = effectiveMessages[effectiveMessages.length - 1];
55
+ const hasContent = last.parts?.some((p) => (p.type === "text" && p.text?.trim()) ||
56
+ (p.type === "tool" && p.state?.status === "completed" && p.state?.output));
57
+ if (!hasContent) {
58
+ effectiveMessages = effectiveMessages.slice(0, -1);
59
+ }
60
+ else {
61
+ break;
62
+ }
63
+ }
64
+ log(`After filtering empty trailing messages: ${effectiveMessages.length} (was ${messages.length})`);
65
+ // Select messages based on mode
66
+ let selectedMessages;
67
+ if (specificIndices && specificIndices.length > 0) {
68
+ // Specific indices mode: $TURN[:2:5:8] - indices are 1-based from end
69
+ selectedMessages = specificIndices
70
+ .map(idx => effectiveMessages[effectiveMessages.length - idx])
71
+ .filter(Boolean);
72
+ log(`Using specific indices [${specificIndices.join(',')}] -> ${selectedMessages.length} messages`);
73
+ }
74
+ else if (lastN) {
75
+ // Last N mode: $TURN[5]
76
+ selectedMessages = effectiveMessages.slice(-lastN);
77
+ log(`Using last ${lastN} messages`);
78
+ }
79
+ else {
80
+ selectedMessages = effectiveMessages;
81
+ log(`Using all ${selectedMessages.length} messages`);
82
+ }
83
+ // Format each message with its parts
84
+ const formatted = selectedMessages.map((msg) => {
85
+ const role = msg.info.role.toUpperCase();
86
+ const parts = [];
87
+ for (const part of msg.parts) {
88
+ if (part.type === "text" && part.text) {
89
+ // Replace the generic opencode summarize prompt with our first return prompt
90
+ if (part.text.startsWith("Summarize the task tool output")) {
91
+ const replacement = firstReturnPrompt.get(sessionID);
92
+ if (replacement) {
93
+ parts.push(replacement);
94
+ }
95
+ // If no replacement, skip it entirely
96
+ continue;
97
+ }
98
+ parts.push(part.text);
99
+ }
100
+ else if (part.type === "tool" && part.state?.status === "completed") {
101
+ // Include completed tool results (especially task tool for subtask content)
102
+ const toolName = part.tool;
103
+ let output = part.state.output;
104
+ if (output && typeof output === "string") {
105
+ // Strip <task_metadata> tags from task tool output
106
+ output = output.replace(/<task_metadata>[\s\S]*?<\/task_metadata>/g, "").trim();
107
+ if (output && output.length < 2000) {
108
+ // For task tool, just include the content directly (it's the subtask's response)
109
+ if (toolName === "task") {
110
+ parts.push(output);
111
+ }
112
+ else {
113
+ parts.push(`[Tool: ${toolName}]\n${output}`);
114
+ }
115
+ }
116
+ }
117
+ }
118
+ }
119
+ return `--- ${role} ---\n${parts.join("\n")}`;
120
+ });
121
+ return formatted.join("\n\n");
122
+ }
123
+ catch (e) {
124
+ log("fetchSessionMessages error:", e);
125
+ return `[TURN: error fetching messages - ${e}]`;
126
+ }
127
+ }
128
+ /**
129
+ * Process a string and replace all $TURN references with actual session content
130
+ */
131
+ async function resolveTurnReferences(text, sessionID) {
132
+ if (!hasTurnReferences(text)) {
133
+ return text;
134
+ }
135
+ const refs = extractTurnReferences(text);
136
+ if (!refs.length)
137
+ return text;
138
+ const replacements = new Map();
139
+ for (const ref of refs) {
140
+ if (ref.type === "lastN") {
141
+ const content = await fetchSessionMessages(sessionID, ref.count);
142
+ replacements.set(ref.match, content);
143
+ log(`Resolved ${ref.match}: ${content.length} chars`);
144
+ }
145
+ else if (ref.type === "specific") {
146
+ const content = await fetchSessionMessages(sessionID, undefined, ref.indices);
147
+ replacements.set(ref.match, content);
148
+ log(`Resolved ${ref.match}: ${content.length} chars`);
149
+ }
150
+ }
151
+ return replaceTurnReferences(text, replacements);
152
+ }
19
153
  async function flattenParallels(parallels, mainArgs, sessionID, visited = new Set(), depth = 0, maxDepth = 5) {
20
154
  if (depth > maxDepth)
21
155
  return [];
@@ -42,6 +176,11 @@ async function flattenParallels(parallels, mainArgs, sessionID, visited = new Se
42
176
  const args = pipeArg ?? parallelCmd.arguments ?? mainArgs;
43
177
  log(`Parallel ${parallelCmd.command}: using args="${args}" (pipeArg=${pipeArg}, fmArg=${parallelCmd.arguments}, mainArgs=${mainArgs})`);
44
178
  template = template.replace(/\$ARGUMENTS/g, args);
179
+ // Resolve $SESSION[n] references in the template
180
+ if (hasTurnReferences(template)) {
181
+ template = await resolveTurnReferences(template, sessionID);
182
+ log(`Parallel ${parallelCmd.command}: resolved $SESSION refs`);
183
+ }
45
184
  // Parse model string "provider/model" into {providerID, modelID}
46
185
  let model;
47
186
  if (typeof fm.model === "string" && fm.model.includes("/")) {
@@ -69,66 +208,51 @@ async function flattenParallels(parallels, mainArgs, sessionID, visited = new Se
69
208
  return parts;
70
209
  }
71
210
  const plugin = async (ctx) => {
211
+ clearLog();
72
212
  configs = await buildManifest();
73
213
  pluginConfig = await loadConfig();
74
214
  client = ctx.client;
75
- clearLog();
76
- log("Plugin initialized, configs:", Object.keys(configs));
215
+ const allKeys = Object.keys(configs);
216
+ const uniqueCmds = allKeys.filter(k => !k.includes('/'));
217
+ log(`Plugin initialized: ${uniqueCmds.length} commands`, uniqueCmds);
77
218
  // Helper to execute a return item (command or prompt)
78
219
  async function executeReturn(item, sessionID) {
79
- log(`executeReturn called: item=${item}, sessionID=${sessionID}`);
80
220
  // Dedup check to prevent double execution
81
221
  const key = `${sessionID}:${item}`;
82
- if (executedReturns.has(key)) {
83
- log(`executeReturn skipped (already executed): ${key}`);
222
+ if (executedReturns.has(key))
84
223
  return;
85
- }
86
224
  executedReturns.add(key);
87
225
  if (item.startsWith("/")) {
88
- // Parse /command args syntax
89
226
  const [cmdName, ...argParts] = item.slice(1).split(/\s+/);
90
227
  let args = argParts.join(" ");
91
- const inlineArgs = args;
92
- // Log the chained command's frontmatter
93
- if (configs[cmdName]) {
94
- log(`executeReturn: chained command "${cmdName}" config:`, {
95
- return: configs[cmdName].return,
96
- parallel: configs[cmdName].parallel,
97
- agent: configs[cmdName].agent,
98
- description: configs[cmdName].description,
99
- });
100
- }
101
- else {
102
- log(`executeReturn: command "${cmdName}" not found in configs`);
103
- }
228
+ // Find the path key for this command (OpenCode needs full path for subfolder commands)
229
+ const allKeys = Object.keys(configs);
230
+ const pathKey = allKeys.find(k => k.includes('/') && k.endsWith('/' + cmdName)) || cmdName;
104
231
  // Check if we have piped args for this return command
105
232
  const returnArgs = returnArgsState.get(sessionID);
106
- log(`executeReturn /command: cmdName=${cmdName}, inlineArgs="${inlineArgs}", returnArgsState=`, returnArgs);
107
233
  if (returnArgs?.length) {
108
234
  const pipeArg = returnArgs.shift();
109
235
  if (!returnArgs.length)
110
236
  returnArgsState.delete(sessionID);
111
237
  if (pipeArg)
112
238
  args = pipeArg;
113
- log(`executeReturn: using pipeArg="${pipeArg}" instead of inlineArgs`);
114
239
  }
115
- log(`executeReturn: final args="${args}"`);
116
- // Update main command to this chained command so its own return is processed
117
- log(`executeReturn: setting mainCmd to ${cmdName} for session ${sessionID}`);
118
- sessionMainCommand.set(sessionID, cmdName);
240
+ log(`executeReturn: /${cmdName} -> ${pathKey} args="${args}" (parent=${sessionID})`);
241
+ sessionMainCommand.set(sessionID, pathKey);
242
+ // Set parent session for $SESSION resolution - will be consumed by tool.execute.before
243
+ pendingParentSession = sessionID;
119
244
  try {
120
245
  await client.session.command({
121
246
  path: { id: sessionID },
122
- body: { command: cmdName, arguments: args || "" },
247
+ body: { command: pathKey, arguments: args || "" },
123
248
  });
124
- log(`executeReturn: command ${cmdName} completed`);
125
249
  }
126
250
  catch (e) {
127
- log(`executeReturn: command ${cmdName} FAILED:`, e);
251
+ log(`executeReturn FAILED: ${pathKey}`, e);
128
252
  }
129
253
  }
130
254
  else {
131
- log(`executeReturn: sending prompt: ${item.substring(0, 50)}...`);
255
+ log(`executeReturn: prompt "${item.substring(0, 40)}..."`);
132
256
  await client.session.promptAsync({
133
257
  path: { id: sessionID },
134
258
  body: { parts: [{ type: "text", text: item }] },
@@ -138,26 +262,46 @@ const plugin = async (ctx) => {
138
262
  return {
139
263
  "command.execute.before": async (input, output) => {
140
264
  const cmd = input.command;
141
- const config = configs[cmd];
265
+ const config = getConfig(configs, cmd);
142
266
  sessionMainCommand.set(input.sessionID, cmd);
143
- log(`command.execute.before: cmd=${cmd}, sessionID=${input.sessionID}, hasConfig=${!!config}`);
267
+ log(`cmd.before: ${cmd}`, config ? {
268
+ return: config.return,
269
+ parallel: config.parallel.map(p => p.command),
270
+ agent: config.agent
271
+ } : "no config");
144
272
  // Parse pipe-separated arguments: main || arg1 || arg2 || arg3 ...
145
273
  const argSegments = input.arguments.split("||").map((s) => s.trim());
146
- const mainArgs = argSegments[0] || "";
147
- // Store ALL piped args (after main) in a shared queue
274
+ let mainArgs = argSegments[0] || "";
148
275
  const allPipedArgs = argSegments.slice(1);
149
- log(`Pipe args parsing:`, {
150
- fullArgs: input.arguments,
151
- argSegments,
152
- mainArgs,
153
- allPipedArgs,
154
- configParallel: config?.parallel,
155
- configReturn: config?.return,
156
- });
157
276
  // Store piped args for consumption by parallels and return commands
158
277
  if (allPipedArgs.length) {
159
278
  pipedArgsQueue.set(input.sessionID, allPipedArgs);
160
- log(`Stored pipedArgsQueue for session ${input.sessionID}:`, allPipedArgs);
279
+ }
280
+ // Resolve $SESSION[n] references in mainArgs
281
+ if (hasTurnReferences(mainArgs)) {
282
+ mainArgs = await resolveTurnReferences(mainArgs, input.sessionID);
283
+ log(`Resolved $SESSION in mainArgs: ${mainArgs.length} chars`);
284
+ }
285
+ // Resolve $SESSION[n] references in output parts
286
+ log(`Processing ${output.parts.length} parts for $SESSION refs`);
287
+ for (const part of output.parts) {
288
+ log(`Part type=${part.type}, hasPrompt=${!!part.prompt}, hasText=${!!part.text}`);
289
+ if (part.type === "subtask" && part.prompt) {
290
+ log(`Subtask prompt (first 200): ${part.prompt.substring(0, 200)}`);
291
+ if (hasTurnReferences(part.prompt)) {
292
+ log(`Found $SESSION in subtask prompt, resolving...`);
293
+ part.prompt = await resolveTurnReferences(part.prompt, input.sessionID);
294
+ log(`Resolved subtask prompt (first 200): ${part.prompt.substring(0, 200)}`);
295
+ }
296
+ }
297
+ if (part.type === "text" && part.text) {
298
+ log(`Text part (first 200): ${part.text.substring(0, 200)}`);
299
+ if (hasTurnReferences(part.text)) {
300
+ log(`Found $SESSION in text part, resolving...`);
301
+ part.text = await resolveTurnReferences(part.text, input.sessionID);
302
+ log(`Resolved text part (first 200): ${part.text.substring(0, 200)}`);
303
+ }
304
+ }
161
305
  }
162
306
  // Fix main command's parts to use only mainArgs (not the full pipe string)
163
307
  if (argSegments.length > 1) {
@@ -187,22 +331,16 @@ const plugin = async (ctx) => {
187
331
  hasActiveSubtask = true;
188
332
  const cmd = output.args?.command;
189
333
  const prompt = output.args?.prompt;
334
+ const description = output.args?.description;
190
335
  let mainCmd = sessionMainCommand.get(input.sessionID);
336
+ log(`tool.before: callID=${input.callID}, cmd=${cmd}, desc="${description?.substring(0, 30)}", mainCmd=${mainCmd}`);
191
337
  // If mainCmd is not set (command.execute.before didn't fire - no PR),
192
338
  // set the first subtask command as the main command
193
- if (!mainCmd && cmd && configs[cmd]) {
339
+ if (!mainCmd && cmd && getConfig(configs, cmd)) {
194
340
  sessionMainCommand.set(input.sessionID, cmd);
195
341
  mainCmd = cmd;
196
- log(`tool.execute.before: no mainCmd set, setting to ${cmd} (fallback for non-PR)`);
197
- // Log the command's frontmatter for debugging
198
- log(`Command ${cmd} config:`, {
199
- return: configs[cmd].return,
200
- parallel: configs[cmd].parallel,
201
- agent: configs[cmd].agent,
202
- description: configs[cmd].description,
203
- });
342
+ const cmdConfig = getConfig(configs, cmd);
204
343
  // Parse piped args from prompt if present (fallback for non-PR)
205
- // The prompt may contain "|| arg2 || arg3" if pipes were used
206
344
  if (prompt && prompt.includes("||")) {
207
345
  const pipeMatch = prompt.match(/\|\|(.+)/);
208
346
  if (pipeMatch) {
@@ -210,38 +348,39 @@ const plugin = async (ctx) => {
210
348
  const pipedArgs = pipedPart.split("||").map((s) => s.trim()).filter(Boolean);
211
349
  if (pipedArgs.length) {
212
350
  pipedArgsQueue.set(input.sessionID, pipedArgs);
213
- log(`Parsed piped args from prompt (fallback):`, pipedArgs);
214
- // Also fix the prompt to remove the piped args portion
215
- const cleanPrompt = prompt.replace(/\s*\|\|.+$/, "").trim();
216
- output.args.prompt = cleanPrompt;
217
- log(`Cleaned prompt: "${cleanPrompt.substring(0, 100)}..."`);
351
+ output.args.prompt = prompt.replace(/\s*\|\|.+$/, "").trim();
218
352
  }
219
353
  }
220
354
  }
221
355
  // Also set up return state since command.execute.before didn't run
222
- if (configs[cmd].return.length > 1) {
223
- returnState.set(input.sessionID, [...configs[cmd].return.slice(1)]);
356
+ // Only do this once per session
357
+ if (cmdConfig.return.length > 0 && !returnState.has(input.sessionID)) {
358
+ // Store the first return prompt (replaces "Summarize..." in $SESSION)
359
+ firstReturnPrompt.set(input.sessionID, cmdConfig.return[0]);
360
+ if (cmdConfig.return.length > 1) {
361
+ returnState.set(input.sessionID, [...cmdConfig.return.slice(1)]);
362
+ log(`Set returnState: ${cmdConfig.return.slice(1).length} items`);
363
+ }
224
364
  }
225
365
  }
226
- log(`tool.execute.before: cmd=${cmd}, mainCmd=${mainCmd}, sessionID=${input.sessionID}`);
227
- log(`tool.execute.before: prompt preview: "${(prompt || "").substring(0, 150)}..."`);
228
- log(`tool.execute.before: output.args:`, output.args);
229
- if (cmd && configs[cmd]) {
230
- // Log command frontmatter for all commands passing through
231
- if (cmd !== mainCmd) {
232
- log(`tool.execute.before: command "${cmd}" config:`, {
233
- return: configs[cmd].return,
234
- parallel: configs[cmd].parallel,
235
- agent: configs[cmd].agent,
236
- description: configs[cmd].description,
237
- });
238
- }
366
+ // Resolve $SESSION[n] in the prompt for ANY subtask
367
+ // Use parent session if this command was triggered via executeReturn
368
+ if (prompt && hasTurnReferences(prompt)) {
369
+ const resolveFromSession = pendingParentSession || input.sessionID;
370
+ log(`tool.execute.before: resolving $SESSION in prompt (from ${pendingParentSession ? 'parent' : 'current'} session ${resolveFromSession})`);
371
+ output.args.prompt = await resolveTurnReferences(prompt, resolveFromSession);
372
+ log(`tool.execute.before: resolved prompt (${output.args.prompt.length} chars)`);
373
+ // Clear after use
374
+ pendingParentSession = null;
375
+ }
376
+ if (cmd && getConfig(configs, cmd)) {
377
+ const cmdConfig = getConfig(configs, cmd);
239
378
  if (cmd === mainCmd) {
240
379
  pendingNonSubtaskReturns.delete(input.sessionID);
241
380
  }
242
381
  callState.set(input.callID, cmd);
243
- if (cmd === mainCmd && configs[cmd].return.length > 1) {
244
- returnState.set(input.sessionID, [...configs[cmd].return.slice(1)]);
382
+ if (cmd === mainCmd && cmdConfig.return.length > 1) {
383
+ returnState.set(input.sessionID, [...cmdConfig.return.slice(1)]);
245
384
  }
246
385
  }
247
386
  },
@@ -249,51 +388,56 @@ const plugin = async (ctx) => {
249
388
  if (input.tool !== "task")
250
389
  return;
251
390
  const cmd = callState.get(input.callID);
391
+ log(`tool.after: callID=${input.callID}, cmd=${cmd}, wasTracked=${!!cmd}`);
392
+ if (!cmd) {
393
+ // Already processed or not our command
394
+ return;
395
+ }
252
396
  callState.delete(input.callID);
253
397
  const mainCmd = sessionMainCommand.get(input.sessionID);
254
- log(`tool.execute.after: cmd=${cmd}, mainCmd=${mainCmd}, hasReturn=${!!(cmd && configs[cmd]?.return?.length)}`);
255
- if (cmd && cmd === mainCmd && configs[cmd]?.return?.length) {
256
- log(`Setting pendingReturn for session ${input.sessionID}: ${configs[cmd].return[0]}`);
257
- pendingReturns.set(input.sessionID, configs[cmd].return[0]);
398
+ const cmdConfig = cmd ? getConfig(configs, cmd) : undefined;
399
+ log(`tool.after: cmd=${cmd}, mainCmd=${mainCmd}, isMain=${cmd === mainCmd}, hasReturn=${!!cmdConfig?.return?.length}`);
400
+ if (cmd && cmd === mainCmd && cmdConfig?.return?.length) {
401
+ // Only set pendingReturn if we haven't already
402
+ if (!pendingReturns.has(input.sessionID)) {
403
+ log(`Setting pendingReturn: ${cmdConfig.return[0].substring(0, 50)}...`);
404
+ pendingReturns.set(input.sessionID, cmdConfig.return[0]);
405
+ }
406
+ else {
407
+ log(`Skipping pendingReturn - already set`);
408
+ }
409
+ }
410
+ else if (cmd && cmd !== mainCmd) {
411
+ log(`task.after: ${cmd} (parallel of ${mainCmd})`);
258
412
  }
259
413
  },
260
414
  "experimental.chat.messages.transform": async (input, output) => {
261
- log(`messages.transform called, pendingReturns keys:`, Array.from(pendingReturns.keys()), `message count: ${output.messages.length}`);
262
415
  // Find the LAST message with OPENCODE_GENERIC
263
416
  let lastGenericPart = null;
264
- let lastGenericMsgIndex = -1;
265
- for (let i = 0; i < output.messages.length; i++) {
266
- const msg = output.messages[i];
417
+ for (const msg of output.messages) {
267
418
  for (const part of msg.parts) {
268
419
  if (part.type === "text" && part.text === OPENCODE_GENERIC) {
269
420
  lastGenericPart = part;
270
- lastGenericMsgIndex = i;
271
421
  }
272
422
  }
273
423
  }
274
424
  if (lastGenericPart) {
275
- log(`Found LAST OPENCODE_GENERIC at msg[${lastGenericMsgIndex}]`);
276
425
  // Check for pending return
277
426
  for (const [sessionID, returnPrompt] of pendingReturns) {
278
- log(`Replacing with pendingReturn for session=${sessionID}, returnPrompt=${returnPrompt}`);
279
427
  if (returnPrompt.startsWith("/")) {
280
428
  lastGenericPart.text = "";
281
- log(`Set part.text to empty string, will execute command`);
282
429
  executeReturn(returnPrompt, sessionID).catch(console.error);
283
430
  }
284
431
  else {
285
432
  lastGenericPart.text = returnPrompt;
286
- log(`Set part.text to: "${lastGenericPart.text}", verification: ${lastGenericPart.text === returnPrompt}`);
287
433
  }
288
434
  pendingReturns.delete(sessionID);
289
435
  hasActiveSubtask = false;
290
- log(`After replacement, pendingReturns keys:`, Array.from(pendingReturns.keys()));
291
436
  return;
292
437
  }
293
438
  // No pending return found, use generic replacement if configured
294
- log(`No pendingReturn found, hasActiveSubtask=${hasActiveSubtask}`);
295
439
  if (hasActiveSubtask && pluginConfig.replace_generic) {
296
- log(`Using default replacement: ${pluginConfig.generic_return ?? DEFAULT_PROMPT}`);
440
+ log(`Using default generic replacement`);
297
441
  lastGenericPart.text = pluginConfig.generic_return ?? DEFAULT_PROMPT;
298
442
  hasActiveSubtask = false;
299
443
  return;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import type { CommandConfig } from "./types";
2
+ export declare function getConfig(configs: Record<string, CommandConfig>, cmd: string): CommandConfig | undefined;
2
3
  export declare function loadCommandFile(name: string): Promise<{
3
4
  content: string;
4
5
  path: string;
@@ -1 +1 @@
1
- {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/commands.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,SAAS,CAAC;AAG3C,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAC,GAAG,IAAI,CAAC,CA4BjD;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAkC5E"}
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/commands.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,SAAS,CAAC;AAK3C,wBAAgB,SAAS,CACvB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,EACtC,GAAG,EAAE,MAAM,GACV,aAAa,GAAG,SAAS,CAiB3B;AAED,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAC,GAAG,IAAI,CAAC,CA4BjD;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CA8C5E"}
@@ -1,5 +1,24 @@
1
1
  /// <reference types="bun-types" />
2
2
  import { parseFrontmatter, getTemplateBody, parseParallelConfig } from "./parser";
3
+ // Normalize command name - try multiple variations to find a match
4
+ export function getConfig(configs, cmd) {
5
+ // Direct match
6
+ if (configs[cmd])
7
+ return configs[cmd];
8
+ // Try filename-only (last segment of path)
9
+ const filenameOnly = cmd.split("/").pop();
10
+ if (configs[filenameOnly])
11
+ return configs[filenameOnly];
12
+ // Try with slashes replaced by hyphens
13
+ const hyphenated = cmd.replace(/\//g, "-");
14
+ if (configs[hyphenated])
15
+ return configs[hyphenated];
16
+ // Try converting hyphens back to slashes
17
+ const slashed = cmd.replace(/-/g, "/");
18
+ if (configs[slashed])
19
+ return configs[slashed];
20
+ return undefined;
21
+ }
3
22
  export async function loadCommandFile(name) {
4
23
  const home = Bun.env.HOME ?? "";
5
24
  const dirs = [
@@ -41,6 +60,7 @@ export async function buildManifest() {
41
60
  const glob = new Bun.Glob("**/*.md");
42
61
  for await (const file of glob.scan(dir)) {
43
62
  const name = file.replace(/\.md$/, "").split("/").pop();
63
+ const pathKey = file.replace(/\.md$/, "");
44
64
  const content = await Bun.file(`${dir}/${file}`).text();
45
65
  const fm = parseFrontmatter(content);
46
66
  const returnVal = fm.return;
@@ -50,16 +70,24 @@ export async function buildManifest() {
50
70
  : [returnVal]
51
71
  : [];
52
72
  const parallelArr = parseParallelConfig(fm.parallel);
53
- manifest[name] = {
73
+ const config = {
54
74
  return: returnArr,
55
75
  parallel: parallelArr,
56
76
  agent: fm.agent,
57
77
  description: fm.description,
58
78
  template: getTemplateBody(content),
59
79
  };
80
+ // Store with filename-only key
81
+ manifest[name] = config;
82
+ // Also store with full relative path for subfolder commands
83
+ if (pathKey !== name) {
84
+ manifest[pathKey] = config;
85
+ }
60
86
  }
61
87
  }
62
- catch { }
88
+ catch (e) {
89
+ // Ignore errors scanning directories that don't exist
90
+ }
63
91
  }
64
92
  return manifest;
65
93
  }
@@ -1 +1 @@
1
- {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/commands.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAGnC,OAAO,EAAC,gBAAgB,EAAE,eAAe,EAAE,mBAAmB,EAAC,MAAM,UAAU,CAAC;AAEhF,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAY;IAEZ,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;IAChC,MAAM,IAAI,GAAG;QACX,GAAG,IAAI,2BAA2B;QAClC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,oBAAoB;KAC1C,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,6CAA6C;QAC7C,MAAM,UAAU,GAAG,GAAG,GAAG,IAAI,IAAI,KAAK,CAAC;QACvC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAClC,IAAI,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;gBACxB,OAAO,EAAC,OAAO,EAAE,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAC,CAAC;YACxD,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QAEV,6BAA6B;QAC7B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC;YAC3C,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACzC,MAAM,QAAQ,GAAG,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;gBACnC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;gBAChD,OAAO,EAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAC,CAAC;YACnC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,QAAQ,GAAkC,EAAE,CAAC;IACnD,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;IAChC,MAAM,IAAI,GAAG;QACX,GAAG,IAAI,2BAA2B;QAClC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,oBAAoB;KAC1C,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACrC,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAG,CAAC;gBACzD,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;gBACxD,MAAM,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;gBACrC,MAAM,SAAS,GAAG,EAAE,CAAC,MAAM,CAAC;gBAC5B,MAAM,SAAS,GAAG,SAAS;oBACzB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;wBACxB,CAAC,CAAC,SAAS;wBACX,CAAC,CAAC,CAAC,SAAS,CAAC;oBACf,CAAC,CAAC,EAAE,CAAC;gBACP,MAAM,WAAW,GAAG,mBAAmB,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;gBAErD,QAAQ,CAAC,IAAI,CAAC,GAAG;oBACf,MAAM,EAAE,SAAS;oBACjB,QAAQ,EAAE,WAAW;oBACrB,KAAK,EAAE,EAAE,CAAC,KAA2B;oBACrC,WAAW,EAAE,EAAE,CAAC,WAAiC;oBACjD,QAAQ,EAAE,eAAe,CAAC,OAAO,CAAC;iBACnC,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/commands.ts"],"names":[],"mappings":"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"}
@@ -3,4 +3,31 @@ export declare function parseFrontmatter(content: string): Record<string, unknow
3
3
  export declare function getTemplateBody(content: string): string;
4
4
  export declare function parseParallelItem(p: unknown): ParallelCommand | null;
5
5
  export declare function parseParallelConfig(parallel: unknown): ParallelCommand[];
6
+ export type TurnReference = {
7
+ type: "lastN";
8
+ match: string;
9
+ count: number;
10
+ } | {
11
+ type: "specific";
12
+ match: string;
13
+ indices: number[];
14
+ };
15
+ /**
16
+ * Extract all $TURN references from a string
17
+ * - $TURN[n] -> last n messages
18
+ * - $TURN[:n] or $TURN[:2:5:8] -> specific indices (1-based from end)
19
+ */
20
+ export declare function extractTurnReferences(text: string): TurnReference[];
21
+ /**
22
+ * Check if text contains any $TURN references
23
+ */
24
+ export declare function hasTurnReferences(text: string): boolean;
25
+ /**
26
+ * Replace all $TURN references in text with the provided content map
27
+ */
28
+ export declare function replaceTurnReferences(text: string, replacements: Map<string, string>): string;
29
+ export declare const extractSessionReferences: typeof extractTurnReferences;
30
+ export declare const hasSessionReferences: typeof hasTurnReferences;
31
+ export declare const replaceSessionReferences: typeof replaceTurnReferences;
32
+ export type SessionReference = TurnReference;
6
33
  //# sourceMappingURL=parser.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/parser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,SAAS,CAAC;AAE7C,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAQzE;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGvD;AAGD,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,OAAO,GAAG,eAAe,GAAG,IAAI,CAcpE;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,OAAO,GAAG,eAAe,EAAE,CAexE"}
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/parser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,SAAS,CAAC;AAE7C,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAQzE;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGvD;AAGD,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,OAAO,GAAG,eAAe,GAAG,IAAI,CAcpE;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,OAAO,GAAG,eAAe,EAAE,CAexE;AAOD,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAE3D;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE,CAyBnE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,MAAM,CAMR;AAGD,eAAO,MAAM,wBAAwB,8BAAwB,CAAC;AAC9D,eAAO,MAAM,oBAAoB,0BAAoB,CAAC;AACtD,eAAO,MAAM,wBAAwB,8BAAwB,CAAC;AAC9D,MAAM,MAAM,gBAAgB,GAAG,aAAa,CAAC"}
@@ -47,4 +47,57 @@ export function parseParallelConfig(parallel) {
47
47
  }
48
48
  return [];
49
49
  }
50
+ // $TURN[n] - last n messages
51
+ // $TURN[:n] or $TURN[:n:m:o] - specific messages at indices (1-based from end)
52
+ const TURN_LAST_N_PATTERN = "\\$TURN\\[(\\d+)\\]";
53
+ const TURN_SPECIFIC_PATTERN = "\\$TURN\\[([:\\d]+)\\]";
54
+ /**
55
+ * Extract all $TURN references from a string
56
+ * - $TURN[n] -> last n messages
57
+ * - $TURN[:n] or $TURN[:2:5:8] -> specific indices (1-based from end)
58
+ */
59
+ export function extractTurnReferences(text) {
60
+ const refs = [];
61
+ // Match $TURN[...] patterns
62
+ const regex = /\$TURN\[([^\]]+)\]/g;
63
+ let match;
64
+ while ((match = regex.exec(text)) !== null) {
65
+ const inner = match[1];
66
+ if (inner.startsWith(":")) {
67
+ // Specific indices: $TURN[:2] or $TURN[:2:5:8]
68
+ const indices = inner.split(":").filter(Boolean).map(n => parseInt(n, 10));
69
+ if (indices.length > 0 && indices.every(n => !isNaN(n))) {
70
+ refs.push({ type: "specific", match: match[0], indices });
71
+ }
72
+ }
73
+ else {
74
+ // Last N: $TURN[5]
75
+ const count = parseInt(inner, 10);
76
+ if (!isNaN(count)) {
77
+ refs.push({ type: "lastN", match: match[0], count });
78
+ }
79
+ }
80
+ }
81
+ return refs;
82
+ }
83
+ /**
84
+ * Check if text contains any $TURN references
85
+ */
86
+ export function hasTurnReferences(text) {
87
+ return /\$TURN\[[^\]]+\]/.test(text);
88
+ }
89
+ /**
90
+ * Replace all $TURN references in text with the provided content map
91
+ */
92
+ export function replaceTurnReferences(text, replacements) {
93
+ let result = text;
94
+ for (const [pattern, replacement] of replacements) {
95
+ result = result.replaceAll(pattern, replacement);
96
+ }
97
+ return result;
98
+ }
99
+ // Keep old names as aliases for backward compat during transition
100
+ export const extractSessionReferences = extractTurnReferences;
101
+ export const hasSessionReferences = hasTurnReferences;
102
+ export const replaceSessionReferences = replaceTurnReferences;
50
103
  //# sourceMappingURL=parser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/parser.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACrD,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAC/D,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AAClD,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,iBAAiB,CAAC,CAAU;IAC1C,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACzB,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,6BAA6B;YAC7B,MAAM,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC7D,OAAO,EAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,SAAS,EAAC,CAAC;QACxE,CAAC;QACD,OAAO,EAAC,OAAO,EAAE,OAAO,EAAC,CAAC;IAC5B,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAK,CAAS,CAAC,OAAO,EAAE,CAAC;QAC9D,OAAO,EAAC,OAAO,EAAG,CAAS,CAAC,OAAO,EAAE,SAAS,EAAG,CAAS,CAAC,SAAS,EAAC,CAAC;IACxE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAiB;IACnD,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IACzB,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,OAAO,QAAQ;aACZ,GAAG,CAAC,iBAAiB,CAAC;aACtB,MAAM,CAAC,CAAC,CAAC,EAAwB,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IACrD,CAAC;IACD,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,6BAA6B;QAC7B,OAAO,QAAQ;aACZ,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,iBAAiB,CAAC;aACtB,MAAM,CAAC,CAAC,CAAC,EAAwB,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC"}
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/parser.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "@openspoon/subtask2",
4
- "version": "0.2.5",
4
+ "version": "0.2.7",
5
5
  "type": "module",
6
6
  "description": "Opencode plugin for enhanced subtask control with return context and prompt chaining",
7
7
  "main": "./dist/index.js",