kagent-ts 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.
Files changed (143) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +395 -0
  3. package/dist/compression/interface.d.ts +26 -0
  4. package/dist/compression/interface.d.ts.map +1 -0
  5. package/dist/compression/interface.js +3 -0
  6. package/dist/compression/interface.js.map +1 -0
  7. package/dist/compression/sliding-window.d.ts +21 -0
  8. package/dist/compression/sliding-window.d.ts.map +1 -0
  9. package/dist/compression/sliding-window.js +55 -0
  10. package/dist/compression/sliding-window.js.map +1 -0
  11. package/dist/compression/types.d.ts +12 -0
  12. package/dist/compression/types.d.ts.map +1 -0
  13. package/dist/compression/types.js +3 -0
  14. package/dist/compression/types.js.map +1 -0
  15. package/dist/context/context-manager.d.ts +76 -0
  16. package/dist/context/context-manager.d.ts.map +1 -0
  17. package/dist/context/context-manager.js +132 -0
  18. package/dist/context/context-manager.js.map +1 -0
  19. package/dist/context/types.d.ts +35 -0
  20. package/dist/context/types.d.ts.map +1 -0
  21. package/dist/context/types.js +3 -0
  22. package/dist/context/types.js.map +1 -0
  23. package/dist/core/agent.d.ts +288 -0
  24. package/dist/core/agent.d.ts.map +1 -0
  25. package/dist/core/agent.js +398 -0
  26. package/dist/core/agent.js.map +1 -0
  27. package/dist/core/hooks.d.ts +34 -0
  28. package/dist/core/hooks.d.ts.map +1 -0
  29. package/dist/core/hooks.js +3 -0
  30. package/dist/core/hooks.js.map +1 -0
  31. package/dist/core/plan-solve-agent.d.ts +114 -0
  32. package/dist/core/plan-solve-agent.d.ts.map +1 -0
  33. package/dist/core/plan-solve-agent.js +450 -0
  34. package/dist/core/plan-solve-agent.js.map +1 -0
  35. package/dist/core/react-agent.d.ts +52 -0
  36. package/dist/core/react-agent.d.ts.map +1 -0
  37. package/dist/core/react-agent.js +266 -0
  38. package/dist/core/react-agent.js.map +1 -0
  39. package/dist/core/response-schema.d.ts +91 -0
  40. package/dist/core/response-schema.d.ts.map +1 -0
  41. package/dist/core/response-schema.js +292 -0
  42. package/dist/core/response-schema.js.map +1 -0
  43. package/dist/core/types.d.ts +6 -0
  44. package/dist/core/types.d.ts.map +1 -0
  45. package/dist/core/types.js +3 -0
  46. package/dist/core/types.js.map +1 -0
  47. package/dist/index.d.ts +39 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +67 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/llm/interface.d.ts +87 -0
  52. package/dist/llm/interface.d.ts.map +1 -0
  53. package/dist/llm/interface.js +3 -0
  54. package/dist/llm/interface.js.map +1 -0
  55. package/dist/llm/openai-provider.d.ts +92 -0
  56. package/dist/llm/openai-provider.d.ts.map +1 -0
  57. package/dist/llm/openai-provider.js +262 -0
  58. package/dist/llm/openai-provider.js.map +1 -0
  59. package/dist/messages/message.d.ts +50 -0
  60. package/dist/messages/message.d.ts.map +1 -0
  61. package/dist/messages/message.js +87 -0
  62. package/dist/messages/message.js.map +1 -0
  63. package/dist/messages/types.d.ts +31 -0
  64. package/dist/messages/types.d.ts.map +1 -0
  65. package/dist/messages/types.js +14 -0
  66. package/dist/messages/types.js.map +1 -0
  67. package/dist/preferences/preference-manager.d.ts +88 -0
  68. package/dist/preferences/preference-manager.d.ts.map +1 -0
  69. package/dist/preferences/preference-manager.js +196 -0
  70. package/dist/preferences/preference-manager.js.map +1 -0
  71. package/dist/preferences/types.d.ts +27 -0
  72. package/dist/preferences/types.d.ts.map +1 -0
  73. package/dist/preferences/types.js +3 -0
  74. package/dist/preferences/types.js.map +1 -0
  75. package/dist/session/session-manager.d.ts +56 -0
  76. package/dist/session/session-manager.d.ts.map +1 -0
  77. package/dist/session/session-manager.js +156 -0
  78. package/dist/session/session-manager.js.map +1 -0
  79. package/dist/session/session-types.d.ts +51 -0
  80. package/dist/session/session-types.d.ts.map +1 -0
  81. package/dist/session/session-types.js +3 -0
  82. package/dist/session/session-types.js.map +1 -0
  83. package/dist/skills/file-skill-loader.d.ts +88 -0
  84. package/dist/skills/file-skill-loader.d.ts.map +1 -0
  85. package/dist/skills/file-skill-loader.js +365 -0
  86. package/dist/skills/file-skill-loader.js.map +1 -0
  87. package/dist/skills/index.d.ts +4 -0
  88. package/dist/skills/index.d.ts.map +1 -0
  89. package/dist/skills/index.js +10 -0
  90. package/dist/skills/index.js.map +1 -0
  91. package/dist/skills/skill-manager.d.ts +133 -0
  92. package/dist/skills/skill-manager.d.ts.map +1 -0
  93. package/dist/skills/skill-manager.js +310 -0
  94. package/dist/skills/skill-manager.js.map +1 -0
  95. package/dist/skills/types.d.ts +42 -0
  96. package/dist/skills/types.d.ts.map +1 -0
  97. package/dist/skills/types.js +3 -0
  98. package/dist/skills/types.js.map +1 -0
  99. package/dist/tools/builtin/edit-file.d.ts +12 -0
  100. package/dist/tools/builtin/edit-file.d.ts.map +1 -0
  101. package/dist/tools/builtin/edit-file.js +123 -0
  102. package/dist/tools/builtin/edit-file.js.map +1 -0
  103. package/dist/tools/builtin/glob-search.d.ts +11 -0
  104. package/dist/tools/builtin/glob-search.d.ts.map +1 -0
  105. package/dist/tools/builtin/glob-search.js +264 -0
  106. package/dist/tools/builtin/glob-search.js.map +1 -0
  107. package/dist/tools/builtin/grep-search.d.ts +14 -0
  108. package/dist/tools/builtin/grep-search.d.ts.map +1 -0
  109. package/dist/tools/builtin/grep-search.js +264 -0
  110. package/dist/tools/builtin/grep-search.js.map +1 -0
  111. package/dist/tools/builtin/index.d.ts +21 -0
  112. package/dist/tools/builtin/index.d.ts.map +1 -0
  113. package/dist/tools/builtin/index.js +53 -0
  114. package/dist/tools/builtin/index.js.map +1 -0
  115. package/dist/tools/builtin/read-file.d.ts +11 -0
  116. package/dist/tools/builtin/read-file.d.ts.map +1 -0
  117. package/dist/tools/builtin/read-file.js +122 -0
  118. package/dist/tools/builtin/read-file.js.map +1 -0
  119. package/dist/tools/builtin/write-file.d.ts +10 -0
  120. package/dist/tools/builtin/write-file.d.ts.map +1 -0
  121. package/dist/tools/builtin/write-file.js +89 -0
  122. package/dist/tools/builtin/write-file.js.map +1 -0
  123. package/dist/tools/circuit-breaker.d.ts +77 -0
  124. package/dist/tools/circuit-breaker.d.ts.map +1 -0
  125. package/dist/tools/circuit-breaker.js +102 -0
  126. package/dist/tools/circuit-breaker.js.map +1 -0
  127. package/dist/tools/error-tracker.d.ts +116 -0
  128. package/dist/tools/error-tracker.d.ts.map +1 -0
  129. package/dist/tools/error-tracker.js +484 -0
  130. package/dist/tools/error-tracker.js.map +1 -0
  131. package/dist/tools/tool-registry.d.ts +87 -0
  132. package/dist/tools/tool-registry.d.ts.map +1 -0
  133. package/dist/tools/tool-registry.js +188 -0
  134. package/dist/tools/tool-registry.js.map +1 -0
  135. package/dist/tools/types.d.ts +95 -0
  136. package/dist/tools/types.d.ts.map +1 -0
  137. package/dist/tools/types.js +14 -0
  138. package/dist/tools/types.js.map +1 -0
  139. package/dist/utils/token-counter.d.ts +31 -0
  140. package/dist/utils/token-counter.d.ts.map +1 -0
  141. package/dist/utils/token-counter.js +105 -0
  142. package/dist/utils/token-counter.js.map +1 -0
  143. package/package.json +56 -0
@@ -0,0 +1,50 @@
1
+ import { Role, MessageData, ToolCall } from "./types";
2
+ /**
3
+ * Message class representing a single turn in the conversation.
4
+ * Supports system, user, assistant, and tool roles.
5
+ */
6
+ export declare class Message {
7
+ readonly role: Role;
8
+ readonly content: string;
9
+ readonly name?: string;
10
+ readonly tool_call_id?: string;
11
+ readonly tool_calls?: ToolCall[];
12
+ constructor(role: Role, content: string, options?: {
13
+ name?: string;
14
+ tool_call_id?: string;
15
+ tool_calls?: ToolCall[];
16
+ });
17
+ /**
18
+ * Convert to a plain object suitable for the OpenAI Chat Completion API.
19
+ */
20
+ toDict(): MessageData;
21
+ /**
22
+ * Serialize to JSON for file persistence.
23
+ */
24
+ toJSON(): string;
25
+ /**
26
+ * Deserialize a Message from a MessageData object.
27
+ */
28
+ static fromData(data: MessageData): Message;
29
+ /**
30
+ * Deserialize a Message from a JSON string.
31
+ */
32
+ static fromJSON(json: string): Message;
33
+ /**
34
+ * Create a user message.
35
+ */
36
+ static user(content: string): Message;
37
+ /**
38
+ * Create a system message.
39
+ */
40
+ static system(content: string): Message;
41
+ /**
42
+ * Create an assistant message.
43
+ */
44
+ static assistant(content: string, tool_calls?: ToolCall[]): Message;
45
+ /**
46
+ * Create a tool result message.
47
+ */
48
+ static tool(content: string, tool_call_id: string, name?: string): Message;
49
+ }
50
+ //# sourceMappingURL=message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../src/messages/message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEtD;;;GAGG;AACH,qBAAa,OAAO;IAClB,SAAgB,IAAI,EAAE,IAAI,CAAC;IAC3B,SAAgB,OAAO,EAAE,MAAM,CAAC;IAChC,SAAgB,IAAI,CAAC,EAAE,MAAM,CAAC;IAC9B,SAAgB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtC,SAAgB,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC;gBAGtC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QACR,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC;KACzB;IASH;;OAEG;IACH,MAAM,IAAI,WAAW;IAYrB;;OAEG;IACH,MAAM,IAAI,MAAM;IAIhB;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO;IAQ3C;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAKtC;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIrC;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIvC;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,QAAQ,EAAE,GAAG,OAAO;IAInE;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO;CAG3E"}
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Message = void 0;
4
+ const types_1 = require("./types");
5
+ /**
6
+ * Message class representing a single turn in the conversation.
7
+ * Supports system, user, assistant, and tool roles.
8
+ */
9
+ class Message {
10
+ role;
11
+ content;
12
+ name;
13
+ tool_call_id;
14
+ tool_calls;
15
+ constructor(role, content, options) {
16
+ this.role = role;
17
+ this.content = content;
18
+ this.name = options?.name;
19
+ this.tool_call_id = options?.tool_call_id;
20
+ this.tool_calls = options?.tool_calls;
21
+ }
22
+ /**
23
+ * Convert to a plain object suitable for the OpenAI Chat Completion API.
24
+ */
25
+ toDict() {
26
+ const dict = {
27
+ role: this.role,
28
+ content: this.content,
29
+ };
30
+ if (this.name)
31
+ dict.name = this.name;
32
+ if (this.tool_call_id)
33
+ dict.tool_call_id = this.tool_call_id;
34
+ if (this.tool_calls && this.tool_calls.length > 0)
35
+ dict.tool_calls = this.tool_calls;
36
+ return dict;
37
+ }
38
+ /**
39
+ * Serialize to JSON for file persistence.
40
+ */
41
+ toJSON() {
42
+ return JSON.stringify(this.toDict());
43
+ }
44
+ /**
45
+ * Deserialize a Message from a MessageData object.
46
+ */
47
+ static fromData(data) {
48
+ return new Message(data.role, data.content, {
49
+ name: data.name,
50
+ tool_call_id: data.tool_call_id,
51
+ tool_calls: data.tool_calls,
52
+ });
53
+ }
54
+ /**
55
+ * Deserialize a Message from a JSON string.
56
+ */
57
+ static fromJSON(json) {
58
+ const data = JSON.parse(json);
59
+ return Message.fromData(data);
60
+ }
61
+ /**
62
+ * Create a user message.
63
+ */
64
+ static user(content) {
65
+ return new Message(types_1.Role.User, content);
66
+ }
67
+ /**
68
+ * Create a system message.
69
+ */
70
+ static system(content) {
71
+ return new Message(types_1.Role.System, content);
72
+ }
73
+ /**
74
+ * Create an assistant message.
75
+ */
76
+ static assistant(content, tool_calls) {
77
+ return new Message(types_1.Role.Assistant, content, { tool_calls });
78
+ }
79
+ /**
80
+ * Create a tool result message.
81
+ */
82
+ static tool(content, tool_call_id, name) {
83
+ return new Message(types_1.Role.Tool, content, { tool_call_id, name });
84
+ }
85
+ }
86
+ exports.Message = Message;
87
+ //# sourceMappingURL=message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.js","sourceRoot":"","sources":["../../src/messages/message.ts"],"names":[],"mappings":";;;AAAA,mCAAsD;AAEtD;;;GAGG;AACH,MAAa,OAAO;IACF,IAAI,CAAO;IACX,OAAO,CAAS;IAChB,IAAI,CAAU;IACd,YAAY,CAAU;IACtB,UAAU,CAAc;IAExC,YACE,IAAU,EACV,OAAe,EACf,OAIC;QAED,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,IAAI,CAAC;QAC1B,IAAI,CAAC,YAAY,GAAG,OAAO,EAAE,YAAY,CAAC;QAC1C,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,UAAU,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,MAAM,IAAI,GAAgB;YACxB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC;QACF,IAAI,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACrC,IAAI,IAAI,CAAC,YAAY;YAAE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QAC7D,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC;YAC/C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,IAAiB;QAC/B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE;YAC1C,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,UAAU,EAAE,IAAI,CAAC,UAAU;SAC5B,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,IAAY;QAC1B,MAAM,IAAI,GAAgB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3C,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,OAAe;QACzB,OAAO,IAAI,OAAO,CAAC,YAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,OAAe;QAC3B,OAAO,IAAI,OAAO,CAAC,YAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,OAAe,EAAE,UAAuB;QACvD,OAAO,IAAI,OAAO,CAAC,YAAI,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,OAAe,EAAE,YAAoB,EAAE,IAAa;QAC9D,OAAO,IAAI,OAAO,CAAC,YAAI,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;IACjE,CAAC;CACF;AA3FD,0BA2FC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Role enum for message types in the agent conversation.
3
+ */
4
+ export declare enum Role {
5
+ System = "system",
6
+ User = "user",
7
+ Assistant = "assistant",
8
+ Tool = "tool"
9
+ }
10
+ /**
11
+ * Represents a tool call requested by the assistant.
12
+ */
13
+ export interface ToolCall {
14
+ id: string;
15
+ type: "function";
16
+ function: {
17
+ name: string;
18
+ arguments: string;
19
+ };
20
+ }
21
+ /**
22
+ * Raw data shape of a message — used for serialization and LLM API calls.
23
+ */
24
+ export interface MessageData {
25
+ role: Role;
26
+ content: string;
27
+ name?: string;
28
+ tool_call_id?: string;
29
+ tool_calls?: ToolCall[];
30
+ }
31
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/messages/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,oBAAY,IAAI;IACd,MAAM,WAAW;IACjB,IAAI,SAAS;IACb,SAAS,cAAc;IACvB,IAAI,SAAS;CACd;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC;CACzB"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Role = void 0;
4
+ /**
5
+ * Role enum for message types in the agent conversation.
6
+ */
7
+ var Role;
8
+ (function (Role) {
9
+ Role["System"] = "system";
10
+ Role["User"] = "user";
11
+ Role["Assistant"] = "assistant";
12
+ Role["Tool"] = "tool";
13
+ })(Role || (exports.Role = Role = {}));
14
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/messages/types.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,IAAY,IAKX;AALD,WAAY,IAAI;IACd,yBAAiB,CAAA;IACjB,qBAAa,CAAA;IACb,+BAAuB,CAAA;IACvB,qBAAa,CAAA;AACf,CAAC,EALW,IAAI,oBAAJ,IAAI,QAKf"}
@@ -0,0 +1,88 @@
1
+ import { Preferences, PreferenceManagerConfig } from "./types";
2
+ /**
3
+ * Manages user preference persistence to disk.
4
+ *
5
+ * Preferences are stored as a Markdown file with one `key: value` per line.
6
+ * Lines starting with `#` are comments and are ignored on load.
7
+ * The default location is `.kagent/preferences.md`.
8
+ *
9
+ * The `toPrompt()` static helper converts preferences into a
10
+ * text section suitable for injection into a system prompt.
11
+ *
12
+ * Usage:
13
+ * ```ts
14
+ * const pm = new PreferenceManager();
15
+ * pm.set("codeStyle", "Use TypeScript with functional style.");
16
+ * pm.save();
17
+ * ```
18
+ *
19
+ * === Example `.kagent/preferences.md` ===
20
+ * ```markdown
21
+ * # User Preferences
22
+ *
23
+ * codeStyle: Use TypeScript with functional style. Prefer interfaces.
24
+ * language: Always respond in Chinese.
25
+ * ```
26
+ */
27
+ export declare class PreferenceManager {
28
+ private filePath;
29
+ private prefs;
30
+ private lastLoadedMtime;
31
+ constructor(config?: PreferenceManagerConfig);
32
+ /** Get all current preferences. */
33
+ getAll(): Preferences;
34
+ /** Get a single preference by key. */
35
+ get(key: string): string | undefined;
36
+ /** Set a single preference and persist to disk. */
37
+ set(key: string, value: string): void;
38
+ /** Replace all preferences and persist to disk. */
39
+ setAll(prefs: Preferences): void;
40
+ /** Remove a single preference and persist to disk. */
41
+ delete(key: string): void;
42
+ /** Clear all preferences and persist to disk. */
43
+ clear(): void;
44
+ /**
45
+ * Load preferences from a Markdown file.
46
+ *
47
+ * Format:
48
+ * - Lines starting with `#` are comments (ignored).
49
+ * - Empty lines are ignored.
50
+ * - Each `key: value` line is parsed as one preference.
51
+ *
52
+ * Returns `{}` if the file is missing or empty.
53
+ */
54
+ load(): Preferences;
55
+ /**
56
+ * Re-read preferences from disk.
57
+ * Useful for picking up manual edits to the Markdown file at runtime.
58
+ *
59
+ * Returns the updated preferences.
60
+ */
61
+ reload(): Preferences;
62
+ /**
63
+ * Check whether the preferences file has changed on disk since last load.
64
+ * Returns false if the file doesn't exist (treated as unchanged).
65
+ */
66
+ hasFileChanged(): boolean;
67
+ /**
68
+ * Persist preferences to disk as a Markdown file.
69
+ *
70
+ * Preferences are written in sorted key order for readability.
71
+ */
72
+ save(): void;
73
+ /**
74
+ * Convert preferences into a system-prompt section.
75
+ *
76
+ * Returns an empty string when `prefs` is empty.
77
+ * Otherwise returns a section like:
78
+ *
79
+ * ```
80
+ *
81
+ * === User Preferences ===
82
+ * - code-style: Use TypeScript with functional style.
83
+ * - language: Always respond in Chinese.
84
+ * ```
85
+ */
86
+ static toPrompt(prefs: Preferences): string;
87
+ }
88
+ //# sourceMappingURL=preference-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preference-manager.d.ts","sourceRoot":"","sources":["../../src/preferences/preference-manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAE/D;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,eAAe,CAAa;gBAExB,MAAM,CAAC,EAAE,uBAAuB;IAQ5C,mCAAmC;IACnC,MAAM,IAAI,WAAW;IAIrB,sCAAsC;IACtC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIpC,mDAAmD;IACnD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAKrC,mDAAmD;IACnD,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IAKhC,sDAAsD;IACtD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKzB,iDAAiD;IACjD,KAAK,IAAI,IAAI;IAOb;;;;;;;;;OASG;IACH,IAAI,IAAI,WAAW;IAuBnB;;;;;OAKG;IACH,MAAM,IAAI,WAAW;IAIrB;;;OAGG;IACH,cAAc,IAAI,OAAO;IAQzB;;;;OAIG;IACH,IAAI,IAAI,IAAI;IAWZ;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM;CAO5C"}
@@ -0,0 +1,196 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.PreferenceManager = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ /**
40
+ * Manages user preference persistence to disk.
41
+ *
42
+ * Preferences are stored as a Markdown file with one `key: value` per line.
43
+ * Lines starting with `#` are comments and are ignored on load.
44
+ * The default location is `.kagent/preferences.md`.
45
+ *
46
+ * The `toPrompt()` static helper converts preferences into a
47
+ * text section suitable for injection into a system prompt.
48
+ *
49
+ * Usage:
50
+ * ```ts
51
+ * const pm = new PreferenceManager();
52
+ * pm.set("codeStyle", "Use TypeScript with functional style.");
53
+ * pm.save();
54
+ * ```
55
+ *
56
+ * === Example `.kagent/preferences.md` ===
57
+ * ```markdown
58
+ * # User Preferences
59
+ *
60
+ * codeStyle: Use TypeScript with functional style. Prefer interfaces.
61
+ * language: Always respond in Chinese.
62
+ * ```
63
+ */
64
+ class PreferenceManager {
65
+ filePath;
66
+ prefs = {};
67
+ lastLoadedMtime = 0;
68
+ constructor(config) {
69
+ this.filePath = path.resolve(config?.filePath ?? ".kagent/preferences.md");
70
+ fs.mkdirSync(path.dirname(this.filePath), { recursive: true });
71
+ this.load();
72
+ }
73
+ // ─── Accessors ──────────────────────────────────────────────────────────
74
+ /** Get all current preferences. */
75
+ getAll() {
76
+ return { ...this.prefs };
77
+ }
78
+ /** Get a single preference by key. */
79
+ get(key) {
80
+ return this.prefs[key];
81
+ }
82
+ /** Set a single preference and persist to disk. */
83
+ set(key, value) {
84
+ this.prefs[key] = value;
85
+ this.save();
86
+ }
87
+ /** Replace all preferences and persist to disk. */
88
+ setAll(prefs) {
89
+ this.prefs = { ...prefs };
90
+ this.save();
91
+ }
92
+ /** Remove a single preference and persist to disk. */
93
+ delete(key) {
94
+ delete this.prefs[key];
95
+ this.save();
96
+ }
97
+ /** Clear all preferences and persist to disk. */
98
+ clear() {
99
+ this.prefs = {};
100
+ this.save();
101
+ }
102
+ // ─── Persistence ────────────────────────────────────────────────────────
103
+ /**
104
+ * Load preferences from a Markdown file.
105
+ *
106
+ * Format:
107
+ * - Lines starting with `#` are comments (ignored).
108
+ * - Empty lines are ignored.
109
+ * - Each `key: value` line is parsed as one preference.
110
+ *
111
+ * Returns `{}` if the file is missing or empty.
112
+ */
113
+ load() {
114
+ try {
115
+ const stat = fs.statSync(this.filePath);
116
+ this.lastLoadedMtime = stat.mtimeMs;
117
+ const raw = fs.readFileSync(this.filePath, "utf-8");
118
+ const prefs = {};
119
+ for (const line of raw.split("\n")) {
120
+ const trimmed = line.trim();
121
+ if (trimmed === "" || trimmed.startsWith("#"))
122
+ continue;
123
+ const colonIdx = trimmed.indexOf(":");
124
+ if (colonIdx <= 0)
125
+ continue;
126
+ const key = trimmed.slice(0, colonIdx).trim();
127
+ const value = trimmed.slice(colonIdx + 1).trim();
128
+ if (key)
129
+ prefs[key] = value;
130
+ }
131
+ this.prefs = prefs;
132
+ }
133
+ catch {
134
+ this.prefs = {};
135
+ this.lastLoadedMtime = 0;
136
+ }
137
+ return this.getAll();
138
+ }
139
+ /**
140
+ * Re-read preferences from disk.
141
+ * Useful for picking up manual edits to the Markdown file at runtime.
142
+ *
143
+ * Returns the updated preferences.
144
+ */
145
+ reload() {
146
+ return this.load();
147
+ }
148
+ /**
149
+ * Check whether the preferences file has changed on disk since last load.
150
+ * Returns false if the file doesn't exist (treated as unchanged).
151
+ */
152
+ hasFileChanged() {
153
+ try {
154
+ return fs.statSync(this.filePath).mtimeMs !== this.lastLoadedMtime;
155
+ }
156
+ catch {
157
+ return false;
158
+ }
159
+ }
160
+ /**
161
+ * Persist preferences to disk as a Markdown file.
162
+ *
163
+ * Preferences are written in sorted key order for readability.
164
+ */
165
+ save() {
166
+ const lines = ["# User Preferences", ""];
167
+ for (const [k, v] of Object.entries(this.prefs).sort()) {
168
+ lines.push(`${k}: ${v}`);
169
+ }
170
+ lines.push(""); // trailing newline
171
+ fs.writeFileSync(this.filePath, lines.join("\n"), "utf-8");
172
+ }
173
+ // ─── Prompt Builder ─────────────────────────────────────────────────────
174
+ /**
175
+ * Convert preferences into a system-prompt section.
176
+ *
177
+ * Returns an empty string when `prefs` is empty.
178
+ * Otherwise returns a section like:
179
+ *
180
+ * ```
181
+ *
182
+ * === User Preferences ===
183
+ * - code-style: Use TypeScript with functional style.
184
+ * - language: Always respond in Chinese.
185
+ * ```
186
+ */
187
+ static toPrompt(prefs) {
188
+ const entries = Object.entries(prefs);
189
+ if (entries.length === 0)
190
+ return "";
191
+ const lines = entries.map(([k, v]) => ` - ${k}: ${v}`);
192
+ return "\n\n=== User Preferences ===\n" + lines.join("\n") + "\n";
193
+ }
194
+ }
195
+ exports.PreferenceManager = PreferenceManager;
196
+ //# sourceMappingURL=preference-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preference-manager.js","sourceRoot":"","sources":["../../src/preferences/preference-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * User preferences: key-value pairs of plain-text directives.
3
+ *
4
+ * Keys are short descriptive names (e.g., "code-style", "response-language").
5
+ * Values are natural-language instructions injected into the agent's
6
+ * system prompt so the LLM always sees them.
7
+ *
8
+ * Example:
9
+ * ```ts
10
+ * {
11
+ * codeStyle: "Use TypeScript with functional style. Prefer interfaces.",
12
+ * language: "Always respond in Chinese.",
13
+ * }
14
+ * ```
15
+ */
16
+ export type Preferences = Record<string, string>;
17
+ /**
18
+ * Configuration for the PreferenceManager.
19
+ */
20
+ export interface PreferenceManagerConfig {
21
+ /**
22
+ * Path to the preferences Markdown file.
23
+ * Default: `.kagent/preferences.md` relative to cwd.
24
+ */
25
+ filePath?: string;
26
+ }
27
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/preferences/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/preferences/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,56 @@
1
+ import { SessionState, SessionStatus } from "./session-types";
2
+ /**
3
+ * Configuration for the SessionManager.
4
+ */
5
+ export interface SessionManagerConfig {
6
+ /** Explicit session ID. Auto-generated if omitted. */
7
+ sessionId?: string;
8
+ /** Storage directory for session files (default: .kagent-sessions/). */
9
+ sessionDir?: string;
10
+ }
11
+ /**
12
+ * Manages session state persistence to disk.
13
+ *
14
+ * Each session is stored as a single JSON file in the configured directory.
15
+ * Sessions are self-contained (messages are inline) so they survive any
16
+ * memory/component lifecycle and can be resumed after process restarts.
17
+ */
18
+ export declare class SessionManager {
19
+ private sessionId;
20
+ private sessionDir;
21
+ constructor(config?: SessionManagerConfig);
22
+ getSessionId(): string;
23
+ getSessionDir(): string;
24
+ /**
25
+ * Set the session ID (used during resume to match the restored session).
26
+ */
27
+ setSessionId(id: string): void;
28
+ /**
29
+ * Get the file path for the current session.
30
+ */
31
+ private filePath;
32
+ /**
33
+ * Save a session checkpoint to disk.
34
+ *
35
+ * Preserves the original `createdAt` timestamp so resuming a session
36
+ * retains the original creation time. Updates `updatedAt` to now.
37
+ */
38
+ saveCheckpoint(state: SessionState): void;
39
+ /**
40
+ * Load a session by ID. Returns null if the file is missing or corrupt.
41
+ */
42
+ loadSession(sessionId: string): SessionState | null;
43
+ /**
44
+ * Return all persisted session states, sorted by `updatedAt` descending.
45
+ */
46
+ listSessions(): SessionState[];
47
+ /**
48
+ * Delete a session file from disk.
49
+ */
50
+ deleteSession(sessionId: string): void;
51
+ /**
52
+ * Update the status and timestamp of a session in-place.
53
+ */
54
+ markStatus(sessionId: string, status: SessionStatus): void;
55
+ }
56
+ //# sourceMappingURL=session-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/session/session-manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;GAMG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;gBAEf,MAAM,CAAC,EAAE,oBAAoB;IASzC,YAAY,IAAI,MAAM;IAItB,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAM9B;;OAEG;IACH,OAAO,CAAC,QAAQ;IAIhB;;;;;OAKG;IACH,cAAc,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAYzC;;OAEG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAiBnD;;OAEG;IACH,YAAY,IAAI,YAAY,EAAE;IAqB9B;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAStC;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI;CAQ3D"}