@minicor/mcp-server 3.2.0 → 3.2.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/README.md +69 -24
- package/dist/__tests__/laminar-client.test.d.ts +2 -0
- package/dist/__tests__/laminar-client.test.d.ts.map +1 -0
- package/dist/__tests__/laminar-client.test.js +70 -0
- package/dist/__tests__/laminar-client.test.js.map +1 -0
- package/dist/__tests__/token-provider.test.d.ts +2 -0
- package/dist/__tests__/token-provider.test.d.ts.map +1 -0
- package/dist/__tests__/token-provider.test.js +82 -0
- package/dist/__tests__/token-provider.test.js.map +1 -0
- package/dist/bootstrap.d.ts +12 -0
- package/dist/bootstrap.d.ts.map +1 -0
- package/dist/bootstrap.js +244 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/config.d.ts +6 -3
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +14 -10
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +64 -10
- package/dist/index.js.map +1 -1
- package/dist/laminar-client.d.ts +3 -1
- package/dist/laminar-client.d.ts.map +1 -1
- package/dist/laminar-client.js +18 -5
- package/dist/laminar-client.js.map +1 -1
- package/dist/lib.d.ts +10 -7
- package/dist/lib.d.ts.map +1 -1
- package/dist/lib.js +64 -10
- package/dist/lib.js.map +1 -1
- package/dist/prompts/workspace-session.d.ts +3 -0
- package/dist/prompts/workspace-session.d.ts.map +1 -0
- package/dist/prompts/workspace-session.js +58 -0
- package/dist/prompts/workspace-session.js.map +1 -0
- package/dist/state.d.ts +22 -0
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +12 -0
- package/dist/state.js.map +1 -1
- package/dist/token-provider.d.ts +16 -0
- package/dist/token-provider.d.ts.map +1 -0
- package/dist/token-provider.js +44 -0
- package/dist/token-provider.js.map +1 -0
- package/dist/tools/session.d.ts +8 -0
- package/dist/tools/session.d.ts.map +1 -0
- package/dist/tools/session.js +392 -0
- package/dist/tools/session.js.map +1 -0
- package/dist/tools/sync-tools.d.ts.map +1 -1
- package/dist/tools/sync-tools.js +37 -8
- package/dist/tools/sync-tools.js.map +1 -1
- package/dist/tools/vm.d.ts.map +1 -1
- package/dist/tools/vm.js +17 -9
- package/dist/tools/vm.js.map +1 -1
- package/package.json +5 -3
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
export function register({ server }) {
|
|
5
|
+
server.prompt("workspace-session-guide", "Returns the workspace agent loop rules (AGENTS.md) and session lifecycle instructions. Use when starting work in a Minicor workspace clone.", {
|
|
6
|
+
directory: z
|
|
7
|
+
.string()
|
|
8
|
+
.optional()
|
|
9
|
+
.describe("Workspace clone directory (defaults to cwd)"),
|
|
10
|
+
}, async ({ directory }) => {
|
|
11
|
+
const dir = directory ? path.resolve(directory) : process.cwd();
|
|
12
|
+
let agentsMd = "";
|
|
13
|
+
const agentsPath = path.join(dir, "AGENTS.md");
|
|
14
|
+
if (fs.existsSync(agentsPath)) {
|
|
15
|
+
agentsMd = fs.readFileSync(agentsPath, "utf-8");
|
|
16
|
+
}
|
|
17
|
+
let sessionInfo = "No prior session found.";
|
|
18
|
+
const sessionPath = path.join(dir, ".minicor", "session.json");
|
|
19
|
+
if (fs.existsSync(sessionPath)) {
|
|
20
|
+
try {
|
|
21
|
+
const session = JSON.parse(fs.readFileSync(sessionPath, "utf-8"));
|
|
22
|
+
const phase = session.currentPhase || "unknown";
|
|
23
|
+
const task = session.workingOn?.description ||
|
|
24
|
+
session.workingOn?.workflow ||
|
|
25
|
+
"unknown";
|
|
26
|
+
sessionInfo =
|
|
27
|
+
`Prior session exists. Phase: ${phase}, Working on: ${task}, ` +
|
|
28
|
+
`Status: ${session.status}. Resume from here.`;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
sessionInfo = "session.json exists but could not be parsed.";
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const text = `# Workspace Session Guide
|
|
35
|
+
|
|
36
|
+
## Session Lifecycle
|
|
37
|
+
|
|
38
|
+
1. **Start**: Call \`session_start(directory: "${dir}")\` as your FIRST action
|
|
39
|
+
2. **Work**: Follow the phase loop from AGENTS.md below
|
|
40
|
+
3. **Checkpoint**: Call \`session_checkpoint\` between phases to save progress
|
|
41
|
+
4. **End**: Call \`session_end\` before finishing — this persists state for the next agent
|
|
42
|
+
|
|
43
|
+
## Current Session State
|
|
44
|
+
|
|
45
|
+
${sessionInfo}
|
|
46
|
+
|
|
47
|
+
${agentsMd ? `## Agent Loop (AGENTS.md)\n\n${agentsMd}` : "No AGENTS.md found in this directory. This may not be a Minicor workspace clone."}`;
|
|
48
|
+
return {
|
|
49
|
+
messages: [
|
|
50
|
+
{
|
|
51
|
+
role: "user",
|
|
52
|
+
content: { type: "text", text },
|
|
53
|
+
},
|
|
54
|
+
],
|
|
55
|
+
};
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=workspace-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-session.js","sourceRoot":"","sources":["../../src/prompts/workspace-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,QAAQ,CAAC,EAAE,MAAM,EAAY;IAC3C,MAAM,CAAC,MAAM,CACX,yBAAyB,EACzB,6IAA6I,EAC7I;QACE,SAAS,EAAE,CAAC;aACT,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,6CAA6C,CAAC;KAC3D,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;QACtB,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QAEhE,IAAI,QAAQ,GAAG,EAAE,CAAC;QAClB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QAC/C,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAClD,CAAC;QAED,IAAI,WAAW,GAAG,yBAAyB,CAAC;QAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;QAC/D,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;gBAClE,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,IAAI,SAAS,CAAC;gBAChD,MAAM,IAAI,GACR,OAAO,CAAC,SAAS,EAAE,WAAW;oBAC9B,OAAO,CAAC,SAAS,EAAE,QAAQ;oBAC3B,SAAS,CAAC;gBACZ,WAAW;oBACT,gCAAgC,KAAK,iBAAiB,IAAI,IAAI;wBAC9D,WAAW,OAAO,CAAC,MAAM,qBAAqB,CAAC;YACnD,CAAC;YAAC,MAAM,CAAC;gBACP,WAAW,GAAG,8CAA8C,CAAC;YAC/D,CAAC;QACH,CAAC;QAED,MAAM,IAAI,GAAG;;;;iDAI8B,GAAG;;;;;;;EAOlD,WAAW;;EAEX,QAAQ,CAAC,CAAC,CAAC,gCAAgC,QAAQ,EAAE,CAAC,CAAC,CAAC,kFAAkF,EAAE,CAAC;QAEzI,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAe;oBACrB,OAAO,EAAE,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE;iBACzC;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
package/dist/state.d.ts
CHANGED
|
@@ -25,4 +25,26 @@ export declare function getCachedVm(vmId: number): VmInfo | undefined;
|
|
|
25
25
|
export declare function setWorkspaceRegion(workspaceId: number, region: Region): void;
|
|
26
26
|
export declare function getWorkspaceRegion(workspaceId: number): Region | undefined;
|
|
27
27
|
export declare function clearWorkspaceRegionMap(): void;
|
|
28
|
+
export interface ActiveSession {
|
|
29
|
+
directory: string;
|
|
30
|
+
workspaceId: number;
|
|
31
|
+
region?: Region;
|
|
32
|
+
startedAt: string;
|
|
33
|
+
currentPhase: string;
|
|
34
|
+
lastCheckpoint?: string;
|
|
35
|
+
workingOn?: {
|
|
36
|
+
workflow?: string;
|
|
37
|
+
workflowId?: number;
|
|
38
|
+
step?: number;
|
|
39
|
+
stepName?: string;
|
|
40
|
+
description?: string;
|
|
41
|
+
};
|
|
42
|
+
completed: string[];
|
|
43
|
+
blocked: string[];
|
|
44
|
+
nextSteps: string[];
|
|
45
|
+
notes?: string;
|
|
46
|
+
}
|
|
47
|
+
export declare function getActiveSession(): ActiveSession | null;
|
|
48
|
+
export declare function setActiveSession(session: ActiveSession | null): void;
|
|
49
|
+
export declare function updateActiveSession(updates: Partial<ActiveSession>): void;
|
|
28
50
|
//# sourceMappingURL=state.d.ts.map
|
package/dist/state.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,KAAK,GAAG,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,IAAI,aAAa,EAAE,aAAa,GAAG,IAAW,CAAC;AAEtD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,QAE1D;AAED,wBAAgB,OAAO,IAAI,GAAG,CAAC,OAAO,GAAG,SAAS,CAKjD;AAID,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,IAAI,OAAO,EAAE,YAAY,GAAG,IAAW,CAAC;AAE/C,wBAAgB,UAAU,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,QAEpD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG5D;AAMD,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAErE;AAED,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE1E;AAED,wBAAgB,uBAAuB,SAEtC"}
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,KAAK,GAAG,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,IAAI,aAAa,EAAE,aAAa,GAAG,IAAW,CAAC;AAEtD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,QAE1D;AAED,wBAAgB,OAAO,IAAI,GAAG,CAAC,OAAO,GAAG,SAAS,CAKjD;AAID,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,IAAI,OAAO,EAAE,YAAY,GAAG,IAAW,CAAC;AAE/C,wBAAgB,UAAU,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,QAEpD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG5D;AAMD,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAErE;AAED,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE1E;AAED,wBAAgB,uBAAuB,SAEtC;AAID,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE;QACV,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAID,wBAAgB,gBAAgB,IAAI,aAAa,GAAG,IAAI,CAEvD;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,QAE7D;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,QAIlE"}
|
package/dist/state.js
CHANGED
|
@@ -32,4 +32,16 @@ export function getWorkspaceRegion(workspaceId) {
|
|
|
32
32
|
export function clearWorkspaceRegionMap() {
|
|
33
33
|
workspaceRegionMap.clear();
|
|
34
34
|
}
|
|
35
|
+
let activeSession = null;
|
|
36
|
+
export function getActiveSession() {
|
|
37
|
+
return activeSession;
|
|
38
|
+
}
|
|
39
|
+
export function setActiveSession(session) {
|
|
40
|
+
activeSession = session;
|
|
41
|
+
}
|
|
42
|
+
export function updateActiveSession(updates) {
|
|
43
|
+
if (activeSession) {
|
|
44
|
+
Object.assign(activeSession, updates);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
35
47
|
//# sourceMappingURL=state.js.map
|
package/dist/state.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAcH,MAAM,CAAC,IAAI,aAAa,GAAyB,IAAI,CAAC;AAEtD,MAAM,UAAU,gBAAgB,CAAC,IAA0B;IACzD,aAAa,GAAG,IAAI,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,IAAI,aAAa,EAAE,MAAM,IAAI,aAAa,EAAE,SAAS,EAAE,CAAC;QACtD,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,aAAa,CAAC,SAAS,EAAE,CAAC;IAC9E,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AASD,MAAM,CAAC,IAAI,OAAO,GAAwB,IAAI,CAAC;AAE/C,MAAM,UAAU,UAAU,CAAC,KAA0B;IACnD,OAAO,GAAG,KAAK,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;AAClD,CAAC;AAED,gEAAgE;AAEhE,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAkB,CAAC;AAErD,MAAM,UAAU,kBAAkB,CAAC,WAAmB,EAAE,MAAc;IACpE,kBAAkB,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,WAAmB;IACpD,OAAO,kBAAkB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,kBAAkB,CAAC,KAAK,EAAE,CAAC;AAC7B,CAAC"}
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAcH,MAAM,CAAC,IAAI,aAAa,GAAyB,IAAI,CAAC;AAEtD,MAAM,UAAU,gBAAgB,CAAC,IAA0B;IACzD,aAAa,GAAG,IAAI,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,IAAI,aAAa,EAAE,MAAM,IAAI,aAAa,EAAE,SAAS,EAAE,CAAC;QACtD,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,aAAa,CAAC,SAAS,EAAE,CAAC;IAC9E,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AASD,MAAM,CAAC,IAAI,OAAO,GAAwB,IAAI,CAAC;AAE/C,MAAM,UAAU,UAAU,CAAC,KAA0B;IACnD,OAAO,GAAG,KAAK,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;AAClD,CAAC;AAED,gEAAgE;AAEhE,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAkB,CAAC;AAErD,MAAM,UAAU,kBAAkB,CAAC,WAAmB,EAAE,MAAc;IACpE,kBAAkB,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,WAAmB;IACpD,OAAO,kBAAkB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,kBAAkB,CAAC,KAAK,EAAE,CAAC;AAC7B,CAAC;AAwBD,IAAI,aAAa,GAAyB,IAAI,CAAC;AAE/C,MAAM,UAAU,gBAAgB;IAC9B,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAA6B;IAC5D,aAAa,GAAG,OAAO,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAA+B;IACjE,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type RefreshFn = () => Promise<{
|
|
2
|
+
token: string;
|
|
3
|
+
expiresAt: number;
|
|
4
|
+
} | null>;
|
|
5
|
+
export declare class TokenProvider {
|
|
6
|
+
private token;
|
|
7
|
+
private expiresAt;
|
|
8
|
+
private refreshFn;
|
|
9
|
+
private refreshPromise;
|
|
10
|
+
onTokenRefreshed?: (token: string) => void;
|
|
11
|
+
constructor(token: string, expiresAt: number, refreshFn?: RefreshFn);
|
|
12
|
+
getToken(): string;
|
|
13
|
+
isExpiringSoon(bufferMs?: number): boolean;
|
|
14
|
+
refreshToken(): Promise<string>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=token-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-provider.d.ts","sourceRoot":"","sources":["../src/token-provider.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,IAAI,CAAC,CAAC;AAEV,qBAAa,aAAa;IACxB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,cAAc,CAAgC;IAEtD,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;gBAE/B,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,SAAS;IAMnE,QAAQ,IAAI,MAAM;IAIlB,cAAc,CAAC,QAAQ,SAAgB,GAAG,OAAO;IAI3C,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;CAsBtC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export class TokenProvider {
|
|
2
|
+
token;
|
|
3
|
+
expiresAt;
|
|
4
|
+
refreshFn;
|
|
5
|
+
refreshPromise = null;
|
|
6
|
+
onTokenRefreshed;
|
|
7
|
+
constructor(token, expiresAt, refreshFn) {
|
|
8
|
+
this.token = token;
|
|
9
|
+
this.expiresAt = expiresAt;
|
|
10
|
+
this.refreshFn = refreshFn ?? null;
|
|
11
|
+
}
|
|
12
|
+
getToken() {
|
|
13
|
+
return this.token;
|
|
14
|
+
}
|
|
15
|
+
isExpiringSoon(bufferMs = 5 * 60 * 1000) {
|
|
16
|
+
return Date.now() >= this.expiresAt - bufferMs;
|
|
17
|
+
}
|
|
18
|
+
async refreshToken() {
|
|
19
|
+
if (this.refreshPromise)
|
|
20
|
+
return this.refreshPromise;
|
|
21
|
+
if (!this.refreshFn) {
|
|
22
|
+
throw new Error("No refresh function configured");
|
|
23
|
+
}
|
|
24
|
+
this.refreshPromise = (async () => {
|
|
25
|
+
try {
|
|
26
|
+
const result = await this.refreshFn();
|
|
27
|
+
if (!result)
|
|
28
|
+
throw new Error("Token refresh returned null");
|
|
29
|
+
this.token = result.token;
|
|
30
|
+
this.expiresAt = result.expiresAt;
|
|
31
|
+
try {
|
|
32
|
+
this.onTokenRefreshed?.(result.token);
|
|
33
|
+
}
|
|
34
|
+
catch { /* callback errors must not fail a successful refresh */ }
|
|
35
|
+
return result.token;
|
|
36
|
+
}
|
|
37
|
+
finally {
|
|
38
|
+
this.refreshPromise = null;
|
|
39
|
+
}
|
|
40
|
+
})();
|
|
41
|
+
return this.refreshPromise;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=token-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-provider.js","sourceRoot":"","sources":["../src/token-provider.ts"],"names":[],"mappings":"AAKA,MAAM,OAAO,aAAa;IAChB,KAAK,CAAS;IACd,SAAS,CAAS;IAClB,SAAS,CAAmB;IAC5B,cAAc,GAA2B,IAAI,CAAC;IAEtD,gBAAgB,CAA2B;IAE3C,YAAY,KAAa,EAAE,SAAiB,EAAE,SAAqB;QACjE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,IAAI,CAAC;IACrC,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,cAAc,CAAC,QAAQ,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI;QACrC,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,IAAI,IAAI,CAAC,cAAc;YAAE,OAAO,IAAI,CAAC,cAAc,CAAC;QAEpD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,CAAC,KAAK,IAAI,EAAE;YAChC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAU,EAAE,CAAC;gBACvC,IAAI,CAAC,MAAM;oBAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;gBAC5D,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;gBAC1B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;gBAClC,IAAI,CAAC;oBAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,wDAAwD,CAAC,CAAC;gBACjH,OAAO,MAAM,CAAC,KAAK,CAAC;YACtB,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAC7B,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;QAEL,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;CACF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ToolDeps } from "../types.js";
|
|
2
|
+
export declare function register(deps: ToolDeps): void;
|
|
3
|
+
/**
|
|
4
|
+
* Auto-checkpoint on disconnect. Called from index.ts / lib.ts
|
|
5
|
+
* when the transport closes or process receives a signal.
|
|
6
|
+
*/
|
|
7
|
+
export declare function autoCheckpoint(deps: ToolDeps): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/tools/session.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AA4K5C,wBAAgB,QAAQ,CAAC,IAAI,EAAE,QAAQ,QA2StC;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BlE"}
|
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { ok, text } from "../helpers.js";
|
|
5
|
+
import { getActiveSession, setActiveSession, updateActiveSession, getWorkspaceRegion, } from "../state.js";
|
|
6
|
+
import { getWorkspacesRoot } from "../config.js";
|
|
7
|
+
function readWorkspaceContext(dir) {
|
|
8
|
+
const result = {};
|
|
9
|
+
const agentsPath = path.join(dir, "AGENTS.md");
|
|
10
|
+
if (fs.existsSync(agentsPath)) {
|
|
11
|
+
result.agentsMd = fs.readFileSync(agentsPath, "utf-8");
|
|
12
|
+
}
|
|
13
|
+
const wsPath = path.join(dir, ".minicor", "workspace.json");
|
|
14
|
+
if (fs.existsSync(wsPath)) {
|
|
15
|
+
result.workspace = JSON.parse(fs.readFileSync(wsPath, "utf-8"));
|
|
16
|
+
}
|
|
17
|
+
const ctxPath = path.join(dir, ".minicor", "context.md");
|
|
18
|
+
if (fs.existsSync(ctxPath)) {
|
|
19
|
+
result.context = fs.readFileSync(ctxPath, "utf-8");
|
|
20
|
+
result.contextExists = true;
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
result.contextExists = false;
|
|
24
|
+
result.contextHint =
|
|
25
|
+
"No context.md yet. Follow Phase 0 in AGENTS.md to build workspace understanding.";
|
|
26
|
+
}
|
|
27
|
+
const vmsPath = path.join(dir, ".minicor", "vms.json");
|
|
28
|
+
if (fs.existsSync(vmsPath)) {
|
|
29
|
+
result.vms = JSON.parse(fs.readFileSync(vmsPath, "utf-8"));
|
|
30
|
+
}
|
|
31
|
+
const agPath = path.join(dir, ".minicor", "agents.json");
|
|
32
|
+
if (fs.existsSync(agPath)) {
|
|
33
|
+
result.agents = JSON.parse(fs.readFileSync(agPath, "utf-8"));
|
|
34
|
+
}
|
|
35
|
+
const siPath = path.join(dir, ".minicor", "skill-index.json");
|
|
36
|
+
if (fs.existsSync(siPath)) {
|
|
37
|
+
result.skillIndex = JSON.parse(fs.readFileSync(siPath, "utf-8"));
|
|
38
|
+
}
|
|
39
|
+
const intakePath = path.join(dir, ".minicor", "intake");
|
|
40
|
+
if (fs.existsSync(intakePath)) {
|
|
41
|
+
const intakeFiles = fs
|
|
42
|
+
.readdirSync(intakePath)
|
|
43
|
+
.filter((f) => f !== "README.md");
|
|
44
|
+
result.intakeFiles = intakeFiles;
|
|
45
|
+
if (intakeFiles.length > 0) {
|
|
46
|
+
result.intakeHint = `${intakeFiles.length} file(s) in intake folder. Read them during Phase 0.`;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const issuesPath = path.join(dir, ".minicor", "issues");
|
|
50
|
+
if (fs.existsSync(issuesPath)) {
|
|
51
|
+
result.issueFiles = fs
|
|
52
|
+
.readdirSync(issuesPath)
|
|
53
|
+
.filter((f) => f.endsWith(".md"));
|
|
54
|
+
}
|
|
55
|
+
const manifestPath = path.join(dir, "minicor.json");
|
|
56
|
+
if (fs.existsSync(manifestPath)) {
|
|
57
|
+
result.manifest = JSON.parse(fs.readFileSync(manifestPath, "utf-8"));
|
|
58
|
+
}
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
function readSessionJson(dir) {
|
|
62
|
+
const sessionPath = path.join(dir, ".minicor", "session.json");
|
|
63
|
+
if (!fs.existsSync(sessionPath))
|
|
64
|
+
return null;
|
|
65
|
+
try {
|
|
66
|
+
return JSON.parse(fs.readFileSync(sessionPath, "utf-8"));
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function writeSessionJson(dir, session) {
|
|
73
|
+
const minicorDir = path.join(dir, ".minicor");
|
|
74
|
+
if (!fs.existsSync(minicorDir))
|
|
75
|
+
fs.mkdirSync(minicorDir, { recursive: true });
|
|
76
|
+
fs.writeFileSync(path.join(minicorDir, "session.json"), JSON.stringify(session, null, 2) + "\n", "utf-8");
|
|
77
|
+
}
|
|
78
|
+
function buildSessionJson(session, status) {
|
|
79
|
+
return {
|
|
80
|
+
lastUpdated: new Date().toISOString(),
|
|
81
|
+
lastAgent: "mcp-session",
|
|
82
|
+
currentPhase: session.currentPhase,
|
|
83
|
+
status,
|
|
84
|
+
workingOn: session.workingOn,
|
|
85
|
+
completed: session.completed,
|
|
86
|
+
blocked: session.blocked,
|
|
87
|
+
nextSteps: session.nextSteps,
|
|
88
|
+
notes: session.notes,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
async function syncSessionIssue(deps, workspaceId, session, region) {
|
|
92
|
+
try {
|
|
93
|
+
const r = region ?? getWorkspaceRegion(workspaceId) ?? undefined;
|
|
94
|
+
const client = deps.client(r);
|
|
95
|
+
const issues = await client.listIssues(workspaceId);
|
|
96
|
+
const sessionIssue = issues.find((i) => i.title === "[Workspace:Session]");
|
|
97
|
+
const description = [
|
|
98
|
+
`## Session State`,
|
|
99
|
+
``,
|
|
100
|
+
`**Phase:** ${session.currentPhase}`,
|
|
101
|
+
`**Status:** ${session.status}`,
|
|
102
|
+
`**Last Updated:** ${session.lastUpdated}`,
|
|
103
|
+
`**Agent:** ${session.lastAgent}`,
|
|
104
|
+
``,
|
|
105
|
+
session.workingOn
|
|
106
|
+
? `### Working On\n${session.workingOn.description || session.workingOn.workflow || "N/A"}`
|
|
107
|
+
: "",
|
|
108
|
+
session.completed.length > 0
|
|
109
|
+
? `### Completed\n${session.completed.map((c) => `- ${c}`).join("\n")}`
|
|
110
|
+
: "",
|
|
111
|
+
session.blocked.length > 0
|
|
112
|
+
? `### Blocked\n${session.blocked.map((b) => `- ${b}`).join("\n")}`
|
|
113
|
+
: "",
|
|
114
|
+
session.nextSteps.length > 0
|
|
115
|
+
? `### Next Steps\n${session.nextSteps.map((n) => `- ${n}`).join("\n")}`
|
|
116
|
+
: "",
|
|
117
|
+
session.notes ? `### Notes\n${session.notes}` : "",
|
|
118
|
+
]
|
|
119
|
+
.filter(Boolean)
|
|
120
|
+
.join("\n");
|
|
121
|
+
if (sessionIssue) {
|
|
122
|
+
await client.updateIssue(workspaceId, sessionIssue.id, { description });
|
|
123
|
+
return `Updated issue #${sessionIssue.id}`;
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
const created = await client.createIssue(workspaceId, {
|
|
127
|
+
title: "[Workspace:Session]",
|
|
128
|
+
description,
|
|
129
|
+
});
|
|
130
|
+
return `Created issue #${created.id}`;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
catch (e) {
|
|
134
|
+
return `Failed to sync session issue: ${e.message}`;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
export function register(deps) {
|
|
138
|
+
const { server } = deps;
|
|
139
|
+
server.tool("session_start", `Start a workspace session. Call this FIRST when working in a Minicor workspace clone.
|
|
140
|
+
Does everything get_workspace_context does PLUS tracks an active session so session_checkpoint
|
|
141
|
+
and session_end can auto-persist your progress. If a prior session exists, returns resume
|
|
142
|
+
instructions prominently.`, {
|
|
143
|
+
directory: z
|
|
144
|
+
.string()
|
|
145
|
+
.optional()
|
|
146
|
+
.describe("Workspace clone directory (defaults to cwd)"),
|
|
147
|
+
agentName: z
|
|
148
|
+
.string()
|
|
149
|
+
.optional()
|
|
150
|
+
.describe("Name to identify this agent in session logs (default: 'mcp-session')"),
|
|
151
|
+
}, async ({ directory, agentName }) => {
|
|
152
|
+
try {
|
|
153
|
+
const dir = directory ? path.resolve(directory) : process.cwd();
|
|
154
|
+
const manifestPath = path.join(dir, "minicor.json");
|
|
155
|
+
if (!fs.existsSync(manifestPath)) {
|
|
156
|
+
return text("Not a Minicor workspace clone (no minicor.json found). " +
|
|
157
|
+
"Use clone_workspace to clone a workspace first.");
|
|
158
|
+
}
|
|
159
|
+
const context = readWorkspaceContext(dir);
|
|
160
|
+
const priorSession = readSessionJson(dir);
|
|
161
|
+
const manifest = context.manifest;
|
|
162
|
+
const workspace = context.workspace;
|
|
163
|
+
const workspaceId = manifest?.workspace ?? workspace?.id ?? 0;
|
|
164
|
+
const region = workspace?.region;
|
|
165
|
+
let resumePhase = "gather-context";
|
|
166
|
+
if (priorSession) {
|
|
167
|
+
resumePhase = priorSession.currentPhase || "gather-context";
|
|
168
|
+
}
|
|
169
|
+
setActiveSession({
|
|
170
|
+
directory: dir,
|
|
171
|
+
workspaceId,
|
|
172
|
+
region,
|
|
173
|
+
startedAt: new Date().toISOString(),
|
|
174
|
+
currentPhase: resumePhase,
|
|
175
|
+
completed: priorSession?.completed || [],
|
|
176
|
+
blocked: priorSession?.blocked || [],
|
|
177
|
+
nextSteps: priorSession?.nextSteps || [],
|
|
178
|
+
notes: priorSession?.notes,
|
|
179
|
+
workingOn: priorSession?.workingOn,
|
|
180
|
+
});
|
|
181
|
+
console.error(`[session] Started in ${dir} (workspace ${workspaceId}, phase: ${resumePhase})`);
|
|
182
|
+
const result = {
|
|
183
|
+
...context,
|
|
184
|
+
sessionActive: true,
|
|
185
|
+
workspacesRoot: getWorkspacesRoot() || null,
|
|
186
|
+
};
|
|
187
|
+
if (priorSession) {
|
|
188
|
+
result.session = priorSession;
|
|
189
|
+
const task = priorSession.workingOn?.description ||
|
|
190
|
+
priorSession.workingOn?.workflow ||
|
|
191
|
+
"unknown task";
|
|
192
|
+
result.resumeInstructions = {
|
|
193
|
+
message: `RESUME: A prior session exists. Last agent was in phase "${priorSession.currentPhase}", ` +
|
|
194
|
+
`working on: ${task}. Status: ${priorSession.status}.`,
|
|
195
|
+
nextSteps: priorSession.nextSteps,
|
|
196
|
+
blocked: priorSession.blocked,
|
|
197
|
+
completed: priorSession.completed,
|
|
198
|
+
action: "Resume from the indicated phase and task. Do NOT start over. " +
|
|
199
|
+
"Check blocked items to avoid known issues.",
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
result.session = null;
|
|
204
|
+
result.resumeInstructions = {
|
|
205
|
+
message: "No prior session. Start from Phase 0 (Gather Context).",
|
|
206
|
+
action: "Follow the AGENTS.md loop starting from Phase 0. " +
|
|
207
|
+
"Call session_checkpoint between phases to save progress.",
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
return ok(result);
|
|
211
|
+
}
|
|
212
|
+
catch (e) {
|
|
213
|
+
return text(`Error starting session: ${e.message}`);
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
server.tool("session_checkpoint", `Save session progress. Writes .minicor/session.json and optionally syncs to a
|
|
217
|
+
[Workspace:Session] issue on the platform. Call between phases or after significant progress.`, {
|
|
218
|
+
phase: z
|
|
219
|
+
.enum([
|
|
220
|
+
"gather-context",
|
|
221
|
+
"orient",
|
|
222
|
+
"scope",
|
|
223
|
+
"build",
|
|
224
|
+
"test",
|
|
225
|
+
"harden",
|
|
226
|
+
"learn",
|
|
227
|
+
])
|
|
228
|
+
.describe("Current phase in the agent loop"),
|
|
229
|
+
status: z
|
|
230
|
+
.enum(["in-progress", "completed", "blocked", "interrupted"])
|
|
231
|
+
.default("in-progress")
|
|
232
|
+
.describe("Session status"),
|
|
233
|
+
workingOn: z
|
|
234
|
+
.object({
|
|
235
|
+
workflow: z.string().optional(),
|
|
236
|
+
workflowId: z.number().optional(),
|
|
237
|
+
step: z.number().optional(),
|
|
238
|
+
stepName: z.string().optional(),
|
|
239
|
+
description: z.string().optional(),
|
|
240
|
+
})
|
|
241
|
+
.optional()
|
|
242
|
+
.describe("What you're currently working on"),
|
|
243
|
+
completed: z
|
|
244
|
+
.array(z.string())
|
|
245
|
+
.optional()
|
|
246
|
+
.describe("List of completed items"),
|
|
247
|
+
blocked: z
|
|
248
|
+
.array(z.string())
|
|
249
|
+
.optional()
|
|
250
|
+
.describe("List of blockers"),
|
|
251
|
+
nextSteps: z
|
|
252
|
+
.array(z.string())
|
|
253
|
+
.optional()
|
|
254
|
+
.describe("Clear instructions for the next agent"),
|
|
255
|
+
notes: z
|
|
256
|
+
.string()
|
|
257
|
+
.optional()
|
|
258
|
+
.describe("Anything the next agent should know"),
|
|
259
|
+
syncToIssue: z
|
|
260
|
+
.boolean()
|
|
261
|
+
.default(true)
|
|
262
|
+
.describe("Also sync to [Workspace:Session] issue on the platform"),
|
|
263
|
+
}, async ({ phase, status, workingOn, completed, blocked, nextSteps, notes, syncToIssue, }) => {
|
|
264
|
+
try {
|
|
265
|
+
const session = getActiveSession();
|
|
266
|
+
if (!session) {
|
|
267
|
+
return text("No active session. Call session_start first.");
|
|
268
|
+
}
|
|
269
|
+
updateActiveSession({
|
|
270
|
+
currentPhase: phase,
|
|
271
|
+
workingOn,
|
|
272
|
+
completed: completed || session.completed,
|
|
273
|
+
blocked: blocked || session.blocked,
|
|
274
|
+
nextSteps: nextSteps || session.nextSteps,
|
|
275
|
+
notes: notes ?? session.notes,
|
|
276
|
+
lastCheckpoint: new Date().toISOString(),
|
|
277
|
+
});
|
|
278
|
+
const updated = getActiveSession();
|
|
279
|
+
const sessionData = buildSessionJson(updated, status);
|
|
280
|
+
writeSessionJson(updated.directory, sessionData);
|
|
281
|
+
const result = {
|
|
282
|
+
saved: true,
|
|
283
|
+
file: path.join(updated.directory, ".minicor", "session.json"),
|
|
284
|
+
phase,
|
|
285
|
+
status,
|
|
286
|
+
};
|
|
287
|
+
if (syncToIssue && updated.workspaceId) {
|
|
288
|
+
result.issueSync = await syncSessionIssue(deps, updated.workspaceId, sessionData, updated.region);
|
|
289
|
+
}
|
|
290
|
+
console.error(`[session] Checkpoint: phase=${phase}, status=${status}`);
|
|
291
|
+
return ok(result);
|
|
292
|
+
}
|
|
293
|
+
catch (e) {
|
|
294
|
+
return text(`Error saving checkpoint: ${e.message}`);
|
|
295
|
+
}
|
|
296
|
+
});
|
|
297
|
+
server.tool("session_end", `End the workspace session. Writes final session.json, syncs [Workspace:Session] issue,
|
|
298
|
+
and optionally updates context.md. Call this before ending your work.`, {
|
|
299
|
+
status: z
|
|
300
|
+
.enum(["completed", "blocked", "interrupted"])
|
|
301
|
+
.default("completed")
|
|
302
|
+
.describe("Final session status"),
|
|
303
|
+
summary: z
|
|
304
|
+
.string()
|
|
305
|
+
.optional()
|
|
306
|
+
.describe("Summary of what was accomplished"),
|
|
307
|
+
nextSteps: z
|
|
308
|
+
.array(z.string())
|
|
309
|
+
.optional()
|
|
310
|
+
.describe("Clear instructions for the next agent"),
|
|
311
|
+
blocked: z
|
|
312
|
+
.array(z.string())
|
|
313
|
+
.optional()
|
|
314
|
+
.describe("Blockers if status is blocked"),
|
|
315
|
+
contextUpdate: z
|
|
316
|
+
.string()
|
|
317
|
+
.optional()
|
|
318
|
+
.describe("If provided, appends to .minicor/context.md"),
|
|
319
|
+
}, async ({ status, summary, nextSteps, blocked, contextUpdate }) => {
|
|
320
|
+
try {
|
|
321
|
+
const session = getActiveSession();
|
|
322
|
+
if (!session) {
|
|
323
|
+
return text("No active session. Call session_start first.");
|
|
324
|
+
}
|
|
325
|
+
if (nextSteps)
|
|
326
|
+
session.nextSteps = nextSteps;
|
|
327
|
+
if (blocked)
|
|
328
|
+
session.blocked = blocked;
|
|
329
|
+
if (summary) {
|
|
330
|
+
session.completed.push(summary);
|
|
331
|
+
session.notes = summary;
|
|
332
|
+
}
|
|
333
|
+
const sessionData = buildSessionJson(session, status);
|
|
334
|
+
writeSessionJson(session.directory, sessionData);
|
|
335
|
+
const result = {
|
|
336
|
+
ended: true,
|
|
337
|
+
file: path.join(session.directory, ".minicor", "session.json"),
|
|
338
|
+
phase: session.currentPhase,
|
|
339
|
+
status,
|
|
340
|
+
};
|
|
341
|
+
if (session.workspaceId) {
|
|
342
|
+
result.issueSync = await syncSessionIssue(deps, session.workspaceId, sessionData, session.region);
|
|
343
|
+
}
|
|
344
|
+
if (contextUpdate) {
|
|
345
|
+
const ctxPath = path.join(session.directory, ".minicor", "context.md");
|
|
346
|
+
const existing = fs.existsSync(ctxPath)
|
|
347
|
+
? fs.readFileSync(ctxPath, "utf-8")
|
|
348
|
+
: "";
|
|
349
|
+
const timestamp = new Date().toISOString().split("T")[0];
|
|
350
|
+
const appended = `${existing}\n\n## Update (${timestamp})\n\n${contextUpdate}\n`;
|
|
351
|
+
fs.writeFileSync(ctxPath, appended, "utf-8");
|
|
352
|
+
result.contextUpdated = true;
|
|
353
|
+
}
|
|
354
|
+
console.error(`[session] Ended: status=${status}, workspace=${session.workspaceId}`);
|
|
355
|
+
setActiveSession(null);
|
|
356
|
+
return ok(result);
|
|
357
|
+
}
|
|
358
|
+
catch (e) {
|
|
359
|
+
return text(`Error ending session: ${e.message}`);
|
|
360
|
+
}
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Auto-checkpoint on disconnect. Called from index.ts / lib.ts
|
|
365
|
+
* when the transport closes or process receives a signal.
|
|
366
|
+
*/
|
|
367
|
+
export async function autoCheckpoint(deps) {
|
|
368
|
+
const session = getActiveSession();
|
|
369
|
+
if (!session)
|
|
370
|
+
return;
|
|
371
|
+
console.error("[session] Auto-checkpoint on disconnect...");
|
|
372
|
+
const sessionData = buildSessionJson(session, "interrupted");
|
|
373
|
+
sessionData.notes =
|
|
374
|
+
(sessionData.notes ? sessionData.notes + "\n" : "") +
|
|
375
|
+
"Session interrupted — auto-saved on disconnect.";
|
|
376
|
+
try {
|
|
377
|
+
writeSessionJson(session.directory, sessionData);
|
|
378
|
+
}
|
|
379
|
+
catch (e) {
|
|
380
|
+
console.error(`[session] Failed to write session.json: ${e.message}`);
|
|
381
|
+
}
|
|
382
|
+
if (session.workspaceId) {
|
|
383
|
+
try {
|
|
384
|
+
await syncSessionIssue(deps, session.workspaceId, sessionData, session.region);
|
|
385
|
+
}
|
|
386
|
+
catch (e) {
|
|
387
|
+
console.error(`[session] Failed to sync issue: ${e.message}`);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
setActiveSession(null);
|
|
391
|
+
}
|
|
392
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/tools/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-tools.d.ts","sourceRoot":"","sources":["../../src/tools/sync-tools.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sync-tools.d.ts","sourceRoot":"","sources":["../../src/tools/sync-tools.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAO5C,wBAAgB,QAAQ,CAAC,IAAI,EAAE,QAAQ,QAoQtC"}
|