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.
Files changed (139) hide show
  1. package/CHANGELOG.md +95 -0
  2. package/LICENSE +21 -0
  3. package/README.md +218 -0
  4. package/dist/cli/init.d.ts +23 -0
  5. package/dist/cli/init.d.ts.map +1 -0
  6. package/dist/cli/init.js +175 -0
  7. package/dist/cli/init.js.map +1 -0
  8. package/dist/cli.d.ts +14 -0
  9. package/dist/cli.d.ts.map +1 -0
  10. package/dist/cli.js +162 -0
  11. package/dist/cli.js.map +1 -0
  12. package/dist/dashboard/i18n/en.d.ts +43 -0
  13. package/dist/dashboard/i18n/en.d.ts.map +1 -0
  14. package/dist/dashboard/i18n/en.js +43 -0
  15. package/dist/dashboard/i18n/en.js.map +1 -0
  16. package/dist/dashboard/i18n/index.d.ts +10 -0
  17. package/dist/dashboard/i18n/index.d.ts.map +1 -0
  18. package/dist/dashboard/i18n/index.js +14 -0
  19. package/dist/dashboard/i18n/index.js.map +1 -0
  20. package/dist/dashboard/i18n/vi.d.ts +43 -0
  21. package/dist/dashboard/i18n/vi.d.ts.map +1 -0
  22. package/dist/dashboard/i18n/vi.js +43 -0
  23. package/dist/dashboard/i18n/vi.js.map +1 -0
  24. package/dist/dashboard/server.d.ts +23 -0
  25. package/dist/dashboard/server.d.ts.map +1 -0
  26. package/dist/dashboard/server.js +282 -0
  27. package/dist/dashboard/server.js.map +1 -0
  28. package/dist/hooks/compaction.d.ts +21 -0
  29. package/dist/hooks/compaction.d.ts.map +1 -0
  30. package/dist/hooks/compaction.js +79 -0
  31. package/dist/hooks/compaction.js.map +1 -0
  32. package/dist/hooks/index.d.ts +8 -0
  33. package/dist/hooks/index.d.ts.map +1 -0
  34. package/dist/hooks/index.js +7 -0
  35. package/dist/hooks/index.js.map +1 -0
  36. package/dist/hooks/session-lifecycle.d.ts +28 -0
  37. package/dist/hooks/session-lifecycle.d.ts.map +1 -0
  38. package/dist/hooks/session-lifecycle.js +94 -0
  39. package/dist/hooks/session-lifecycle.js.map +1 -0
  40. package/dist/hooks/tool-gate.d.ts +28 -0
  41. package/dist/hooks/tool-gate.d.ts.map +1 -0
  42. package/dist/hooks/tool-gate.js +152 -0
  43. package/dist/hooks/tool-gate.js.map +1 -0
  44. package/dist/index.d.ts +19 -0
  45. package/dist/index.d.ts.map +1 -0
  46. package/dist/index.js +159 -0
  47. package/dist/index.js.map +1 -0
  48. package/dist/lib/complexity.d.ts +41 -0
  49. package/dist/lib/complexity.d.ts.map +1 -0
  50. package/dist/lib/complexity.js +67 -0
  51. package/dist/lib/complexity.js.map +1 -0
  52. package/dist/lib/context-refresh.d.ts +46 -0
  53. package/dist/lib/context-refresh.d.ts.map +1 -0
  54. package/dist/lib/context-refresh.js +77 -0
  55. package/dist/lib/context-refresh.js.map +1 -0
  56. package/dist/lib/index.d.ts +10 -0
  57. package/dist/lib/index.d.ts.map +1 -0
  58. package/dist/lib/index.js +10 -0
  59. package/dist/lib/index.js.map +1 -0
  60. package/dist/lib/logging.d.ts +13 -0
  61. package/dist/lib/logging.d.ts.map +1 -0
  62. package/dist/lib/logging.js +40 -0
  63. package/dist/lib/logging.js.map +1 -0
  64. package/dist/lib/persistence.d.ts +15 -0
  65. package/dist/lib/persistence.d.ts.map +1 -0
  66. package/dist/lib/persistence.js +62 -0
  67. package/dist/lib/persistence.js.map +1 -0
  68. package/dist/lib/planning-fs.d.ts +34 -0
  69. package/dist/lib/planning-fs.d.ts.map +1 -0
  70. package/dist/lib/planning-fs.js +134 -0
  71. package/dist/lib/planning-fs.js.map +1 -0
  72. package/dist/lib/sentiment.d.ts +31 -0
  73. package/dist/lib/sentiment.d.ts.map +1 -0
  74. package/dist/lib/sentiment.js +158 -0
  75. package/dist/lib/sentiment.js.map +1 -0
  76. package/dist/schemas/brain-state.d.ts +60 -0
  77. package/dist/schemas/brain-state.d.ts.map +1 -0
  78. package/dist/schemas/brain-state.js +176 -0
  79. package/dist/schemas/brain-state.js.map +1 -0
  80. package/dist/schemas/config.d.ts +51 -0
  81. package/dist/schemas/config.d.ts.map +1 -0
  82. package/dist/schemas/config.js +128 -0
  83. package/dist/schemas/config.js.map +1 -0
  84. package/dist/schemas/hierarchy.d.ts +22 -0
  85. package/dist/schemas/hierarchy.d.ts.map +1 -0
  86. package/dist/schemas/hierarchy.js +27 -0
  87. package/dist/schemas/hierarchy.js.map +1 -0
  88. package/dist/schemas/index.d.ts +7 -0
  89. package/dist/schemas/index.d.ts.map +1 -0
  90. package/dist/schemas/index.js +7 -0
  91. package/dist/schemas/index.js.map +1 -0
  92. package/dist/tools/compact-session.d.ts +15 -0
  93. package/dist/tools/compact-session.d.ts.map +1 -0
  94. package/dist/tools/compact-session.js +76 -0
  95. package/dist/tools/compact-session.js.map +1 -0
  96. package/dist/tools/declare-intent.d.ts +15 -0
  97. package/dist/tools/declare-intent.d.ts.map +1 -0
  98. package/dist/tools/declare-intent.js +83 -0
  99. package/dist/tools/declare-intent.js.map +1 -0
  100. package/dist/tools/index.d.ts +14 -0
  101. package/dist/tools/index.d.ts.map +1 -0
  102. package/dist/tools/index.js +14 -0
  103. package/dist/tools/index.js.map +1 -0
  104. package/dist/tools/map-context.d.ts +15 -0
  105. package/dist/tools/map-context.d.ts.map +1 -0
  106. package/dist/tools/map-context.js +85 -0
  107. package/dist/tools/map-context.js.map +1 -0
  108. package/dist/tools/self-rate.d.ts +15 -0
  109. package/dist/tools/self-rate.d.ts.map +1 -0
  110. package/dist/tools/self-rate.js +76 -0
  111. package/dist/tools/self-rate.js.map +1 -0
  112. package/package.json +71 -0
  113. package/src/cli/init.ts +214 -0
  114. package/src/cli.ts +178 -0
  115. package/src/dashboard/i18n/en.ts +43 -0
  116. package/src/dashboard/i18n/index.ts +20 -0
  117. package/src/dashboard/i18n/vi.ts +43 -0
  118. package/src/dashboard/server.ts +372 -0
  119. package/src/hooks/compaction.ts +104 -0
  120. package/src/hooks/index.ts +8 -0
  121. package/src/hooks/session-lifecycle.ts +133 -0
  122. package/src/hooks/tool-gate.ts +205 -0
  123. package/src/index.ts +206 -0
  124. package/src/lib/complexity.ts +96 -0
  125. package/src/lib/context-refresh.ts +107 -0
  126. package/src/lib/index.ts +10 -0
  127. package/src/lib/logging.ts +53 -0
  128. package/src/lib/persistence.ts +83 -0
  129. package/src/lib/planning-fs.ts +187 -0
  130. package/src/lib/sentiment.ts +183 -0
  131. package/src/schemas/brain-state.ts +257 -0
  132. package/src/schemas/config.ts +184 -0
  133. package/src/schemas/hierarchy.ts +58 -0
  134. package/src/schemas/index.ts +7 -0
  135. package/src/tools/compact-session.ts +97 -0
  136. package/src/tools/declare-intent.ts +104 -0
  137. package/src/tools/index.ts +14 -0
  138. package/src/tools/map-context.ts +105 -0
  139. 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"}