hivemind-context-governance 1.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.
- package/CHANGELOG.md +95 -0
- package/LICENSE +21 -0
- package/README.md +218 -0
- package/dist/cli/init.d.ts +23 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +175 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli.d.ts +14 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +162 -0
- package/dist/cli.js.map +1 -0
- package/dist/dashboard/i18n/en.d.ts +43 -0
- package/dist/dashboard/i18n/en.d.ts.map +1 -0
- package/dist/dashboard/i18n/en.js +43 -0
- package/dist/dashboard/i18n/en.js.map +1 -0
- package/dist/dashboard/i18n/index.d.ts +10 -0
- package/dist/dashboard/i18n/index.d.ts.map +1 -0
- package/dist/dashboard/i18n/index.js +14 -0
- package/dist/dashboard/i18n/index.js.map +1 -0
- package/dist/dashboard/i18n/vi.d.ts +43 -0
- package/dist/dashboard/i18n/vi.d.ts.map +1 -0
- package/dist/dashboard/i18n/vi.js +43 -0
- package/dist/dashboard/i18n/vi.js.map +1 -0
- package/dist/dashboard/server.d.ts +23 -0
- package/dist/dashboard/server.d.ts.map +1 -0
- package/dist/dashboard/server.js +282 -0
- package/dist/dashboard/server.js.map +1 -0
- package/dist/hooks/compaction.d.ts +21 -0
- package/dist/hooks/compaction.d.ts.map +1 -0
- package/dist/hooks/compaction.js +79 -0
- package/dist/hooks/compaction.js.map +1 -0
- package/dist/hooks/index.d.ts +8 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +7 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/session-lifecycle.d.ts +28 -0
- package/dist/hooks/session-lifecycle.d.ts.map +1 -0
- package/dist/hooks/session-lifecycle.js +94 -0
- package/dist/hooks/session-lifecycle.js.map +1 -0
- package/dist/hooks/tool-gate.d.ts +28 -0
- package/dist/hooks/tool-gate.d.ts.map +1 -0
- package/dist/hooks/tool-gate.js +152 -0
- package/dist/hooks/tool-gate.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +159 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/complexity.d.ts +41 -0
- package/dist/lib/complexity.d.ts.map +1 -0
- package/dist/lib/complexity.js +67 -0
- package/dist/lib/complexity.js.map +1 -0
- package/dist/lib/context-refresh.d.ts +46 -0
- package/dist/lib/context-refresh.d.ts.map +1 -0
- package/dist/lib/context-refresh.js +77 -0
- package/dist/lib/context-refresh.js.map +1 -0
- package/dist/lib/index.d.ts +10 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +10 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/logging.d.ts +13 -0
- package/dist/lib/logging.d.ts.map +1 -0
- package/dist/lib/logging.js +40 -0
- package/dist/lib/logging.js.map +1 -0
- package/dist/lib/persistence.d.ts +15 -0
- package/dist/lib/persistence.d.ts.map +1 -0
- package/dist/lib/persistence.js +62 -0
- package/dist/lib/persistence.js.map +1 -0
- package/dist/lib/planning-fs.d.ts +34 -0
- package/dist/lib/planning-fs.d.ts.map +1 -0
- package/dist/lib/planning-fs.js +134 -0
- package/dist/lib/planning-fs.js.map +1 -0
- package/dist/lib/sentiment.d.ts +31 -0
- package/dist/lib/sentiment.d.ts.map +1 -0
- package/dist/lib/sentiment.js +158 -0
- package/dist/lib/sentiment.js.map +1 -0
- package/dist/schemas/brain-state.d.ts +60 -0
- package/dist/schemas/brain-state.d.ts.map +1 -0
- package/dist/schemas/brain-state.js +176 -0
- package/dist/schemas/brain-state.js.map +1 -0
- package/dist/schemas/config.d.ts +51 -0
- package/dist/schemas/config.d.ts.map +1 -0
- package/dist/schemas/config.js +128 -0
- package/dist/schemas/config.js.map +1 -0
- package/dist/schemas/hierarchy.d.ts +22 -0
- package/dist/schemas/hierarchy.d.ts.map +1 -0
- package/dist/schemas/hierarchy.js +27 -0
- package/dist/schemas/hierarchy.js.map +1 -0
- package/dist/schemas/index.d.ts +7 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +7 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/tools/compact-session.d.ts +15 -0
- package/dist/tools/compact-session.d.ts.map +1 -0
- package/dist/tools/compact-session.js +76 -0
- package/dist/tools/compact-session.js.map +1 -0
- package/dist/tools/declare-intent.d.ts +15 -0
- package/dist/tools/declare-intent.d.ts.map +1 -0
- package/dist/tools/declare-intent.js +83 -0
- package/dist/tools/declare-intent.js.map +1 -0
- package/dist/tools/index.d.ts +14 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +14 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/map-context.d.ts +15 -0
- package/dist/tools/map-context.d.ts.map +1 -0
- package/dist/tools/map-context.js +85 -0
- package/dist/tools/map-context.js.map +1 -0
- package/dist/tools/self-rate.d.ts +15 -0
- package/dist/tools/self-rate.d.ts.map +1 -0
- package/dist/tools/self-rate.js +76 -0
- package/dist/tools/self-rate.js.map +1 -0
- package/package.json +71 -0
- package/src/cli/init.ts +214 -0
- package/src/cli.ts +178 -0
- package/src/dashboard/i18n/en.ts +43 -0
- package/src/dashboard/i18n/index.ts +20 -0
- package/src/dashboard/i18n/vi.ts +43 -0
- package/src/dashboard/server.ts +372 -0
- package/src/hooks/compaction.ts +104 -0
- package/src/hooks/index.ts +8 -0
- package/src/hooks/session-lifecycle.ts +133 -0
- package/src/hooks/tool-gate.ts +205 -0
- package/src/index.ts +206 -0
- package/src/lib/complexity.ts +96 -0
- package/src/lib/context-refresh.ts +107 -0
- package/src/lib/index.ts +10 -0
- package/src/lib/logging.ts +53 -0
- package/src/lib/persistence.ts +83 -0
- package/src/lib/planning-fs.ts +187 -0
- package/src/lib/sentiment.ts +183 -0
- package/src/schemas/brain-state.ts +257 -0
- package/src/schemas/config.ts +184 -0
- package/src/schemas/hierarchy.ts +58 -0
- package/src/schemas/index.ts +7 -0
- package/src/tools/compact-session.ts +97 -0
- package/src/tools/declare-intent.ts +104 -0
- package/src/tools/index.ts +14 -0
- package/src/tools/map-context.ts +105 -0
- package/src/tools/self-rate.ts +86 -0
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HiveMind Dashboard Backend
|
|
3
|
+
*
|
|
4
|
+
* Provides HTTP API for dashboard data:
|
|
5
|
+
* - GET /api/state — Current brain state
|
|
6
|
+
* - GET /api/active — Active session content
|
|
7
|
+
* - GET /api/index — Project trajectory
|
|
8
|
+
* - GET /api/archives — List of archived sessions
|
|
9
|
+
* - GET /api/archives/:id — Specific archive content
|
|
10
|
+
* - GET /api/metrics — Session metrics
|
|
11
|
+
*
|
|
12
|
+
* Serves static dashboard files in production.
|
|
13
|
+
*/
|
|
14
|
+
import { createServer } from "http";
|
|
15
|
+
import { readFile } from "fs/promises";
|
|
16
|
+
import { existsSync } from "fs";
|
|
17
|
+
import { join, basename } from "path";
|
|
18
|
+
import { createStateManager } from "../lib/persistence.js";
|
|
19
|
+
import { readActiveMd, listArchives, getPlanningPaths } from "../lib/planning-fs.js";
|
|
20
|
+
import { createLogger } from "../lib/logging.js";
|
|
21
|
+
// ─── CORS Headers ────────────────────────────────────────────────────
|
|
22
|
+
const CORS_HEADERS = {
|
|
23
|
+
"Access-Control-Allow-Origin": "*",
|
|
24
|
+
"Access-Control-Allow-Methods": "GET, POST, OPTIONS",
|
|
25
|
+
"Access-Control-Allow-Headers": "Content-Type",
|
|
26
|
+
"Content-Type": "application/json",
|
|
27
|
+
};
|
|
28
|
+
// ─── Response Helpers ────────────────────────────────────────────────
|
|
29
|
+
function sendJson(res, status, data) {
|
|
30
|
+
res.writeHead(status, CORS_HEADERS);
|
|
31
|
+
res.end(JSON.stringify(data));
|
|
32
|
+
}
|
|
33
|
+
function sendError(res, status, message) {
|
|
34
|
+
sendJson(res, status, { success: false, error: message });
|
|
35
|
+
}
|
|
36
|
+
// ─── Route Handlers ──────────────────────────────────────────────────
|
|
37
|
+
async function handleGetState(config, res) {
|
|
38
|
+
try {
|
|
39
|
+
const stateManager = createStateManager(config.projectRoot);
|
|
40
|
+
const state = await stateManager.load();
|
|
41
|
+
if (!state) {
|
|
42
|
+
sendJson(res, 200, { success: true, data: null });
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
sendJson(res, 200, { success: true, data: state });
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
sendError(res, 500, `Failed to load state: ${err}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async function handleGetActive(config, res) {
|
|
52
|
+
try {
|
|
53
|
+
const activeMd = await readActiveMd(config.projectRoot);
|
|
54
|
+
sendJson(res, 200, { success: true, data: activeMd });
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
sendError(res, 500, `Failed to load active.md: ${err}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
async function handleGetIndex(config, res) {
|
|
61
|
+
try {
|
|
62
|
+
const paths = getPlanningPaths(config.projectRoot);
|
|
63
|
+
const content = await readFile(paths.indexPath, "utf-8");
|
|
64
|
+
sendJson(res, 200, { success: true, data: { content } });
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
sendError(res, 500, `Failed to load index.md: ${err}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
async function handleGetArchives(config, res) {
|
|
71
|
+
try {
|
|
72
|
+
const archives = await listArchives(config.projectRoot);
|
|
73
|
+
sendJson(res, 200, {
|
|
74
|
+
success: true,
|
|
75
|
+
data: archives.map((path) => ({
|
|
76
|
+
id: basename(path, ".md"),
|
|
77
|
+
path,
|
|
78
|
+
})),
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
sendError(res, 500, `Failed to list archives: ${err}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
async function handleGetArchive(config, archiveId, res) {
|
|
86
|
+
try {
|
|
87
|
+
const paths = getPlanningPaths(config.projectRoot);
|
|
88
|
+
const archivePath = join(paths.archiveDir, `${archiveId}.md`);
|
|
89
|
+
// Security: ensure path is within archive directory
|
|
90
|
+
if (!archivePath.startsWith(paths.archiveDir)) {
|
|
91
|
+
sendError(res, 403, "Invalid archive ID");
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (!existsSync(archivePath)) {
|
|
95
|
+
sendError(res, 404, "Archive not found");
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const content = await readFile(archivePath, "utf-8");
|
|
99
|
+
sendJson(res, 200, { success: true, data: { id: archiveId, content } });
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
sendError(res, 500, `Failed to load archive: ${err}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
async function handleGetMetrics(config, res) {
|
|
106
|
+
try {
|
|
107
|
+
const stateManager = createStateManager(config.projectRoot);
|
|
108
|
+
const state = await stateManager.load();
|
|
109
|
+
const archives = await listArchives(config.projectRoot);
|
|
110
|
+
if (!state) {
|
|
111
|
+
sendJson(res, 200, {
|
|
112
|
+
success: true,
|
|
113
|
+
data: {
|
|
114
|
+
hasSession: false,
|
|
115
|
+
totalArchives: archives.length,
|
|
116
|
+
},
|
|
117
|
+
});
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
sendJson(res, 200, {
|
|
121
|
+
success: true,
|
|
122
|
+
data: {
|
|
123
|
+
hasSession: true,
|
|
124
|
+
session: {
|
|
125
|
+
id: state.session.id,
|
|
126
|
+
mode: state.session.mode,
|
|
127
|
+
status: state.session.governance_status,
|
|
128
|
+
startTime: state.session.start_time,
|
|
129
|
+
},
|
|
130
|
+
hierarchy: state.hierarchy,
|
|
131
|
+
metrics: state.metrics,
|
|
132
|
+
totalArchives: archives.length,
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
sendError(res, 500, `Failed to load metrics: ${err}`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// ─── Router ──────────────────────────────────────────────────────────
|
|
141
|
+
function route(config, req, res) {
|
|
142
|
+
const url = req.url ?? "/";
|
|
143
|
+
const method = req.method ?? "GET";
|
|
144
|
+
// CORS preflight
|
|
145
|
+
if (method === "OPTIONS") {
|
|
146
|
+
res.writeHead(204, CORS_HEADERS);
|
|
147
|
+
res.end();
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
// Only accept GET requests for API
|
|
151
|
+
if (method !== "GET") {
|
|
152
|
+
sendError(res, 405, "Method not allowed");
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
// API routes
|
|
156
|
+
if (url === "/api/state") {
|
|
157
|
+
handleGetState(config, res);
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
if (url === "/api/active") {
|
|
161
|
+
handleGetActive(config, res);
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
if (url === "/api/index") {
|
|
165
|
+
handleGetIndex(config, res);
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
if (url === "/api/archives") {
|
|
169
|
+
handleGetArchives(config, res);
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
if (url.startsWith("/api/archives/")) {
|
|
173
|
+
const archiveId = url.slice("/api/archives/".length);
|
|
174
|
+
handleGetArchive(config, archiveId, res);
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
if (url === "/api/metrics") {
|
|
178
|
+
handleGetMetrics(config, res);
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
if (url === "/api/health") {
|
|
182
|
+
sendJson(res, 200, { success: true, data: { status: "ok" } });
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
// 404 for unknown routes
|
|
186
|
+
sendError(res, 404, "Not found");
|
|
187
|
+
}
|
|
188
|
+
export function createDashboardServer(projectRoot, options = {}) {
|
|
189
|
+
const config = {
|
|
190
|
+
projectRoot,
|
|
191
|
+
port: options.port ?? 0, // 0 = random available port
|
|
192
|
+
host: options.host ?? "127.0.0.1",
|
|
193
|
+
};
|
|
194
|
+
let server = null;
|
|
195
|
+
let serverUrl = "";
|
|
196
|
+
return {
|
|
197
|
+
get url() {
|
|
198
|
+
return serverUrl;
|
|
199
|
+
},
|
|
200
|
+
async start() {
|
|
201
|
+
// Ensure planning directory exists
|
|
202
|
+
const paths = getPlanningPaths(projectRoot);
|
|
203
|
+
if (!existsSync(paths.planningDir)) {
|
|
204
|
+
throw new Error(`HiveMind not initialized. Run 'hivemind init' first.`);
|
|
205
|
+
}
|
|
206
|
+
// Setup logging
|
|
207
|
+
const log = await createLogger(join(paths.planningDir, "logs"), "dashboard");
|
|
208
|
+
return new Promise((resolve, reject) => {
|
|
209
|
+
server = createServer((req, res) => {
|
|
210
|
+
route(config, req, res);
|
|
211
|
+
});
|
|
212
|
+
server.listen(config.port, config.host, () => {
|
|
213
|
+
const address = server?.address();
|
|
214
|
+
if (address && typeof address === "object") {
|
|
215
|
+
serverUrl = `http://${config.host}:${address.port}`;
|
|
216
|
+
log.info(`Dashboard server started at ${serverUrl}`);
|
|
217
|
+
resolve();
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
reject(new Error("Failed to get server address"));
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
server.on("error", (err) => {
|
|
224
|
+
reject(err);
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
},
|
|
228
|
+
async stop() {
|
|
229
|
+
return new Promise((resolve) => {
|
|
230
|
+
if (server) {
|
|
231
|
+
server.close(() => resolve());
|
|
232
|
+
server = null;
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
resolve();
|
|
236
|
+
}
|
|
237
|
+
});
|
|
238
|
+
},
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
// ─── CLI Entry Point ─────────────────────────────────────────────────
|
|
242
|
+
async function main() {
|
|
243
|
+
const projectRoot = process.cwd();
|
|
244
|
+
const port = process.env.HIVEMIND_PORT
|
|
245
|
+
? parseInt(process.env.HIVEMIND_PORT, 10)
|
|
246
|
+
: undefined;
|
|
247
|
+
const server = createDashboardServer(projectRoot, { port });
|
|
248
|
+
try {
|
|
249
|
+
await server.start();
|
|
250
|
+
// eslint-disable-next-line no-console
|
|
251
|
+
console.log(`HiveMind Dashboard running at ${server.url}`);
|
|
252
|
+
// eslint-disable-next-line no-console
|
|
253
|
+
console.log(`API endpoints:`);
|
|
254
|
+
// eslint-disable-next-line no-console
|
|
255
|
+
console.log(` ${server.url}/api/state`);
|
|
256
|
+
// eslint-disable-next-line no-console
|
|
257
|
+
console.log(` ${server.url}/api/metrics`);
|
|
258
|
+
// eslint-disable-next-line no-console
|
|
259
|
+
console.log(` ${server.url}/api/active`);
|
|
260
|
+
// eslint-disable-next-line no-console
|
|
261
|
+
console.log(` ${server.url}/api/archives`);
|
|
262
|
+
// eslint-disable-next-line no-console
|
|
263
|
+
console.log(`\nPress Ctrl+C to stop`);
|
|
264
|
+
}
|
|
265
|
+
catch (err) {
|
|
266
|
+
// eslint-disable-next-line no-console
|
|
267
|
+
console.error("Failed to start dashboard:", err);
|
|
268
|
+
process.exit(1);
|
|
269
|
+
}
|
|
270
|
+
// Graceful shutdown
|
|
271
|
+
process.on("SIGINT", async () => {
|
|
272
|
+
// eslint-disable-next-line no-console
|
|
273
|
+
console.log("\nShutting down...");
|
|
274
|
+
await server.stop();
|
|
275
|
+
process.exit(0);
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
// Run if called directly
|
|
279
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
280
|
+
main();
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/dashboard/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compaction Hook — Preserves hierarchy context across LLM compaction.
|
|
3
|
+
*
|
|
4
|
+
* Reads current brain state hierarchy and injects it into
|
|
5
|
+
* post-compaction context via output.context.push().
|
|
6
|
+
*
|
|
7
|
+
* P3: try/catch — never break compaction
|
|
8
|
+
* Budget-capped ≤500 tokens (~2000 chars)
|
|
9
|
+
*/
|
|
10
|
+
import type { Logger } from "../lib/logging.js";
|
|
11
|
+
/**
|
|
12
|
+
* Creates the compaction hook.
|
|
13
|
+
*
|
|
14
|
+
* Hook factory pattern: captured logger + directory.
|
|
15
|
+
*/
|
|
16
|
+
export declare function createCompactionHook(log: Logger, directory: string): (_input: {
|
|
17
|
+
sessionID: string;
|
|
18
|
+
}, output: {
|
|
19
|
+
context: string[];
|
|
20
|
+
}) => Promise<void>;
|
|
21
|
+
//# sourceMappingURL=compaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compaction.d.ts","sourceRoot":"","sources":["../../src/hooks/compaction.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAM/C;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,IAI/D,QAAQ;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,EAC7B,QAAQ;IAAE,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,KAC5B,OAAO,CAAC,IAAI,CAAC,CA4EjB"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compaction Hook — Preserves hierarchy context across LLM compaction.
|
|
3
|
+
*
|
|
4
|
+
* Reads current brain state hierarchy and injects it into
|
|
5
|
+
* post-compaction context via output.context.push().
|
|
6
|
+
*
|
|
7
|
+
* P3: try/catch — never break compaction
|
|
8
|
+
* Budget-capped ≤500 tokens (~2000 chars)
|
|
9
|
+
*/
|
|
10
|
+
import { createStateManager } from "../lib/persistence.js";
|
|
11
|
+
/** Budget in characters (~500 tokens at ~4 chars/token) */
|
|
12
|
+
const INJECTION_BUDGET_CHARS = 2000;
|
|
13
|
+
/**
|
|
14
|
+
* Creates the compaction hook.
|
|
15
|
+
*
|
|
16
|
+
* Hook factory pattern: captured logger + directory.
|
|
17
|
+
*/
|
|
18
|
+
export function createCompactionHook(log, directory) {
|
|
19
|
+
const stateManager = createStateManager(directory);
|
|
20
|
+
return async (_input, output) => {
|
|
21
|
+
try {
|
|
22
|
+
const state = await stateManager.load();
|
|
23
|
+
if (!state) {
|
|
24
|
+
await log.debug("Compaction: no brain state to preserve");
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const lines = [];
|
|
28
|
+
lines.push("=== HiveMind Context (post-compaction) ===");
|
|
29
|
+
lines.push("");
|
|
30
|
+
// Session info
|
|
31
|
+
lines.push(`Session: ${state.session.id} | Status: ${state.session.governance_status} | Mode: ${state.session.mode}`);
|
|
32
|
+
lines.push("");
|
|
33
|
+
// Hierarchy — the most important context to preserve
|
|
34
|
+
lines.push("## Current Hierarchy");
|
|
35
|
+
if (state.hierarchy.trajectory) {
|
|
36
|
+
lines.push(`Trajectory: ${state.hierarchy.trajectory}`);
|
|
37
|
+
}
|
|
38
|
+
if (state.hierarchy.tactic) {
|
|
39
|
+
lines.push(`Tactic: ${state.hierarchy.tactic}`);
|
|
40
|
+
}
|
|
41
|
+
if (state.hierarchy.action) {
|
|
42
|
+
lines.push(`Action: ${state.hierarchy.action}`);
|
|
43
|
+
}
|
|
44
|
+
if (!state.hierarchy.trajectory &&
|
|
45
|
+
!state.hierarchy.tactic &&
|
|
46
|
+
!state.hierarchy.action) {
|
|
47
|
+
lines.push("No hierarchy set. Use map_context to set focus.");
|
|
48
|
+
}
|
|
49
|
+
lines.push("");
|
|
50
|
+
// Metrics
|
|
51
|
+
lines.push(`Turns: ${state.metrics.turn_count} | Drift: ${state.metrics.drift_score}/100 | Files: ${state.metrics.files_touched.length}`);
|
|
52
|
+
if (state.metrics.files_touched.length > 0) {
|
|
53
|
+
const maxFiles = 10;
|
|
54
|
+
const shown = state.metrics.files_touched.slice(0, maxFiles);
|
|
55
|
+
lines.push(`Files: ${shown.join(", ")}`);
|
|
56
|
+
if (state.metrics.files_touched.length > maxFiles) {
|
|
57
|
+
lines.push(` ... and ${state.metrics.files_touched.length - maxFiles} more`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
lines.push("");
|
|
61
|
+
lines.push("=== End HiveMind Context ===");
|
|
62
|
+
// Budget enforcement
|
|
63
|
+
let context = lines.join("\n");
|
|
64
|
+
if (context.length > INJECTION_BUDGET_CHARS) {
|
|
65
|
+
context =
|
|
66
|
+
context.slice(0, INJECTION_BUDGET_CHARS - 30) +
|
|
67
|
+
"\n=== End HiveMind Context ===";
|
|
68
|
+
await log.warn(`Compaction injection truncated: ${lines.join("\n").length} → ${context.length} chars`);
|
|
69
|
+
}
|
|
70
|
+
output.context.push(context);
|
|
71
|
+
await log.debug(`Compaction: injected ${context.length} chars`);
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
// P3: Never break compaction — this is critical
|
|
75
|
+
await log.error(`Compaction hook error: ${error}`);
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=compaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compaction.js","sourceRoot":"","sources":["../../src/hooks/compaction.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook barrel exports — HiveMind governance hooks
|
|
3
|
+
*/
|
|
4
|
+
export { createToolGateHook } from "./tool-gate.js";
|
|
5
|
+
export type { ToolGateResult } from "./tool-gate.js";
|
|
6
|
+
export { createSessionLifecycleHook } from "./session-lifecycle.js";
|
|
7
|
+
export { createCompactionHook } from "./compaction.js";
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACnD,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAA;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook barrel exports — HiveMind governance hooks
|
|
3
|
+
*/
|
|
4
|
+
export { createToolGateHook } from "./tool-gate.js";
|
|
5
|
+
export { createSessionLifecycleHook } from "./session-lifecycle.js";
|
|
6
|
+
export { createCompactionHook } from "./compaction.js";
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAEnD,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAA;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Lifecycle Hook — Initialize/load brain state on session events.
|
|
3
|
+
*
|
|
4
|
+
* Handles:
|
|
5
|
+
* - Session start: load existing state or create fresh
|
|
6
|
+
* - System prompt injection: current hierarchy + governance status
|
|
7
|
+
*
|
|
8
|
+
* P3: try/catch — never break session lifecycle
|
|
9
|
+
* P5: Config cached in closure
|
|
10
|
+
*/
|
|
11
|
+
import type { Logger } from "../lib/logging.js";
|
|
12
|
+
import type { HiveMindConfig } from "../schemas/config.js";
|
|
13
|
+
/**
|
|
14
|
+
* Creates the session lifecycle hook (system prompt transform).
|
|
15
|
+
*
|
|
16
|
+
* Injects current session context into the system prompt:
|
|
17
|
+
* - Hierarchy state (trajectory/tactic/action)
|
|
18
|
+
* - Governance status (LOCKED/OPEN)
|
|
19
|
+
* - Session metrics (drift score, turn count)
|
|
20
|
+
*
|
|
21
|
+
* Budget: ≤250 tokens (~1000 chars). ADD, not REPLACE.
|
|
22
|
+
*/
|
|
23
|
+
export declare function createSessionLifecycleHook(log: Logger, directory: string, config: HiveMindConfig): (input: {
|
|
24
|
+
sessionID?: string;
|
|
25
|
+
}, output: {
|
|
26
|
+
system: string[];
|
|
27
|
+
}) => Promise<void>;
|
|
28
|
+
//# sourceMappingURL=session-lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-lifecycle.d.ts","sourceRoot":"","sources":["../../src/hooks/session-lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAS1D;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,cAAc,IAMpB,OAAO;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EAC7B,QAAQ;IAAE,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,KAC3B,OAAO,CAAC,IAAI,CAAC,CA0FjB"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Lifecycle Hook — Initialize/load brain state on session events.
|
|
3
|
+
*
|
|
4
|
+
* Handles:
|
|
5
|
+
* - Session start: load existing state or create fresh
|
|
6
|
+
* - System prompt injection: current hierarchy + governance status
|
|
7
|
+
*
|
|
8
|
+
* P3: try/catch — never break session lifecycle
|
|
9
|
+
* P5: Config cached in closure
|
|
10
|
+
*/
|
|
11
|
+
import { generateAgentBehaviorPrompt } from "../schemas/config.js";
|
|
12
|
+
import { createStateManager } from "../lib/persistence.js";
|
|
13
|
+
import { createBrainState, generateSessionId, } from "../schemas/brain-state.js";
|
|
14
|
+
import { initializePlanningDirectory } from "../lib/planning-fs.js";
|
|
15
|
+
/**
|
|
16
|
+
* Creates the session lifecycle hook (system prompt transform).
|
|
17
|
+
*
|
|
18
|
+
* Injects current session context into the system prompt:
|
|
19
|
+
* - Hierarchy state (trajectory/tactic/action)
|
|
20
|
+
* - Governance status (LOCKED/OPEN)
|
|
21
|
+
* - Session metrics (drift score, turn count)
|
|
22
|
+
*
|
|
23
|
+
* Budget: ≤250 tokens (~1000 chars). ADD, not REPLACE.
|
|
24
|
+
*/
|
|
25
|
+
export function createSessionLifecycleHook(log, directory, config) {
|
|
26
|
+
const stateManager = createStateManager(directory);
|
|
27
|
+
const BUDGET_CHARS = 1000;
|
|
28
|
+
return async (input, output) => {
|
|
29
|
+
try {
|
|
30
|
+
if (!input.sessionID)
|
|
31
|
+
return;
|
|
32
|
+
// Load or create brain state
|
|
33
|
+
let state = await stateManager.load();
|
|
34
|
+
if (!state) {
|
|
35
|
+
// First session — initialize
|
|
36
|
+
await initializePlanningDirectory(directory);
|
|
37
|
+
const sessionId = generateSessionId();
|
|
38
|
+
state = createBrainState(sessionId, config);
|
|
39
|
+
await stateManager.save(state);
|
|
40
|
+
}
|
|
41
|
+
const lines = [];
|
|
42
|
+
lines.push("<hivemind-governance>");
|
|
43
|
+
// Session status
|
|
44
|
+
lines.push(`Session: ${state.session.governance_status} | Mode: ${state.session.mode} | Governance: ${state.session.governance_mode}`);
|
|
45
|
+
// Hierarchy context
|
|
46
|
+
if (state.hierarchy.trajectory) {
|
|
47
|
+
lines.push(`Trajectory: ${state.hierarchy.trajectory}`);
|
|
48
|
+
}
|
|
49
|
+
if (state.hierarchy.tactic) {
|
|
50
|
+
lines.push(`Tactic: ${state.hierarchy.tactic}`);
|
|
51
|
+
}
|
|
52
|
+
if (state.hierarchy.action) {
|
|
53
|
+
lines.push(`Action: ${state.hierarchy.action}`);
|
|
54
|
+
}
|
|
55
|
+
// No hierarchy = prompt to declare intent
|
|
56
|
+
if (!state.hierarchy.trajectory &&
|
|
57
|
+
!state.hierarchy.tactic &&
|
|
58
|
+
!state.hierarchy.action) {
|
|
59
|
+
if (config.governance_mode === "strict") {
|
|
60
|
+
lines.push("No intent declared. Use declare_intent to unlock the session before writing.");
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
lines.push("Tip: Use declare_intent to set your work focus for better tracking.");
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Metrics summary
|
|
67
|
+
lines.push(`Turns: ${state.metrics.turn_count} | Drift: ${state.metrics.drift_score}/100 | Files: ${state.metrics.files_touched.length}`);
|
|
68
|
+
// Drift warning
|
|
69
|
+
if (state.metrics.drift_score < 50) {
|
|
70
|
+
lines.push("⚠ High drift detected. Use map_context to re-focus.");
|
|
71
|
+
}
|
|
72
|
+
lines.push("</hivemind-governance>");
|
|
73
|
+
// Inject mandatory agent behavior configuration
|
|
74
|
+
const agentConfigPrompt = generateAgentBehaviorPrompt(config.agent_behavior);
|
|
75
|
+
lines.push("");
|
|
76
|
+
lines.push(agentConfigPrompt);
|
|
77
|
+
// Budget enforcement
|
|
78
|
+
let injection = lines.join("\n");
|
|
79
|
+
if (injection.length > BUDGET_CHARS) {
|
|
80
|
+
injection =
|
|
81
|
+
injection.slice(0, BUDGET_CHARS - 30) +
|
|
82
|
+
"\n</agent-configuration>";
|
|
83
|
+
await log.warn(`System injection truncated: ${lines.join("\n").length} → ${injection.length} chars`);
|
|
84
|
+
}
|
|
85
|
+
output.system.push(injection);
|
|
86
|
+
await log.debug(`Session lifecycle: injected ${injection.length} chars`);
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
// P3: Never break session lifecycle
|
|
90
|
+
await log.error(`Session lifecycle hook error: ${error}`);
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=session-lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-lifecycle.js","sourceRoot":"","sources":["../../src/hooks/session-lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Gate Hook — Configurable governance enforcement.
|
|
3
|
+
*
|
|
4
|
+
* Intercepts tool calls and applies governance based on mode:
|
|
5
|
+
* - strict: blocks writes until declare_intent called
|
|
6
|
+
* - assisted: warns but allows
|
|
7
|
+
* - permissive: silently allows, tracks for metrics
|
|
8
|
+
*
|
|
9
|
+
* P3: try/catch — never break tool execution
|
|
10
|
+
* P5: Config cached in closure — single disk read on first call
|
|
11
|
+
*/
|
|
12
|
+
import type { Logger } from "../lib/logging.js";
|
|
13
|
+
import type { HiveMindConfig } from "../schemas/config.js";
|
|
14
|
+
export interface ToolGateResult {
|
|
15
|
+
allowed: boolean;
|
|
16
|
+
error?: string;
|
|
17
|
+
warning?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Creates the tool gate hook.
|
|
21
|
+
*
|
|
22
|
+
* Hook factory pattern — captures config + logger + directory.
|
|
23
|
+
*/
|
|
24
|
+
export declare function createToolGateHook(log: Logger, directory: string, config: HiveMindConfig): (input: {
|
|
25
|
+
sessionID: string;
|
|
26
|
+
tool: string;
|
|
27
|
+
}) => Promise<ToolGateResult>;
|
|
28
|
+
//# sourceMappingURL=tool-gate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-gate.d.ts","sourceRoot":"","sources":["../../src/hooks/tool-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAqD1D,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,cAAc,IAIR,OAAO;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;CACb,KAAG,OAAO,CAAC,cAAc,CAAC,CAqH5B"}
|