knitbrain 0.1.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/LICENSE +21 -0
- package/README.md +142 -0
- package/dist/ccr/store.d.ts +57 -0
- package/dist/ccr/store.js +195 -0
- package/dist/ccr/store.js.map +1 -0
- package/dist/dashboard.d.ts +23 -0
- package/dist/dashboard.js +125 -0
- package/dist/dashboard.js.map +1 -0
- package/dist/engine/agents.d.ts +36 -0
- package/dist/engine/agents.js +88 -0
- package/dist/engine/agents.js.map +1 -0
- package/dist/engine/calibration.d.ts +29 -0
- package/dist/engine/calibration.js +72 -0
- package/dist/engine/calibration.js.map +1 -0
- package/dist/engine/feedback.d.ts +30 -0
- package/dist/engine/feedback.js +82 -0
- package/dist/engine/feedback.js.map +1 -0
- package/dist/engine/knowledge.d.ts +22 -0
- package/dist/engine/knowledge.js +154 -0
- package/dist/engine/knowledge.js.map +1 -0
- package/dist/engine/memory.d.ts +35 -0
- package/dist/engine/memory.js +93 -0
- package/dist/engine/memory.js.map +1 -0
- package/dist/engine/meter.d.ts +40 -0
- package/dist/engine/meter.js +61 -0
- package/dist/engine/meter.js.map +1 -0
- package/dist/engine/skills.d.ts +33 -0
- package/dist/engine/skills.js +97 -0
- package/dist/engine/skills.js.map +1 -0
- package/dist/engine/teams.d.ts +28 -0
- package/dist/engine/teams.js +58 -0
- package/dist/engine/teams.js.map +1 -0
- package/dist/engine/workflow.d.ts +18 -0
- package/dist/engine/workflow.js +40 -0
- package/dist/engine/workflow.js.map +1 -0
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.js +47 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/pretooluse.d.ts +23 -0
- package/dist/hooks/pretooluse.js +38 -0
- package/dist/hooks/pretooluse.js.map +1 -0
- package/dist/hub/client.d.ts +26 -0
- package/dist/hub/client.js +64 -0
- package/dist/hub/client.js.map +1 -0
- package/dist/hub/server.d.ts +23 -0
- package/dist/hub/server.js +85 -0
- package/dist/hub/server.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +82 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/tools.d.ts +40 -0
- package/dist/mcp/tools.js +461 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/measure.d.ts +27 -0
- package/dist/measure.js +25 -0
- package/dist/measure.js.map +1 -0
- package/dist/optimizer/ast.d.ts +19 -0
- package/dist/optimizer/ast.js +189 -0
- package/dist/optimizer/ast.js.map +1 -0
- package/dist/optimizer/code.d.ts +10 -0
- package/dist/optimizer/code.js +231 -0
- package/dist/optimizer/code.js.map +1 -0
- package/dist/optimizer/json.d.ts +9 -0
- package/dist/optimizer/json.js +68 -0
- package/dist/optimizer/json.js.map +1 -0
- package/dist/optimizer/router.d.ts +39 -0
- package/dist/optimizer/router.js +137 -0
- package/dist/optimizer/router.js.map +1 -0
- package/dist/optimizer/text.d.ts +21 -0
- package/dist/optimizer/text.js +88 -0
- package/dist/optimizer/text.js.map +1 -0
- package/dist/optimizer/types.d.ts +13 -0
- package/dist/optimizer/types.js +2 -0
- package/dist/optimizer/types.js.map +1 -0
- package/dist/paths.d.ts +20 -0
- package/dist/paths.js +44 -0
- package/dist/paths.js.map +1 -0
- package/dist/platforms.d.ts +51 -0
- package/dist/platforms.js +157 -0
- package/dist/platforms.js.map +1 -0
- package/dist/profile.d.ts +3 -0
- package/dist/profile.js +169 -0
- package/dist/profile.js.map +1 -0
- package/dist/proxy/cache-aligner.d.ts +9 -0
- package/dist/proxy/cache-aligner.js +15 -0
- package/dist/proxy/cache-aligner.js.map +1 -0
- package/dist/proxy/index.d.ts +2 -0
- package/dist/proxy/index.js +37 -0
- package/dist/proxy/index.js.map +1 -0
- package/dist/proxy/optimize-request.d.ts +51 -0
- package/dist/proxy/optimize-request.js +111 -0
- package/dist/proxy/optimize-request.js.map +1 -0
- package/dist/proxy/server.d.ts +31 -0
- package/dist/proxy/server.js +104 -0
- package/dist/proxy/server.js.map +1 -0
- package/dist/server.d.ts +19 -0
- package/dist/server.js +54 -0
- package/dist/server.js.map +1 -0
- package/dist/setup.d.ts +28 -0
- package/dist/setup.js +96 -0
- package/dist/setup.js.map +1 -0
- package/dist/tokenizer.d.ts +23 -0
- package/dist/tokenizer.js +25 -0
- package/dist/tokenizer.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.js +4 -0
- package/dist/version.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type Server } from "node:http";
|
|
2
|
+
/**
|
|
3
|
+
* Knit Brain HUB — the shared-sessions server a team points at.
|
|
4
|
+
* One URL + one token; everything else is invisible. Clients mirror their
|
|
5
|
+
* board postings here fire-and-forget; dashboards read the merged view.
|
|
6
|
+
* Auth: single team token (Bearer). Originals stored verbatim server-side so
|
|
7
|
+
* any teammate can page in the full content (their local CCR handles don't
|
|
8
|
+
* resolve across machines).
|
|
9
|
+
*/
|
|
10
|
+
export interface HubEntry {
|
|
11
|
+
id: string;
|
|
12
|
+
author: string;
|
|
13
|
+
/** Compressed skeleton (cheap for everyone to scan). */
|
|
14
|
+
summary: string;
|
|
15
|
+
/** Full original (recoverable by any teammate). */
|
|
16
|
+
original: string;
|
|
17
|
+
ts: string;
|
|
18
|
+
}
|
|
19
|
+
export interface Hub {
|
|
20
|
+
server: Server;
|
|
21
|
+
token: string;
|
|
22
|
+
}
|
|
23
|
+
export declare function createHub(root: string): Hub;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { randomBytes, createHash, timingSafeEqual } from "node:crypto";
|
|
2
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { createServer } from "node:http";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
function readBody(req) {
|
|
6
|
+
return new Promise((resolve, reject) => {
|
|
7
|
+
let d = "";
|
|
8
|
+
req.on("data", (c) => (d += c));
|
|
9
|
+
req.on("end", () => resolve(d));
|
|
10
|
+
req.on("error", reject);
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
export function createHub(root) {
|
|
14
|
+
mkdirSync(root, { recursive: true });
|
|
15
|
+
const tokenPath = join(root, "token.txt");
|
|
16
|
+
const boardPath = join(root, "board.json");
|
|
17
|
+
let token;
|
|
18
|
+
if (existsSync(tokenPath)) {
|
|
19
|
+
token = readFileSync(tokenPath, "utf8").trim();
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
token = `khub_${randomBytes(24).toString("hex")}`;
|
|
23
|
+
writeFileSync(tokenPath, token, { encoding: "utf8", mode: 0o600 });
|
|
24
|
+
}
|
|
25
|
+
const load = () => {
|
|
26
|
+
if (!existsSync(boardPath))
|
|
27
|
+
return [];
|
|
28
|
+
try {
|
|
29
|
+
return JSON.parse(readFileSync(boardPath, "utf8"));
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return [];
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
const save = (entries) => {
|
|
36
|
+
const tmp = `${boardPath}.${process.pid}.tmp`;
|
|
37
|
+
writeFileSync(tmp, JSON.stringify(entries), "utf8");
|
|
38
|
+
renameSync(tmp, boardPath);
|
|
39
|
+
};
|
|
40
|
+
// SECURITY: constant-time comparison — no timing oracle on the team token.
|
|
41
|
+
const expected = createHash("sha256").update(`Bearer ${token}`).digest();
|
|
42
|
+
const authed = (req) => {
|
|
43
|
+
const got = createHash("sha256").update(req.headers.authorization ?? "").digest();
|
|
44
|
+
return timingSafeEqual(got, expected);
|
|
45
|
+
};
|
|
46
|
+
const json = (res, code, body) => {
|
|
47
|
+
res.writeHead(code, { "content-type": "application/json" });
|
|
48
|
+
res.end(JSON.stringify(body));
|
|
49
|
+
};
|
|
50
|
+
const server = createServer((req, res) => {
|
|
51
|
+
void (async () => {
|
|
52
|
+
if (req.method === "GET" && req.url === "/health") {
|
|
53
|
+
return json(res, 200, { status: "healthy", server: "knitbrain-hub" });
|
|
54
|
+
}
|
|
55
|
+
if (!authed(req))
|
|
56
|
+
return json(res, 401, { error: "missing or invalid token" });
|
|
57
|
+
if (req.method === "POST" && req.url === "/board") {
|
|
58
|
+
const body = JSON.parse(await readBody(req));
|
|
59
|
+
if (typeof body.author !== "string" || typeof body.original !== "string") {
|
|
60
|
+
return json(res, 400, { error: "author and original are required" });
|
|
61
|
+
}
|
|
62
|
+
const entry = {
|
|
63
|
+
id: createHash("sha256").update(body.author + body.original + Date.now()).digest("hex").slice(0, 8),
|
|
64
|
+
author: body.author,
|
|
65
|
+
summary: typeof body.summary === "string" ? body.summary : body.original.slice(0, 400),
|
|
66
|
+
original: body.original,
|
|
67
|
+
ts: new Date().toISOString(),
|
|
68
|
+
};
|
|
69
|
+
save([...load(), entry]);
|
|
70
|
+
return json(res, 200, { id: entry.id });
|
|
71
|
+
}
|
|
72
|
+
if (req.method === "GET" && req.url === "/board") {
|
|
73
|
+
return json(res, 200, load().map((e) => ({ id: e.id, author: e.author, summary: e.summary, ts: e.ts })));
|
|
74
|
+
}
|
|
75
|
+
const m = req.url?.match(/^\/board\/([0-9a-f]{8})$/);
|
|
76
|
+
if (req.method === "GET" && m) {
|
|
77
|
+
const entry = load().find((e) => e.id === m[1]);
|
|
78
|
+
return entry ? json(res, 200, entry) : json(res, 404, { error: "not found" });
|
|
79
|
+
}
|
|
80
|
+
return json(res, 404, { error: "not found" });
|
|
81
|
+
})().catch((err) => json(res, 500, { error: String(err) }));
|
|
82
|
+
});
|
|
83
|
+
return { server, token };
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/hub/server.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
|
+
import { buildServer } from "./server.js";
|
|
4
|
+
import { runSetup } from "./setup.js";
|
|
5
|
+
async function main() {
|
|
6
|
+
if (process.argv[2] === "setup") {
|
|
7
|
+
process.exit(runSetup());
|
|
8
|
+
}
|
|
9
|
+
if (process.argv[2] === "hub") {
|
|
10
|
+
const [{ createHub }, { knitbrainHome }, { join }] = await Promise.all([
|
|
11
|
+
import("./hub/server.js"),
|
|
12
|
+
import("./paths.js"),
|
|
13
|
+
import("node:path"),
|
|
14
|
+
]);
|
|
15
|
+
const { server, token } = createHub(join(knitbrainHome(), "hub"));
|
|
16
|
+
const port = Number(process.env["KNITBRAIN_HUB_PORT"] ?? 8791);
|
|
17
|
+
const host = process.env["KNITBRAIN_HUB_HOST"] ?? "127.0.0.1";
|
|
18
|
+
server.listen(port, host, () => {
|
|
19
|
+
console.log(`knitbrain hub → http://${host}:${port}`);
|
|
20
|
+
console.log(`team token: ${token}`);
|
|
21
|
+
console.log(`teammates join with: knitbrain join http://<this-host>:${port} ${token} <name>`);
|
|
22
|
+
if (host === "127.0.0.1") {
|
|
23
|
+
console.log("(loopback only — set KNITBRAIN_HUB_HOST=0.0.0.0 to allow your team to reach it)");
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
if (process.argv[2] === "join") {
|
|
29
|
+
const [url, token, member] = [process.argv[3], process.argv[4], process.argv[5] ?? "me"];
|
|
30
|
+
if (!url || !token) {
|
|
31
|
+
console.error("usage: knitbrain join <hub-url> <token> [member-name]");
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
const { saveHubConfig } = await import("./hub/client.js");
|
|
35
|
+
const path = saveHubConfig({ url, token, member });
|
|
36
|
+
console.log(`joined hub ${url} as "${member}" (config: ${path})`);
|
|
37
|
+
console.log("from now on, team_post mirrors to the hub automatically.");
|
|
38
|
+
process.exit(0);
|
|
39
|
+
}
|
|
40
|
+
if (process.argv[2] === "profile") {
|
|
41
|
+
const { runProfile } = await import("./profile.js");
|
|
42
|
+
await runProfile(process.argv.slice(3));
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
if (process.argv[2] === "dashboard") {
|
|
46
|
+
const [{ createDashboardServer }, { createFileCCRStore }, { createKnowledge }, { createMemory }, { createFeedback }, { createSkillsStore }, { createTeamBoard }, { createMeter }, paths] = await Promise.all([
|
|
47
|
+
import("./dashboard.js"),
|
|
48
|
+
import("./ccr/store.js"),
|
|
49
|
+
import("./engine/knowledge.js"),
|
|
50
|
+
import("./engine/memory.js"),
|
|
51
|
+
import("./engine/feedback.js"),
|
|
52
|
+
import("./engine/skills.js"),
|
|
53
|
+
import("./engine/teams.js"),
|
|
54
|
+
import("./engine/meter.js"),
|
|
55
|
+
import("./paths.js"),
|
|
56
|
+
]);
|
|
57
|
+
const ccr = createFileCCRStore(paths.ccrRoot());
|
|
58
|
+
const srv = createDashboardServer({
|
|
59
|
+
ccr,
|
|
60
|
+
memory: createMemory(paths.memoryRoot()),
|
|
61
|
+
feedback: createFeedback(paths.feedbackRoot()),
|
|
62
|
+
team: createTeamBoard(paths.teamRoot(), ccr),
|
|
63
|
+
meter: createMeter(paths.meterRoot()),
|
|
64
|
+
// Project scope: the directory the dashboard was started in.
|
|
65
|
+
knowledge: createKnowledge(process.cwd(), paths.knowledgeRoot()),
|
|
66
|
+
skills: createSkillsStore(paths.skillsRoot()),
|
|
67
|
+
});
|
|
68
|
+
const port = Number(process.env["KNITBRAIN_DASHBOARD_PORT"] ?? 8790);
|
|
69
|
+
srv.listen(port, "127.0.0.1", () => {
|
|
70
|
+
console.log(`knitbrain dashboard → http://127.0.0.1:${port}`);
|
|
71
|
+
});
|
|
72
|
+
return; // keep serving
|
|
73
|
+
}
|
|
74
|
+
const server = buildServer();
|
|
75
|
+
const transport = new StdioServerTransport();
|
|
76
|
+
await server.connect(transport);
|
|
77
|
+
}
|
|
78
|
+
main().catch((err) => {
|
|
79
|
+
console.error("[knitbrain] fatal:", err);
|
|
80
|
+
process.exit(1);
|
|
81
|
+
});
|
|
82
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { CCRStore } from "../ccr/store.js";
|
|
2
|
+
import type { Memory } from "../engine/memory.js";
|
|
3
|
+
import type { Knowledge } from "../engine/knowledge.js";
|
|
4
|
+
import type { Feedback } from "../engine/feedback.js";
|
|
5
|
+
import type { TeamBoard } from "../engine/teams.js";
|
|
6
|
+
import type { Meter } from "../engine/meter.js";
|
|
7
|
+
import type { SkillsStore } from "../engine/skills.js";
|
|
8
|
+
import type { Calibration } from "../engine/calibration.js";
|
|
9
|
+
/** Runtime context handed to every tool. */
|
|
10
|
+
export interface ToolContext {
|
|
11
|
+
ccr: CCRStore;
|
|
12
|
+
memory: Memory;
|
|
13
|
+
knowledge: Knowledge;
|
|
14
|
+
feedback: Feedback;
|
|
15
|
+
team: TeamBoard;
|
|
16
|
+
meter: Meter;
|
|
17
|
+
skills: SkillsStore;
|
|
18
|
+
calibration: Calibration;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Output discipline at the dispatch chokepoint:
|
|
22
|
+
* - "data" → auto-compressed (skeleton + ⟨ccr:hash⟩), original in CCR.
|
|
23
|
+
* - "verbatim" → returned exactly as-is (governance/protocol/control output
|
|
24
|
+
* the agent must read literally — NEVER skeletonized).
|
|
25
|
+
*/
|
|
26
|
+
export type OutputKind = "data" | "verbatim";
|
|
27
|
+
export interface ToolDef {
|
|
28
|
+
readonly name: string;
|
|
29
|
+
readonly description: string;
|
|
30
|
+
readonly inputSchema: Record<string, unknown>;
|
|
31
|
+
readonly output: OutputKind;
|
|
32
|
+
run(args: Record<string, unknown>, ctx: ToolContext): string;
|
|
33
|
+
}
|
|
34
|
+
export declare const TOOLS: readonly ToolDef[];
|
|
35
|
+
/**
|
|
36
|
+
* The ONE chokepoint: run a tool, then apply output discipline. Data outputs
|
|
37
|
+
* are compressed through the optimizer (original preserved in CCR); verbatim
|
|
38
|
+
* outputs pass through untouched.
|
|
39
|
+
*/
|
|
40
|
+
export declare function dispatch(tool: ToolDef, args: Record<string, unknown>, ctx: ToolContext): string;
|