@ekroon/opencode-copilot-instructions 0.3.0 → 0.3.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAsCjD,eAAO,MAAM,yBAAyB,EAAE,MAoMvC,CAAA;AAGD,eAAe,yBAAyB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAuCjD,eAAO,MAAM,yBAAyB,EAAE,MAiLvC,CAAA;AAGD,eAAe,yBAAyB,CAAA"}
package/dist/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import * as path from 'node:path';
2
- import { loadRepoInstructions, loadPathInstructions } from './loader.js';
2
+ import { loadRepoInstructions, loadPathInstructions } from './loader';
3
+ import { SessionState } from './session-state';
3
4
  /**
4
5
  * Convert an absolute path to a relative path from the given directory.
5
6
  * If the path is already relative, returns it as-is.
@@ -65,14 +66,8 @@ export const CopilotInstructionsPlugin = async (ctx) => {
65
66
  if (!repoInstructions && pathInstructions.length === 0) {
66
67
  log('No Copilot instructions found');
67
68
  }
68
- // Track injected instructions per session
69
- // Map<sessionID, Set<instructionFile>>
70
- const injectedPerSession = new Map();
71
- // Track sessions where we've injected repo instructions
72
- const repoInstructionsInjected = new Set();
73
- // Track pending instructions to inject per tool call
74
- // Map<callID, instructionText>
75
- const pendingInstructions = new Map();
69
+ // Encapsulated state management
70
+ const state = new SessionState();
76
71
  return {
77
72
  // Listen for session.created events to inject repo-wide instructions
78
73
  event: async ({ event }) => {
@@ -85,8 +80,8 @@ export const CopilotInstructionsPlugin = async (ctx) => {
85
80
  // Session ID is in event.properties.info.id
86
81
  const sessionId = event.properties?.info?.id;
87
82
  log(`Extracted sessionId: ${sessionId}`, 'debug');
88
- if (sessionId && !repoInstructionsInjected.has(sessionId)) {
89
- repoInstructionsInjected.add(sessionId);
83
+ if (sessionId && !state.hasRepoInstructions(sessionId)) {
84
+ state.markRepoInstructionsInjected(sessionId);
90
85
  log(`Injecting repo instructions into session ${sessionId}`);
91
86
  try {
92
87
  await client.session.prompt({
@@ -130,18 +125,16 @@ export const CopilotInstructionsPlugin = async (ctx) => {
130
125
  // Convert to relative path for matching
131
126
  const relativePath = getRelativePath(projectDir, filePath);
132
127
  // Find matching instructions that haven't been injected yet
133
- const sessionInjected = injectedPerSession.get(input.sessionID) ?? new Set();
134
- injectedPerSession.set(input.sessionID, sessionInjected);
135
128
  const matchingInstructions = [];
136
129
  for (const instruction of pathInstructions) {
137
130
  // Skip if already injected in this session
138
- if (sessionInjected.has(instruction.file)) {
131
+ if (state.isFileInjected(input.sessionID, instruction.file)) {
139
132
  continue;
140
133
  }
141
134
  // Check if file matches this instruction's patterns
142
135
  if (instruction.matcher(relativePath)) {
143
136
  matchingInstructions.push(instruction);
144
- sessionInjected.add(instruction.file);
137
+ state.markFileInjected(input.sessionID, instruction.file);
145
138
  }
146
139
  }
147
140
  // Store matching instructions to inject in tool.execute.after
@@ -153,15 +146,14 @@ export const CopilotInstructionsPlugin = async (ctx) => {
153
146
  return `<copilot-instruction:${filename}>\n## Path-Specific Instructions (applies to: ${patterns})\n\n${i.content.trimEnd()}\n</copilot-instruction:${filename}>`;
154
147
  })
155
148
  .join('\n\n');
156
- pendingInstructions.set(input.callID, instructionText);
149
+ state.setPending(input.callID, instructionText);
157
150
  log(`Queued ${matchingInstructions.length} path instructions for ${relativePath}`, 'debug');
158
151
  }
159
152
  },
160
153
  'tool.execute.after': async (input, output) => {
161
154
  // Check if we have pending instructions for this tool call
162
- const instructionText = pendingInstructions.get(input.callID);
155
+ const instructionText = state.consumePending(input.callID);
163
156
  if (instructionText) {
164
- pendingInstructions.delete(input.callID);
165
157
  // Append instructions to the tool output
166
158
  output.output = `${output.output}\n\n${instructionText}`;
167
159
  log(`Injected path instructions for call ${input.callID}`, 'debug');
@@ -175,9 +167,9 @@ export const CopilotInstructionsPlugin = async (ctx) => {
175
167
  if (part.type === 'tool') {
176
168
  // Tool state can be pending, running, or completed
177
169
  // Only completed state has output
178
- const state = part.state;
179
- if (state?.output) {
180
- const markers = extractInstructionMarkers(state.output);
170
+ const toolState = part.state;
171
+ if (toolState?.output) {
172
+ const markers = extractInstructionMarkers(toolState.output);
181
173
  for (const marker of markers) {
182
174
  presentMarkers.add(marker);
183
175
  }
@@ -185,17 +177,11 @@ export const CopilotInstructionsPlugin = async (ctx) => {
185
177
  }
186
178
  }
187
179
  }
188
- // For each session in injectedPerSession, remove entries for instructions
189
- // that are no longer present in the message history
190
- for (const [sessionId, injectedFiles] of injectedPerSession) {
191
- for (const file of injectedFiles) {
192
- const filename = path.basename(file);
193
- if (!presentMarkers.has(filename)) {
194
- injectedFiles.delete(file);
195
- log(`Cleared injection state for ${filename} (marker not in history)`, 'debug');
196
- }
197
- }
198
- }
180
+ // Sync injection state with actual markers in message history
181
+ // This enables re-injection after undo operations
182
+ const clearedFiles = [];
183
+ state.syncWithMarkers(presentMarkers);
184
+ // Note: logging of cleared files now handled internally by SessionState
199
185
  }
200
186
  };
201
187
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/loader.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { type Matcher } from './matcher.js';
1
+ import { type Matcher } from './matcher';
2
2
  export interface PathInstruction {
3
3
  file: string;
4
4
  applyTo: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAGA,OAAO,EAAoC,KAAK,OAAO,EAAE,MAAM,cAAc,CAAA;AAE7E,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;CACjB;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQrE;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,EAAE,CA4CzE"}
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAGA,OAAO,EAAoC,KAAK,OAAO,EAAE,MAAM,WAAW,CAAA;AAE1E,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;CACjB;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQrE;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,EAAE,CA4CzE"}
package/dist/loader.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as fs from 'node:fs';
2
2
  import * as path from 'node:path';
3
- import { parseFrontmatter } from './frontmatter.js';
4
- import { createMatcher, normalizePatterns } from './matcher.js';
3
+ import { parseFrontmatter } from './frontmatter';
4
+ import { createMatcher, normalizePatterns } from './matcher';
5
5
  /**
6
6
  * Load repository-wide Copilot instructions from .github/copilot-instructions.md
7
7
  *
@@ -1 +1 @@
1
- {"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAgB,MAAM,cAAc,CAAA;AAS7E;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAiB;IACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,yBAAyB,CAAC,CAAA;IAE3E,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAiB;IACpD,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,cAAc,CAAC,CAAA;IAEvE,IAAI,KAAe,CAAA;IACnB,IAAI,CAAC;QACH,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,eAAe,CAAC,CAAA;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;IAED,MAAM,MAAM,GAAsB,EAAE,CAAA;IAEpC,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;QAC7B,uCAAuC;QACvC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC3C,SAAQ;QACV,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAA;QAErD,IAAI,OAAe,CAAA;QACnB,IAAI,CAAC;YACH,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,SAAQ;QACV,CAAC;QAED,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAA;QACxC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;QAE9D,sCAAsC;QACtC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,SAAQ;QACV,CAAC;QAED,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,QAAQ;YACjB,OAAO,EAAE,MAAM,CAAC,IAAI;YACpB,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC;SACjC,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC"}
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAgB,MAAM,WAAW,CAAA;AAS1E;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAiB;IACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,yBAAyB,CAAC,CAAA;IAE3E,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAiB;IACpD,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,cAAc,CAAC,CAAA;IAEvE,IAAI,KAAe,CAAA;IACnB,IAAI,CAAC;QACH,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,eAAe,CAAC,CAAA;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;IAED,MAAM,MAAM,GAAsB,EAAE,CAAA;IAEpC,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;QAC7B,uCAAuC;QACvC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC3C,SAAQ;QACV,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAA;QAErD,IAAI,OAAe,CAAA;QACnB,IAAI,CAAC;YACH,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,SAAQ;QACV,CAAC;QAED,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAA;QACxC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;QAE9D,sCAAsC;QACtC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,SAAQ;QACV,CAAC;QAED,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,QAAQ;YACjB,OAAO,EAAE,MAAM,CAAC,IAAI;YACpB,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC;SACjC,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Encapsulates all session-related state for the Copilot Instructions plugin.
3
+ *
4
+ * Manages three types of state:
5
+ * 1. Path instruction injection tracking (with undo support via marker sync)
6
+ * 2. Repo instruction injection tracking (one-time per session)
7
+ * 3. Pending instructions for tool call lifecycle (ephemeral)
8
+ */
9
+ export declare class SessionState {
10
+ private injectedPerSession;
11
+ private repoInstructionsInjected;
12
+ private pendingInstructions;
13
+ /**
14
+ * Check if a file has been injected in a session.
15
+ */
16
+ isFileInjected(sessionId: string, file: string): boolean;
17
+ /**
18
+ * Mark a file as injected in a session.
19
+ */
20
+ markFileInjected(sessionId: string, file: string): void;
21
+ /**
22
+ * Clear the injection marker for a specific file in a session.
23
+ * Used when an instruction is undone and needs to be re-injectable.
24
+ */
25
+ clearFileMarker(sessionId: string, file: string): void;
26
+ /**
27
+ * Get all injected files for a session.
28
+ * Returns a copy to prevent external modification.
29
+ */
30
+ getInjectedFiles(sessionId: string): Set<string>;
31
+ /**
32
+ * Synchronize injection state with actual markers present in message history.
33
+ * This enables re-injection after undo operations.
34
+ *
35
+ * @param presentMarkers - Set of instruction filenames (basenames) found in message history
36
+ */
37
+ syncWithMarkers(presentMarkers: Set<string>): void;
38
+ /**
39
+ * Check if repo instructions have been injected for a session.
40
+ */
41
+ hasRepoInstructions(sessionId: string): boolean;
42
+ /**
43
+ * Mark repo instructions as injected for a session.
44
+ */
45
+ markRepoInstructionsInjected(sessionId: string): void;
46
+ /**
47
+ * Store pending instructions to inject after a tool call completes.
48
+ */
49
+ setPending(callId: string, text: string): void;
50
+ /**
51
+ * Get pending instructions for a tool call without consuming them.
52
+ */
53
+ getPending(callId: string): string | undefined;
54
+ /**
55
+ * Consume and return pending instructions for a tool call.
56
+ * The instructions are deleted after retrieval.
57
+ */
58
+ consumePending(callId: string): string | undefined;
59
+ }
60
+ //# sourceMappingURL=session-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-state.d.ts","sourceRoot":"","sources":["../src/session-state.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,qBAAa,YAAY;IAGvB,OAAO,CAAC,kBAAkB,CAAiC;IAG3D,OAAO,CAAC,wBAAwB,CAAoB;IAIpD,OAAO,CAAC,mBAAmB,CAA4B;IAIvD;;OAEG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IAKxD;;OAEG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IASvD;;;OAGG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAKtD;;;OAGG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IAKhD;;;;;OAKG;IACH,eAAe,CAAC,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI;IAalD;;OAEG;IACH,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI/C;;OAEG;IACH,4BAA4B,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAMrD;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAI9C;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI9C;;;OAGG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;CAOnD"}
@@ -0,0 +1,108 @@
1
+ import * as path from 'node:path';
2
+ /**
3
+ * Encapsulates all session-related state for the Copilot Instructions plugin.
4
+ *
5
+ * Manages three types of state:
6
+ * 1. Path instruction injection tracking (with undo support via marker sync)
7
+ * 2. Repo instruction injection tracking (one-time per session)
8
+ * 3. Pending instructions for tool call lifecycle (ephemeral)
9
+ */
10
+ export class SessionState {
11
+ // Track which instruction files have been injected per session
12
+ // Map<sessionID, Set<instructionFilePath>>
13
+ injectedPerSession = new Map();
14
+ // Track sessions where repo-wide instructions have been injected
15
+ repoInstructionsInjected = new Set();
16
+ // Track pending instructions to inject per tool call (ephemeral)
17
+ // Map<callID, instructionText>
18
+ pendingInstructions = new Map();
19
+ // --- Path instruction tracking ---
20
+ /**
21
+ * Check if a file has been injected in a session.
22
+ */
23
+ isFileInjected(sessionId, file) {
24
+ const sessionFiles = this.injectedPerSession.get(sessionId);
25
+ return sessionFiles?.has(file) ?? false;
26
+ }
27
+ /**
28
+ * Mark a file as injected in a session.
29
+ */
30
+ markFileInjected(sessionId, file) {
31
+ let sessionFiles = this.injectedPerSession.get(sessionId);
32
+ if (!sessionFiles) {
33
+ sessionFiles = new Set();
34
+ this.injectedPerSession.set(sessionId, sessionFiles);
35
+ }
36
+ sessionFiles.add(file);
37
+ }
38
+ /**
39
+ * Clear the injection marker for a specific file in a session.
40
+ * Used when an instruction is undone and needs to be re-injectable.
41
+ */
42
+ clearFileMarker(sessionId, file) {
43
+ const sessionFiles = this.injectedPerSession.get(sessionId);
44
+ sessionFiles?.delete(file);
45
+ }
46
+ /**
47
+ * Get all injected files for a session.
48
+ * Returns a copy to prevent external modification.
49
+ */
50
+ getInjectedFiles(sessionId) {
51
+ const sessionFiles = this.injectedPerSession.get(sessionId);
52
+ return new Set(sessionFiles ?? []);
53
+ }
54
+ /**
55
+ * Synchronize injection state with actual markers present in message history.
56
+ * This enables re-injection after undo operations.
57
+ *
58
+ * @param presentMarkers - Set of instruction filenames (basenames) found in message history
59
+ */
60
+ syncWithMarkers(presentMarkers) {
61
+ for (const [_sessionId, injectedFiles] of this.injectedPerSession) {
62
+ for (const file of injectedFiles) {
63
+ const filename = path.basename(file);
64
+ if (!presentMarkers.has(filename)) {
65
+ injectedFiles.delete(file);
66
+ }
67
+ }
68
+ }
69
+ }
70
+ // --- Repo instruction tracking ---
71
+ /**
72
+ * Check if repo instructions have been injected for a session.
73
+ */
74
+ hasRepoInstructions(sessionId) {
75
+ return this.repoInstructionsInjected.has(sessionId);
76
+ }
77
+ /**
78
+ * Mark repo instructions as injected for a session.
79
+ */
80
+ markRepoInstructionsInjected(sessionId) {
81
+ this.repoInstructionsInjected.add(sessionId);
82
+ }
83
+ // --- Pending instructions (tool call lifecycle) ---
84
+ /**
85
+ * Store pending instructions to inject after a tool call completes.
86
+ */
87
+ setPending(callId, text) {
88
+ this.pendingInstructions.set(callId, text);
89
+ }
90
+ /**
91
+ * Get pending instructions for a tool call without consuming them.
92
+ */
93
+ getPending(callId) {
94
+ return this.pendingInstructions.get(callId);
95
+ }
96
+ /**
97
+ * Consume and return pending instructions for a tool call.
98
+ * The instructions are deleted after retrieval.
99
+ */
100
+ consumePending(callId) {
101
+ const text = this.pendingInstructions.get(callId);
102
+ if (text !== undefined) {
103
+ this.pendingInstructions.delete(callId);
104
+ }
105
+ return text;
106
+ }
107
+ }
108
+ //# sourceMappingURL=session-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-state.js","sourceRoot":"","sources":["../src/session-state.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ekroon/opencode-copilot-instructions",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",