@blockspool/mcp 0.3.0

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 (66) hide show
  1. package/README.md +174 -0
  2. package/dist/advance.d.ts +30 -0
  3. package/dist/advance.d.ts.map +1 -0
  4. package/dist/advance.js +514 -0
  5. package/dist/advance.js.map +1 -0
  6. package/dist/direct-client.d.ts +57 -0
  7. package/dist/direct-client.d.ts.map +1 -0
  8. package/dist/direct-client.js +92 -0
  9. package/dist/direct-client.js.map +1 -0
  10. package/dist/event-processor.d.ts +17 -0
  11. package/dist/event-processor.d.ts.map +1 -0
  12. package/dist/event-processor.js +360 -0
  13. package/dist/event-processor.js.map +1 -0
  14. package/dist/formulas.d.ts +37 -0
  15. package/dist/formulas.d.ts.map +1 -0
  16. package/dist/formulas.js +245 -0
  17. package/dist/formulas.js.map +1 -0
  18. package/dist/index.d.ts +9 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +42 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/proposals.d.ts +51 -0
  23. package/dist/proposals.d.ts.map +1 -0
  24. package/dist/proposals.js +207 -0
  25. package/dist/proposals.js.map +1 -0
  26. package/dist/run-manager.d.ts +69 -0
  27. package/dist/run-manager.d.ts.map +1 -0
  28. package/dist/run-manager.js +315 -0
  29. package/dist/run-manager.js.map +1 -0
  30. package/dist/scope-policy.d.ts +34 -0
  31. package/dist/scope-policy.d.ts.map +1 -0
  32. package/dist/scope-policy.js +145 -0
  33. package/dist/scope-policy.js.map +1 -0
  34. package/dist/server.d.ts +16 -0
  35. package/dist/server.d.ts.map +1 -0
  36. package/dist/server.js +31 -0
  37. package/dist/server.js.map +1 -0
  38. package/dist/spindle.d.ts +41 -0
  39. package/dist/spindle.d.ts.map +1 -0
  40. package/dist/spindle.js +279 -0
  41. package/dist/spindle.js.map +1 -0
  42. package/dist/state.d.ts +36 -0
  43. package/dist/state.d.ts.map +1 -0
  44. package/dist/state.js +50 -0
  45. package/dist/state.js.map +1 -0
  46. package/dist/tools/execute.d.ts +7 -0
  47. package/dist/tools/execute.d.ts.map +1 -0
  48. package/dist/tools/execute.js +238 -0
  49. package/dist/tools/execute.js.map +1 -0
  50. package/dist/tools/git.d.ts +7 -0
  51. package/dist/tools/git.d.ts.map +1 -0
  52. package/dist/tools/git.js +67 -0
  53. package/dist/tools/git.js.map +1 -0
  54. package/dist/tools/scout.d.ts +7 -0
  55. package/dist/tools/scout.d.ts.map +1 -0
  56. package/dist/tools/scout.js +199 -0
  57. package/dist/tools/scout.js.map +1 -0
  58. package/dist/tools/session.d.ts +7 -0
  59. package/dist/tools/session.d.ts.map +1 -0
  60. package/dist/tools/session.js +296 -0
  61. package/dist/tools/session.js.map +1 -0
  62. package/dist/types.d.ts +116 -0
  63. package/dist/types.d.ts.map +1 -0
  64. package/dist/types.js +13 -0
  65. package/dist/types.js.map +1 -0
  66. package/package.json +63 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/tools/git.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,cAAc,QAmEjF"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Git operations tool: git_setup
3
+ */
4
+ import { z } from 'zod';
5
+ import { repos } from '@blockspool/core';
6
+ import { execSync } from 'node:child_process';
7
+ export function registerGitTools(server, getState) {
8
+ server.tool('blockspool_git_setup', 'Create/checkout a branch for the current ticket. Returns branch name. Use after completing a ticket to prepare for PR creation.', {
9
+ ticketId: z.string().describe('The ticket ID to create a branch for.'),
10
+ baseBranch: z.string().optional().describe('Base branch to branch from (default: main).'),
11
+ }, async (params) => {
12
+ const state = getState();
13
+ state.requireActive(); // ensure session is active
14
+ const ticket = await repos.tickets.getById(state.db, params.ticketId);
15
+ if (!ticket) {
16
+ return {
17
+ content: [{ type: 'text', text: JSON.stringify({ error: 'Ticket not found.' }) }],
18
+ isError: true,
19
+ };
20
+ }
21
+ const baseBranch = params.baseBranch ?? 'main';
22
+ // Create branch name from ticket
23
+ const slug = ticket.title
24
+ .toLowerCase()
25
+ .replace(/[^a-z0-9]+/g, '-')
26
+ .replace(/^-|-$/g, '')
27
+ .slice(0, 50);
28
+ const branchName = `blockspool/${ticket.id}/${slug}`;
29
+ const cwd = state.project.rootPath;
30
+ try {
31
+ // Check if branch exists
32
+ try {
33
+ execSync(`git rev-parse --verify ${branchName}`, { cwd, stdio: 'pipe' });
34
+ // Branch exists, just checkout
35
+ execSync(`git checkout ${branchName}`, { cwd, stdio: 'pipe' });
36
+ }
37
+ catch {
38
+ // Branch doesn't exist, create from base
39
+ execSync(`git checkout -b ${branchName} ${baseBranch}`, { cwd, stdio: 'pipe' });
40
+ }
41
+ return {
42
+ content: [{
43
+ type: 'text',
44
+ text: JSON.stringify({
45
+ branchName,
46
+ baseBranch,
47
+ ticketId: ticket.id,
48
+ message: `Branch ${branchName} ready. Make your changes, then commit and push.`,
49
+ }, null, 2),
50
+ }],
51
+ };
52
+ }
53
+ catch (e) {
54
+ return {
55
+ content: [{
56
+ type: 'text',
57
+ text: JSON.stringify({
58
+ error: `Git operation failed: ${e.message}`,
59
+ branchName,
60
+ }),
61
+ }],
62
+ isError: true,
63
+ };
64
+ }
65
+ });
66
+ }
67
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/tools/git.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAG9C,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,QAA8B;IAChF,MAAM,CAAC,IAAI,CACT,sBAAsB,EACtB,iIAAiI,EACjI;QACE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;QACtE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;KAC1F,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;QACzB,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC,2BAA2B;QAElD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QACtE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,EAAE,CAAC;gBAC1F,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC;QAC/C,iCAAiC;QACjC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK;aACtB,WAAW,EAAE;aACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;aAC3B,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;aACrB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAChB,MAAM,UAAU,GAAG,cAAc,MAAM,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;QAErD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;QAEnC,IAAI,CAAC;YACH,yBAAyB;YACzB,IAAI,CAAC;gBACH,QAAQ,CAAC,0BAA0B,UAAU,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;gBACzE,+BAA+B;gBAC/B,QAAQ,CAAC,gBAAgB,UAAU,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YACjE,CAAC;YAAC,MAAM,CAAC;gBACP,yCAAyC;gBACzC,QAAQ,CAAC,mBAAmB,UAAU,IAAI,UAAU,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAClF,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,UAAU;4BACV,UAAU;4BACV,QAAQ,EAAE,MAAM,CAAC,EAAE;4BACnB,OAAO,EAAE,UAAU,UAAU,kDAAkD;yBAChF,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ,CAAC;aACH,CAAC;QACJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,KAAK,EAAE,yBAA0B,CAAW,CAAC,OAAO,EAAE;4BACtD,UAAU;yBACX,CAAC;qBACH,CAAC;gBACF,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Scout tools: scout_files, submit_proposals
3
+ */
4
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ import type { SessionManager } from '../state.js';
6
+ export declare function registerScoutTools(server: McpServer, getState: () => SessionManager): void;
7
+ //# sourceMappingURL=scout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scout.d.ts","sourceRoot":"","sources":["../../src/tools/scout.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,cAAc,QA8MnF"}
@@ -0,0 +1,199 @@
1
+ /**
2
+ * Scout tools: scout_files, submit_proposals
3
+ */
4
+ import { z } from 'zod';
5
+ import { repos, scout } from '@blockspool/core';
6
+ export function registerScoutTools(server, getState) {
7
+ server.tool('blockspool_scout_files', 'Returns the scout prompt + file batch for Claude to analyze. BlockSpool selects which files to scan. You should process the prompt and return proposals via blockspool_submit_proposals.', {
8
+ batchIndex: z.number().optional().describe('Which batch to process (0-indexed). Omit to get the next unprocessed batch.'),
9
+ }, async (params) => {
10
+ const state = getState();
11
+ const run = state.requireActive();
12
+ const projectPath = state.project.rootPath;
13
+ const scope = run.scope;
14
+ // Scan files
15
+ const files = scout.scanFiles({
16
+ cwd: projectPath,
17
+ include: [scope],
18
+ exclude: [],
19
+ });
20
+ if (files.length === 0) {
21
+ return {
22
+ content: [{
23
+ type: 'text',
24
+ text: JSON.stringify({
25
+ message: 'No files found matching scope.',
26
+ scope,
27
+ projectPath,
28
+ }),
29
+ }],
30
+ };
31
+ }
32
+ // Batch them
33
+ const batches = scout.batchFiles(files, 3);
34
+ const batchIndex = params.batchIndex ?? run.scout_cycles;
35
+ if (batchIndex >= batches.length) {
36
+ return {
37
+ content: [{
38
+ type: 'text',
39
+ text: JSON.stringify({
40
+ message: 'All file batches have been processed.',
41
+ totalBatches: batches.length,
42
+ processed: run.scout_cycles,
43
+ }),
44
+ }],
45
+ };
46
+ }
47
+ const batch = batches[batchIndex];
48
+ // Get dedup context
49
+ const recentTickets = await repos.tickets.getRecentlyCompleted(state.db, run.project_id, 20);
50
+ const recentTitles = recentTickets.map(t => t.title);
51
+ // Build the scout prompt
52
+ const prompt = scout.buildScoutPrompt({
53
+ files: batch.map(f => ({ path: f.path, content: f.content })),
54
+ scope,
55
+ types: run.categories,
56
+ maxProposals: run.max_proposals_per_scout,
57
+ minConfidence: run.min_confidence,
58
+ recentlyCompletedTitles: recentTitles,
59
+ customPrompt: run.formula ? `Formula: ${run.formula}` : undefined,
60
+ });
61
+ // Track scout cycle
62
+ const s = state.run.require();
63
+ s.scout_cycles++;
64
+ state.run.appendEvent('ADVANCE_CALLED', { phase: 'SCOUT', batch_index: batchIndex });
65
+ return {
66
+ content: [{
67
+ type: 'text',
68
+ text: JSON.stringify({
69
+ batchIndex,
70
+ totalBatches: batches.length,
71
+ filesInBatch: batch.map(f => f.path),
72
+ prompt,
73
+ instructions: 'Analyze the code according to the prompt above. Return proposals via blockspool_submit_proposals.',
74
+ }, null, 2),
75
+ }],
76
+ };
77
+ });
78
+ server.tool('blockspool_submit_proposals', 'Submit discovered proposals from scouting. BlockSpool filters via trust ladder, dedup, and confidence threshold. Returns accepted tickets.', {
79
+ proposals: z.array(z.object({
80
+ category: z.enum(['refactor', 'docs', 'test', 'perf', 'security']),
81
+ title: z.string(),
82
+ description: z.string(),
83
+ acceptance_criteria: z.array(z.string()),
84
+ verification_commands: z.array(z.string()),
85
+ allowed_paths: z.array(z.string()),
86
+ files: z.array(z.string()),
87
+ confidence: z.number(),
88
+ impact_score: z.number().optional(),
89
+ rationale: z.string(),
90
+ estimated_complexity: z.enum(['trivial', 'simple', 'moderate', 'complex']),
91
+ })).describe('Array of proposals from scout analysis.'),
92
+ }, async (params) => {
93
+ const state = getState();
94
+ const run = state.requireActive();
95
+ const minConfidence = run.min_confidence;
96
+ // Trust ladder
97
+ const allowedCategories = new Set(run.categories);
98
+ // Cap proposals
99
+ const capped = params.proposals.slice(0, run.max_proposals_per_scout);
100
+ // Filter proposals
101
+ const accepted = capped.filter(p => {
102
+ if (p.confidence < minConfidence)
103
+ return false;
104
+ if (!allowedCategories.has(p.category))
105
+ return false;
106
+ return true;
107
+ });
108
+ state.run.appendEvent('SCOUT_OUTPUT', {
109
+ submitted: params.proposals.length,
110
+ capped_to: capped.length,
111
+ });
112
+ if (accepted.length === 0) {
113
+ state.run.appendEvent('PROPOSALS_FILTERED', { accepted: 0 });
114
+ return {
115
+ content: [{
116
+ type: 'text',
117
+ text: JSON.stringify({
118
+ message: 'No proposals passed filtering.',
119
+ submitted: params.proposals.length,
120
+ accepted: 0,
121
+ reasons: 'Filtered by confidence threshold or category trust ladder.',
122
+ }),
123
+ }],
124
+ };
125
+ }
126
+ // Dedup against existing tickets
127
+ const existingTickets = await repos.tickets.listByProject(state.db, run.project_id);
128
+ const existingTitles = new Set(existingTickets.map(t => t.title.toLowerCase()));
129
+ const deduped = accepted.filter(p => !existingTitles.has(p.title.toLowerCase()));
130
+ state.run.appendEvent('PROPOSALS_FILTERED', {
131
+ accepted: accepted.length,
132
+ deduped: deduped.length,
133
+ duplicates: accepted.length - deduped.length,
134
+ });
135
+ if (deduped.length === 0) {
136
+ return {
137
+ content: [{
138
+ type: 'text',
139
+ text: JSON.stringify({
140
+ message: 'All proposals were duplicates of existing tickets.',
141
+ submitted: params.proposals.length,
142
+ accepted: 0,
143
+ }),
144
+ }],
145
+ };
146
+ }
147
+ // Create tickets
148
+ const ticketInputs = deduped.map(p => ({
149
+ projectId: run.project_id,
150
+ title: p.title,
151
+ description: formatDescription(p),
152
+ status: 'ready',
153
+ priority: p.confidence,
154
+ category: p.category,
155
+ allowedPaths: p.allowed_paths,
156
+ verificationCommands: p.verification_commands,
157
+ }));
158
+ const created = await repos.tickets.createMany(state.db, ticketInputs);
159
+ state.run.appendEvent('TICKETS_CREATED', {
160
+ count: created.length,
161
+ ids: created.map(t => t.id),
162
+ });
163
+ return {
164
+ content: [{
165
+ type: 'text',
166
+ text: JSON.stringify({
167
+ submitted: params.proposals.length,
168
+ accepted: created.length,
169
+ filtered: params.proposals.length - deduped.length,
170
+ tickets: created.map(t => ({
171
+ id: t.id,
172
+ title: t.title,
173
+ category: t.category,
174
+ priority: t.priority,
175
+ })),
176
+ message: `Created ${created.length} tickets. Use blockspool_next_ticket to start execution.`,
177
+ }, null, 2),
178
+ }],
179
+ };
180
+ });
181
+ }
182
+ function formatDescription(proposal) {
183
+ return [
184
+ proposal.description,
185
+ '',
186
+ '## Acceptance Criteria',
187
+ ...proposal.acceptance_criteria.map(c => `- ${c}`),
188
+ '',
189
+ '## Rationale',
190
+ proposal.rationale,
191
+ '',
192
+ '## Files',
193
+ ...proposal.files.map(f => `- \`${f}\``),
194
+ '',
195
+ `**Complexity:** ${proposal.estimated_complexity}`,
196
+ `**Confidence:** ${proposal.confidence}%`,
197
+ ].join('\n');
198
+ }
199
+ //# sourceMappingURL=scout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scout.js","sourceRoot":"","sources":["../../src/tools/scout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Session management tools: start_session, session_status, end_session, advance, ingest_event
3
+ */
4
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ import type { SessionManager } from '../state.js';
6
+ export declare function registerSessionTools(server: McpServer, getState: () => SessionManager): void;
7
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/tools/session.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAQlD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,cAAc,QA+VrF"}
@@ -0,0 +1,296 @@
1
+ /**
2
+ * Session management tools: start_session, session_status, end_session, advance, ingest_event
3
+ */
4
+ import { z } from 'zod';
5
+ import { advance } from '../advance.js';
6
+ import { processEvent } from '../event-processor.js';
7
+ import { deriveScopePolicy, isFileAllowed, serializeScopePolicy } from '../scope-policy.js';
8
+ import { repos } from '@blockspool/core';
9
+ import { loadFormula, applyFormula, listFormulas } from '../formulas.js';
10
+ export function registerSessionTools(server, getState) {
11
+ server.tool('blockspool_start_session', 'Initialize an improvement session. Creates a run folder with state.json and event log. Call this first.', {
12
+ hours: z.number().optional().describe('Session duration in hours. Omit for unlimited.'),
13
+ formula: z.string().optional().describe('Formula name (e.g., security-audit, test-coverage).'),
14
+ deep: z.boolean().optional().describe('Enable deep architectural review mode.'),
15
+ continuous: z.boolean().optional().describe('Run until manually stopped.'),
16
+ scope: z.string().optional().describe('Glob pattern for files to scan (default: src/**).'),
17
+ categories: z.array(z.string()).optional().describe('Trust ladder categories.'),
18
+ min_confidence: z.number().optional().describe('Minimum confidence threshold (default: 70).'),
19
+ max_proposals: z.number().optional().describe('Max proposals per scout (default: 5).'),
20
+ step_budget: z.number().optional().describe('Max advance() calls (default: 200).'),
21
+ ticket_step_budget: z.number().optional().describe('Max steps per ticket (default: 12).'),
22
+ max_prs: z.number().optional().describe('Max PRs to create (default: 5).'),
23
+ max_cycles: z.number().optional().describe('Max scout→execute cycles (default: 1). Use with hours for multi-cycle runs.'),
24
+ draft_prs: z.boolean().optional().describe('Create draft PRs (default: true).'),
25
+ }, async (params) => {
26
+ const state = getState();
27
+ // Load and apply formula if specified
28
+ let config = {
29
+ hours: params.hours,
30
+ formula: params.formula,
31
+ deep: params.deep,
32
+ continuous: params.continuous,
33
+ scope: params.scope,
34
+ categories: params.categories,
35
+ min_confidence: params.min_confidence,
36
+ max_proposals: params.max_proposals,
37
+ step_budget: params.step_budget,
38
+ ticket_step_budget: params.ticket_step_budget,
39
+ max_prs: params.max_prs,
40
+ max_cycles: params.max_cycles,
41
+ draft_prs: params.draft_prs,
42
+ };
43
+ let formulaInfo;
44
+ if (params.formula) {
45
+ const formula = loadFormula(params.formula, state.projectPath);
46
+ if (formula) {
47
+ config = applyFormula(formula, config);
48
+ formulaInfo = { name: formula.name, description: formula.description };
49
+ }
50
+ }
51
+ const runState = state.start(config);
52
+ return {
53
+ content: [{
54
+ type: 'text',
55
+ text: JSON.stringify({
56
+ run_id: runState.run_id,
57
+ session_id: runState.session_id,
58
+ project_id: runState.project_id,
59
+ phase: runState.phase,
60
+ step_budget: runState.step_budget,
61
+ expires_at: runState.expires_at,
62
+ run_dir: state.run.dir,
63
+ formula: formulaInfo,
64
+ message: 'Session started. Call blockspool_advance to begin.',
65
+ }, null, 2),
66
+ }],
67
+ };
68
+ });
69
+ server.tool('blockspool_advance', 'Get the next action to perform. This is the main loop driver. Call repeatedly until it returns STOP.', {}, async () => {
70
+ const state = getState();
71
+ try {
72
+ const response = await advance({
73
+ run: state.run,
74
+ db: state.db,
75
+ project: state.project,
76
+ });
77
+ return {
78
+ content: [{
79
+ type: 'text',
80
+ text: JSON.stringify(response, null, 2),
81
+ }],
82
+ };
83
+ }
84
+ catch (e) {
85
+ return {
86
+ content: [{
87
+ type: 'text',
88
+ text: JSON.stringify({ error: e.message }),
89
+ }],
90
+ isError: true,
91
+ };
92
+ }
93
+ });
94
+ server.tool('blockspool_ingest_event', 'Report an event back to BlockSpool. Used after executing an action from advance(). Triggers state transitions.', {
95
+ type: z.string().describe('Event type (e.g., SCOUT_OUTPUT, PLAN_SUBMITTED, TICKET_RESULT, QA_PASSED, QA_FAILED, PR_CREATED, USER_OVERRIDE).'),
96
+ payload: z.record(z.string(), z.unknown()).describe('Event payload data.'),
97
+ }, async (params) => {
98
+ const state = getState();
99
+ try {
100
+ state.run.require();
101
+ // Log the raw event
102
+ state.run.appendEvent(params.type, params.payload);
103
+ // Process the event (may trigger state transitions)
104
+ const result = await processEvent(state.run, state.db, params.type, params.payload);
105
+ return {
106
+ content: [{
107
+ type: 'text',
108
+ text: JSON.stringify({
109
+ ...result,
110
+ step: state.run.require().step_count,
111
+ current_phase: state.run.require().phase,
112
+ }, null, 2),
113
+ }],
114
+ };
115
+ }
116
+ catch (e) {
117
+ return {
118
+ content: [{
119
+ type: 'text',
120
+ text: JSON.stringify({ error: e.message }),
121
+ }],
122
+ isError: true,
123
+ };
124
+ }
125
+ });
126
+ server.tool('blockspool_session_status', 'Get current session state: phase, budgets, tickets completed/failed, time remaining.', {}, async () => {
127
+ const state = getState();
128
+ try {
129
+ const status = state.getStatus();
130
+ const digest = state.run.buildDigest();
131
+ const warnings = state.run.getBudgetWarnings();
132
+ return {
133
+ content: [{
134
+ type: 'text',
135
+ text: JSON.stringify({
136
+ ...status,
137
+ digest,
138
+ budget_warnings: warnings.length > 0 ? warnings : undefined,
139
+ }, null, 2),
140
+ }],
141
+ };
142
+ }
143
+ catch (e) {
144
+ return {
145
+ content: [{
146
+ type: 'text',
147
+ text: JSON.stringify({ error: e.message }),
148
+ }],
149
+ isError: true,
150
+ };
151
+ }
152
+ });
153
+ server.tool('blockspool_end_session', 'Finalize the current session. Returns summary.', {}, async () => {
154
+ const state = getState();
155
+ try {
156
+ const finalState = state.end();
157
+ const durationMs = Date.now() - new Date(finalState.started_at).getTime();
158
+ return {
159
+ content: [{
160
+ type: 'text',
161
+ text: JSON.stringify({
162
+ run_id: finalState.run_id,
163
+ session_id: finalState.session_id,
164
+ duration_ms: durationMs,
165
+ step_count: finalState.step_count,
166
+ tickets_completed: finalState.tickets_completed,
167
+ tickets_failed: finalState.tickets_failed,
168
+ tickets_blocked: finalState.tickets_blocked,
169
+ prs_created: finalState.prs_created,
170
+ scout_cycles: finalState.scout_cycles,
171
+ final_phase: finalState.phase,
172
+ message: 'Session ended.',
173
+ }, null, 2),
174
+ }],
175
+ };
176
+ }
177
+ catch (e) {
178
+ return {
179
+ content: [{
180
+ type: 'text',
181
+ text: JSON.stringify({ error: e.message }),
182
+ }],
183
+ isError: true,
184
+ };
185
+ }
186
+ });
187
+ server.tool('blockspool_get_scope_policy', 'Get the scope policy for the current ticket. Used by PreToolUse hooks to check if a file path is allowed before writes.', {
188
+ file_path: z.string().optional().describe('Optional file path to check. If provided, returns whether this specific file is allowed.'),
189
+ }, async (params) => {
190
+ const state = getState();
191
+ try {
192
+ const s = state.run.require();
193
+ if (!s.current_ticket_id) {
194
+ return {
195
+ content: [{
196
+ type: 'text',
197
+ text: JSON.stringify({ error: 'No active ticket' }),
198
+ }],
199
+ isError: true,
200
+ };
201
+ }
202
+ const ticket = await repos.tickets.getById(state.db, s.current_ticket_id);
203
+ if (!ticket) {
204
+ return {
205
+ content: [{
206
+ type: 'text',
207
+ text: JSON.stringify({ error: 'Ticket not found' }),
208
+ }],
209
+ isError: true,
210
+ };
211
+ }
212
+ const policy = deriveScopePolicy({
213
+ allowedPaths: ticket.allowedPaths ?? [],
214
+ category: ticket.category ?? 'refactor',
215
+ maxLinesPerTicket: s.max_lines_per_ticket,
216
+ });
217
+ const result = {
218
+ ticket_id: s.current_ticket_id,
219
+ policy: serializeScopePolicy(policy),
220
+ };
221
+ // If a file path is provided, check it
222
+ if (params.file_path) {
223
+ const allowed = isFileAllowed(params.file_path, policy);
224
+ result.file_check = {
225
+ path: params.file_path,
226
+ allowed,
227
+ };
228
+ // Log the scope check event
229
+ state.run.appendEvent(allowed ? 'SCOPE_ALLOWED' : 'SCOPE_BLOCKED', { path: params.file_path, ticket_id: s.current_ticket_id });
230
+ }
231
+ return {
232
+ content: [{
233
+ type: 'text',
234
+ text: JSON.stringify(result, null, 2),
235
+ }],
236
+ };
237
+ }
238
+ catch (e) {
239
+ return {
240
+ content: [{
241
+ type: 'text',
242
+ text: JSON.stringify({ error: e.message }),
243
+ }],
244
+ isError: true,
245
+ };
246
+ }
247
+ });
248
+ server.tool('blockspool_nudge', 'Add a hint to guide the running session. Hints are consumed in the next scout cycle and appended to the scout prompt.', {
249
+ hint: z.string().describe('Guidance for the scout (e.g., "focus on auth module", "skip test files").'),
250
+ }, async (params) => {
251
+ const state = getState();
252
+ try {
253
+ state.run.addHint(params.hint);
254
+ const s = state.run.require();
255
+ return {
256
+ content: [{
257
+ type: 'text',
258
+ text: JSON.stringify({
259
+ hint: params.hint,
260
+ pending_hints: s.hints.length,
261
+ message: 'Hint added. Will be consumed in next scout cycle.',
262
+ }, null, 2),
263
+ }],
264
+ };
265
+ }
266
+ catch (e) {
267
+ return {
268
+ content: [{
269
+ type: 'text',
270
+ text: JSON.stringify({ error: e.message }),
271
+ }],
272
+ isError: true,
273
+ };
274
+ }
275
+ });
276
+ server.tool('blockspool_list_formulas', 'List all available formulas (built-in + custom from .blockspool/formulas/).', {}, async () => {
277
+ const state = getState();
278
+ const formulas = listFormulas(state.projectPath);
279
+ return {
280
+ content: [{
281
+ type: 'text',
282
+ text: JSON.stringify({
283
+ formulas: formulas.map(f => ({
284
+ name: f.name,
285
+ version: f.version,
286
+ description: f.description,
287
+ categories: f.categories,
288
+ risk_tolerance: f.risk_tolerance,
289
+ tags: f.tags,
290
+ })),
291
+ }, null, 2),
292
+ }],
293
+ };
294
+ });
295
+ }
296
+ //# 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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"}