@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.
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +42 -39
- package/dist/index.js.map +1 -1
- package/dist/loader.d.ts +1 -1
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +2 -2
- package/dist/loader.js.map +1 -1
- package/dist/session-state.d.ts +66 -0
- package/dist/session-state.d.ts.map +1 -0
- package/dist/session-state.js +117 -0
- package/dist/session-state.js.map +1 -0
- package/package.json +1 -1
package/dist/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
|
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
|
-
//
|
|
69
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
86
|
-
const sessionId = event.properties?.info?.id;
|
|
94
|
+
const sessionId = event.properties.info.id;
|
|
87
95
|
log(`Extracted sessionId: ${sessionId}`, 'debug');
|
|
88
|
-
if (
|
|
89
|
-
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
|
179
|
-
if (
|
|
180
|
-
const markers = extractInstructionMarkers(
|
|
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
|
-
//
|
|
189
|
-
//
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
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":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/loader.d.ts
CHANGED
package/dist/loader.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAGA,OAAO,EAAoC,KAAK,OAAO,EAAE,MAAM,
|
|
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
|
|
4
|
-
import { createMatcher, normalizePatterns } from './matcher
|
|
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
|
*
|
package/dist/loader.js.map
CHANGED
|
@@ -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,
|
|
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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"}
|