loopforge 1.1.1 → 1.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.
Files changed (87) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +2 -0
  3. package/dist/backends/fs.d.ts.map +1 -1
  4. package/dist/backends/fs.js +1 -0
  5. package/dist/backends/fs.js.map +1 -1
  6. package/dist/cli.d.ts +1 -1
  7. package/dist/cli.js +69 -180
  8. package/dist/cli.js.map +1 -1
  9. package/dist/engine.d.ts.map +1 -1
  10. package/dist/engine.js +6 -2
  11. package/dist/engine.js.map +1 -1
  12. package/dist/generate-schema.js +56 -4
  13. package/dist/generate-schema.js.map +1 -1
  14. package/dist/index.d.ts +17 -7
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +17 -7
  17. package/dist/index.js.map +1 -1
  18. package/dist/loop-compiler.js +1 -1
  19. package/dist/loop-compiler.js.map +1 -1
  20. package/dist/mcp/server.d.ts +14 -0
  21. package/dist/mcp/server.d.ts.map +1 -0
  22. package/dist/mcp/server.js +93 -0
  23. package/dist/mcp/server.js.map +1 -0
  24. package/dist/mcp/session.d.ts +68 -0
  25. package/dist/mcp/session.d.ts.map +1 -0
  26. package/dist/mcp/session.js +343 -0
  27. package/dist/mcp/session.js.map +1 -0
  28. package/dist/mcp/tools.d.ts +128 -0
  29. package/dist/mcp/tools.d.ts.map +1 -0
  30. package/dist/mcp/tools.js +237 -0
  31. package/dist/mcp/tools.js.map +1 -0
  32. package/dist/mcp-server.d.ts +12 -0
  33. package/dist/mcp-server.d.ts.map +1 -0
  34. package/dist/mcp-server.js +14 -0
  35. package/dist/mcp-server.js.map +1 -0
  36. package/dist/policy.d.ts +8 -0
  37. package/dist/policy.d.ts.map +1 -1
  38. package/dist/policy.js +7 -0
  39. package/dist/policy.js.map +1 -1
  40. package/dist/protocol.d.ts +68 -1
  41. package/dist/protocol.d.ts.map +1 -1
  42. package/dist/protocol.js +9 -1
  43. package/dist/protocol.js.map +1 -1
  44. package/dist/runtime.d.ts +57 -0
  45. package/dist/runtime.d.ts.map +1 -0
  46. package/dist/runtime.js +414 -0
  47. package/dist/runtime.js.map +1 -0
  48. package/dist/tests/_helpers.d.ts +25 -0
  49. package/dist/tests/_helpers.d.ts.map +1 -0
  50. package/dist/tests/_helpers.js +47 -0
  51. package/dist/tests/_helpers.js.map +1 -0
  52. package/dist/tests/generate-schema.test.js +2 -2
  53. package/dist/tests/generate-schema.test.js.map +1 -1
  54. package/dist/tests/loop-compiler.test.js +21 -0
  55. package/dist/tests/loop-compiler.test.js.map +1 -1
  56. package/dist/tests/mcp.test.d.ts +7 -0
  57. package/dist/tests/mcp.test.d.ts.map +1 -0
  58. package/dist/tests/mcp.test.js +398 -0
  59. package/dist/tests/mcp.test.js.map +1 -0
  60. package/dist/tests/replay.test.js +69 -41
  61. package/dist/tests/replay.test.js.map +1 -1
  62. package/dist/tests/runtime.test.d.ts +7 -0
  63. package/dist/tests/runtime.test.d.ts.map +1 -0
  64. package/dist/tests/runtime.test.js +323 -0
  65. package/dist/tests/runtime.test.js.map +1 -0
  66. package/loop_policy.json +7 -0
  67. package/package.json +8 -6
  68. package/skills/perception/SKILL.md +194 -0
  69. package/skills/prompt-techniques/SKILL.md +52 -0
  70. package/skills/prompt-techniques/references/chain-of-thought.md +207 -0
  71. package/skills/prompt-techniques/references/few-shot.md +174 -0
  72. package/skills/prompt-techniques/references/least-to-most.md +182 -0
  73. package/skills/prompt-techniques/references/step-back.md +160 -0
  74. package/skills/prompt-techniques/references/tree-of-thought.md +191 -0
  75. package/skills/prompt-techniques/references/zero-shot.md +97 -0
  76. package/dist/autonomous.d.ts +0 -84
  77. package/dist/autonomous.d.ts.map +0 -1
  78. package/dist/autonomous.js +0 -250
  79. package/dist/autonomous.js.map +0 -1
  80. package/dist/backends/ai.d.ts +0 -37
  81. package/dist/backends/ai.d.ts.map +0 -1
  82. package/dist/backends/ai.js +0 -98
  83. package/dist/backends/ai.js.map +0 -1
  84. package/dist/tests/autonomous.test.d.ts +0 -7
  85. package/dist/tests/autonomous.test.d.ts.map +0 -1
  86. package/dist/tests/autonomous.test.js +0 -294
  87. package/dist/tests/autonomous.test.js.map +0 -1
@@ -0,0 +1,93 @@
1
+ /** LoopForge MCP — JSON-RPC transport over stdio.
2
+ *
3
+ * Implements the MCP protocol: initialize → tools/list → tools/call.
4
+ * Uses node:readline for stdin, writes JSON-RPC responses to stdout.
5
+ * All logging goes to stderr to keep stdout clean.
6
+ */
7
+ import { createInterface } from "node:readline";
8
+ import { SessionManager } from "./session.js";
9
+ import { TOOL_SCHEMAS, TOOL_HANDLERS } from "./tools.js";
10
+ const SERVER_INFO = {
11
+ name: "loopforge-mcp",
12
+ version: "1.3.0",
13
+ };
14
+ function errorResponse(id, code, message) {
15
+ return JSON.stringify({
16
+ jsonrpc: "2.0",
17
+ id: id ?? null,
18
+ error: { code, message },
19
+ });
20
+ }
21
+ function okResponse(id, result) {
22
+ if (id === undefined)
23
+ return ""; // notification — no response
24
+ return JSON.stringify({ jsonrpc: "2.0", id, result });
25
+ }
26
+ // ═══════════════════════════════════════════════════════════════════════════
27
+ // Server
28
+ // ═══════════════════════════════════════════════════════════════════════════
29
+ export class McpServer {
30
+ mgr;
31
+ constructor(backend) {
32
+ this.mgr = new SessionManager(backend);
33
+ }
34
+ start() {
35
+ const rl = createInterface({ input: process.stdin });
36
+ rl.on("line", (line) => {
37
+ let req;
38
+ try {
39
+ req = JSON.parse(line);
40
+ }
41
+ catch {
42
+ process.stderr.write(`[loopforge-mcp] bad JSON: ${line.slice(0, 80)}\n`);
43
+ process.stdout.write(errorResponse(undefined, -32700, "Parse error") + "\n");
44
+ return;
45
+ }
46
+ // Notifications (no id) — ignore
47
+ if (req.id === undefined) {
48
+ process.stderr.write(`[loopforge-mcp] notification: ${req.method}\n`);
49
+ return;
50
+ }
51
+ try {
52
+ const result = this.dispatch(req);
53
+ if (result !== null) {
54
+ process.stdout.write(okResponse(req.id, result) + "\n");
55
+ }
56
+ }
57
+ catch (err) {
58
+ const msg = err instanceof Error ? err.message : String(err);
59
+ process.stderr.write(`[loopforge-mcp] dispatch error: ${msg}\n`);
60
+ process.stdout.write(errorResponse(req.id, -32603, msg) + "\n");
61
+ }
62
+ });
63
+ process.stderr.write(`[loopforge-mcp] v${SERVER_INFO.version} started\n`);
64
+ }
65
+ dispatch(req) {
66
+ switch (req.method) {
67
+ case "initialize":
68
+ return {
69
+ protocolVersion: "2024-11-05",
70
+ capabilities: { tools: {} },
71
+ serverInfo: SERVER_INFO,
72
+ };
73
+ case "tools/list":
74
+ return { tools: TOOL_SCHEMAS };
75
+ case "tools/call": {
76
+ const params = req.params ?? {};
77
+ const name = String(params.name ?? "");
78
+ const args = params.arguments ?? {};
79
+ const handler = TOOL_HANDLERS[name];
80
+ if (!handler) {
81
+ throw new Error(`Unknown tool: ${name}`);
82
+ }
83
+ const output = handler(this.mgr, args);
84
+ return {
85
+ content: [{ type: "text", text: JSON.stringify(output) }],
86
+ };
87
+ }
88
+ default:
89
+ throw new Error(`Unknown method: ${req.method}`);
90
+ }
91
+ }
92
+ }
93
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGzD,MAAM,WAAW,GAAG;IAClB,IAAI,EAAE,eAAe;IACrB,OAAO,EAAE,OAAO;CACjB,CAAC;AAaF,SAAS,aAAa,CAAC,EAA+B,EAAE,IAAY,EAAE,OAAe;IACnF,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,OAAO,EAAE,KAAK;QACd,EAAE,EAAE,EAAE,IAAI,IAAI;QACd,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;KACzB,CAAC,CAAC;AACL,CAAC;AAED,SAAS,UAAU,CAAC,EAA+B,EAAE,MAA+B;IAClF,IAAI,EAAE,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC,CAAC,6BAA6B;IAC9D,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;AACxD,CAAC;AAED,8EAA8E;AAC9E,SAAS;AACT,8EAA8E;AAE9E,MAAM,OAAO,SAAS;IACZ,GAAG,CAAiB;IAE5B,YAAY,OAAsB;QAChC,IAAI,CAAC,GAAG,GAAG,IAAI,cAAc,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,KAAK;QACH,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QAErD,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YAC7B,IAAI,GAAmB,CAAC;YACxB,IAAI,CAAC;gBACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;gBACzE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,GAAG,IAAI,CAAC,CAAC;gBAC7E,OAAO;YACT,CAAC;YAED,iCAAiC;YACjC,IAAI,GAAG,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;gBACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;gBACtE,OAAO;YACT,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBAClC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;oBACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;gBAC1D,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,GAAG,IAAI,CAAC,CAAC;gBACjE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;YAClE,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,WAAW,CAAC,OAAO,YAAY,CAAC,CAAC;IAC5E,CAAC;IAEO,QAAQ,CAAC,GAAmB;QAClC,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;YACnB,KAAK,YAAY;gBACf,OAAO;oBACL,eAAe,EAAE,YAAY;oBAC7B,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;oBAC3B,UAAU,EAAE,WAAW;iBACxB,CAAC;YAEJ,KAAK,YAAY;gBACf,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;YAEjC,KAAK,YAAY,CAAC,CAAC,CAAC;gBAClB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC;gBAChC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;gBACvC,MAAM,IAAI,GAAI,MAAM,CAAC,SAAqC,IAAI,EAAE,CAAC;gBAEjE,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;gBACpC,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;gBAC3C,CAAC;gBAED,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBACvC,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;iBAC1D,CAAC;YACJ,CAAC;YAED;gBACE,MAAM,IAAI,KAAK,CAAC,mBAAmB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,68 @@
1
+ /** LoopForge MCP — Session manager.
2
+ *
3
+ * Each McpSession = one complete multi-round loop.
4
+ * SessionManager holds Map<sessionId, McpSession> and drives
5
+ * the advance() cycle: extract → feedback → check stop → compile next.
6
+ */
7
+ import { LoopForgeEngine } from "../engine.js";
8
+ import type { VaultBackend } from "../backends/interface.js";
9
+ export interface McpSession {
10
+ sessionId: string;
11
+ loopId: string;
12
+ task: string;
13
+ engine: LoopForgeEngine;
14
+ currentRound: number;
15
+ maxRounds: number;
16
+ qualityTrajectory: number[];
17
+ status: "running" | "stopped" | "stalled";
18
+ createdAt: number;
19
+ }
20
+ export interface McpSessionSummary {
21
+ sessionId: string;
22
+ loopId: string;
23
+ round: number;
24
+ status: "running" | "stopped" | "stalled";
25
+ }
26
+ export interface StartInput {
27
+ task: string;
28
+ loopId?: string;
29
+ maxRounds?: number;
30
+ domain?: string;
31
+ planSource?: string;
32
+ constraints?: string[];
33
+ }
34
+ export interface AdvanceResult {
35
+ sessionId: string;
36
+ round: number;
37
+ prompt: string | null;
38
+ stopReason?: string;
39
+ technique?: string;
40
+ level?: string;
41
+ quality?: number;
42
+ warnings?: string[];
43
+ }
44
+ export declare class SessionManager {
45
+ private sessions;
46
+ private backend;
47
+ constructor(backend?: VaultBackend);
48
+ create(input: StartInput): AdvanceResult;
49
+ get(sessionId: string): McpSession | undefined;
50
+ delete(sessionId: string): boolean;
51
+ /** Persist session state to vault for cross-process recovery.
52
+ * Uses upsert: removes any previous session_state entry for this loop,
53
+ * then appends a new one with current state. */
54
+ save(session: McpSession): void;
55
+ /** Resume a loop from vault state.
56
+ * Reconstructs the session and compiles the prompt for the next round.
57
+ * Returns null if no session_state entry exists for this loopId. */
58
+ resume(loopId: string): AdvanceResult | null;
59
+ list(): McpSessionSummary[];
60
+ /** Get loop health for a loop (in-memory or vault).
61
+ * Computes goal alignment, constraint integrity, drift, strategy stability. */
62
+ getHealth(loopId: string): Record<string, unknown> | null;
63
+ /** Core cycle: extract self-eval → record feedback → check stop → compile next. */
64
+ advance(sessionId: string, output: string): AdvanceResult;
65
+ /** Replay timeline for a session — creates ReplayBackend from the stored backend. */
66
+ replayTimeline(sessionId: string): Record<string, unknown>[] | null;
67
+ }
68
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/mcp/session.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,eAAe,EAAkD,MAAM,cAAc,CAAC;AAM/F,OAAO,KAAK,EAAE,YAAY,EAAc,MAAM,0BAA0B,CAAC;AAKzE,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,eAAe,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IAC1C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;CAC3C;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAoDD,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAiC;IACjD,OAAO,CAAC,OAAO,CAA2B;gBAE9B,OAAO,CAAC,EAAE,YAAY;IAIlC,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,aAAa;IAsCxC,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAI9C,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAQlC;;qDAEiD;IACjD,IAAI,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;IA8B/B;;yEAEqE;IACrE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAkE5C,IAAI,IAAI,iBAAiB,EAAE;IAqC3B;oFACgF;IAChF,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAqDzD,mFAAmF;IACnF,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa;IAiEzD,qFAAqF;IACrF,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,IAAI;CAQpE"}
@@ -0,0 +1,343 @@
1
+ /** LoopForge MCP — Session manager.
2
+ *
3
+ * Each McpSession = one complete multi-round loop.
4
+ * SessionManager holds Map<sessionId, McpSession> and drives
5
+ * the advance() cycle: extract → feedback → check stop → compile next.
6
+ */
7
+ import { randomUUID } from "node:crypto";
8
+ import { LoopForgeEngine, extractSelfEvaluation, heuristicSelfEvaluation } from "../engine.js";
9
+ import { checkLoopHealth } from "../loop-compiler.js";
10
+ import { getPolicy } from "../policy.js";
11
+ import { Mode, makeLoopCompileRequest, makeVaultConfig } from "../protocol.js";
12
+ import { ReplayBackend } from "../replay.js";
13
+ import { FSBackend } from "../backends/fs.js";
14
+ // ── Helpers ────────────────────────────────────────────────────────────────
15
+ function buildLoopRequest(session, lastEval, lastQuality) {
16
+ const req = {
17
+ task: session.task,
18
+ mode: Mode.LOOP_COMPILE,
19
+ vault_config: makeVaultConfig(),
20
+ feedback: null,
21
+ skill_name: null,
22
+ task_id: null,
23
+ loop_id: session.loopId,
24
+ round: session.currentRound,
25
+ };
26
+ if (lastEval && lastQuality !== undefined) {
27
+ req.last_round_result = {
28
+ round: session.currentRound - 1,
29
+ success: lastEval.success,
30
+ output_summary: lastEval.output_summary,
31
+ constraint_violations: lastEval.constraint_violations,
32
+ manual_fixes_needed: "",
33
+ quality_score: lastQuality,
34
+ };
35
+ }
36
+ return req;
37
+ }
38
+ function parseLevel(rationale) {
39
+ if (!rationale)
40
+ return "l2";
41
+ if (rationale.includes("l0"))
42
+ return "l0";
43
+ if (rationale.includes("l1"))
44
+ return "l1";
45
+ return "l2";
46
+ }
47
+ function parseWarnings(prompt) {
48
+ if (!prompt)
49
+ return [];
50
+ const warnings = [];
51
+ const warnSection = prompt.match(/### Warnings\n([\s\S]*?)(?=\n###|\n\*\*|$)/);
52
+ if (warnSection) {
53
+ for (const line of warnSection[1].split("\n")) {
54
+ const m = line.match(/- ⚠️\s*(.+)/);
55
+ if (m)
56
+ warnings.push(m[1]);
57
+ }
58
+ }
59
+ return warnings;
60
+ }
61
+ // ── SessionManager ─────────────────────────────────────────────────────────
62
+ export class SessionManager {
63
+ sessions = new Map();
64
+ backend;
65
+ constructor(backend) {
66
+ this.backend = backend;
67
+ }
68
+ create(input) {
69
+ const sessionId = randomUUID();
70
+ const loopId = input.loopId ?? randomUUID();
71
+ const engine = new LoopForgeEngine("skills", this.backend);
72
+ const maxRounds = input.maxRounds ?? getPolicy().runtime.max_rounds;
73
+ // Populate extra fields for the first round
74
+ const request = buildLoopRequest({
75
+ sessionId, loopId, task: input.task, engine, currentRound: 1,
76
+ maxRounds, qualityTrajectory: [], status: "running", createdAt: Date.now(),
77
+ });
78
+ request.domain = input.domain ?? "";
79
+ request.plan_source = input.planSource ?? null;
80
+ request.constraints_from_plan = input.constraints ?? [];
81
+ const result = engine.invokeLoopCompile(request);
82
+ const session = {
83
+ sessionId, loopId, task: input.task, engine,
84
+ currentRound: 1, maxRounds, qualityTrajectory: [],
85
+ status: "running", createdAt: Date.now(),
86
+ };
87
+ this.sessions.set(sessionId, session);
88
+ // Persist to vault for cross-process recovery
89
+ this.save(session);
90
+ return {
91
+ sessionId,
92
+ round: 1,
93
+ prompt: result.response?.prompt ?? null,
94
+ technique: result.response?.analysis?.technique ?? "zero-shot",
95
+ level: parseLevel(result.response?.analysis?.rationale),
96
+ quality: 0,
97
+ warnings: parseWarnings(result.response?.prompt ?? null),
98
+ };
99
+ }
100
+ get(sessionId) {
101
+ return this.sessions.get(sessionId);
102
+ }
103
+ delete(sessionId) {
104
+ const session = this.sessions.get(sessionId);
105
+ if (!session)
106
+ return false;
107
+ session.status = "stopped";
108
+ this.sessions.delete(sessionId);
109
+ return true;
110
+ }
111
+ /** Persist session state to vault for cross-process recovery.
112
+ * Uses upsert: removes any previous session_state entry for this loop,
113
+ * then appends a new one with current state. */
114
+ save(session) {
115
+ if (!this.backend)
116
+ return;
117
+ // Upsert: remove old session_state entries for this loop
118
+ const vault = this.backend.readVault();
119
+ const entries = vault.entries || [];
120
+ vault.entries = entries.filter((e) => !(e.task_type === "session_state" && e.loop_id === session.loopId));
121
+ this.backend.writeVault(vault);
122
+ // Append fresh session state
123
+ this.backend.appendEntry({
124
+ task_id: `loop:${session.loopId}:session`,
125
+ task_type: "session_state",
126
+ timestamp: new Date().toISOString(),
127
+ loop_id: session.loopId,
128
+ task: session.task,
129
+ loop_lineage: {
130
+ session_id: session.sessionId,
131
+ current_round: session.currentRound,
132
+ max_rounds: session.maxRounds,
133
+ quality_trajectory: session.qualityTrajectory,
134
+ status: session.status,
135
+ created_at: session.createdAt,
136
+ },
137
+ });
138
+ }
139
+ /** Resume a loop from vault state.
140
+ * Reconstructs the session and compiles the prompt for the next round.
141
+ * Returns null if no session_state entry exists for this loopId. */
142
+ resume(loopId) {
143
+ if (!this.backend)
144
+ return null;
145
+ const entries = this.backend.queryEntries({
146
+ prefix: `loop:${loopId}:session`,
147
+ });
148
+ const sessionEntry = entries.find((e) => e.task_type === "session_state");
149
+ if (!sessionEntry)
150
+ return null;
151
+ const lineage = (sessionEntry.loop_lineage ?? {});
152
+ const status = lineage.status ?? "running";
153
+ const currentRound = lineage.current_round ?? 1;
154
+ const qualityTrajectory = lineage.quality_trajectory ?? [];
155
+ const task = sessionEntry.task ?? "";
156
+ const maxRounds = lineage.max_rounds ?? getPolicy().runtime.max_rounds;
157
+ // If the loop was already stopped or stalled, return immediately
158
+ if (status !== "running") {
159
+ return {
160
+ sessionId: "",
161
+ round: currentRound,
162
+ prompt: null,
163
+ stopReason: status,
164
+ };
165
+ }
166
+ // Reconstruct session with a fresh engine
167
+ const engine = new LoopForgeEngine("skills", this.backend);
168
+ const sessionId = randomUUID();
169
+ const session = {
170
+ sessionId,
171
+ loopId,
172
+ task,
173
+ engine,
174
+ currentRound,
175
+ maxRounds,
176
+ qualityTrajectory,
177
+ status: "running",
178
+ createdAt: lineage.created_at ?? Date.now(),
179
+ };
180
+ this.sessions.set(sessionId, session);
181
+ // Compile the next round's prompt from vault lineage
182
+ const request = buildLoopRequest(session);
183
+ const result = engine.invokeLoopCompile(request);
184
+ return {
185
+ sessionId,
186
+ round: currentRound,
187
+ prompt: result.response?.prompt ?? null,
188
+ technique: result.response?.analysis?.technique ?? "zero-shot",
189
+ level: parseLevel(result.response?.analysis?.rationale),
190
+ quality: 0,
191
+ warnings: parseWarnings(result.response?.prompt ?? null),
192
+ };
193
+ }
194
+ list() {
195
+ const seen = new Set();
196
+ const result = [];
197
+ // In-memory sessions first (take priority)
198
+ for (const s of this.sessions.values()) {
199
+ seen.add(s.loopId);
200
+ result.push({
201
+ sessionId: s.sessionId,
202
+ loopId: s.loopId,
203
+ round: s.currentRound,
204
+ status: s.status,
205
+ });
206
+ }
207
+ // Merge vault-persisted sessions not already in memory
208
+ if (this.backend) {
209
+ const vault = this.backend.readVault();
210
+ const entries = vault.entries ?? [];
211
+ for (const e of entries) {
212
+ if (e.task_type !== "session_state")
213
+ continue;
214
+ const lid = e.loop_id ?? "";
215
+ if (!lid || seen.has(lid))
216
+ continue;
217
+ seen.add(lid);
218
+ const lineage = (e.loop_lineage ?? {});
219
+ result.push({
220
+ sessionId: "",
221
+ loopId: lid,
222
+ round: lineage.current_round ?? 1,
223
+ status: (lineage.status || "running"),
224
+ });
225
+ }
226
+ }
227
+ return result;
228
+ }
229
+ /** Get loop health for a loop (in-memory or vault).
230
+ * Computes goal alignment, constraint integrity, drift, strategy stability. */
231
+ getHealth(loopId) {
232
+ // Find the task — check in-memory sessions first, then vault
233
+ let task = "";
234
+ let goalId = loopId;
235
+ for (const s of this.sessions.values()) {
236
+ if (s.loopId === loopId) {
237
+ task = s.task;
238
+ if (s.engine.state?.task_id) {
239
+ goalId = s.engine.state.task_id;
240
+ }
241
+ break;
242
+ }
243
+ }
244
+ // Fall back to vault for task
245
+ if (!task && this.backend) {
246
+ const entries = this.backend.queryEntries({
247
+ prefix: `loop:${loopId}:session`,
248
+ });
249
+ const sessionEntry = entries.find((e) => e.task_type === "session_state");
250
+ if (sessionEntry) {
251
+ task = sessionEntry.task ?? "";
252
+ }
253
+ }
254
+ if (!task)
255
+ return null;
256
+ // Hydrate vault context
257
+ const engine = new LoopForgeEngine("skills", this.backend);
258
+ const vaultContext = engine.hydrateLoopContext(loopId);
259
+ // Build a minimal request for health check
260
+ const request = makeLoopCompileRequest({
261
+ task,
262
+ loop_id: loopId,
263
+ goal_id: goalId,
264
+ round: 1, // round doesn't matter for health check
265
+ });
266
+ const health = checkLoopHealth(loopId, request, vaultContext);
267
+ return {
268
+ loopId,
269
+ goal_alignment: health.goal_alignment,
270
+ constraint_integrity: health.constraint_integrity,
271
+ drift_detected: health.drift_detected,
272
+ strategy_stability: health.strategy_stability,
273
+ task_continuity: health.task_continuity,
274
+ };
275
+ }
276
+ /** Core cycle: extract self-eval → record feedback → check stop → compile next. */
277
+ advance(sessionId, output) {
278
+ const session = this.sessions.get(sessionId);
279
+ if (!session)
280
+ return { sessionId, round: 0, prompt: null, stopReason: "session_not_found" };
281
+ if (session.status !== "running") {
282
+ return { sessionId, round: session.currentRound, prompt: null, stopReason: session.status };
283
+ }
284
+ // 1. Extract self-evaluation
285
+ const structured = extractSelfEvaluation(output);
286
+ const extractionFailed = structured === null;
287
+ const selfEval = structured ?? heuristicSelfEvaluation(output);
288
+ // Guard: if both extraction methods returned null, stop
289
+ if (!selfEval) {
290
+ session.status = "stalled";
291
+ this.save(session);
292
+ return { sessionId, round: session.currentRound, prompt: null, stopReason: "stalled", quality: 0 };
293
+ }
294
+ // 2. Record feedback (flushes immediately so next compile sees scores)
295
+ const quality = session.engine.autoFeedback(selfEval, session.loopId, session.currentRound, session.task);
296
+ session.qualityTrajectory.push(quality);
297
+ // 3. Stop conditions (extraction-first order — see memory)
298
+ if (extractionFailed) {
299
+ session.status = "stalled";
300
+ this.save(session);
301
+ return { sessionId, round: session.currentRound, prompt: null, stopReason: "stalled", quality };
302
+ }
303
+ if (!selfEval.should_continue) {
304
+ session.status = "stopped";
305
+ this.save(session);
306
+ return { sessionId, round: session.currentRound, prompt: null, stopReason: "task_complete", quality };
307
+ }
308
+ if (session.engine.shouldBreak()) {
309
+ session.status = "stopped";
310
+ this.save(session);
311
+ return { sessionId, round: session.currentRound, prompt: null, stopReason: "circuit_breaker", quality };
312
+ }
313
+ if (session.currentRound >= session.maxRounds) {
314
+ session.status = "stopped";
315
+ this.save(session);
316
+ return { sessionId, round: session.currentRound, prompt: null, stopReason: "max_rounds", quality };
317
+ }
318
+ // 4. Compile next round
319
+ session.currentRound++;
320
+ const request = buildLoopRequest(session, selfEval, quality);
321
+ const result = session.engine.invokeLoopCompile(request);
322
+ this.save(session);
323
+ return {
324
+ sessionId,
325
+ round: session.currentRound,
326
+ prompt: result.response?.prompt ?? null,
327
+ technique: result.response?.analysis?.technique ?? "zero-shot",
328
+ level: parseLevel(result.response?.analysis?.rationale),
329
+ quality,
330
+ warnings: parseWarnings(result.response?.prompt ?? null),
331
+ };
332
+ }
333
+ /** Replay timeline for a session — creates ReplayBackend from the stored backend. */
334
+ replayTimeline(sessionId) {
335
+ const session = this.sessions.get(sessionId);
336
+ if (!session)
337
+ return null;
338
+ const vaultBackend = this.backend ?? new FSBackend();
339
+ const replay = new ReplayBackend(vaultBackend);
340
+ return replay.timeline(session.loopId);
341
+ }
342
+ }
343
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/mcp/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,128 @@
1
+ /** LoopForge MCP — Tool definitions and handlers.
2
+ *
3
+ * 6 tools: start, next, status, stop, list, replay.
4
+ * Each handler receives SessionManager + parsed input, returns the output object.
5
+ */
6
+ import type { SessionManager } from "./session.js";
7
+ export declare const TOOL_SCHEMAS: ({
8
+ name: string;
9
+ description: string;
10
+ inputSchema: {
11
+ type: "object";
12
+ properties: {
13
+ task: {
14
+ type: "string";
15
+ description: string;
16
+ };
17
+ loopId: {
18
+ type: "string";
19
+ description: string;
20
+ };
21
+ maxRounds: {
22
+ type: "number";
23
+ description: string;
24
+ };
25
+ domain: {
26
+ type: "string";
27
+ description: string;
28
+ };
29
+ planSource: {
30
+ type: "string";
31
+ description: string;
32
+ };
33
+ constraints: {
34
+ type: "array";
35
+ items: {
36
+ type: "string";
37
+ };
38
+ description: string;
39
+ };
40
+ sessionId?: undefined;
41
+ output?: undefined;
42
+ };
43
+ required: string[];
44
+ };
45
+ } | {
46
+ name: string;
47
+ description: string;
48
+ inputSchema: {
49
+ type: "object";
50
+ properties: {
51
+ sessionId: {
52
+ type: "string";
53
+ description: string;
54
+ };
55
+ output: {
56
+ type: "string";
57
+ description: string;
58
+ };
59
+ task?: undefined;
60
+ loopId?: undefined;
61
+ maxRounds?: undefined;
62
+ domain?: undefined;
63
+ planSource?: undefined;
64
+ constraints?: undefined;
65
+ };
66
+ required: string[];
67
+ };
68
+ } | {
69
+ name: string;
70
+ description: string;
71
+ inputSchema: {
72
+ type: "object";
73
+ properties: {
74
+ sessionId: {
75
+ type: "string";
76
+ description: string;
77
+ };
78
+ task?: undefined;
79
+ loopId?: undefined;
80
+ maxRounds?: undefined;
81
+ domain?: undefined;
82
+ planSource?: undefined;
83
+ constraints?: undefined;
84
+ output?: undefined;
85
+ };
86
+ required: string[];
87
+ };
88
+ } | {
89
+ name: string;
90
+ description: string;
91
+ inputSchema: {
92
+ type: "object";
93
+ properties: {
94
+ task?: undefined;
95
+ loopId?: undefined;
96
+ maxRounds?: undefined;
97
+ domain?: undefined;
98
+ planSource?: undefined;
99
+ constraints?: undefined;
100
+ sessionId?: undefined;
101
+ output?: undefined;
102
+ };
103
+ required: never[];
104
+ };
105
+ } | {
106
+ name: string;
107
+ description: string;
108
+ inputSchema: {
109
+ type: "object";
110
+ properties: {
111
+ loopId: {
112
+ type: "string";
113
+ description: string;
114
+ };
115
+ task?: undefined;
116
+ maxRounds?: undefined;
117
+ domain?: undefined;
118
+ planSource?: undefined;
119
+ constraints?: undefined;
120
+ sessionId?: undefined;
121
+ output?: undefined;
122
+ };
123
+ required: string[];
124
+ };
125
+ })[];
126
+ export type ToolHandler = (mgr: SessionManager, input: Record<string, unknown>) => Record<string, unknown>;
127
+ export declare const TOOL_HANDLERS: Record<string, ToolHandler>;
128
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,cAAc,CAAC;AAM/D,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA6IxB,CAAC;AAMF,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE3G,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAyGrD,CAAC"}