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,461 @@
|
|
|
1
|
+
import { classifyTask } from "../engine/workflow.js";
|
|
2
|
+
import { proposeAgents, writeAgent } from "../engine/agents.js";
|
|
3
|
+
import { loadHubConfig, mirrorToHub } from "../hub/client.js";
|
|
4
|
+
import { detectPlatforms } from "../setup.js";
|
|
5
|
+
import { slashCommands } from "../platforms.js";
|
|
6
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
7
|
+
import { homedir } from "node:os";
|
|
8
|
+
import { relative, resolve, isAbsolute } from "node:path";
|
|
9
|
+
import { compress, detect } from "../optimizer/router.js";
|
|
10
|
+
import { countTokens } from "../tokenizer.js";
|
|
11
|
+
import { VERSION } from "../version.js";
|
|
12
|
+
function str(args, key) {
|
|
13
|
+
return typeof args[key] === "string" ? args[key] : "";
|
|
14
|
+
}
|
|
15
|
+
/** Strip a ⟨ccr:…⟩ wrapper / prefix so a pasted handle still resolves. */
|
|
16
|
+
function normalizeHandle(raw) {
|
|
17
|
+
return raw.replace(/[⟨⟩]/g, "").replace(/^ccr:/, "").trim();
|
|
18
|
+
}
|
|
19
|
+
export const TOOLS = [
|
|
20
|
+
{
|
|
21
|
+
name: "knitbrain_ping",
|
|
22
|
+
description: "Health check — returns pong and the server version.",
|
|
23
|
+
inputSchema: { type: "object", properties: {}, additionalProperties: false },
|
|
24
|
+
output: "verbatim",
|
|
25
|
+
run: () => `pong · knitbrain v${VERSION}`,
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
name: "knitbrain_optimize",
|
|
29
|
+
description: "Compress a payload (JSON / code / prose) into a token-cheap skeleton. The exact original is stored locally and recoverable via knitbrain_retrieve using the returned ⟨ccr:hash⟩. Returns the original unchanged if compression wouldn't help.",
|
|
30
|
+
inputSchema: {
|
|
31
|
+
type: "object",
|
|
32
|
+
properties: { text: { type: "string", description: "The payload to optimize." } },
|
|
33
|
+
required: ["text"],
|
|
34
|
+
additionalProperties: false,
|
|
35
|
+
},
|
|
36
|
+
output: "verbatim", // already produces the optimized form itself
|
|
37
|
+
run: (args, ctx) => {
|
|
38
|
+
const text = typeof args["text"] === "string" ? args["text"] : "";
|
|
39
|
+
const r = compress(text, ctx.ccr, { allowProse: !ctx.feedback.shouldSkip("prose") });
|
|
40
|
+
if (!r.compressed)
|
|
41
|
+
return text;
|
|
42
|
+
ctx.feedback.onCompress(r.contentType, r.handle);
|
|
43
|
+
return `${r.skeleton}\n\n[optimized: ${r.originalTokens}→${r.skeletonTokens} tokens, saved ${r.savedPct}% · retrieve the ⟨ccr:…⟩ handle for the exact original]`;
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: "knitbrain_retrieve",
|
|
48
|
+
description: "Retrieve the exact original bytes for a ⟨ccr:hash⟩ handle produced by compression. Use when a skeleton isn't enough and you need the precise content.",
|
|
49
|
+
inputSchema: {
|
|
50
|
+
type: "object",
|
|
51
|
+
properties: { handle: { type: "string", description: "The ⟨ccr:hash⟩ or raw hash." } },
|
|
52
|
+
required: ["handle"],
|
|
53
|
+
additionalProperties: false,
|
|
54
|
+
},
|
|
55
|
+
output: "verbatim",
|
|
56
|
+
run: (args, ctx) => {
|
|
57
|
+
const handle = normalizeHandle(str(args, "handle"));
|
|
58
|
+
const original = ctx.ccr.get(handle);
|
|
59
|
+
ctx.feedback.onRetrieve(handle); // a vote that the skeleton wasn't enough
|
|
60
|
+
return original;
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
name: "knitbrain_read",
|
|
65
|
+
description: "Read a project file OPTIMIZED: returns a structure-preserving skeleton (signatures/schema kept, bulk elided) + a ⟨ccr:hash⟩ to page in the exact original. Use INSTEAD of the host's raw read for large files — same information shape, ~70-90% fewer tokens. Works on every platform.",
|
|
66
|
+
inputSchema: {
|
|
67
|
+
type: "object",
|
|
68
|
+
properties: { path: { type: "string", description: "File path, relative to the project root." } },
|
|
69
|
+
required: ["path"],
|
|
70
|
+
additionalProperties: false,
|
|
71
|
+
},
|
|
72
|
+
output: "verbatim", // already produces the optimized form itself
|
|
73
|
+
run: (args, ctx) => {
|
|
74
|
+
// SECURITY: project-scoped only — no absolute paths, no traversal out.
|
|
75
|
+
const requested = str(args, "path");
|
|
76
|
+
const full = resolve(process.cwd(), requested);
|
|
77
|
+
const rel = relative(process.cwd(), full);
|
|
78
|
+
if (isAbsolute(rel) || rel.startsWith("..")) {
|
|
79
|
+
return `refused: path escapes the project root (${requested})`;
|
|
80
|
+
}
|
|
81
|
+
if (!existsSync(full))
|
|
82
|
+
return `no such file: ${requested}`;
|
|
83
|
+
const original = readFileSync(full, "utf8");
|
|
84
|
+
const r = compress(original, ctx.ccr, { allowProse: !ctx.feedback.shouldSkip("prose") });
|
|
85
|
+
if (!r.compressed)
|
|
86
|
+
return original; // small/incompressible → exact content
|
|
87
|
+
ctx.feedback.onCompress(r.contentType, r.handle);
|
|
88
|
+
return `${r.skeleton}\n\n[knitbrain_read: ${requested} · ${r.originalTokens}→${r.skeletonTokens} tokens (saved ${r.savedPct}%) · exact original: knitbrain_retrieve ⟨ccr:${r.handle}⟩]`;
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
name: "knitbrain_record_learning",
|
|
93
|
+
description: "Record a non-obvious project learning (summary + lesson + tags) for future sessions.",
|
|
94
|
+
inputSchema: {
|
|
95
|
+
type: "object",
|
|
96
|
+
properties: {
|
|
97
|
+
summary: { type: "string" },
|
|
98
|
+
lesson: { type: "string" },
|
|
99
|
+
tags: { type: "array", items: { type: "string" } },
|
|
100
|
+
},
|
|
101
|
+
required: ["summary", "lesson"],
|
|
102
|
+
additionalProperties: false,
|
|
103
|
+
},
|
|
104
|
+
output: "verbatim",
|
|
105
|
+
run: (args, ctx) => {
|
|
106
|
+
const tags = Array.isArray(args["tags"]) ? args["tags"] : [];
|
|
107
|
+
const { id, duplicate } = ctx.memory.recordLearning({
|
|
108
|
+
summary: str(args, "summary"),
|
|
109
|
+
lesson: str(args, "lesson"),
|
|
110
|
+
tags,
|
|
111
|
+
});
|
|
112
|
+
return duplicate ? `duplicate of existing learning ${id}` : `recorded learning ${id}`;
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
name: "knitbrain_search_learnings",
|
|
117
|
+
description: "Search project learnings; returns ranked headlines (id + summary). Call knitbrain_get_learning for a full lesson.",
|
|
118
|
+
inputSchema: {
|
|
119
|
+
type: "object",
|
|
120
|
+
properties: { query: { type: "string" }, limit: { type: "number" } },
|
|
121
|
+
required: ["query"],
|
|
122
|
+
additionalProperties: false,
|
|
123
|
+
},
|
|
124
|
+
output: "data",
|
|
125
|
+
run: (args, ctx) => {
|
|
126
|
+
const limit = typeof args["limit"] === "number" ? args["limit"] : 5;
|
|
127
|
+
return JSON.stringify(ctx.memory.searchLearnings(str(args, "query"), limit), null, 2);
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
name: "knitbrain_get_learning",
|
|
132
|
+
description: "Fetch the full lesson for a learning id (from knitbrain_search_learnings).",
|
|
133
|
+
inputSchema: {
|
|
134
|
+
type: "object",
|
|
135
|
+
properties: { id: { type: "string" } },
|
|
136
|
+
required: ["id"],
|
|
137
|
+
additionalProperties: false,
|
|
138
|
+
},
|
|
139
|
+
output: "data",
|
|
140
|
+
run: (args, ctx) => {
|
|
141
|
+
const l = ctx.memory.getLearning(str(args, "id"));
|
|
142
|
+
return l ? JSON.stringify(l, null, 2) : `no learning found with id ${str(args, "id")}`;
|
|
143
|
+
},
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
name: "knitbrain_save_handoff",
|
|
147
|
+
description: "Save session handoff state so the next session can resume.",
|
|
148
|
+
inputSchema: {
|
|
149
|
+
type: "object",
|
|
150
|
+
properties: { state: { type: "string" } },
|
|
151
|
+
required: ["state"],
|
|
152
|
+
additionalProperties: false,
|
|
153
|
+
},
|
|
154
|
+
output: "verbatim",
|
|
155
|
+
run: (args, ctx) => {
|
|
156
|
+
ctx.memory.saveHandoff(str(args, "state"));
|
|
157
|
+
return "handoff saved";
|
|
158
|
+
},
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
name: "knitbrain_load_session",
|
|
162
|
+
description: "Load the prior handoff + top recent learnings to resume work. Resets the context meter for the new session.",
|
|
163
|
+
inputSchema: { type: "object", properties: {}, additionalProperties: false },
|
|
164
|
+
output: "data",
|
|
165
|
+
run: (_args, ctx) => {
|
|
166
|
+
ctx.meter.reset(); // new session starts a fresh window
|
|
167
|
+
return JSON.stringify(ctx.memory.loadSession(), null, 2);
|
|
168
|
+
},
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
name: "knitbrain_context_meter",
|
|
172
|
+
description: "Token-window meter: how full the context is, tokens saved by optimization, and whether it's time to save a handoff and clear the session.",
|
|
173
|
+
inputSchema: { type: "object", properties: {}, additionalProperties: false },
|
|
174
|
+
output: "verbatim",
|
|
175
|
+
run: (_args, ctx) => JSON.stringify(ctx.meter.read(), null, 2),
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
name: "knitbrain_scan",
|
|
179
|
+
description: "Scan the project and (re)build the import/export knowledge graph.",
|
|
180
|
+
inputSchema: { type: "object", properties: {}, additionalProperties: false },
|
|
181
|
+
output: "verbatim",
|
|
182
|
+
run: (_args, ctx) => `scanned ${ctx.knowledge.scan().files} files`,
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
name: "knitbrain_query_imports",
|
|
186
|
+
description: "What a file imports (module specifiers + names).",
|
|
187
|
+
inputSchema: {
|
|
188
|
+
type: "object",
|
|
189
|
+
properties: { file: { type: "string" } },
|
|
190
|
+
required: ["file"],
|
|
191
|
+
additionalProperties: false,
|
|
192
|
+
},
|
|
193
|
+
output: "data",
|
|
194
|
+
run: (args, ctx) => JSON.stringify(ctx.knowledge.queryImports(str(args, "file")) ?? [], null, 2),
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
name: "knitbrain_query_exports",
|
|
198
|
+
description: "What a file exports.",
|
|
199
|
+
inputSchema: {
|
|
200
|
+
type: "object",
|
|
201
|
+
properties: { file: { type: "string" } },
|
|
202
|
+
required: ["file"],
|
|
203
|
+
additionalProperties: false,
|
|
204
|
+
},
|
|
205
|
+
output: "data",
|
|
206
|
+
run: (args, ctx) => JSON.stringify(ctx.knowledge.queryExports(str(args, "file")) ?? [], null, 2),
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
name: "knitbrain_query_dependents",
|
|
210
|
+
description: "Which files import the given file (blast radius before editing).",
|
|
211
|
+
inputSchema: {
|
|
212
|
+
type: "object",
|
|
213
|
+
properties: { file: { type: "string" } },
|
|
214
|
+
required: ["file"],
|
|
215
|
+
additionalProperties: false,
|
|
216
|
+
},
|
|
217
|
+
output: "data",
|
|
218
|
+
run: (args, ctx) => JSON.stringify(ctx.knowledge.queryDependents(str(args, "file")), null, 2),
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
name: "knitbrain_classify_task",
|
|
222
|
+
description: "Classify a task into a tier (inquiry/trivial/standard/complex) with phases + plan-mode signal. Follow the returned plan.",
|
|
223
|
+
inputSchema: {
|
|
224
|
+
type: "object",
|
|
225
|
+
properties: {
|
|
226
|
+
description: { type: "string" },
|
|
227
|
+
files: { type: "array", items: { type: "string" } },
|
|
228
|
+
},
|
|
229
|
+
required: ["description"],
|
|
230
|
+
additionalProperties: false,
|
|
231
|
+
},
|
|
232
|
+
output: "verbatim",
|
|
233
|
+
run: (args, ctx) => {
|
|
234
|
+
const files = Array.isArray(args["files"]) ? args["files"] : [];
|
|
235
|
+
const scopeAdjust = ctx.calibration.get().scopeAdjust;
|
|
236
|
+
return JSON.stringify(classifyTask(str(args, "description"), files, scopeAdjust), null, 2);
|
|
237
|
+
},
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
name: "knitbrain_record_false_positive",
|
|
241
|
+
description: "The classifier got it wrong? Record it: claimed tier vs what the task actually was. After 3 same-direction reports the classifier's threshold self-adjusts (per-project, deterministic, bounded).",
|
|
242
|
+
inputSchema: {
|
|
243
|
+
type: "object",
|
|
244
|
+
properties: {
|
|
245
|
+
claimed_tier: { type: "string", enum: ["inquiry", "trivial", "standard", "complex"], description: "What the classifier said." },
|
|
246
|
+
actual_tier: { type: "string", enum: ["inquiry", "trivial", "standard", "complex"], description: "What it really was." },
|
|
247
|
+
reason: { type: "string", description: "One line: why the verdict was wrong." },
|
|
248
|
+
},
|
|
249
|
+
required: ["claimed_tier", "actual_tier"],
|
|
250
|
+
additionalProperties: false,
|
|
251
|
+
},
|
|
252
|
+
output: "verbatim",
|
|
253
|
+
run: (args, ctx) => {
|
|
254
|
+
const claimed = str(args, "claimed_tier");
|
|
255
|
+
const actual = str(args, "actual_tier");
|
|
256
|
+
if (claimed === actual || claimed === "" || actual === "") {
|
|
257
|
+
return "refused: claimed_tier and actual_tier must be valid tiers and differ.";
|
|
258
|
+
}
|
|
259
|
+
const r = ctx.calibration.recordFalsePositive(claimed, actual);
|
|
260
|
+
const pending = r.fpDirections[`${claimed}-was-${actual}`] ?? 0;
|
|
261
|
+
return r.shifted
|
|
262
|
+
? `recorded — threshold SHIFTED (scopeAdjust=${r.scopeAdjust}); the classifier now requires ${Math.max(2, 4 + r.scopeAdjust)} files for complex.`
|
|
263
|
+
: `recorded (${pending}/3 toward a shift in direction ${claimed}-was-${actual}; scopeAdjust=${r.scopeAdjust}).`;
|
|
264
|
+
},
|
|
265
|
+
},
|
|
266
|
+
{
|
|
267
|
+
name: "knitbrain_metrics",
|
|
268
|
+
description: "Compression telemetry: CCR tier counts + per-kind retrieval rates (TOIN self-tuning).",
|
|
269
|
+
inputSchema: { type: "object", properties: {}, additionalProperties: false },
|
|
270
|
+
output: "verbatim",
|
|
271
|
+
run: (_args, ctx) => JSON.stringify({ ccr: ctx.ccr.stats(), feedback: ctx.feedback.stats(), calibration: ctx.calibration.get() }, null, 2),
|
|
272
|
+
},
|
|
273
|
+
{
|
|
274
|
+
name: "knitbrain_propose_agents",
|
|
275
|
+
description: "Auto-detect project-specific agent proposals from the knowledge graph (domains + guardrails). Review/edit, then create with knitbrain_create_agent.",
|
|
276
|
+
inputSchema: { type: "object", properties: {}, additionalProperties: false },
|
|
277
|
+
output: "data",
|
|
278
|
+
run: (_args, ctx) => JSON.stringify(proposeAgents(ctx.knowledge.listFiles()), null, 2),
|
|
279
|
+
},
|
|
280
|
+
{
|
|
281
|
+
name: "knitbrain_create_agent",
|
|
282
|
+
description: "Generate a project-specific subagent (.claude/agents/<name>.md) with 4 guardrails: file scope, allowed-tools, optional review gate, context budget.",
|
|
283
|
+
inputSchema: {
|
|
284
|
+
type: "object",
|
|
285
|
+
properties: {
|
|
286
|
+
name: { type: "string" },
|
|
287
|
+
description: { type: "string" },
|
|
288
|
+
scope: { type: "string" },
|
|
289
|
+
tools: { type: "array", items: { type: "string" } },
|
|
290
|
+
reviewGate: { type: "boolean" },
|
|
291
|
+
contextBudget: { type: "number" },
|
|
292
|
+
},
|
|
293
|
+
required: ["name"],
|
|
294
|
+
additionalProperties: false,
|
|
295
|
+
},
|
|
296
|
+
output: "verbatim",
|
|
297
|
+
run: (args) => {
|
|
298
|
+
const path = writeAgent(process.cwd(), {
|
|
299
|
+
name: str(args, "name"),
|
|
300
|
+
...(typeof args["description"] === "string" ? { description: args["description"] } : {}),
|
|
301
|
+
...(typeof args["scope"] === "string" ? { scope: args["scope"] } : {}),
|
|
302
|
+
...(Array.isArray(args["tools"]) ? { tools: args["tools"] } : {}),
|
|
303
|
+
...(typeof args["reviewGate"] === "boolean" ? { reviewGate: args["reviewGate"] } : {}),
|
|
304
|
+
...(typeof args["contextBudget"] === "number" ? { contextBudget: args["contextBudget"] } : {}),
|
|
305
|
+
});
|
|
306
|
+
return `created agent at ${path}`;
|
|
307
|
+
},
|
|
308
|
+
},
|
|
309
|
+
{
|
|
310
|
+
name: "knitbrain_run",
|
|
311
|
+
description: "THE feedback/orchestrator tool — call FIRST when the user states a task. Classifies it (small→big), finds-or-drafts the SKILL for it, proposes guardrailed agents when multi-domain, lists host slash-commands the agent can run itself, and reports the context meter. Follow the returned directive.",
|
|
312
|
+
inputSchema: {
|
|
313
|
+
type: "object",
|
|
314
|
+
properties: {
|
|
315
|
+
task: { type: "string", description: "The user's task, verbatim." },
|
|
316
|
+
files: { type: "array", items: { type: "string" }, description: "Files likely touched, if known." },
|
|
317
|
+
},
|
|
318
|
+
required: ["task"],
|
|
319
|
+
additionalProperties: false,
|
|
320
|
+
},
|
|
321
|
+
output: "verbatim", // a directive the agent must read exactly
|
|
322
|
+
run: (args, ctx) => {
|
|
323
|
+
const task = str(args, "task");
|
|
324
|
+
const files = Array.isArray(args["files"]) ? args["files"] : [];
|
|
325
|
+
const cls = classifyTask(task, files, ctx.calibration.get().scopeAdjust);
|
|
326
|
+
// SKILL: find-or-draft (skills made on-demand, persist, compound).
|
|
327
|
+
const found = ctx.skills.find(task);
|
|
328
|
+
const seed = ctx.memory.searchLearnings(task, 3).map((h) => h.summary);
|
|
329
|
+
const skill = found
|
|
330
|
+
? { status: "found", name: found.name, uses: found.uses, body: found.body }
|
|
331
|
+
: { status: "drafted — refine while working, then knitbrain_skill_save", body: ctx.skills.draft(task, seed) };
|
|
332
|
+
// AGENTS: only when the task is complex/multi-domain (never at start).
|
|
333
|
+
const agents = cls.tier === "complex"
|
|
334
|
+
? proposeAgents(ctx.knowledge.listFiles()).slice(0, 4).map((p) => ({
|
|
335
|
+
name: p.name,
|
|
336
|
+
scope: p.scope,
|
|
337
|
+
tools: p.tools,
|
|
338
|
+
reviewGate: p.reviewGate,
|
|
339
|
+
brief: "spawn via your host's sub-agent mechanism; brief it with the SKILL body + its guardrails; post findings to knitbrain_team_post",
|
|
340
|
+
}))
|
|
341
|
+
: [];
|
|
342
|
+
// HOST COMMANDS the agent can run itself (autonomous loop).
|
|
343
|
+
const platforms = detectPlatforms({ env: process.env, exists: existsSync, home: homedir() });
|
|
344
|
+
const commands = platforms.flatMap((p) => slashCommands(p));
|
|
345
|
+
return JSON.stringify({
|
|
346
|
+
classification: cls,
|
|
347
|
+
skill,
|
|
348
|
+
agents,
|
|
349
|
+
host_commands: commands,
|
|
350
|
+
meter: ctx.meter.read(),
|
|
351
|
+
directive: cls.tier === "complex"
|
|
352
|
+
? "Plan first. Spawn the proposed agents in parallel; each works its scope w/ its skill; consolidate via team board; verify; record learning + skill update."
|
|
353
|
+
: "Execute with the skill. Verify before claiming done. Record learning + skill update if anything non-obvious surfaced.",
|
|
354
|
+
}, null, 2);
|
|
355
|
+
},
|
|
356
|
+
},
|
|
357
|
+
{
|
|
358
|
+
name: "knitbrain_skill_save",
|
|
359
|
+
description: "Persist a refined skill playbook (telegraphic). Same name updates the skill — skills compound across tasks.",
|
|
360
|
+
inputSchema: {
|
|
361
|
+
type: "object",
|
|
362
|
+
properties: {
|
|
363
|
+
name: { type: "string" },
|
|
364
|
+
body: { type: "string" },
|
|
365
|
+
triggers: { type: "array", items: { type: "string" } },
|
|
366
|
+
},
|
|
367
|
+
required: ["name", "body"],
|
|
368
|
+
additionalProperties: false,
|
|
369
|
+
},
|
|
370
|
+
output: "verbatim",
|
|
371
|
+
run: (args, ctx) => {
|
|
372
|
+
const triggers = Array.isArray(args["triggers"]) ? args["triggers"] : [];
|
|
373
|
+
const s = ctx.skills.save({ name: str(args, "name"), body: str(args, "body"), triggers });
|
|
374
|
+
return `skill "${s.name}" saved (uses=${s.uses}, triggers: ${s.triggers.join(", ")})`;
|
|
375
|
+
},
|
|
376
|
+
},
|
|
377
|
+
{
|
|
378
|
+
name: "knitbrain_team_post",
|
|
379
|
+
description: "Post a finding to the shared team board (stored compressed; full original recoverable).",
|
|
380
|
+
inputSchema: {
|
|
381
|
+
type: "object",
|
|
382
|
+
properties: { author: { type: "string" }, content: { type: "string" } },
|
|
383
|
+
required: ["author", "content"],
|
|
384
|
+
additionalProperties: false,
|
|
385
|
+
},
|
|
386
|
+
output: "verbatim",
|
|
387
|
+
run: (args, ctx) => {
|
|
388
|
+
// The SDK does not enforce inputSchema server-side — validate here, or a
|
|
389
|
+
// mis-named param silently posts an empty finding.
|
|
390
|
+
const content = str(args, "content");
|
|
391
|
+
const author = str(args, "author");
|
|
392
|
+
if (content.trim() === "" || author.trim() === "") {
|
|
393
|
+
return "refused: team_post needs non-empty `author` and `content`.";
|
|
394
|
+
}
|
|
395
|
+
const e = ctx.team.post(author, content);
|
|
396
|
+
// Shared sessions: mirror to the team hub when joined — fire-and-forget,
|
|
397
|
+
// a dead hub never blocks local work.
|
|
398
|
+
const hub = loadHubConfig();
|
|
399
|
+
if (hub)
|
|
400
|
+
mirrorToHub(hub, { author: e.author, summary: e.summary, original: content });
|
|
401
|
+
return `posted ${e.id} by ${e.author}${hub ? " (mirrored to hub)" : ""}`;
|
|
402
|
+
},
|
|
403
|
+
},
|
|
404
|
+
{
|
|
405
|
+
name: "knitbrain_team_board",
|
|
406
|
+
description: "Read the shared team board — compressed skeletons of every posting (cheap to scan; fetch full with knitbrain_team_get).",
|
|
407
|
+
inputSchema: { type: "object", properties: {}, additionalProperties: false },
|
|
408
|
+
output: "data",
|
|
409
|
+
run: (_args, ctx) => JSON.stringify(ctx.team.board(), null, 2),
|
|
410
|
+
},
|
|
411
|
+
{
|
|
412
|
+
name: "knitbrain_team_get",
|
|
413
|
+
description: "Fetch the full original of a board posting by id.",
|
|
414
|
+
inputSchema: {
|
|
415
|
+
type: "object",
|
|
416
|
+
properties: { id: { type: "string" } },
|
|
417
|
+
required: ["id"],
|
|
418
|
+
additionalProperties: false,
|
|
419
|
+
},
|
|
420
|
+
output: "verbatim",
|
|
421
|
+
run: (args, ctx) => ctx.team.get(str(args, "id")) ?? `no board entry with id ${str(args, "id")}`,
|
|
422
|
+
},
|
|
423
|
+
{
|
|
424
|
+
name: "knitbrain_team_clear",
|
|
425
|
+
description: "Clear the shared team board (CCR originals are retained until tiered out).",
|
|
426
|
+
inputSchema: { type: "object", properties: {}, additionalProperties: false },
|
|
427
|
+
output: "verbatim",
|
|
428
|
+
run: (_args, ctx) => {
|
|
429
|
+
ctx.team.clear();
|
|
430
|
+
return "board cleared";
|
|
431
|
+
},
|
|
432
|
+
},
|
|
433
|
+
];
|
|
434
|
+
/**
|
|
435
|
+
* The ONE chokepoint: run a tool, then apply output discipline. Data outputs
|
|
436
|
+
* are compressed through the optimizer (original preserved in CCR); verbatim
|
|
437
|
+
* outputs pass through untouched.
|
|
438
|
+
*/
|
|
439
|
+
export function dispatch(tool, args, ctx) {
|
|
440
|
+
const raw = tool.run(args, ctx);
|
|
441
|
+
let out = raw;
|
|
442
|
+
if (tool.output === "data") {
|
|
443
|
+
// TOIN self-tuning: if this kind gets over-retrieved, stop compressing it.
|
|
444
|
+
if (!ctx.feedback.shouldSkip(detect(raw))) {
|
|
445
|
+
const r = compress(raw, ctx.ccr, { allowProse: !ctx.feedback.shouldSkip("prose") });
|
|
446
|
+
if (r.compressed) {
|
|
447
|
+
ctx.feedback.onCompress(r.contentType, r.handle);
|
|
448
|
+
out = r.skeleton;
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
// Context meter: account what we emit; when the window runs hot, tell the
|
|
453
|
+
// agent to save a handoff and clear — automatically, on any tool response.
|
|
454
|
+
ctx.meter.onToolOutput(countTokens(out));
|
|
455
|
+
const reading = ctx.meter.read();
|
|
456
|
+
if (reading.status !== "ok" && tool.name !== "knitbrain_context_meter") {
|
|
457
|
+
out += `\n\n[knitbrain context-meter] ${reading.advice}`;
|
|
458
|
+
}
|
|
459
|
+
return out;
|
|
460
|
+
}
|
|
461
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/** Result of measuring a single original→optimized payload pair. */
|
|
2
|
+
export interface Measurement {
|
|
3
|
+
/** Human-readable label for the payload. */
|
|
4
|
+
readonly label: string;
|
|
5
|
+
/** Token count of the original (pre-optimization) text. */
|
|
6
|
+
readonly originalTokens: number;
|
|
7
|
+
/** Token count of the optimized (post-optimization) text. */
|
|
8
|
+
readonly optimizedTokens: number;
|
|
9
|
+
/** optimizedTokens / originalTokens (1 = no change, <1 = smaller). */
|
|
10
|
+
readonly ratio: number;
|
|
11
|
+
/** Percentage of tokens saved, rounded to 0.1%. */
|
|
12
|
+
readonly savedPct: number;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Measure token savings between an original and its optimized form.
|
|
16
|
+
*
|
|
17
|
+
* Rung 1: the harness exists and is exercised with `optimized === original`
|
|
18
|
+
* (no compressor yet → 0% saved). From rung 2 the optimizer feeds real
|
|
19
|
+
* skeletons here and this becomes the compression-ratio gate.
|
|
20
|
+
*/
|
|
21
|
+
export declare function measure(label: string, original: string, optimized: string): Measurement;
|
|
22
|
+
/** Aggregate token totals + overall saved% across many measurements. */
|
|
23
|
+
export declare function summarize(measurements: readonly Measurement[]): {
|
|
24
|
+
totalOriginal: number;
|
|
25
|
+
totalOptimized: number;
|
|
26
|
+
savedPct: number;
|
|
27
|
+
};
|
package/dist/measure.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { countTokens } from "./tokenizer.js";
|
|
2
|
+
/**
|
|
3
|
+
* Measure token savings between an original and its optimized form.
|
|
4
|
+
*
|
|
5
|
+
* Rung 1: the harness exists and is exercised with `optimized === original`
|
|
6
|
+
* (no compressor yet → 0% saved). From rung 2 the optimizer feeds real
|
|
7
|
+
* skeletons here and this becomes the compression-ratio gate.
|
|
8
|
+
*/
|
|
9
|
+
export function measure(label, original, optimized) {
|
|
10
|
+
const originalTokens = countTokens(original);
|
|
11
|
+
const optimizedTokens = countTokens(optimized);
|
|
12
|
+
const ratio = originalTokens === 0 ? 1 : optimizedTokens / originalTokens;
|
|
13
|
+
const savedPct = Math.round((1 - ratio) * 1000) / 10;
|
|
14
|
+
return { label, originalTokens, optimizedTokens, ratio, savedPct };
|
|
15
|
+
}
|
|
16
|
+
/** Aggregate token totals + overall saved% across many measurements. */
|
|
17
|
+
export function summarize(measurements) {
|
|
18
|
+
const totalOriginal = measurements.reduce((s, m) => s + m.originalTokens, 0);
|
|
19
|
+
const totalOptimized = measurements.reduce((s, m) => s + m.optimizedTokens, 0);
|
|
20
|
+
const savedPct = totalOriginal === 0
|
|
21
|
+
? 0
|
|
22
|
+
: Math.round((1 - totalOptimized / totalOriginal) * 1000) / 10;
|
|
23
|
+
return { totalOriginal, totalOptimized, savedPct };
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=measure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"measure.js","sourceRoot":"","sources":["../src/measure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAgB7C;;;;;;GAMG;AACH,MAAM,UAAU,OAAO,CACrB,KAAa,EACb,QAAgB,EAChB,SAAiB;IAEjB,MAAM,cAAc,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,eAAe,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,cAAc,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,GAAG,cAAc,CAAC;IAC1E,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACrD,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AACrE,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,SAAS,CAAC,YAAoC;IAK5D,MAAM,aAAa,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;IAC7E,MAAM,cAAc,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;IAC/E,MAAM,QAAQ,GACZ,aAAa,KAAK,CAAC;QACjB,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,cAAc,GAAG,aAAa,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACnE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { CCRStore } from "../ccr/store.js";
|
|
2
|
+
import type { CompressResult } from "./types.js";
|
|
3
|
+
/** Whether the WASM parsers are loaded and usable right now (sync check). */
|
|
4
|
+
export declare function astReady(): boolean;
|
|
5
|
+
/** Test seam: reset to cold state (parsers are kept — re-init is cheap). */
|
|
6
|
+
export declare function resetAstForTest(): void;
|
|
7
|
+
/**
|
|
8
|
+
* Kick off (or await) WASM parser initialization. Idempotent; safe to call
|
|
9
|
+
* fire-and-forget from sync code. On any failure the state is "failed" and
|
|
10
|
+
* the scanner fallback serves all code forever — never throws.
|
|
11
|
+
*/
|
|
12
|
+
export declare function ensureAst(): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* Compress source code via tree-sitter: keep imports, signatures, types,
|
|
15
|
+
* decorators, class headers; elide function/method bodies. Returns null when
|
|
16
|
+
* the parsers aren't loaded or no grammar fits — caller falls back to the
|
|
17
|
+
* scanner. Lossless: pristine original in CCR.
|
|
18
|
+
*/
|
|
19
|
+
export declare function compressCodeAst(original: string, ccr: CCRStore): CompressResult | null;
|