@ekroon/opencode-copilot-instructions 0.3.0 → 0.3.2

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;AAwDjD,eAAO,MAAM,yBAAyB,EAAE,MAsLvC,CAAA;AAGD,eAAe,yBAAyB,CAAA"}
package/dist/index.js CHANGED
@@ -1,5 +1,20 @@
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';
4
+ /**
5
+ * Type guard to check if an event is a session.created event.
6
+ * Narrows the Event union type to EventSessionCreated.
7
+ */
8
+ function isSessionCreatedEvent(event) {
9
+ return event.type === 'session.created';
10
+ }
11
+ /**
12
+ * Type guard to check if an event is a session.compacted event.
13
+ * Narrows the Event union type to EventSessionCompacted.
14
+ */
15
+ function isSessionCompactedEvent(event) {
16
+ return event.type === 'session.compacted';
17
+ }
3
18
  /**
4
19
  * Convert an absolute path to a relative path from the given directory.
5
20
  * If the path is already relative, returns it as-is.
@@ -65,28 +80,21 @@ export const CopilotInstructionsPlugin = async (ctx) => {
65
80
  if (!repoInstructions && pathInstructions.length === 0) {
66
81
  log('No Copilot instructions found');
67
82
  }
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();
83
+ // Encapsulated state management
84
+ const state = new SessionState();
76
85
  return {
77
- // Listen for session.created events to inject repo-wide instructions
86
+ // Listen for session events
78
87
  event: async ({ event }) => {
79
88
  // Log all events for debugging
80
89
  log(`Event received: ${event.type}`, 'debug');
81
- if (event.type === 'session.created') {
90
+ if (isSessionCreatedEvent(event)) {
82
91
  log(`session.created event received, repoInstructions: ${!!repoInstructions}`);
83
92
  log(`Event properties: ${JSON.stringify(event.properties)}`, 'debug');
84
93
  if (repoInstructions) {
85
- // Session ID is in event.properties.info.id
86
- const sessionId = event.properties?.info?.id;
94
+ const sessionId = event.properties.info.id;
87
95
  log(`Extracted sessionId: ${sessionId}`, 'debug');
88
- if (sessionId && !repoInstructionsInjected.has(sessionId)) {
89
- repoInstructionsInjected.add(sessionId);
96
+ if (!state.hasRepoInstructions(sessionId)) {
97
+ state.markRepoInstructionsInjected(sessionId);
90
98
  log(`Injecting repo instructions into session ${sessionId}`);
91
99
  try {
92
100
  await client.session.prompt({
@@ -105,11 +113,15 @@ export const CopilotInstructionsPlugin = async (ctx) => {
105
113
  log(`Failed to inject repo instructions: ${err}`);
106
114
  }
107
115
  }
108
- else if (!sessionId) {
109
- log(`No sessionId found in event.properties`);
110
- }
111
116
  }
112
117
  }
118
+ // Clear session state on compaction to allow re-injection
119
+ if (isSessionCompactedEvent(event)) {
120
+ const sessionId = event.properties.sessionID;
121
+ log(`session.compacted event received for session ${sessionId}`);
122
+ state.clearSession(sessionId);
123
+ log(`Cleared injection state for session ${sessionId}, instructions will be re-injected on next file access`);
124
+ }
113
125
  },
114
126
  // Preserve repo-wide instructions during compaction
115
127
  'experimental.session.compacting': async (_input, output) => {
@@ -130,18 +142,16 @@ export const CopilotInstructionsPlugin = async (ctx) => {
130
142
  // Convert to relative path for matching
131
143
  const relativePath = getRelativePath(projectDir, filePath);
132
144
  // 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
145
  const matchingInstructions = [];
136
146
  for (const instruction of pathInstructions) {
137
147
  // Skip if already injected in this session
138
- if (sessionInjected.has(instruction.file)) {
148
+ if (state.isFileInjected(input.sessionID, instruction.file)) {
139
149
  continue;
140
150
  }
141
151
  // Check if file matches this instruction's patterns
142
152
  if (instruction.matcher(relativePath)) {
143
153
  matchingInstructions.push(instruction);
144
- sessionInjected.add(instruction.file);
154
+ state.markFileInjected(input.sessionID, instruction.file);
145
155
  }
146
156
  }
147
157
  // Store matching instructions to inject in tool.execute.after
@@ -153,15 +163,14 @@ export const CopilotInstructionsPlugin = async (ctx) => {
153
163
  return `<copilot-instruction:${filename}>\n## Path-Specific Instructions (applies to: ${patterns})\n\n${i.content.trimEnd()}\n</copilot-instruction:${filename}>`;
154
164
  })
155
165
  .join('\n\n');
156
- pendingInstructions.set(input.callID, instructionText);
166
+ state.setPending(input.callID, instructionText);
157
167
  log(`Queued ${matchingInstructions.length} path instructions for ${relativePath}`, 'debug');
158
168
  }
159
169
  },
160
170
  'tool.execute.after': async (input, output) => {
161
171
  // Check if we have pending instructions for this tool call
162
- const instructionText = pendingInstructions.get(input.callID);
172
+ const instructionText = state.consumePending(input.callID);
163
173
  if (instructionText) {
164
- pendingInstructions.delete(input.callID);
165
174
  // Append instructions to the tool output
166
175
  output.output = `${output.output}\n\n${instructionText}`;
167
176
  log(`Injected path instructions for call ${input.callID}`, 'debug');
@@ -175,9 +184,9 @@ export const CopilotInstructionsPlugin = async (ctx) => {
175
184
  if (part.type === 'tool') {
176
185
  // Tool state can be pending, running, or completed
177
186
  // Only completed state has output
178
- const state = part.state;
179
- if (state?.output) {
180
- const markers = extractInstructionMarkers(state.output);
187
+ const toolState = part.state;
188
+ if (toolState?.output) {
189
+ const markers = extractInstructionMarkers(toolState.output);
181
190
  for (const marker of markers) {
182
191
  presentMarkers.add(marker);
183
192
  }
@@ -185,17 +194,11 @@ export const CopilotInstructionsPlugin = async (ctx) => {
185
194
  }
186
195
  }
187
196
  }
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
- }
197
+ // Sync injection state with actual markers in message history
198
+ // This enables re-injection after undo operations
199
+ const clearedFiles = [];
200
+ state.syncWithMarkers(presentMarkers);
201
+ // Note: logging of cleared files now handled internally by SessionState
199
202
  }
200
203
  };
201
204
  };
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,66 @@
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
+ * Clear all injection state for a session.
48
+ * Used when a session is compacted to allow re-injection of instructions.
49
+ * Note: Does not clear pending instructions as they are keyed by callID, not sessionID.
50
+ */
51
+ clearSession(sessionId: string): void;
52
+ /**
53
+ * Store pending instructions to inject after a tool call completes.
54
+ */
55
+ setPending(callId: string, text: string): void;
56
+ /**
57
+ * Get pending instructions for a tool call without consuming them.
58
+ */
59
+ getPending(callId: string): string | undefined;
60
+ /**
61
+ * Consume and return pending instructions for a tool call.
62
+ * The instructions are deleted after retrieval.
63
+ */
64
+ consumePending(callId: string): string | undefined;
65
+ }
66
+ //# 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;IAIrD;;;;OAIG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAOrC;;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,117 @@
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
+ /**
84
+ * Clear all injection state for a session.
85
+ * Used when a session is compacted to allow re-injection of instructions.
86
+ * Note: Does not clear pending instructions as they are keyed by callID, not sessionID.
87
+ */
88
+ clearSession(sessionId) {
89
+ this.injectedPerSession.delete(sessionId);
90
+ this.repoInstructionsInjected.delete(sessionId);
91
+ }
92
+ // --- Pending instructions (tool call lifecycle) ---
93
+ /**
94
+ * Store pending instructions to inject after a tool call completes.
95
+ */
96
+ setPending(callId, text) {
97
+ this.pendingInstructions.set(callId, text);
98
+ }
99
+ /**
100
+ * Get pending instructions for a tool call without consuming them.
101
+ */
102
+ getPending(callId) {
103
+ return this.pendingInstructions.get(callId);
104
+ }
105
+ /**
106
+ * Consume and return pending instructions for a tool call.
107
+ * The instructions are deleted after retrieval.
108
+ */
109
+ consumePending(callId) {
110
+ const text = this.pendingInstructions.get(callId);
111
+ if (text !== undefined) {
112
+ this.pendingInstructions.delete(callId);
113
+ }
114
+ return text;
115
+ }
116
+ }
117
+ //# 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.2",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",