@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.
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -32
- 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 +60 -0
- package/dist/session-state.d.ts.map +1 -0
- package/dist/session-state.js +108 -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;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
|
|
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
|
-
//
|
|
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();
|
|
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 && !
|
|
89
|
-
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
|
179
|
-
if (
|
|
180
|
-
const markers = extractInstructionMarkers(
|
|
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
|
-
//
|
|
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
|
-
}
|
|
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":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AAEjC,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAwB,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AAEjC,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAwB,MAAM,UAAU,CAAA;AAC3F,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAE9C;;;;GAIG;AACH,SAAS,eAAe,CAAC,SAAiB,EAAE,QAAgB;IAC1D,mDAAmD;IACnD,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAElF,mEAAmE;IACnE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,6CAA6C;IAC7C,OAAO,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAA;AAC/C,CAAC;AAED,kCAAkC;AAClC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;AAErD;;;GAGG;AACH,SAAS,yBAAyB,CAAC,IAAY;IAC7C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAA;IACjC,MAAM,KAAK,GAAG,gCAAgC,CAAA;IAC9C,IAAI,KAAK,CAAA;IACT,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IACvB,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAW,KAAK,EAAE,GAAG,EAAE,EAAE;IAC7D,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,GAAG,CAAA;IAEjC,iDAAiD;IACjD,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QAChD,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;QAC/F,MAAM,IAAI,KAAK,CAAC,kDAAkD,OAAO,SAAS,EAAE,CAAC,CAAA;IACvF,CAAC;IAED,0EAA0E;IAC1E,MAAM,UAAU,GAAG,SAAS,CAAA;IAE5B,+BAA+B;IAC/B,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAA;IACzD,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAA;IAEzD,yBAAyB;IACzB,MAAM,GAAG,GAAG,CAAC,OAAe,EAAE,QAA0B,MAAM,EAAE,EAAE;QAChE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;YACb,IAAI,EAAE;gBACJ,OAAO,EAAE,sBAAsB;gBAC/B,KAAK;gBACL,OAAO;aACR;SACF,CAAC,CAAA;IACJ,CAAC,CAAA;IAED,sBAAsB;IACtB,IAAI,gBAAgB,EAAE,CAAC;QACrB,GAAG,CAAC,+DAA+D,CAAC,CAAA;IACtE,CAAC;IAED,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,KAAK,MAAM,WAAW,IAAI,gBAAgB,EAAE,CAAC;YAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;YAChD,GAAG,CAAC,iCAAiC,QAAQ,EAAE,CAAC,CAAA;QAClD,CAAC;IACH,CAAC;IAED,IAAI,CAAC,gBAAgB,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvD,GAAG,CAAC,+BAA+B,CAAC,CAAA;IACtC,CAAC;IAED,gCAAgC;IAChC,MAAM,KAAK,GAAG,IAAI,YAAY,EAAE,CAAA;IAEhC,OAAO;QACL,qEAAqE;QACrE,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;YACzB,+BAA+B;YAC/B,GAAG,CAAC,mBAAmB,KAAK,CAAC,IAAI,EAAE,EAAE,OAAO,CAAC,CAAA;YAE7C,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;gBACrC,GAAG,CAAC,qDAAqD,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAA;gBAC9E,GAAG,CAAC,qBAAqB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;gBAErE,IAAI,gBAAgB,EAAE,CAAC;oBACrB,4CAA4C;oBAC5C,MAAM,SAAS,GAAI,KAAK,CAAC,UAAkB,EAAE,IAAI,EAAE,EAAE,CAAA;oBACrD,GAAG,CAAC,wBAAwB,SAAS,EAAE,EAAE,OAAO,CAAC,CAAA;oBAEjD,IAAI,SAAS,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,SAAS,CAAC,EAAE,CAAC;wBACvD,KAAK,CAAC,4BAA4B,CAAC,SAAS,CAAC,CAAA;wBAC7C,GAAG,CAAC,4CAA4C,SAAS,EAAE,CAAC,CAAA;wBAE5D,IAAI,CAAC;4BACH,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;gCAC1B,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE;gCACvB,IAAI,EAAE;oCACJ,OAAO,EAAE,IAAI;oCACb,KAAK,EAAE,CAAC;4CACN,IAAI,EAAE,MAAM;4CACZ,IAAI,EAAE,qCAAqC,gBAAgB,EAAE;yCAC9D,CAAC;iCACH;6BACF,CAAC,CAAA;4BACF,GAAG,CAAC,wDAAwD,SAAS,EAAE,CAAC,CAAA;wBAC1E,CAAC;wBAAC,OAAO,GAAG,EAAE,CAAC;4BACb,GAAG,CAAC,uCAAuC,GAAG,EAAE,CAAC,CAAA;wBACnD,CAAC;oBACH,CAAC;yBAAM,IAAI,CAAC,SAAS,EAAE,CAAC;wBACtB,GAAG,CAAC,wCAAwC,CAAC,CAAA;oBAC/C,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,oDAAoD;QACpD,iCAAiC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YAC1D,IAAI,gBAAgB,EAAE,CAAC;gBACrB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,qCAAqC,gBAAgB,EAAE,CAAC,CAAA;YAC9E,CAAC;QACH,CAAC;QAED,qBAAqB,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YAC7C,yBAAyB;YACzB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChC,OAAM;YACR,CAAC;YAED,0BAA0B;YAC1B,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAA;YACtC,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC9C,OAAM;YACR,CAAC;YAED,wCAAwC;YACxC,MAAM,YAAY,GAAG,eAAe,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAA;YAE1D,4DAA4D;YAC5D,MAAM,oBAAoB,GAAsB,EAAE,CAAA;YAElD,KAAK,MAAM,WAAW,IAAI,gBAAgB,EAAE,CAAC;gBAC3C,2CAA2C;gBAC3C,IAAI,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,SAAS,EAAE,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC5D,SAAQ;gBACV,CAAC;gBAED,oDAAoD;gBACpD,IAAI,WAAW,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;oBACtC,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;oBACtC,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,SAAS,EAAE,WAAW,CAAC,IAAI,CAAC,CAAA;gBAC3D,CAAC;YACH,CAAC;YAED,8DAA8D;YAC9D,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpC,MAAM,eAAe,GAAG,oBAAoB;qBACzC,GAAG,CAAC,CAAC,CAAC,EAAE;oBACP,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;oBACtC,MAAM,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;oBACrC,OAAO,wBAAwB,QAAQ,iDAAiD,QAAQ,QAAQ,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,2BAA2B,QAAQ,GAAG,CAAA;gBACnK,CAAC,CAAC;qBACD,IAAI,CAAC,MAAM,CAAC,CAAA;gBAEf,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;gBAC/C,GAAG,CAAC,UAAU,oBAAoB,CAAC,MAAM,0BAA0B,YAAY,EAAE,EAAE,OAAO,CAAC,CAAA;YAC7F,CAAC;QACH,CAAC;QAED,oBAAoB,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YAC5C,2DAA2D;YAC3D,MAAM,eAAe,GAAG,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;YAC1D,IAAI,eAAe,EAAE,CAAC;gBACpB,yCAAyC;gBACzC,MAAM,CAAC,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,OAAO,eAAe,EAAE,CAAA;gBACxD,GAAG,CAAC,uCAAuC,KAAK,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,CAAA;YACrE,CAAC;QACH,CAAC;QAED,sCAAsC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YAC/D,kEAAkE;YAClE,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAA;YAExC,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACtC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;oBACjC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;wBACzB,mDAAmD;wBACnD,kCAAkC;wBAClC,MAAM,SAAS,GAAG,IAAI,CAAC,KAA4B,CAAA;wBACnD,IAAI,SAAS,EAAE,MAAM,EAAE,CAAC;4BACtB,MAAM,OAAO,GAAG,yBAAyB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;4BAC3D,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gCAC7B,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;4BAC5B,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAED,8DAA8D;YAC9D,kDAAkD;YAClD,MAAM,YAAY,GAAa,EAAE,CAAA;YACjC,KAAK,CAAC,eAAe,CAAC,cAAc,CAAC,CAAA;YACrC,wEAAwE;QAC1E,CAAC;KACF,CAAA;AACH,CAAC,CAAA;AAED,oCAAoC;AACpC,eAAe,yBAAyB,CAAA"}
|
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,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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"}
|