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,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TUI-safe logging
|
|
3
|
+
* File-based logging only - never use console.log
|
|
4
|
+
*/
|
|
5
|
+
import { appendFile, mkdir } from "fs/promises";
|
|
6
|
+
import { dirname } from "path";
|
|
7
|
+
export async function createLogger(logDir, service) {
|
|
8
|
+
const logFile = `${logDir}/${service}.log`;
|
|
9
|
+
// Ensure log directory exists
|
|
10
|
+
try {
|
|
11
|
+
await mkdir(dirname(logFile), { recursive: true });
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
// Directory may already exist
|
|
15
|
+
}
|
|
16
|
+
async function log(level, message) {
|
|
17
|
+
const timestamp = new Date().toISOString();
|
|
18
|
+
const line = `[${timestamp}] [${level.toUpperCase()}] ${message}\n`;
|
|
19
|
+
try {
|
|
20
|
+
await appendFile(logFile, line);
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
// Fail silently - logging should never break the application
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
debug: (msg) => log("debug", msg),
|
|
28
|
+
info: (msg) => log("info", msg),
|
|
29
|
+
warn: (msg) => log("warn", msg),
|
|
30
|
+
error: (msg) => log("error", msg),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
// No-op logger for when logging is disabled
|
|
34
|
+
export const noopLogger = {
|
|
35
|
+
debug: async () => { },
|
|
36
|
+
info: async () => { },
|
|
37
|
+
warn: async () => { },
|
|
38
|
+
error: async () => { },
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=logging.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logging.js","sourceRoot":"","sources":["../../src/lib/logging.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAS/B,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAc,EACd,OAAe;IAEf,MAAM,OAAO,GAAG,GAAG,MAAM,IAAI,OAAO,MAAM,CAAC;IAE3C,8BAA8B;IAC9B,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,8BAA8B;IAChC,CAAC;IAED,KAAK,UAAU,GAAG,CAAC,KAAa,EAAE,OAAe;QAC/C,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,IAAI,SAAS,MAAM,KAAK,CAAC,WAAW,EAAE,KAAK,OAAO,IAAI,CAAC;QACpE,IAAI,CAAC;YACH,MAAM,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACP,6DAA6D;QAC/D,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC;QACjC,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC;QAC/B,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC;QAC/B,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC;KAClC,CAAC;AACJ,CAAC;AAED,4CAA4C;AAC5C,MAAM,CAAC,MAAM,UAAU,GAAW;IAChC,KAAK,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;IACrB,IAAI,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;IACpB,IAAI,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;IACpB,KAAK,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;CACtB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StateManager - Disk persistence for brain state
|
|
3
|
+
*/
|
|
4
|
+
import type { BrainState } from "../schemas/brain-state.js";
|
|
5
|
+
import type { HiveMindConfig } from "../schemas/config.js";
|
|
6
|
+
export interface StateManager {
|
|
7
|
+
load(): Promise<BrainState | null>;
|
|
8
|
+
save(state: BrainState): Promise<void>;
|
|
9
|
+
initialize(sessionId: string, config: HiveMindConfig): Promise<BrainState>;
|
|
10
|
+
exists(): boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare function createStateManager(projectRoot: string): StateManager;
|
|
13
|
+
export declare function loadConfig(projectRoot: string): Promise<HiveMindConfig>;
|
|
14
|
+
export declare function saveConfig(projectRoot: string, config: HiveMindConfig): Promise<void>;
|
|
15
|
+
//# sourceMappingURL=persistence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../src/lib/persistence.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAI3D,MAAM,WAAW,YAAY;IAC3B,IAAI,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3E,MAAM,IAAI,OAAO,CAAC;CACnB;AAED,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY,CAsCpE;AAED,wBAAsB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAc7E;AAED,wBAAsB,UAAU,CAC9B,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,IAAI,CAAC,CAIf"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StateManager - Disk persistence for brain state
|
|
3
|
+
*/
|
|
4
|
+
import { readFile, writeFile, mkdir } from "fs/promises";
|
|
5
|
+
import { existsSync } from "fs";
|
|
6
|
+
import { dirname, join } from "path";
|
|
7
|
+
import { createBrainState } from "../schemas/brain-state.js";
|
|
8
|
+
import { createConfig } from "../schemas/config.js";
|
|
9
|
+
export function createStateManager(projectRoot) {
|
|
10
|
+
const brainPath = join(projectRoot, ".opencode", "planning", "brain.json");
|
|
11
|
+
return {
|
|
12
|
+
async load() {
|
|
13
|
+
try {
|
|
14
|
+
if (!existsSync(brainPath)) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
const data = await readFile(brainPath, "utf-8");
|
|
18
|
+
return JSON.parse(data);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
async save(state) {
|
|
25
|
+
try {
|
|
26
|
+
await mkdir(dirname(brainPath), { recursive: true });
|
|
27
|
+
await writeFile(brainPath, JSON.stringify(state, null, 2));
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
throw new Error(`Failed to save brain state: ${error}`);
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
async initialize(sessionId, config) {
|
|
34
|
+
const state = createBrainState(sessionId, config);
|
|
35
|
+
await this.save(state);
|
|
36
|
+
return state;
|
|
37
|
+
},
|
|
38
|
+
exists() {
|
|
39
|
+
return existsSync(brainPath);
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
export async function loadConfig(projectRoot) {
|
|
44
|
+
const configPath = join(projectRoot, ".opencode", "planning", "config.json");
|
|
45
|
+
try {
|
|
46
|
+
if (existsSync(configPath)) {
|
|
47
|
+
const data = await readFile(configPath, "utf-8");
|
|
48
|
+
const parsed = JSON.parse(data);
|
|
49
|
+
return createConfig(parsed);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// Fall through to default
|
|
54
|
+
}
|
|
55
|
+
return createConfig();
|
|
56
|
+
}
|
|
57
|
+
export async function saveConfig(projectRoot, config) {
|
|
58
|
+
const configPath = join(projectRoot, ".opencode", "planning", "config.json");
|
|
59
|
+
await mkdir(dirname(configPath), { recursive: true });
|
|
60
|
+
await writeFile(configPath, JSON.stringify(config, null, 2));
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=persistence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../src/lib/persistence.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAGrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AASpD,MAAM,UAAU,kBAAkB,CAAC,WAAmB;IACpD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;IAE3E,OAAO;QACL,KAAK,CAAC,IAAI;YACR,IAAI,CAAC;gBACH,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC3B,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBAChD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAe,CAAC;YACxC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,KAAiB;YAC1B,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACrD,MAAM,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC7D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,+BAA+B,KAAK,EAAE,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;QAED,KAAK,CAAC,UAAU,CACd,SAAiB,EACjB,MAAsB;YAEtB,MAAM,KAAK,GAAG,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAClD,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM;YACJ,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC;QAC/B,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,WAAmB;IAClD,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;IAE7E,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACjD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAChC,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,0BAA0B;IAC5B,CAAC;IAED,OAAO,YAAY,EAAE,CAAC;AACxB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,WAAmB,EACnB,MAAsB;IAEtB,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;IAC7E,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,MAAM,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Planning File System
|
|
3
|
+
* Manages .opencode/planning/ directory structure
|
|
4
|
+
*/
|
|
5
|
+
export interface PlanningPaths {
|
|
6
|
+
projectRoot: string;
|
|
7
|
+
planningDir: string;
|
|
8
|
+
indexPath: string;
|
|
9
|
+
activePath: string;
|
|
10
|
+
archiveDir: string;
|
|
11
|
+
brainPath: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function getPlanningPaths(projectRoot: string): PlanningPaths;
|
|
14
|
+
export interface ActiveMdContent {
|
|
15
|
+
frontmatter: {
|
|
16
|
+
session_id?: string;
|
|
17
|
+
mode?: string;
|
|
18
|
+
governance_status?: string;
|
|
19
|
+
start_time?: number;
|
|
20
|
+
last_updated?: number;
|
|
21
|
+
};
|
|
22
|
+
body: string;
|
|
23
|
+
}
|
|
24
|
+
export declare function initializePlanningDirectory(projectRoot: string): Promise<PlanningPaths>;
|
|
25
|
+
export declare function readActiveMd(projectRoot: string): Promise<ActiveMdContent>;
|
|
26
|
+
export declare function parseActiveMd(content: string): ActiveMdContent;
|
|
27
|
+
export declare function writeActiveMd(projectRoot: string, content: ActiveMdContent): Promise<void>;
|
|
28
|
+
export declare function archiveSession(projectRoot: string, sessionId: string, content: string): Promise<void>;
|
|
29
|
+
export declare function updateIndexMd(projectRoot: string, summaryLine: string): Promise<void>;
|
|
30
|
+
export declare function listArchives(projectRoot: string): Promise<string[]>;
|
|
31
|
+
export declare function generateIndexTemplate(): string;
|
|
32
|
+
export declare function generateActiveTemplate(): string;
|
|
33
|
+
export declare function resetActiveMd(projectRoot: string): Promise<void>;
|
|
34
|
+
//# sourceMappingURL=planning-fs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planning-fs.d.ts","sourceRoot":"","sources":["../../src/lib/planning-fs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,CAUnE;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE;QACX,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,2BAA2B,CAC/C,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,aAAa,CAAC,CAkBxB;AAED,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,eAAe,CAAC,CAS1B;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAc9D;AAED,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAaf;AAED,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CASzE;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAc9C;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAoB/C;AAED,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKtE"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Planning File System
|
|
3
|
+
* Manages .opencode/planning/ directory structure
|
|
4
|
+
*/
|
|
5
|
+
import { readFile, writeFile, mkdir, readdir } from "fs/promises";
|
|
6
|
+
import { existsSync } from "fs";
|
|
7
|
+
import { join } from "path";
|
|
8
|
+
import { parse, stringify } from "yaml";
|
|
9
|
+
export function getPlanningPaths(projectRoot) {
|
|
10
|
+
const planningDir = join(projectRoot, ".opencode", "planning");
|
|
11
|
+
return {
|
|
12
|
+
projectRoot,
|
|
13
|
+
planningDir,
|
|
14
|
+
indexPath: join(planningDir, "index.md"),
|
|
15
|
+
activePath: join(planningDir, "active.md"),
|
|
16
|
+
archiveDir: join(planningDir, "archive"),
|
|
17
|
+
brainPath: join(planningDir, "brain.json"),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export async function initializePlanningDirectory(projectRoot) {
|
|
21
|
+
const paths = getPlanningPaths(projectRoot);
|
|
22
|
+
// Create directories
|
|
23
|
+
await mkdir(paths.planningDir, { recursive: true });
|
|
24
|
+
await mkdir(paths.archiveDir, { recursive: true });
|
|
25
|
+
// Create index.md if not exists
|
|
26
|
+
if (!existsSync(paths.indexPath)) {
|
|
27
|
+
await writeFile(paths.indexPath, generateIndexTemplate());
|
|
28
|
+
}
|
|
29
|
+
// Create active.md if not exists
|
|
30
|
+
if (!existsSync(paths.activePath)) {
|
|
31
|
+
await writeFile(paths.activePath, generateActiveTemplate());
|
|
32
|
+
}
|
|
33
|
+
return paths;
|
|
34
|
+
}
|
|
35
|
+
export async function readActiveMd(projectRoot) {
|
|
36
|
+
const paths = getPlanningPaths(projectRoot);
|
|
37
|
+
try {
|
|
38
|
+
const content = await readFile(paths.activePath, "utf-8");
|
|
39
|
+
return parseActiveMd(content);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return { frontmatter: {}, body: "" };
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export function parseActiveMd(content) {
|
|
46
|
+
const yamlMatch = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
|
|
47
|
+
if (yamlMatch) {
|
|
48
|
+
try {
|
|
49
|
+
const frontmatter = parse(yamlMatch[1]) || {};
|
|
50
|
+
const body = yamlMatch[2].trim();
|
|
51
|
+
return { frontmatter, body };
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// Fall through to default
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return { frontmatter: {}, body: content.trim() };
|
|
58
|
+
}
|
|
59
|
+
export async function writeActiveMd(projectRoot, content) {
|
|
60
|
+
const paths = getPlanningPaths(projectRoot);
|
|
61
|
+
const yamlContent = stringify(content.frontmatter);
|
|
62
|
+
const fullContent = `---\n${yamlContent}---\n\n${content.body}`;
|
|
63
|
+
await writeFile(paths.activePath, fullContent);
|
|
64
|
+
}
|
|
65
|
+
export async function archiveSession(projectRoot, sessionId, content) {
|
|
66
|
+
const paths = getPlanningPaths(projectRoot);
|
|
67
|
+
const timestamp = new Date().toISOString().split("T")[0];
|
|
68
|
+
const archiveFile = join(paths.archiveDir, `session_${timestamp}_${sessionId}.md`);
|
|
69
|
+
await writeFile(archiveFile, content);
|
|
70
|
+
}
|
|
71
|
+
export async function updateIndexMd(projectRoot, summaryLine) {
|
|
72
|
+
const paths = getPlanningPaths(projectRoot);
|
|
73
|
+
try {
|
|
74
|
+
const content = await readFile(paths.indexPath, "utf-8");
|
|
75
|
+
const timestamp = new Date().toISOString().split("T")[0];
|
|
76
|
+
const entry = `- ${timestamp}: ${summaryLine}\n`;
|
|
77
|
+
const updated = content + entry;
|
|
78
|
+
await writeFile(paths.indexPath, updated);
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// If index doesn't exist, create it
|
|
82
|
+
await writeFile(paths.indexPath, generateIndexTemplate() + summaryLine + "\n");
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
export async function listArchives(projectRoot) {
|
|
86
|
+
const paths = getPlanningPaths(projectRoot);
|
|
87
|
+
try {
|
|
88
|
+
const files = await readdir(paths.archiveDir);
|
|
89
|
+
return files.filter((f) => f.endsWith(".md")).sort();
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return [];
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
export function generateIndexTemplate() {
|
|
96
|
+
return `# Project Trajectory
|
|
97
|
+
|
|
98
|
+
## Goals
|
|
99
|
+
<!-- High-level goals only -->
|
|
100
|
+
-
|
|
101
|
+
|
|
102
|
+
## Constraints
|
|
103
|
+
<!-- Project-wide constraints -->
|
|
104
|
+
-
|
|
105
|
+
|
|
106
|
+
## Session History
|
|
107
|
+
<!-- Auto-updated by compact_session -->
|
|
108
|
+
`;
|
|
109
|
+
}
|
|
110
|
+
export function generateActiveTemplate() {
|
|
111
|
+
return `---
|
|
112
|
+
session_id: ""
|
|
113
|
+
mode: ""
|
|
114
|
+
governance_status: "LOCKED"
|
|
115
|
+
start_time: 0
|
|
116
|
+
last_updated: 0
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
# Active Session
|
|
120
|
+
|
|
121
|
+
## Current Focus
|
|
122
|
+
<!-- Updated via map_context -->
|
|
123
|
+
|
|
124
|
+
## Completed
|
|
125
|
+
<!-- Items marked [x] get archived -->
|
|
126
|
+
|
|
127
|
+
## Notes
|
|
128
|
+
<!-- Scratchpad - anything goes -->
|
|
129
|
+
`;
|
|
130
|
+
}
|
|
131
|
+
export async function resetActiveMd(projectRoot) {
|
|
132
|
+
await writeFile(getPlanningPaths(projectRoot).activePath, generateActiveTemplate());
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=planning-fs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planning-fs.js","sourceRoot":"","sources":["../../src/lib/planning-fs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sentiment Detection Module
|
|
3
|
+
*
|
|
4
|
+
* Detects negative signals in agent/user communication to trigger
|
|
5
|
+
* context refresh when drift is detected.
|
|
6
|
+
*
|
|
7
|
+
* Signals:
|
|
8
|
+
* - Negative keywords: stop, wrong, no, bad, incorrect, confused
|
|
9
|
+
* - Agent failure phrases: "I apologize", "you are right", "I was wrong"
|
|
10
|
+
* - Cancellation patterns: "cancel", "abort", "start over"
|
|
11
|
+
*/
|
|
12
|
+
export interface SentimentSignal {
|
|
13
|
+
type: "negative_keyword" | "failure_phrase" | "cancellation" | "confusion";
|
|
14
|
+
matched_text: string;
|
|
15
|
+
timestamp: number;
|
|
16
|
+
turn_number: number;
|
|
17
|
+
source: "user" | "agent";
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Detect sentiment signals in text
|
|
21
|
+
*/
|
|
22
|
+
export declare function detectSentiment(text: string, turnNumber: number, source?: "user" | "agent"): SentimentSignal[];
|
|
23
|
+
/**
|
|
24
|
+
* Check if text contains any negative sentiment
|
|
25
|
+
*/
|
|
26
|
+
export declare function hasNegativeSentiment(text: string): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Get sentiment summary for display
|
|
29
|
+
*/
|
|
30
|
+
export declare function getSentimentSummary(signals: SentimentSignal[]): string;
|
|
31
|
+
//# sourceMappingURL=sentiment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sentiment.d.ts","sourceRoot":"","sources":["../../src/lib/sentiment.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,kBAAkB,GAAG,gBAAgB,GAAG,cAAc,GAAG,WAAW,CAAA;IAC1E,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,GAAG,OAAO,CAAA;CACzB;AAmED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,MAAM,GAAE,MAAM,GAAG,OAAgB,GAChC,eAAe,EAAE,CA0DnB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,MAAM,CAoBtE"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sentiment Detection Module
|
|
3
|
+
*
|
|
4
|
+
* Detects negative signals in agent/user communication to trigger
|
|
5
|
+
* context refresh when drift is detected.
|
|
6
|
+
*
|
|
7
|
+
* Signals:
|
|
8
|
+
* - Negative keywords: stop, wrong, no, bad, incorrect, confused
|
|
9
|
+
* - Agent failure phrases: "I apologize", "you are right", "I was wrong"
|
|
10
|
+
* - Cancellation patterns: "cancel", "abort", "start over"
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Negative keywords that indicate problems.
|
|
14
|
+
*
|
|
15
|
+
* Short keywords (≤5 chars) use word-boundary regex to prevent false positives
|
|
16
|
+
* like "no" matching "no issues" or "error" matching "error handling".
|
|
17
|
+
* Benign phrases are excluded via negative-lookahead.
|
|
18
|
+
*/
|
|
19
|
+
const NEGATIVE_KEYWORD_PATTERNS = [
|
|
20
|
+
{ pattern: /\bstop\b(?!\s+(worrying|there))/i, label: "stop" },
|
|
21
|
+
{ pattern: /\bwrong\b/i, label: "wrong" },
|
|
22
|
+
{ pattern: /\bno\b(?!\s+(issues?|errors?|problems?|worries|need|thanks|longer|more))/i, label: "no" },
|
|
23
|
+
{ pattern: /\bbad\b(?!\s+(→|->|to))/i, label: "bad" },
|
|
24
|
+
{ pattern: /\bincorrect\b/i, label: "incorrect" },
|
|
25
|
+
{ pattern: /\bconfused\b/i, label: "confused" },
|
|
26
|
+
{ pattern: /\bconfusion\b/i, label: "confusion" },
|
|
27
|
+
{ pattern: /\bmistake\b/i, label: "mistake" },
|
|
28
|
+
{ pattern: /\berror\b(?!\s+(handling|boundary|boundaries|message|code|type|class|object|page|recovery|log))/i, label: "error" },
|
|
29
|
+
{ pattern: /\bbroken\b/i, label: "broken" },
|
|
30
|
+
{ pattern: /not working/i, label: "not working" },
|
|
31
|
+
{ pattern: /doesn't work/i, label: "doesn't work" },
|
|
32
|
+
{ pattern: /isn't working/i, label: "isn't working" },
|
|
33
|
+
];
|
|
34
|
+
/** Agent failure admission phrases */
|
|
35
|
+
const FAILURE_PHRASES = [
|
|
36
|
+
"i apologize",
|
|
37
|
+
"you are right",
|
|
38
|
+
"i was wrong",
|
|
39
|
+
"my mistake",
|
|
40
|
+
"i misunderstood",
|
|
41
|
+
"i made an error",
|
|
42
|
+
"that was incorrect",
|
|
43
|
+
"i see the issue now",
|
|
44
|
+
"you're correct",
|
|
45
|
+
"i should have",
|
|
46
|
+
];
|
|
47
|
+
/** Cancellation/restart patterns */
|
|
48
|
+
const CANCELLATION_PATTERNS = [
|
|
49
|
+
"cancel",
|
|
50
|
+
"abort",
|
|
51
|
+
"start over",
|
|
52
|
+
"begin again",
|
|
53
|
+
"scratch that",
|
|
54
|
+
"forget that",
|
|
55
|
+
"never mind",
|
|
56
|
+
"nevermind",
|
|
57
|
+
"let's restart",
|
|
58
|
+
"do over",
|
|
59
|
+
];
|
|
60
|
+
/** Confusion indicators */
|
|
61
|
+
const CONFUSION_PATTERNS = [
|
|
62
|
+
"i'm confused",
|
|
63
|
+
"i am confused",
|
|
64
|
+
"this is confusing",
|
|
65
|
+
"doesn't make sense",
|
|
66
|
+
"not making sense",
|
|
67
|
+
"unclear",
|
|
68
|
+
"i don't understand",
|
|
69
|
+
"i do not understand",
|
|
70
|
+
"what do you mean",
|
|
71
|
+
"can you explain",
|
|
72
|
+
];
|
|
73
|
+
/**
|
|
74
|
+
* Detect sentiment signals in text
|
|
75
|
+
*/
|
|
76
|
+
export function detectSentiment(text, turnNumber, source = "user") {
|
|
77
|
+
const signals = [];
|
|
78
|
+
const lowerText = text.toLowerCase();
|
|
79
|
+
const timestamp = Date.now();
|
|
80
|
+
// Check negative keywords (regex-based with word boundaries)
|
|
81
|
+
for (const { pattern, label } of NEGATIVE_KEYWORD_PATTERNS) {
|
|
82
|
+
if (pattern.test(lowerText)) {
|
|
83
|
+
signals.push({
|
|
84
|
+
type: "negative_keyword",
|
|
85
|
+
matched_text: label,
|
|
86
|
+
timestamp,
|
|
87
|
+
turn_number: turnNumber,
|
|
88
|
+
source,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Check failure phrases
|
|
93
|
+
for (const phrase of FAILURE_PHRASES) {
|
|
94
|
+
if (lowerText.includes(phrase)) {
|
|
95
|
+
signals.push({
|
|
96
|
+
type: "failure_phrase",
|
|
97
|
+
matched_text: phrase,
|
|
98
|
+
timestamp,
|
|
99
|
+
turn_number: turnNumber,
|
|
100
|
+
source,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// Check cancellation patterns
|
|
105
|
+
for (const pattern of CANCELLATION_PATTERNS) {
|
|
106
|
+
if (lowerText.includes(pattern)) {
|
|
107
|
+
signals.push({
|
|
108
|
+
type: "cancellation",
|
|
109
|
+
matched_text: pattern,
|
|
110
|
+
timestamp,
|
|
111
|
+
turn_number: turnNumber,
|
|
112
|
+
source,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Check confusion patterns
|
|
117
|
+
for (const pattern of CONFUSION_PATTERNS) {
|
|
118
|
+
if (lowerText.includes(pattern)) {
|
|
119
|
+
signals.push({
|
|
120
|
+
type: "confusion",
|
|
121
|
+
matched_text: pattern,
|
|
122
|
+
timestamp,
|
|
123
|
+
turn_number: turnNumber,
|
|
124
|
+
source,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return signals;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Check if text contains any negative sentiment
|
|
132
|
+
*/
|
|
133
|
+
export function hasNegativeSentiment(text) {
|
|
134
|
+
return detectSentiment(text, 0).length > 0;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Get sentiment summary for display
|
|
138
|
+
*/
|
|
139
|
+
export function getSentimentSummary(signals) {
|
|
140
|
+
if (signals.length === 0) {
|
|
141
|
+
return "No negative signals detected";
|
|
142
|
+
}
|
|
143
|
+
const byType = signals.reduce((acc, signal) => {
|
|
144
|
+
acc[signal.type] = (acc[signal.type] || 0) + 1;
|
|
145
|
+
return acc;
|
|
146
|
+
}, {});
|
|
147
|
+
const parts = [];
|
|
148
|
+
if (byType["negative_keyword"])
|
|
149
|
+
parts.push(`${byType["negative_keyword"]} negative keywords`);
|
|
150
|
+
if (byType["failure_phrase"])
|
|
151
|
+
parts.push(`${byType["failure_phrase"]} failure admissions`);
|
|
152
|
+
if (byType["cancellation"])
|
|
153
|
+
parts.push(`${byType["cancellation"]} cancellations`);
|
|
154
|
+
if (byType["confusion"])
|
|
155
|
+
parts.push(`${byType["confusion"]} confusion indicators`);
|
|
156
|
+
return parts.join(", ");
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=sentiment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sentiment.js","sourceRoot":"","sources":["../../src/lib/sentiment.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Brain State Schema
|
|
3
|
+
* Core state machine for session governance
|
|
4
|
+
*/
|
|
5
|
+
import type { HiveMindConfig, GovernanceMode } from "./config.js";
|
|
6
|
+
import type { HierarchyState } from "./hierarchy.js";
|
|
7
|
+
import type { SentimentSignal } from "../lib/sentiment.js";
|
|
8
|
+
export type SessionMode = "plan_driven" | "quick_fix" | "exploration";
|
|
9
|
+
export type GovernanceStatus = "LOCKED" | "OPEN";
|
|
10
|
+
export interface SessionState {
|
|
11
|
+
id: string;
|
|
12
|
+
mode: SessionMode;
|
|
13
|
+
governance_mode: GovernanceMode;
|
|
14
|
+
governance_status: GovernanceStatus;
|
|
15
|
+
start_time: number;
|
|
16
|
+
last_activity: number;
|
|
17
|
+
}
|
|
18
|
+
export interface SelfRating {
|
|
19
|
+
score: number;
|
|
20
|
+
reason?: string;
|
|
21
|
+
turn_context?: string;
|
|
22
|
+
timestamp: number;
|
|
23
|
+
turn_number: number;
|
|
24
|
+
}
|
|
25
|
+
export interface MetricsState {
|
|
26
|
+
turn_count: number;
|
|
27
|
+
drift_score: number;
|
|
28
|
+
files_touched: string[];
|
|
29
|
+
context_updates: number;
|
|
30
|
+
ratings: SelfRating[];
|
|
31
|
+
auto_health_score: number;
|
|
32
|
+
total_tool_calls: number;
|
|
33
|
+
successful_tool_calls: number;
|
|
34
|
+
}
|
|
35
|
+
export interface BrainState {
|
|
36
|
+
session: SessionState;
|
|
37
|
+
hierarchy: HierarchyState;
|
|
38
|
+
metrics: MetricsState;
|
|
39
|
+
sentiment_signals: SentimentSignal[];
|
|
40
|
+
complexity_nudge_shown: boolean;
|
|
41
|
+
version: string;
|
|
42
|
+
}
|
|
43
|
+
export declare const BRAIN_STATE_VERSION = "1.0.0";
|
|
44
|
+
export declare function generateSessionId(): string;
|
|
45
|
+
export declare function createBrainState(sessionId: string, config: HiveMindConfig, mode?: SessionMode): BrainState;
|
|
46
|
+
export declare function isSessionLocked(state: BrainState): boolean;
|
|
47
|
+
export declare function unlockSession(state: BrainState): BrainState;
|
|
48
|
+
export declare function lockSession(state: BrainState): BrainState;
|
|
49
|
+
export declare function incrementTurnCount(state: BrainState): BrainState;
|
|
50
|
+
export declare function resetTurnCount(state: BrainState): BrainState;
|
|
51
|
+
export declare function updateHierarchy(state: BrainState, hierarchy: Partial<HierarchyState>): BrainState;
|
|
52
|
+
export declare function addFileTouched(state: BrainState, filePath: string): BrainState;
|
|
53
|
+
export declare function calculateDriftScore(state: BrainState): number;
|
|
54
|
+
export declare function shouldTriggerDriftWarning(state: BrainState, maxTurns: number): boolean;
|
|
55
|
+
export declare function addSelfRating(state: BrainState, rating: Omit<SelfRating, "timestamp" | "turn_number">): BrainState;
|
|
56
|
+
export declare function trackToolCall(state: BrainState, success: boolean): BrainState;
|
|
57
|
+
export declare function addSentimentSignals(state: BrainState, signals: SentimentSignal[]): BrainState;
|
|
58
|
+
export declare function setComplexityNudgeShown(state: BrainState): BrainState;
|
|
59
|
+
export declare function resetComplexityNudge(state: BrainState): BrainState;
|
|
60
|
+
//# sourceMappingURL=brain-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brain-state.d.ts","sourceRoot":"","sources":["../../src/schemas/brain-state.ts"],"names":[],"mappings":"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"}
|