kirograph 1.2.3 → 1.4.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 (50) hide show
  1. package/README.md +5 -3
  2. package/dist/bin/commands/attack-surface.js +17 -2
  3. package/dist/bin/commands/attack-surface.js.map +2 -2
  4. package/dist/bin/commands/help.js +4 -2
  5. package/dist/bin/commands/help.js.map +2 -2
  6. package/dist/bin/commands/memory.js +23 -3
  7. package/dist/bin/commands/memory.js.map +2 -2
  8. package/dist/bin/commands/security-export.js +9 -1
  9. package/dist/bin/commands/security-export.js.map +2 -2
  10. package/dist/bin/commands/wiki.js +14 -1
  11. package/dist/bin/commands/wiki.js.map +2 -2
  12. package/dist/bin/installer/common.js +25 -0
  13. package/dist/bin/installer/common.js.map +2 -2
  14. package/dist/bin/installer/config-prompt.js +29 -1
  15. package/dist/bin/installer/config-prompt.js.map +2 -2
  16. package/dist/bin/installer/index.js +49 -0
  17. package/dist/bin/installer/index.js.map +2 -2
  18. package/dist/bin/installer/steering.js +5 -1
  19. package/dist/bin/installer/steering.js.map +2 -2
  20. package/dist/bin/kirograph.js +1 -1
  21. package/dist/config.js +73 -2
  22. package/dist/config.js.map +2 -2
  23. package/dist/jev/client.js.map +2 -2
  24. package/dist/jev/factory.js +36 -0
  25. package/dist/jev/factory.js.map +7 -0
  26. package/dist/jev/strands-client.js +89 -0
  27. package/dist/jev/strands-client.js.map +7 -0
  28. package/dist/jev/types.js.map +1 -1
  29. package/dist/mcp/handlers/memory.js +18 -5
  30. package/dist/mcp/handlers/memory.js.map +2 -2
  31. package/dist/mcp/handlers/security.js +15 -2
  32. package/dist/mcp/handlers/security.js.map +2 -2
  33. package/dist/mcp/handlers/wiki.js +13 -1
  34. package/dist/mcp/handlers/wiki.js.map +2 -2
  35. package/dist/mcp/tools.js +4 -4
  36. package/dist/mcp/tools.js.map +2 -2
  37. package/dist/memory/index.js +42 -10
  38. package/dist/memory/index.js.map +2 -2
  39. package/dist/memory/relation-display.js +37 -0
  40. package/dist/memory/relation-display.js.map +7 -0
  41. package/dist/memory/relation-jev.js.map +1 -1
  42. package/dist/security/attack-surface.js +20 -2
  43. package/dist/security/attack-surface.js.map +2 -2
  44. package/dist/security/auth-detection-jev.js.map +1 -1
  45. package/dist/wiki/contradiction-jev.js.map +1 -1
  46. package/dist/wiki/index.js +21 -2
  47. package/dist/wiki/index.js.map +2 -2
  48. package/dist/wiki/lint.js +23 -11
  49. package/dist/wiki/lint.js.map +2 -2
  50. package/package.json +1 -1
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var factory_exports = {};
20
+ __export(factory_exports, {
21
+ createDecisionClient: () => createDecisionClient
22
+ });
23
+ module.exports = __toCommonJS(factory_exports);
24
+ async function createDecisionClient(backend, config) {
25
+ if (backend === "strands") {
26
+ const { createStrandsClientFromConfig } = await Promise.resolve().then(() => require("./strands-client.js"));
27
+ return createStrandsClientFromConfig(config);
28
+ }
29
+ const { createJevClientFromConfig } = await Promise.resolve().then(() => require("./client.js"));
30
+ return createJevClientFromConfig(config);
31
+ }
32
+ // Annotate the CommonJS export names for ESM import in node:
33
+ 0 && (module.exports = {
34
+ createDecisionClient
35
+ });
36
+ //# sourceMappingURL=factory.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/jev/factory.ts"],
4
+ "sourcesContent": ["/**\n * KiroGraph \u2014 decision-client factory\n *\n * Selects the typed-classification backend for the opt-in `*Mode` toggles.\n * Both backends implement the same DecisionClient contract, so each consumer\n * (memory relation judging, wiki contradiction detection, attack-surface auth\n * detection) builds its client through here and stays backend-agnostic.\n *\n * 'jev' \u2192 JevClient (TypeSafe System One, cloud, needs JEV_API_KEY)\n * 'strands' \u2192 StrandsClient (strands-decider, local server, no API key)\n *\n * Any other mode value ('agent' / 'heuristic') means classification is not\n * delegated to a model at all, and this factory should not be called.\n */\nimport type { DecisionClient } from './types';\n\n/** The two model-backed classification modes shared across memory/wiki/security. */\nexport type DecisionBackend = 'jev' | 'strands';\n\n/** Config fields either backend might read. A superset of both *ConfigLike shapes. */\nexport interface DecisionConfigLike {\n jevApiKey?: string;\n jevBaseUrl?: string;\n jevModel?: string;\n strandsBaseUrl?: string;\n strandsModel?: string;\n}\n\n/**\n * Build the DecisionClient for the given backend. Throws for jev when no API\n * key is resolvable (via config or the JEV_API_KEY env var); strands never\n * throws here since it needs no credential.\n */\nexport async function createDecisionClient(\n backend: DecisionBackend,\n config: DecisionConfigLike,\n): Promise<DecisionClient> {\n if (backend === 'strands') {\n const { createStrandsClientFromConfig } = await Promise.resolve().then(() => require('./strands-client.js'));\n return createStrandsClientFromConfig(config);\n }\n const { createJevClientFromConfig } = await Promise.resolve().then(() => require('./client.js'));\n return createJevClientFromConfig(config);\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAiCA,eAAsB,qBACpB,SACA,QACyB;AACzB,MAAI,YAAY,WAAW;AACzB,UAAM,EAAE,8BAA8B,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,qBAAqB,CAAC;AAC3G,WAAO,8BAA8B,MAAM;AAAA,EAC7C;AACA,QAAM,EAAE,0BAA0B,IAAI,MAAM,QAAQ,QAAQ,EAAE,KAAK,MAAM,QAAQ,aAAa,CAAC;AAC/F,SAAO,0BAA0B,MAAM;AACzC;",
6
+ "names": []
7
+ }
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var strands_client_exports = {};
20
+ __export(strands_client_exports, {
21
+ StrandsClient: () => StrandsClient,
22
+ StrandsError: () => StrandsError,
23
+ createStrandsClientFromConfig: () => createStrandsClientFromConfig
24
+ });
25
+ module.exports = __toCommonJS(strands_client_exports);
26
+ const DEFAULT_BASE_URL = "http://127.0.0.1:8000";
27
+ const DEFAULT_MODEL = "StrandsAgents/strands-decider-2B-hobson-v19";
28
+ const DEFAULT_TIMEOUT_MS = 15e3;
29
+ class StrandsError extends Error {
30
+ constructor(message, status) {
31
+ super(message);
32
+ this.status = status;
33
+ this.name = "StrandsError";
34
+ }
35
+ }
36
+ class StrandsClient {
37
+ constructor(opts = {}) {
38
+ this.baseUrl = (opts.baseUrl ?? DEFAULT_BASE_URL).replace(/\/+$/, "");
39
+ this.model = opts.model ?? DEFAULT_MODEL;
40
+ this.timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
41
+ }
42
+ /**
43
+ * Ask one or more typed questions about a piece of state in a single
44
+ * request. The server encodes the state once and broadcasts it across the
45
+ * question batch, so callers should batch multiple questions about the same
46
+ * state rather than issuing separate calls.
47
+ */
48
+ async ask(state, questions) {
49
+ const controller = new AbortController();
50
+ const timeout = setTimeout(() => controller.abort(), this.timeoutMs);
51
+ let res;
52
+ try {
53
+ res = await fetch(`${this.baseUrl}/v1/systemone`, {
54
+ method: "POST",
55
+ headers: { "Content-Type": "application/json" },
56
+ body: JSON.stringify({ state, model: this.model, questions }),
57
+ signal: controller.signal
58
+ });
59
+ } catch (err) {
60
+ if (err instanceof Error && err.name === "AbortError") {
61
+ throw new StrandsError(`strands-decider request timed out after ${this.timeoutMs}ms`);
62
+ }
63
+ throw new StrandsError(
64
+ `strands-decider request failed: ${err instanceof Error ? err.message : String(err)} (is the server running? start it with "strands-decider serve <checkpoint> --port 8000")`
65
+ );
66
+ } finally {
67
+ clearTimeout(timeout);
68
+ }
69
+ if (!res.ok) {
70
+ let detail = "";
71
+ try {
72
+ detail = await res.text();
73
+ } catch {
74
+ }
75
+ throw new StrandsError(`strands-decider request failed (${res.status})${detail ? `: ${detail}` : ""}`, res.status);
76
+ }
77
+ return await res.json();
78
+ }
79
+ }
80
+ function createStrandsClientFromConfig(config) {
81
+ return new StrandsClient({ baseUrl: config.strandsBaseUrl, model: config.strandsModel });
82
+ }
83
+ // Annotate the CommonJS export names for ESM import in node:
84
+ 0 && (module.exports = {
85
+ StrandsClient,
86
+ StrandsError,
87
+ createStrandsClientFromConfig
88
+ });
89
+ //# sourceMappingURL=strands-client.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/jev/strands-client.ts"],
4
+ "sourcesContent": ["/**\n * KiroGraph \u2014 strands-decider client\n *\n * Thin HTTP client for a local strands-decider server\n * (https://github.com/strands-labs/strands-decider), a small, fast typed-\n * classification model (\"system one\"). It is the local, self-hosted\n * alternative to the cloud jev backend behind the opt-in `*Mode` toggles\n * (memory relation judging, wiki contradiction detection, attack-surface auth\n * detection).\n *\n * strands-decider's `POST /v1/systemone` endpoint is wire-compatible with\n * jev's \u2014 same `{ state, model, questions }` body and the same\n * choice/score/noul answer shapes \u2014 so this client shares the DecisionClient\n * contract and the jev request/response types. The only differences from\n * JevClient: it talks to a local server (default http://127.0.0.1:8000),\n * started with `strands-decider serve`, and sends no Authorization header\n * (the server binds to localhost and has no authentication).\n */\nimport type { DecisionClient, JevQuestion, JevResponse } from './types';\n\n/** strands-decider serve defaults to 127.0.0.1:8000. */\nconst DEFAULT_BASE_URL = 'http://127.0.0.1:8000';\n/** The published reference checkpoint; the server also accepts a local checkpoint path. */\nconst DEFAULT_MODEL = 'StrandsAgents/strands-decider-2B-hobson-v19';\nconst DEFAULT_TIMEOUT_MS = 15000;\n\nexport class StrandsError extends Error {\n constructor(message: string, public readonly status?: number) {\n super(message);\n this.name = 'StrandsError';\n }\n}\n\nexport interface StrandsClientOptions {\n /** Base URL of the running strands-decider server. Default: http://127.0.0.1:8000 */\n baseUrl?: string;\n /** Model/checkpoint the server was started with. Default: StrandsAgents/strands-decider-2B-hobson-v19 */\n model?: string;\n timeoutMs?: number;\n}\n\nexport class StrandsClient implements DecisionClient {\n private readonly baseUrl: string;\n private readonly model: string;\n private readonly timeoutMs: number;\n\n constructor(opts: StrandsClientOptions = {}) {\n this.baseUrl = (opts.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, '');\n this.model = opts.model ?? DEFAULT_MODEL;\n this.timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n }\n\n /**\n * Ask one or more typed questions about a piece of state in a single\n * request. The server encodes the state once and broadcasts it across the\n * question batch, so callers should batch multiple questions about the same\n * state rather than issuing separate calls.\n */\n async ask(state: string, questions: Record<string, JevQuestion>): Promise<JevResponse> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), this.timeoutMs);\n\n let res: Response;\n try {\n res = await fetch(`${this.baseUrl}/v1/systemone`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ state, model: this.model, questions }),\n signal: controller.signal,\n });\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') {\n throw new StrandsError(`strands-decider request timed out after ${this.timeoutMs}ms`);\n }\n throw new StrandsError(\n `strands-decider request failed: ${err instanceof Error ? err.message : String(err)} `\n + `(is the server running? start it with \"strands-decider serve <checkpoint> --port 8000\")`,\n );\n } finally {\n clearTimeout(timeout);\n }\n\n if (!res.ok) {\n let detail = '';\n try { detail = await res.text(); } catch { /* ignore */ }\n throw new StrandsError(`strands-decider request failed (${res.status})${detail ? `: ${detail}` : ''}`, res.status);\n }\n\n return await res.json() as JevResponse;\n }\n}\n\n/** Minimal shape of the config fields StrandsClient needs. */\nexport interface StrandsConfigLike {\n strandsBaseUrl?: string;\n strandsModel?: string;\n}\n\n/**\n * Build a StrandsClient from KiroGraph config. Unlike jev, there is no API\n * key to resolve \u2014 the server is local and unauthenticated \u2014 so this never\n * throws for a missing credential; a wrong/missing server surfaces as a\n * connection error at request time instead.\n */\nexport function createStrandsClientFromConfig(config: StrandsConfigLike): StrandsClient {\n return new StrandsClient({ baseUrl: config.strandsBaseUrl, model: config.strandsModel });\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBA,MAAM,mBAAmB;AAEzB,MAAM,gBAAgB;AACtB,MAAM,qBAAqB;AAEpB,MAAM,qBAAqB,MAAM;AAAA,EACtC,YAAY,SAAiC,QAAiB;AAC5D,UAAM,OAAO;AAD8B;AAE3C,SAAK,OAAO;AAAA,EACd;AACF;AAUO,MAAM,cAAwC;AAAA,EAKnD,YAAY,OAA6B,CAAC,GAAG;AAC3C,SAAK,WAAW,KAAK,WAAW,kBAAkB,QAAQ,QAAQ,EAAE;AACpE,SAAK,QAAQ,KAAK,SAAS;AAC3B,SAAK,YAAY,KAAK,aAAa;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,IAAI,OAAe,WAA8D;AACrF,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,UAAU,WAAW,MAAM,WAAW,MAAM,GAAG,KAAK,SAAS;AAEnE,QAAI;AACJ,QAAI;AACF,YAAM,MAAM,MAAM,GAAG,KAAK,OAAO,iBAAiB;AAAA,QAChD,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU,EAAE,OAAO,OAAO,KAAK,OAAO,UAAU,CAAC;AAAA,QAC5D,QAAQ,WAAW;AAAA,MACrB,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,UAAI,eAAe,SAAS,IAAI,SAAS,cAAc;AACrD,cAAM,IAAI,aAAa,2CAA2C,KAAK,SAAS,IAAI;AAAA,MACtF;AACA,YAAM,IAAI;AAAA,QACR,mCAAmC,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,MAErF;AAAA,IACF,UAAE;AACA,mBAAa,OAAO;AAAA,IACtB;AAEA,QAAI,CAAC,IAAI,IAAI;AACX,UAAI,SAAS;AACb,UAAI;AAAE,iBAAS,MAAM,IAAI,KAAK;AAAA,MAAG,QAAQ;AAAA,MAAe;AACxD,YAAM,IAAI,aAAa,mCAAmC,IAAI,MAAM,IAAI,SAAS,KAAK,MAAM,KAAK,EAAE,IAAI,IAAI,MAAM;AAAA,IACnH;AAEA,WAAO,MAAM,IAAI,KAAK;AAAA,EACxB;AACF;AAcO,SAAS,8BAA8B,QAA0C;AACtF,SAAO,IAAI,cAAc,EAAE,SAAS,OAAO,gBAAgB,OAAO,OAAO,aAAa,CAAC;AACzF;",
6
+ "names": []
7
+ }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/jev/types.ts"],
4
- "sourcesContent": ["/**\n * KiroGraph \u2014 jev (TypeSafe System One) client types\n *\n * Mirrors the real API shape at https://docs.typesafe.ai:\n * POST /v1/systemone\n * { state: string, model: string, questions: { [id]: JevQuestion } }\n * \u2192 { model: string, answers: { [id]: JevAnswer }, usage?: {...} }\n */\n\n/** Choice: selects one of a fixed set of named categories. Max 255 options. */\nexport interface JevChoiceQuestion {\n type: 'choice';\n instructions: string;\n /** category name \u2192 description shown to the model */\n criteria: Record<string, string>;\n}\n\n/** Score: a calibrated numeric level chosen from an ordered set of 2\u201310 descriptions. */\nexport interface JevScoreQuestion {\n type: 'score';\n instructions: string;\n /** ordered level descriptions, low \u2192 high */\n criteria: string[];\n}\n\n/** Noul: a boolean-shaped judgment returned as a 0.0\u20131.0 value. */\nexport interface JevNoulQuestion {\n type: 'noul';\n instructions: string;\n}\n\nexport type JevQuestion = JevChoiceQuestion | JevScoreQuestion | JevNoulQuestion;\n\nexport interface JevChoiceAnswer {\n type: 'choice';\n choice: string;\n confidence?: number;\n probabilities?: Record<string, number>;\n}\n\nexport interface JevScoreAnswer {\n type: 'score';\n score: number;\n confidence?: number;\n legend?: Record<string, string>;\n}\n\nexport interface JevNoulAnswer {\n type: 'noul';\n noul: number;\n confidence?: number;\n}\n\nexport type JevAnswer = JevChoiceAnswer | JevScoreAnswer | JevNoulAnswer;\n\nexport interface JevUsage {\n input_tokens: number;\n output_tokens: number;\n}\n\nexport interface JevResponse {\n model: string;\n answers: Record<string, JevAnswer>;\n usage?: JevUsage;\n}\n"],
4
+ "sourcesContent": ["/**\n * KiroGraph \u2014 jev (TypeSafe System One) client types\n *\n * Mirrors the real API shape at https://docs.typesafe.ai:\n * POST /v1/systemone\n * { state: string, model: string, questions: { [id]: JevQuestion } }\n * \u2192 { model: string, answers: { [id]: JevAnswer }, usage?: {...} }\n */\n\n/** Choice: selects one of a fixed set of named categories. Max 255 options. */\nexport interface JevChoiceQuestion {\n type: 'choice';\n instructions: string;\n /** category name \u2192 description shown to the model */\n criteria: Record<string, string>;\n}\n\n/** Score: a calibrated numeric level chosen from an ordered set of 2\u201310 descriptions. */\nexport interface JevScoreQuestion {\n type: 'score';\n instructions: string;\n /** ordered level descriptions, low \u2192 high */\n criteria: string[];\n}\n\n/** Noul: a boolean-shaped judgment returned as a 0.0\u20131.0 value. */\nexport interface JevNoulQuestion {\n type: 'noul';\n instructions: string;\n}\n\nexport type JevQuestion = JevChoiceQuestion | JevScoreQuestion | JevNoulQuestion;\n\nexport interface JevChoiceAnswer {\n type: 'choice';\n choice: string;\n confidence?: number;\n probabilities?: Record<string, number>;\n}\n\nexport interface JevScoreAnswer {\n type: 'score';\n score: number;\n confidence?: number;\n legend?: Record<string, string>;\n}\n\nexport interface JevNoulAnswer {\n type: 'noul';\n noul: number;\n confidence?: number;\n}\n\nexport type JevAnswer = JevChoiceAnswer | JevScoreAnswer | JevNoulAnswer;\n\nexport interface JevUsage {\n input_tokens: number;\n output_tokens: number;\n}\n\nexport interface JevResponse {\n model: string;\n answers: Record<string, JevAnswer>;\n usage?: JevUsage;\n}\n\n/**\n * Backend-agnostic contract for a typed-classification client.\n *\n * Both JevClient (TypeSafe System One, cloud) and StrandsClient\n * (strands-decider, a local server) implement this. The request/response\n * shape is identical across backends \u2014 strands-decider's `POST /v1/systemone`\n * is wire-compatible with jev's \u2014 so consumers depend only on this interface\n * and never on a concrete backend. The classification helpers\n * (classifyRelationWithJev / checkContradictionWithJev / checkAuthWithJev)\n * accept a DecisionClient, so they run unchanged against either backend.\n */\nexport interface DecisionClient {\n ask(state: string, questions: Record<string, JevQuestion>): Promise<JevResponse>;\n}\n"],
5
5
  "mappings": ";;;;;;;;;;;;;;AAAA;AAAA;",
6
6
  "names": []
7
7
  }
@@ -22,6 +22,7 @@ __export(memory_exports, {
22
22
  });
23
23
  module.exports = __toCommonJS(memory_exports);
24
24
  var import_utils = require("./utils");
25
+ var import_relation_display = require("../../memory/relation-display");
25
26
  async function handleMemory(toolName, args, cg) {
26
27
  switch (toolName) {
27
28
  case "kirograph_mem_search": {
@@ -46,9 +47,8 @@ async function handleMemory(toolName, args, cg) {
46
47
  const lines = [`${i + 1}. [${r.observation.kind}] ${r.observation.content} (${age})`];
47
48
  if (r.relations && r.relations.length > 0) {
48
49
  for (const rel of r.relations) {
49
- const other = rel.observationA === r.observation.id ? rel.observationB : rel.observationA;
50
- const icon = rel.relation === "conflicts_with" ? "\u26A1" : rel.relation === "supersedes" ? "\u21A9" : "~";
51
- lines.push(` ${icon} ${rel.relation} ${other} (confidence: ${rel.confidence})${rel.judgmentStatus === "judged" ? " (judged)" : ""}`);
50
+ const { icon, label, otherId } = (0, import_relation_display.describeMemRelation)(rel, r.observation.id);
51
+ lines.push(` ${icon} ${label} ${otherId} (confidence: ${rel.confidence})${rel.judgmentStatus === "judged" ? " (judged)" : ""}`);
52
52
  }
53
53
  }
54
54
  return lines.join("\n");
@@ -164,8 +164,8 @@ async function handleMemory(toolName, args, cg) {
164
164
  return `Observation ${args.id} marked as reviewed.`;
165
165
  }
166
166
  case "kirograph_mem_compare": {
167
- if (!args.observationA || !args.observationB || !args.relation) {
168
- return "Error: observationA, observationB, and relation are required.";
167
+ if (!args.observationA || !args.observationB) {
168
+ return "Error: observationA and observationB are required.";
169
169
  }
170
170
  const { loadConfig } = await Promise.resolve().then(() => require("../../config.js"));
171
171
  const projectRoot = args.projectPath ?? cg.getProjectRoot();
@@ -176,6 +176,19 @@ async function handleMemory(toolName, args, cg) {
176
176
  db.applyMemorySchema();
177
177
  const mem = new MemoryManager(config, db.getRawDb());
178
178
  mem.initialize();
179
+ const relationAutoMode = config.memoryRelationMode === "jev" || config.memoryRelationMode === "strands";
180
+ if (relationAutoMode && !args.relation) {
181
+ try {
182
+ const result = await mem.autoCompareObservations(args.observationA, args.observationB);
183
+ const status = result.autoJudged ? "auto-judged" : "pending review";
184
+ return `Relation ${result.relationId} classified by ${config.memoryRelationMode}: ${result.relation} (confidence: ${result.confidence.toFixed(2)}, ${status}).` + (result.autoJudged ? "" : " Use kirograph_mem_judge to finalize.");
185
+ } catch (err) {
186
+ return `Error: ${err instanceof Error ? err.message : String(err)}`;
187
+ }
188
+ }
189
+ if (!args.relation) {
190
+ return 'Error: relation is required (set memoryRelationMode: "jev" or "strands" to classify it automatically instead).';
191
+ }
179
192
  const relationId = mem.compareObservations({
180
193
  observationA: args.observationA,
181
194
  observationB: args.observationB,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/mcp/handlers/memory.ts"],
4
- "sourcesContent": ["import KiroGraph from '../../index';\nimport { clampLimit, formatAge } from './utils';\n\nexport async function handleMemory(toolName: string, args: Record<string, unknown>, cg: KiroGraph): Promise<string> {\n switch (toolName) {\n case 'kirograph_mem_search': {\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled. Set enableMemory: true in .kirograph/config.json';\n\n const { MemoryManager } = await Promise.resolve().then(() => require('../../memory/index.js'));\n const db = cg.getDatabase();\n db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n\n const results = await mem.search(args.query as string, {\n limit: (args.limit as number) ?? 10,\n kind: args.kind as any,\n sessionId: args.sessionId as string | undefined,\n asOf: args.asOf as number | undefined,\n });\n\n if (results.length === 0) return `No memory observations found for \"${args.query}\".`;\n\n return results.map((r, i) => {\n const age = formatAge(r.observation.createdAt);\n const lines = [`${i + 1}. [${r.observation.kind}] ${r.observation.content} (${age})`];\n if (r.relations && r.relations.length > 0) {\n for (const rel of r.relations) {\n const other = rel.observationA === r.observation.id ? rel.observationB : rel.observationA;\n const icon = rel.relation === 'conflicts_with' ? '\u26A1' : rel.relation === 'supersedes' ? '\u21A9' : '~';\n lines.push(` ${icon} ${rel.relation} ${other} (confidence: ${rel.confidence})${rel.judgmentStatus === 'judged' ? ' (judged)' : ''}`);\n }\n }\n return lines.join('\\n');\n }).join('\\n');\n }\n\n case 'kirograph_mem_store': {\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled. Set enableMemory: true in .kirograph/config.json';\n\n const { MemoryManager, MemorySchemaError } = await Promise.resolve().then(() => require('../../memory/index.js'));\n const db = cg.getDatabase();\n db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n\n let id;\n try {\n id = await mem.store({\n content: args.content as string,\n kind: (args.kind as any) ?? 'note',\n source: 'agent',\n topicKey: args.topicKey as string | undefined,\n reviewAfter: args.reviewAfter as number | undefined,\n fields: args.fields as Record<string, unknown> | undefined,\n });\n } catch (err) {\n if (err instanceof MemorySchemaError) return `Rejected: ${err.message}`;\n throw err;\n }\n\n if (!id) return 'Observation already exists (duplicate content).';\n return `Stored observation ${id} [${(args.kind as string) ?? 'note'}]`;\n }\n\n case 'kirograph_mem_timeline': {\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled. Set enableMemory: true in .kirograph/config.json';\n\n const { MemoryManager } = await Promise.resolve().then(() => require('../../memory/index.js'));\n const db = cg.getDatabase();\n db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n\n const { sessions, observations } = mem.timeline({\n limit: (args.limit as number) ?? 5,\n sessionId: args.sessionId as string | undefined,\n });\n\n if (sessions.length === 0) return 'No memory sessions found.';\n\n const lines: string[] = [];\n for (const session of sessions) {\n const start = new Date(session.startedAt).toISOString().slice(0, 16).replace('T', ' ');\n const status = session.endedAt ? 'ended' : 'active';\n const obs = observations.get(session.id) ?? [];\n lines.push(`## ${start} [${session.ide ?? 'unknown'}] (${status}, ${obs.length} observations)`);\n for (const o of obs.slice(0, 5)) {\n lines.push(` - [${o.kind}] ${o.content.slice(0, 120)}`);\n }\n if (obs.length > 5) lines.push(` \u2026and ${obs.length - 5} more`);\n }\n return lines.join('\\n');\n }\n\n case 'kirograph_mem_status': {\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled. Set enableMemory: true in .kirograph/config.json';\n\n const { MemoryManager } = await Promise.resolve().then(() => require('../../memory/index.js'));\n const db = cg.getDatabase();\n db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n\n const stats = mem.getStats();\n const lines = [\n 'KiroGraph Memory Status',\n ` Sessions: ${stats.sessions} (${stats.activeSessions} active)`,\n ` Observations: ${stats.observations}`,\n ` Symbol links: ${stats.links}`,\n ` Embeddings: ${stats.vectors} / ${stats.embeddableCount}`,\n ` Model mismatch: ${stats.modelMismatch ? '\u26A0 yes \u2014 run kirograph mem reembed' : 'no'}`,\n ` Relations: ${stats.relations} (${stats.pendingConflicts} pending)`,\n ` Caveman compression: ${config.cavemanMode !== 'off' ? config.cavemanMode : 'off (storing raw)'}`,\n ];\n return lines.join('\\n');\n }\n\n case 'kirograph_mem_review': {\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const obs = mem.getObservationsForReview(args.limit as number ?? 20);\n if (obs.length === 0) return 'No overdue observations \u2014 all review_after dates are in the future.';\n const now = Date.now();\n return obs.map((o, i) => {\n const daysOverdue = Math.floor((now - (o.reviewAfter ?? now)) / 86400000);\n return `${i + 1}. [${o.kind}]${o.topicKey ? ` (${o.topicKey})` : ''} ${o.content.slice(0, 120)} \u2014 overdue by ${daysOverdue}d`;\n }).join('\\n');\n }\n\n case 'kirograph_mem_mark_reviewed': {\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n mem.markReviewed(args.id as string);\n return `Observation ${args.id} marked as reviewed.`;\n }\n\n case 'kirograph_mem_compare': {\n if (!args.observationA || !args.observationB || !args.relation) {\n return 'Error: observationA, observationB, and relation are required.';\n }\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const relationId = mem.compareObservations({\n observationA: args.observationA as string,\n observationB: args.observationB as string,\n relation: args.relation as any,\n confidence: args.confidence as number ?? 1.0,\n reason: args.reason as string | undefined,\n evidence: args.evidence as string | undefined,\n });\n return `Relation ${relationId} created (${args.relation}, confidence: ${args.confidence ?? 1.0}). Use kirograph_mem_judge to finalize.`;\n }\n\n case 'kirograph_mem_judge': {\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n mem.judgeRelation(\n args.relationId as string,\n args.relation as any,\n args.confidence as number,\n args.reason as string | undefined,\n args.evidence as string | undefined,\n );\n return `Relation ${args.relationId} judged as [${args.relation}] (confidence: ${args.confidence}).`;\n }\n\n case 'kirograph_mem_capture': {\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const extracted = mem.capturePassive(args.content as string);\n if (extracted.length === 0) return 'No structured sections found. Use ## Key Learnings, ## Observations, ## Decisions, or ## Key Changes headings.';\n return `Captured ${extracted.length} observation(s):\\n` + extracted.map((e, i) => `${i + 1}. [${e.kind}] ${e.content.slice(0, 100)}${e.id ? '' : ' (duplicate)'}`).join('\\n');\n }\n\n case 'kirograph_mem_save_prompt': {\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const id = await mem.savePrompt(args.content as string);\n return `Prompt saved as ${id}.`;\n }\n\n case 'kirograph_mem_suggest_topic_key': {\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const key = mem.suggestTopicKey(args.kind as string, args.title as string);\n return `Suggested topic_key: ${key}`;\n }\n\n case 'kirograph_mem_conflicts_scan': {\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const candidates = mem.scanConflicts(args.limit as number ?? 50);\n if (candidates.length === 0) return 'No potential conflicts found among recent observations.';\n return `Found ${candidates.length} potential conflict(s):\\n` + candidates.map((c, i) =>\n `${i + 1}. [${c.observationA.kind}] \"${c.observationA.content.slice(0, 80)}\" \u2194 [${c.observationB.kind}] \"${c.observationB.content.slice(0, 80)}\" (similarity: ${c.similarity.toFixed(2)})`\n ).join('\\n') + '\\n\\nUse kirograph_mem_compare to establish relations.';\n }\n\n case 'kirograph_mem_prune': {\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const olderThan = (args.olderThan as string) ?? '90d';\n const durationMs = (() => {\n const m = olderThan.match(/^(\\d+)(d|m|w|h)$/);\n if (!m) return 90 * 86400000;\n const v = parseInt(m[1]);\n switch (m[2]) {\n case 'h': return v * 3600000;\n case 'd': return v * 86400000;\n case 'w': return v * 7 * 86400000;\n case 'm': return v * 30 * 86400000;\n default: return 90 * 86400000;\n }\n })();\n const deleted = mem.prune(durationMs);\n return `Pruned ${deleted} observation(s) older than ${olderThan}.`;\n }\n\n case 'kirograph_mem_lint': {\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const result = mem.lint();\n const lines = ['Memory Lint Results:'];\n lines.push(` Stale links: ${result.staleLinks}`);\n lines.push(` Model mismatch: ${result.modelMismatch ? 'yes' : 'no'}`);\n lines.push(` Stale sessions: ${result.staleSessions} (auto-closed)`);\n if (args.fix && result.staleLinks > 0) {\n const removed = mem.removeStaleLinks();\n lines.push(`\\n\u2713 Removed ${removed} stale link(s)`);\n } else if (result.staleLinks > 0) {\n lines.push(`\\nPass fix: true to remove stale links.`);\n }\n if (result.modelMismatch) {\n lines.push(`\\nRun 'kirograph mem reembed' to fix model mismatch.`);\n }\n return lines.join('\\n');\n }\n\n case 'kirograph_mem_conflicts_list': {\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const limit = clampLimit(args.limit as number | undefined, 20);\n const pending = mem.getPendingRelations(limit);\n if (pending.length === 0) return 'No pending conflict relations.';\n return `Pending relations (${pending.length}):\\n\\n` + pending.map(r =>\n `[${r.id}] ${r.relation}\\n A: ${r.observationA}\\n B: ${r.observationB}${r.reason ? `\\n Reason: ${r.reason}` : ''}`\n ).join('\\n\\n') + '\\n\\nUse kirograph_mem_conflicts_ignore to dismiss, or kirograph_mem_judge to finalize.';\n }\n\n case 'kirograph_mem_conflicts_ignore': {\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const relationId = args.relationId as string;\n mem.ignoreRelation(relationId);\n return `Relation \"${relationId}\" ignored.`;\n }\n\n default:\n return `Unknown tool: ${toolName}`;\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import KiroGraph from '../../index';\nimport { clampLimit, formatAge } from './utils';\nimport { describeMemRelation } from '../../memory/relation-display';\n\nexport async function handleMemory(toolName: string, args: Record<string, unknown>, cg: KiroGraph): Promise<string> {\n switch (toolName) {\n case 'kirograph_mem_search': {\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled. Set enableMemory: true in .kirograph/config.json';\n\n const { MemoryManager } = await Promise.resolve().then(() => require('../../memory/index.js'));\n const db = cg.getDatabase();\n db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n\n const results = await mem.search(args.query as string, {\n limit: (args.limit as number) ?? 10,\n kind: args.kind as any,\n sessionId: args.sessionId as string | undefined,\n asOf: args.asOf as number | undefined,\n });\n\n if (results.length === 0) return `No memory observations found for \"${args.query}\".`;\n\n return results.map((r, i) => {\n const age = formatAge(r.observation.createdAt);\n const lines = [`${i + 1}. [${r.observation.kind}] ${r.observation.content} (${age})`];\n if (r.relations && r.relations.length > 0) {\n for (const rel of r.relations) {\n const { icon, label, otherId } = describeMemRelation(rel, r.observation.id);\n lines.push(` ${icon} ${label} ${otherId} (confidence: ${rel.confidence})${rel.judgmentStatus === 'judged' ? ' (judged)' : ''}`);\n }\n }\n return lines.join('\\n');\n }).join('\\n');\n }\n\n case 'kirograph_mem_store': {\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled. Set enableMemory: true in .kirograph/config.json';\n\n const { MemoryManager, MemorySchemaError } = await Promise.resolve().then(() => require('../../memory/index.js'));\n const db = cg.getDatabase();\n db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n\n let id;\n try {\n id = await mem.store({\n content: args.content as string,\n kind: (args.kind as any) ?? 'note',\n source: 'agent',\n topicKey: args.topicKey as string | undefined,\n reviewAfter: args.reviewAfter as number | undefined,\n fields: args.fields as Record<string, unknown> | undefined,\n });\n } catch (err) {\n if (err instanceof MemorySchemaError) return `Rejected: ${err.message}`;\n throw err;\n }\n\n if (!id) return 'Observation already exists (duplicate content).';\n return `Stored observation ${id} [${(args.kind as string) ?? 'note'}]`;\n }\n\n case 'kirograph_mem_timeline': {\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled. Set enableMemory: true in .kirograph/config.json';\n\n const { MemoryManager } = await Promise.resolve().then(() => require('../../memory/index.js'));\n const db = cg.getDatabase();\n db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n\n const { sessions, observations } = mem.timeline({\n limit: (args.limit as number) ?? 5,\n sessionId: args.sessionId as string | undefined,\n });\n\n if (sessions.length === 0) return 'No memory sessions found.';\n\n const lines: string[] = [];\n for (const session of sessions) {\n const start = new Date(session.startedAt).toISOString().slice(0, 16).replace('T', ' ');\n const status = session.endedAt ? 'ended' : 'active';\n const obs = observations.get(session.id) ?? [];\n lines.push(`## ${start} [${session.ide ?? 'unknown'}] (${status}, ${obs.length} observations)`);\n for (const o of obs.slice(0, 5)) {\n lines.push(` - [${o.kind}] ${o.content.slice(0, 120)}`);\n }\n if (obs.length > 5) lines.push(` \u2026and ${obs.length - 5} more`);\n }\n return lines.join('\\n');\n }\n\n case 'kirograph_mem_status': {\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const projectRoot = cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled. Set enableMemory: true in .kirograph/config.json';\n\n const { MemoryManager } = await Promise.resolve().then(() => require('../../memory/index.js'));\n const db = cg.getDatabase();\n db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n\n const stats = mem.getStats();\n const lines = [\n 'KiroGraph Memory Status',\n ` Sessions: ${stats.sessions} (${stats.activeSessions} active)`,\n ` Observations: ${stats.observations}`,\n ` Symbol links: ${stats.links}`,\n ` Embeddings: ${stats.vectors} / ${stats.embeddableCount}`,\n ` Model mismatch: ${stats.modelMismatch ? '\u26A0 yes \u2014 run kirograph mem reembed' : 'no'}`,\n ` Relations: ${stats.relations} (${stats.pendingConflicts} pending)`,\n ` Caveman compression: ${config.cavemanMode !== 'off' ? config.cavemanMode : 'off (storing raw)'}`,\n ];\n return lines.join('\\n');\n }\n\n case 'kirograph_mem_review': {\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const obs = mem.getObservationsForReview(args.limit as number ?? 20);\n if (obs.length === 0) return 'No overdue observations \u2014 all review_after dates are in the future.';\n const now = Date.now();\n return obs.map((o, i) => {\n const daysOverdue = Math.floor((now - (o.reviewAfter ?? now)) / 86400000);\n return `${i + 1}. [${o.kind}]${o.topicKey ? ` (${o.topicKey})` : ''} ${o.content.slice(0, 120)} \u2014 overdue by ${daysOverdue}d`;\n }).join('\\n');\n }\n\n case 'kirograph_mem_mark_reviewed': {\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n mem.markReviewed(args.id as string);\n return `Observation ${args.id} marked as reviewed.`;\n }\n\n case 'kirograph_mem_compare': {\n if (!args.observationA || !args.observationB) {\n return 'Error: observationA and observationB are required.';\n }\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n\n // jev/strands mode: relation is optional \u2014 when omitted, KiroGraph classifies it itself.\n const relationAutoMode = config.memoryRelationMode === 'jev' || config.memoryRelationMode === 'strands';\n if (relationAutoMode && !args.relation) {\n try {\n const result = await mem.autoCompareObservations(args.observationA as string, args.observationB as string);\n const status = result.autoJudged ? 'auto-judged' : 'pending review';\n return `Relation ${result.relationId} classified by ${config.memoryRelationMode}: ${result.relation} (confidence: ${result.confidence.toFixed(2)}, ${status}).`\n + (result.autoJudged ? '' : ' Use kirograph_mem_judge to finalize.');\n } catch (err) {\n return `Error: ${err instanceof Error ? err.message : String(err)}`;\n }\n }\n\n if (!args.relation) {\n return 'Error: relation is required (set memoryRelationMode: \"jev\" or \"strands\" to classify it automatically instead).';\n }\n const relationId = mem.compareObservations({\n observationA: args.observationA as string,\n observationB: args.observationB as string,\n relation: args.relation as any,\n confidence: args.confidence as number ?? 1.0,\n reason: args.reason as string | undefined,\n evidence: args.evidence as string | undefined,\n });\n return `Relation ${relationId} created (${args.relation}, confidence: ${args.confidence ?? 1.0}). Use kirograph_mem_judge to finalize.`;\n }\n\n case 'kirograph_mem_judge': {\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n mem.judgeRelation(\n args.relationId as string,\n args.relation as any,\n args.confidence as number,\n args.reason as string | undefined,\n args.evidence as string | undefined,\n );\n return `Relation ${args.relationId} judged as [${args.relation}] (confidence: ${args.confidence}).`;\n }\n\n case 'kirograph_mem_capture': {\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const extracted = mem.capturePassive(args.content as string);\n if (extracted.length === 0) return 'No structured sections found. Use ## Key Learnings, ## Observations, ## Decisions, or ## Key Changes headings.';\n return `Captured ${extracted.length} observation(s):\\n` + extracted.map((e, i) => `${i + 1}. [${e.kind}] ${e.content.slice(0, 100)}${e.id ? '' : ' (duplicate)'}`).join('\\n');\n }\n\n case 'kirograph_mem_save_prompt': {\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const id = await mem.savePrompt(args.content as string);\n return `Prompt saved as ${id}.`;\n }\n\n case 'kirograph_mem_suggest_topic_key': {\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const key = mem.suggestTopicKey(args.kind as string, args.title as string);\n return `Suggested topic_key: ${key}`;\n }\n\n case 'kirograph_mem_conflicts_scan': {\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const candidates = mem.scanConflicts(args.limit as number ?? 50);\n if (candidates.length === 0) return 'No potential conflicts found among recent observations.';\n return `Found ${candidates.length} potential conflict(s):\\n` + candidates.map((c, i) =>\n `${i + 1}. [${c.observationA.kind}] \"${c.observationA.content.slice(0, 80)}\" \u2194 [${c.observationB.kind}] \"${c.observationB.content.slice(0, 80)}\" (similarity: ${c.similarity.toFixed(2)})`\n ).join('\\n') + '\\n\\nUse kirograph_mem_compare to establish relations.';\n }\n\n case 'kirograph_mem_prune': {\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const olderThan = (args.olderThan as string) ?? '90d';\n const durationMs = (() => {\n const m = olderThan.match(/^(\\d+)(d|m|w|h)$/);\n if (!m) return 90 * 86400000;\n const v = parseInt(m[1]);\n switch (m[2]) {\n case 'h': return v * 3600000;\n case 'd': return v * 86400000;\n case 'w': return v * 7 * 86400000;\n case 'm': return v * 30 * 86400000;\n default: return 90 * 86400000;\n }\n })();\n const deleted = mem.prune(durationMs);\n return `Pruned ${deleted} observation(s) older than ${olderThan}.`;\n }\n\n case 'kirograph_mem_lint': {\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const result = mem.lint();\n const lines = ['Memory Lint Results:'];\n lines.push(` Stale links: ${result.staleLinks}`);\n lines.push(` Model mismatch: ${result.modelMismatch ? 'yes' : 'no'}`);\n lines.push(` Stale sessions: ${result.staleSessions} (auto-closed)`);\n if (args.fix && result.staleLinks > 0) {\n const removed = mem.removeStaleLinks();\n lines.push(`\\n\u2713 Removed ${removed} stale link(s)`);\n } else if (result.staleLinks > 0) {\n lines.push(`\\nPass fix: true to remove stale links.`);\n }\n if (result.modelMismatch) {\n lines.push(`\\nRun 'kirograph mem reembed' to fix model mismatch.`);\n }\n return lines.join('\\n');\n }\n\n case 'kirograph_mem_conflicts_list': {\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const limit = clampLimit(args.limit as number | undefined, 20);\n const pending = mem.getPendingRelations(limit);\n if (pending.length === 0) return 'No pending conflict relations.';\n return `Pending relations (${pending.length}):\\n\\n` + pending.map(r =>\n `[${r.id}] ${r.relation}\\n A: ${r.observationA}\\n B: ${r.observationB}${r.reason ? `\\n Reason: ${r.reason}` : ''}`\n ).join('\\n\\n') + '\\n\\nUse kirograph_mem_conflicts_ignore to dismiss, or kirograph_mem_judge to finalize.';\n }\n\n case 'kirograph_mem_conflicts_ignore': {\n const { loadConfig } = await Promise.resolve().then(() => require('../../config.js'));\n const projectRoot = args.projectPath as string ?? cg.getProjectRoot();\n const config = await loadConfig(projectRoot);\n if (!config.enableMemory) return 'Memory is not enabled.';\n const { MemoryManager } = await Promise.resolve().then(() => require('../../memory/index.js'));\n const db = cg.getDatabase(); db.applyMemorySchema();\n const mem = new MemoryManager(config, db.getRawDb());\n mem.initialize();\n const relationId = args.relationId as string;\n mem.ignoreRelation(relationId);\n return `Relation \"${relationId}\" ignored.`;\n }\n\n default:\n return `Unknown tool: ${toolName}`;\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -475,8 +475,21 @@ async function handleSecurity(toolName, args, cg) {
475
475
  const db = cg.getDatabase();
476
476
  db.applySecuritySchema();
477
477
  const { AttackSurfaceAnalyzer } = await Promise.resolve().then(() => require("../../security/attack-surface.js"));
478
- const analyzer = new AttackSurfaceAnalyzer(db);
479
- const result = await analyzer.analyze();
478
+ const analyzer = new AttackSurfaceAnalyzer(db, {
479
+ authDetectionMode: config.securityAuthDetectionMode,
480
+ authConfidenceThreshold: config.securityAuthConfidenceThreshold,
481
+ jevApiKey: config.jevApiKey,
482
+ jevBaseUrl: config.jevBaseUrl,
483
+ jevModel: config.jevModel,
484
+ strandsBaseUrl: config.strandsBaseUrl,
485
+ strandsModel: config.strandsModel
486
+ });
487
+ let result;
488
+ try {
489
+ result = await analyzer.analyze();
490
+ } catch (err) {
491
+ return `Error: ${err instanceof Error ? err.message : String(err)}`;
492
+ }
480
493
  if (result.totalRoutes === 0) {
481
494
  return "No route nodes found in the graph. Ensure the project has been indexed with architecture analysis enabled.";
482
495
  }