@openlucaskaka/kagent 0.1.7

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 (117) hide show
  1. package/README.md +353 -0
  2. package/npm/bin/kagent-serve.js +6 -0
  3. package/npm/bin/kagent.js +6 -0
  4. package/npm/lib/App.js +524 -0
  5. package/npm/lib/app-state.js +224 -0
  6. package/npm/lib/approval-choice.js +25 -0
  7. package/npm/lib/commands.js +59 -0
  8. package/npm/lib/editor.js +188 -0
  9. package/npm/lib/ink-runner.js +41 -0
  10. package/npm/lib/kagent-home.js +39 -0
  11. package/npm/lib/launcher.js +221 -0
  12. package/npm/lib/protocol.js +33 -0
  13. package/npm/lib/provider-setup.js +139 -0
  14. package/npm/lib/python-runner.js +892 -0
  15. package/npm/lib/runtime-client.js +390 -0
  16. package/npm/lib/terminal-input.js +127 -0
  17. package/npm/lib/terminal-text.js +19 -0
  18. package/npm/lib/terminal-width.js +14 -0
  19. package/npm/lib/transcript.js +227 -0
  20. package/npm/lib/ui-components.js +247 -0
  21. package/npm/lib/update-manager.js +334 -0
  22. package/package.json +39 -0
  23. package/pyproject.toml +55 -0
  24. package/src/kagent/__init__.py +90 -0
  25. package/src/kagent/cli/__init__.py +5 -0
  26. package/src/kagent/cli/__main__.py +6 -0
  27. package/src/kagent/cli/commands.py +112 -0
  28. package/src/kagent/cli/conversation.py +127 -0
  29. package/src/kagent/cli/interactive.py +841 -0
  30. package/src/kagent/cli/main.py +685 -0
  31. package/src/kagent/cli/memory.py +460 -0
  32. package/src/kagent/cli/pending_approval.py +169 -0
  33. package/src/kagent/cli/provider.py +27 -0
  34. package/src/kagent/cli/session_commands.py +401 -0
  35. package/src/kagent/cli/stdio_runtime.py +784 -0
  36. package/src/kagent/cli/trace.py +67 -0
  37. package/src/kagent/cli/ui.py +931 -0
  38. package/src/kagent/core/__init__.py +0 -0
  39. package/src/kagent/core/agent.py +296 -0
  40. package/src/kagent/core/faults.py +11 -0
  41. package/src/kagent/core/invariants.py +47 -0
  42. package/src/kagent/core/normalization.py +81 -0
  43. package/src/kagent/core/planning.py +48 -0
  44. package/src/kagent/core/state.py +73 -0
  45. package/src/kagent/core/summary.py +64 -0
  46. package/src/kagent/core/tools.py +196 -0
  47. package/src/kagent/core/trace.py +57 -0
  48. package/src/kagent/eval/__init__.py +11 -0
  49. package/src/kagent/eval/cases.py +229 -0
  50. package/src/kagent/eval/evaluator.py +216 -0
  51. package/src/kagent/integrations/__init__.py +3 -0
  52. package/src/kagent/integrations/audit.py +95 -0
  53. package/src/kagent/integrations/backends.py +131 -0
  54. package/src/kagent/integrations/memory.py +301 -0
  55. package/src/kagent/ops/__init__.py +0 -0
  56. package/src/kagent/ops/batch.py +156 -0
  57. package/src/kagent/ops/doctor.py +255 -0
  58. package/src/kagent/ops/metrics.py +214 -0
  59. package/src/kagent/ops/release_evidence.py +877 -0
  60. package/src/kagent/ops/release_manifest.py +142 -0
  61. package/src/kagent/ops/trace_replay.py +285 -0
  62. package/src/kagent/providers/__init__.py +7 -0
  63. package/src/kagent/providers/embeddings.py +187 -0
  64. package/src/kagent/providers/llm.py +770 -0
  65. package/src/kagent/py.typed +1 -0
  66. package/src/kagent/runtime/__init__.py +28 -0
  67. package/src/kagent/runtime/action_graph.py +543 -0
  68. package/src/kagent/runtime/agent.py +2089 -0
  69. package/src/kagent/runtime/approval.py +64 -0
  70. package/src/kagent/runtime/cancellation.py +64 -0
  71. package/src/kagent/runtime/checkpoint_state.py +146 -0
  72. package/src/kagent/runtime/checkpoint_storage.py +270 -0
  73. package/src/kagent/runtime/context.py +65 -0
  74. package/src/kagent/runtime/file_transaction.py +195 -0
  75. package/src/kagent/runtime/hooks.py +74 -0
  76. package/src/kagent/runtime/metadata.py +116 -0
  77. package/src/kagent/runtime/patch_checkpoints.py +385 -0
  78. package/src/kagent/runtime/policy.py +50 -0
  79. package/src/kagent/runtime/presentation.py +205 -0
  80. package/src/kagent/runtime/redaction.py +130 -0
  81. package/src/kagent/runtime/sandbox.py +331 -0
  82. package/src/kagent/runtime/skills.py +66 -0
  83. package/src/kagent/runtime/steering.py +56 -0
  84. package/src/kagent/runtime/steps.py +255 -0
  85. package/src/kagent/runtime/task_state.py +40 -0
  86. package/src/kagent/runtime/tools.py +3532 -0
  87. package/src/kagent/runtime/types.py +240 -0
  88. package/src/kagent/runtime/workspace.py +597 -0
  89. package/src/kagent/service/__init__.py +26 -0
  90. package/src/kagent/service/__main__.py +6 -0
  91. package/src/kagent/service/active_runs.py +178 -0
  92. package/src/kagent/service/cli.py +737 -0
  93. package/src/kagent/service/contract.py +2571 -0
  94. package/src/kagent/service/errors.py +71 -0
  95. package/src/kagent/service/idempotency.py +584 -0
  96. package/src/kagent/service/router.py +884 -0
  97. package/src/kagent/service/run.py +150 -0
  98. package/src/kagent/service/runtime.py +1915 -0
  99. package/src/kagent/service/runtime_approval.py +20 -0
  100. package/src/kagent/service/runtime_cancel.py +192 -0
  101. package/src/kagent/service/runtime_lifecycle.py +229 -0
  102. package/src/kagent/service/runtime_metadata.py +21 -0
  103. package/src/kagent/service/runtime_policy.py +115 -0
  104. package/src/kagent/service/runtime_recovery.py +573 -0
  105. package/src/kagent/service/runtime_resume.py +382 -0
  106. package/src/kagent/service/runtime_resume_claim.py +116 -0
  107. package/src/kagent/service/runtime_run.py +350 -0
  108. package/src/kagent/service/runtime_status.py +2007 -0
  109. package/src/kagent/service/safety.py +139 -0
  110. package/src/kagent/service/server.py +114 -0
  111. package/src/kagent/service/status.py +233 -0
  112. package/src/kagent/service/trace_store.py +322 -0
  113. package/src/kagent/service/transport.py +24 -0
  114. package/src/kagent/utils/__init__.py +0 -0
  115. package/src/kagent/utils/config_validation.py +21 -0
  116. package/src/kagent/utils/json_output.py +23 -0
  117. package/src/kagent/utils/paths.py +473 -0
@@ -0,0 +1,221 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.launchKagent = launchKagent;
7
+ const node_child_process_1 = __importDefault(require("node:child_process"));
8
+ const node_fs_1 = __importDefault(require("node:fs"));
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ const node_readline_1 = __importDefault(require("node:readline"));
11
+ const update_manager_1 = require("./update-manager");
12
+ async function launchKagent(args, overrides = {}) {
13
+ const deps = { ...createDefaultDependencies(), ...overrides };
14
+ const currentVersion = deps.currentVersion();
15
+ if (isUpdateCheckCommand(args)) {
16
+ await runExplicitCheck(currentVersion, deps);
17
+ return;
18
+ }
19
+ if (isUpgradeCommand(args)) {
20
+ await runExplicitUpgrade(currentVersion, deps);
21
+ return;
22
+ }
23
+ if (shouldRunAutomaticCheck(args, deps.env, deps.stdin)) {
24
+ const restarted = await runAutomaticPreflight(args, currentVersion, deps);
25
+ if (restarted) {
26
+ return;
27
+ }
28
+ }
29
+ const pythonArgs = classicArgs(args);
30
+ if (shouldRunInk(args, deps.env, deps.stdin)) {
31
+ await deps.runInk(args, {
32
+ fallback: () => { void deps.runPython(pythonArgs); },
33
+ });
34
+ return;
35
+ }
36
+ await deps.runPython(pythonArgs);
37
+ }
38
+ function createDefaultDependencies() {
39
+ const root = packageRoot();
40
+ const runner = require("./python-runner");
41
+ const ink = require("./ink-runner");
42
+ const env = process.env;
43
+ const managerDeps = {
44
+ readState: async () => runner._internals.readUpdateState(env),
45
+ writeState: async (state) => {
46
+ runner._internals.writeUpdateState(state, env);
47
+ },
48
+ runInstall: async (argv) => {
49
+ runChecked("npm", argv, root, env);
50
+ },
51
+ readInstalledVersion: async () => readPackageVersion(root),
52
+ };
53
+ return {
54
+ env,
55
+ stdin: process.stdin,
56
+ stdout: process.stdout,
57
+ stderr: process.stderr,
58
+ currentVersion: () => readPackageVersion(root),
59
+ checkForUpdate: (options) => (0, update_manager_1.checkForUpdate)({
60
+ ...options,
61
+ env,
62
+ deps: managerDeps,
63
+ }),
64
+ runUpgrade: (options) => (0, update_manager_1.runUpgrade)({
65
+ ...options,
66
+ env,
67
+ deps: managerDeps,
68
+ }),
69
+ promptUpdate: (info) => promptUpdate(info, process.stdin, process.stderr),
70
+ runInk: (launchArgs, options) => ink.runKagentInk(launchArgs, options),
71
+ runPython: (launchArgs) => runner.runPythonEntrypoint("kagent", launchArgs),
72
+ restart: (launchArgs) => restartEntrypoint(launchArgs, env),
73
+ exit: (code) => { process.exitCode = code; },
74
+ };
75
+ }
76
+ async function runAutomaticPreflight(args, currentVersion, deps) {
77
+ let info;
78
+ try {
79
+ info = await deps.checkForUpdate({ currentVersion, force: false, env: deps.env });
80
+ }
81
+ catch (error) {
82
+ deps.stderr.write(`kagent: update check skipped: ${errorMessage(error)}\n`);
83
+ return false;
84
+ }
85
+ if (info.latest === null) {
86
+ deps.stderr.write(`kagent: update check skipped: ${info.error}\n`);
87
+ return false;
88
+ }
89
+ if (!info.updateAvailable || (info.skipped && info.reason === "ttl")) {
90
+ return false;
91
+ }
92
+ if (!(await deps.promptUpdate(info))) {
93
+ return false;
94
+ }
95
+ try {
96
+ const result = await deps.runUpgrade({ currentVersion, env: deps.env });
97
+ if (!result.upgraded) {
98
+ return false;
99
+ }
100
+ }
101
+ catch (error) {
102
+ deps.stderr.write(`kagent: update failed: ${errorMessage(error)}; continuing with ${currentVersion}\n`);
103
+ return false;
104
+ }
105
+ deps.restart(args);
106
+ return true;
107
+ }
108
+ async function runExplicitCheck(currentVersion, deps) {
109
+ try {
110
+ const info = await deps.checkForUpdate({
111
+ currentVersion,
112
+ force: true,
113
+ env: deps.env,
114
+ });
115
+ if (info.latest === null) {
116
+ throw new Error("forced update check was skipped");
117
+ }
118
+ deps.stdout.write(`${JSON.stringify({
119
+ current: info.current,
120
+ latest: info.latest,
121
+ channel: info.channel,
122
+ updateAvailable: info.updateAvailable,
123
+ checkedAt: info.checkedAt,
124
+ ...(info.cacheWarning ? { cacheWarning: info.cacheWarning } : {}),
125
+ })}\n`);
126
+ }
127
+ catch (error) {
128
+ deps.stderr.write(`kagent: update check failed: ${errorMessage(error)}\n`);
129
+ deps.exit(1);
130
+ }
131
+ }
132
+ async function runExplicitUpgrade(currentVersion, deps) {
133
+ try {
134
+ const result = await deps.runUpgrade({ currentVersion, env: deps.env });
135
+ deps.stdout.write(`${JSON.stringify({
136
+ upgraded: result.upgraded,
137
+ installedVersion: result.installedVersion,
138
+ })}\n`);
139
+ }
140
+ catch (error) {
141
+ deps.stderr.write(`kagent: upgrade failed: ${errorMessage(error)}\n`);
142
+ deps.exit(1);
143
+ }
144
+ }
145
+ function shouldRunAutomaticCheck(args, env, stdin) {
146
+ return Boolean(stdin.isTTY) &&
147
+ !envFlagEnabled(env.KAGENT_NO_SELF_UPDATE) &&
148
+ (args.length === 0 || (args.length === 1 && args[0] === "--classic"));
149
+ }
150
+ function shouldRunInk(args, env, stdin) {
151
+ return args.length === 0 && !env.KAGENT_CLASSIC_UI && Boolean(stdin.isTTY);
152
+ }
153
+ function envFlagEnabled(value) {
154
+ if (!value) {
155
+ return false;
156
+ }
157
+ return !["0", "false", "no"].includes(value.toLowerCase());
158
+ }
159
+ function isUpdateCheckCommand(args) {
160
+ return args.length === 2 && args[0] === "update" && args[1] === "--check";
161
+ }
162
+ function isUpgradeCommand(args) {
163
+ return args.length === 1 && args[0] === "upgrade";
164
+ }
165
+ function classicArgs(args) {
166
+ return args.filter((arg) => arg !== "--classic");
167
+ }
168
+ function packageRoot() {
169
+ return node_path_1.default.resolve(__dirname, "..", "..");
170
+ }
171
+ function readPackageVersion(root) {
172
+ const packageJson = JSON.parse(node_fs_1.default.readFileSync(node_path_1.default.join(root, "package.json"), "utf8"));
173
+ if (typeof packageJson.version !== "string" || !packageJson.version) {
174
+ throw new Error("package.json does not declare a version");
175
+ }
176
+ return packageJson.version;
177
+ }
178
+ function runChecked(command, argv, cwd, env) {
179
+ const result = node_child_process_1.default.spawnSync(command, [...argv], {
180
+ cwd,
181
+ env,
182
+ encoding: "utf8",
183
+ stdio: "inherit",
184
+ });
185
+ if (result.error) {
186
+ throw result.error;
187
+ }
188
+ if (result.status !== 0) {
189
+ throw new Error(`${command} ${argv.join(" ")} exited with ${result.status ?? 1}`);
190
+ }
191
+ }
192
+ function promptUpdate(info, input, output) {
193
+ return new Promise((resolve) => {
194
+ const prompt = `kagent update available: current=${info.current} latest=${info.latest} channel=${info.channel}\n` +
195
+ "Update now? [Y/n] ";
196
+ const rl = node_readline_1.default.createInterface({ input, output });
197
+ rl.question(prompt, (answer) => {
198
+ rl.close();
199
+ const normalized = answer.trim().toLowerCase();
200
+ resolve(normalized === "" || normalized === "y" || normalized === "yes");
201
+ });
202
+ });
203
+ }
204
+ function restartEntrypoint(args, env) {
205
+ const binPath = process.argv[1];
206
+ if (!binPath) {
207
+ throw new Error("unable to determine current kagent executable");
208
+ }
209
+ const result = node_child_process_1.default.spawnSync(process.execPath, [binPath, ...args], {
210
+ env,
211
+ stdio: "inherit",
212
+ });
213
+ if (result.error) {
214
+ throw result.error;
215
+ }
216
+ process.exit(result.status ?? 1);
217
+ }
218
+ function errorMessage(error) {
219
+ return error instanceof Error ? error.message : String(error);
220
+ }
221
+ module.exports = { launchKagent };
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseRuntimeProtocolLine = parseRuntimeProtocolLine;
4
+ const EVENT_TYPES = new Set([
5
+ "runtime_ready",
6
+ "runtime_unavailable",
7
+ "run_started",
8
+ "run_progress",
9
+ "run_cancel_requested",
10
+ "run_steer_queued",
11
+ "run_steer_rejected",
12
+ "approval_required",
13
+ "run_completed",
14
+ "run_failed",
15
+ "provider_configured",
16
+ "provider_configuration_failed",
17
+ "session_command_completed",
18
+ "session_command_failed",
19
+ ]);
20
+ function parseRuntimeProtocolLine(line) {
21
+ const trimmed = line.trim();
22
+ if (!trimmed) {
23
+ return null;
24
+ }
25
+ const payload = JSON.parse(trimmed);
26
+ if (!payload || typeof payload !== "object" || typeof payload.type !== "string") {
27
+ throw new Error("runtime event must include a type");
28
+ }
29
+ if (!EVENT_TYPES.has(payload.type)) {
30
+ throw new Error(`unsupported runtime event: ${payload.type}`);
31
+ }
32
+ return payload;
33
+ }
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createProviderSetupState = createProviderSetupState;
4
+ exports.providerSetupReducer = providerSetupReducer;
5
+ exports.selectedProvider = selectedProvider;
6
+ exports.providerConfiguration = providerConfiguration;
7
+ exports.maskSecret = maskSecret;
8
+ exports.isInputStage = isInputStage;
9
+ function createProviderSetupState(options) {
10
+ if (options.length === 0) {
11
+ throw new Error("runtime did not provide any model providers");
12
+ }
13
+ return {
14
+ stage: "provider",
15
+ options,
16
+ selectedIndex: 0,
17
+ baseUrl: "",
18
+ model: "",
19
+ apiKey: "",
20
+ editor: { value: "", cursor: 0 },
21
+ error: "",
22
+ };
23
+ }
24
+ function providerSetupReducer(state, action) {
25
+ if (action.type === "select" && state.stage === "provider") {
26
+ const length = state.options.length;
27
+ const selectedIndex = (state.selectedIndex + action.offset + length) % length;
28
+ return { ...state, selectedIndex, error: "" };
29
+ }
30
+ if (action.type === "edit" && isInputStage(state.stage)) {
31
+ return { ...state, editor: action.editor, error: "" };
32
+ }
33
+ if (action.type === "failure") {
34
+ const stage = action.field ?? "api_key";
35
+ const value = stage === "base_url" ? state.baseUrl : stage === "model" ? state.model : state.apiKey;
36
+ return {
37
+ ...state,
38
+ stage,
39
+ editor: editorFor(value),
40
+ error: action.message,
41
+ };
42
+ }
43
+ if (action.type === "back") {
44
+ return previousStage(state);
45
+ }
46
+ if (action.type === "next") {
47
+ return nextStage(state);
48
+ }
49
+ return state;
50
+ }
51
+ function selectedProvider(state) {
52
+ return state.options[state.selectedIndex];
53
+ }
54
+ function providerConfiguration(state) {
55
+ const option = selectedProvider(state);
56
+ return {
57
+ provider: option.provider,
58
+ baseUrl: state.baseUrl,
59
+ model: state.model,
60
+ apiKey: state.apiKey,
61
+ };
62
+ }
63
+ function maskSecret(value) {
64
+ return splitGraphemes(value).map(() => "•").join("");
65
+ }
66
+ function isInputStage(stage) {
67
+ return stage === "base_url" || stage === "model" || stage === "api_key";
68
+ }
69
+ function nextStage(state) {
70
+ const option = selectedProvider(state);
71
+ if (state.stage === "provider") {
72
+ return {
73
+ ...state,
74
+ stage: "base_url",
75
+ baseUrl: option.base_url,
76
+ model: option.model,
77
+ apiKey: "",
78
+ editor: editorFor(option.base_url),
79
+ error: "",
80
+ };
81
+ }
82
+ const value = state.editor.value.trim();
83
+ if (state.stage === "base_url") {
84
+ if (!value) {
85
+ return { ...state, error: "Base URL is required." };
86
+ }
87
+ return {
88
+ ...state,
89
+ stage: "model",
90
+ baseUrl: value,
91
+ editor: editorFor(state.model),
92
+ error: "",
93
+ };
94
+ }
95
+ if (state.stage === "model") {
96
+ if (!value) {
97
+ return { ...state, error: "Model is required." };
98
+ }
99
+ return {
100
+ ...state,
101
+ stage: "api_key",
102
+ model: value,
103
+ editor: editorFor(state.apiKey),
104
+ error: "",
105
+ };
106
+ }
107
+ if (state.stage === "api_key") {
108
+ if (option.api_key_required && !value) {
109
+ return { ...state, error: "API key is required for this provider." };
110
+ }
111
+ return {
112
+ ...state,
113
+ stage: "saving",
114
+ apiKey: value,
115
+ editor: { value: "", cursor: 0 },
116
+ error: "",
117
+ };
118
+ }
119
+ return state;
120
+ }
121
+ function previousStage(state) {
122
+ if (state.stage === "base_url") {
123
+ return { ...state, stage: "provider", editor: editorFor(""), error: "" };
124
+ }
125
+ if (state.stage === "model") {
126
+ return { ...state, stage: "base_url", editor: editorFor(state.baseUrl), error: "" };
127
+ }
128
+ if (state.stage === "api_key" || state.stage === "saving") {
129
+ return { ...state, stage: "model", editor: editorFor(state.model), error: "" };
130
+ }
131
+ return state;
132
+ }
133
+ function editorFor(value) {
134
+ return { value, cursor: splitGraphemes(value).length };
135
+ }
136
+ function splitGraphemes(value) {
137
+ const segmenter = new Intl.Segmenter(undefined, { granularity: "grapheme" });
138
+ return Array.from(segmenter.segment(value), ({ segment }) => segment);
139
+ }