@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.
- package/README.md +353 -0
- package/npm/bin/kagent-serve.js +6 -0
- package/npm/bin/kagent.js +6 -0
- package/npm/lib/App.js +524 -0
- package/npm/lib/app-state.js +224 -0
- package/npm/lib/approval-choice.js +25 -0
- package/npm/lib/commands.js +59 -0
- package/npm/lib/editor.js +188 -0
- package/npm/lib/ink-runner.js +41 -0
- package/npm/lib/kagent-home.js +39 -0
- package/npm/lib/launcher.js +221 -0
- package/npm/lib/protocol.js +33 -0
- package/npm/lib/provider-setup.js +139 -0
- package/npm/lib/python-runner.js +892 -0
- package/npm/lib/runtime-client.js +390 -0
- package/npm/lib/terminal-input.js +127 -0
- package/npm/lib/terminal-text.js +19 -0
- package/npm/lib/terminal-width.js +14 -0
- package/npm/lib/transcript.js +227 -0
- package/npm/lib/ui-components.js +247 -0
- package/npm/lib/update-manager.js +334 -0
- package/package.json +39 -0
- package/pyproject.toml +55 -0
- package/src/kagent/__init__.py +90 -0
- package/src/kagent/cli/__init__.py +5 -0
- package/src/kagent/cli/__main__.py +6 -0
- package/src/kagent/cli/commands.py +112 -0
- package/src/kagent/cli/conversation.py +127 -0
- package/src/kagent/cli/interactive.py +841 -0
- package/src/kagent/cli/main.py +685 -0
- package/src/kagent/cli/memory.py +460 -0
- package/src/kagent/cli/pending_approval.py +169 -0
- package/src/kagent/cli/provider.py +27 -0
- package/src/kagent/cli/session_commands.py +401 -0
- package/src/kagent/cli/stdio_runtime.py +784 -0
- package/src/kagent/cli/trace.py +67 -0
- package/src/kagent/cli/ui.py +931 -0
- package/src/kagent/core/__init__.py +0 -0
- package/src/kagent/core/agent.py +296 -0
- package/src/kagent/core/faults.py +11 -0
- package/src/kagent/core/invariants.py +47 -0
- package/src/kagent/core/normalization.py +81 -0
- package/src/kagent/core/planning.py +48 -0
- package/src/kagent/core/state.py +73 -0
- package/src/kagent/core/summary.py +64 -0
- package/src/kagent/core/tools.py +196 -0
- package/src/kagent/core/trace.py +57 -0
- package/src/kagent/eval/__init__.py +11 -0
- package/src/kagent/eval/cases.py +229 -0
- package/src/kagent/eval/evaluator.py +216 -0
- package/src/kagent/integrations/__init__.py +3 -0
- package/src/kagent/integrations/audit.py +95 -0
- package/src/kagent/integrations/backends.py +131 -0
- package/src/kagent/integrations/memory.py +301 -0
- package/src/kagent/ops/__init__.py +0 -0
- package/src/kagent/ops/batch.py +156 -0
- package/src/kagent/ops/doctor.py +255 -0
- package/src/kagent/ops/metrics.py +214 -0
- package/src/kagent/ops/release_evidence.py +877 -0
- package/src/kagent/ops/release_manifest.py +142 -0
- package/src/kagent/ops/trace_replay.py +285 -0
- package/src/kagent/providers/__init__.py +7 -0
- package/src/kagent/providers/embeddings.py +187 -0
- package/src/kagent/providers/llm.py +770 -0
- package/src/kagent/py.typed +1 -0
- package/src/kagent/runtime/__init__.py +28 -0
- package/src/kagent/runtime/action_graph.py +543 -0
- package/src/kagent/runtime/agent.py +2089 -0
- package/src/kagent/runtime/approval.py +64 -0
- package/src/kagent/runtime/cancellation.py +64 -0
- package/src/kagent/runtime/checkpoint_state.py +146 -0
- package/src/kagent/runtime/checkpoint_storage.py +270 -0
- package/src/kagent/runtime/context.py +65 -0
- package/src/kagent/runtime/file_transaction.py +195 -0
- package/src/kagent/runtime/hooks.py +74 -0
- package/src/kagent/runtime/metadata.py +116 -0
- package/src/kagent/runtime/patch_checkpoints.py +385 -0
- package/src/kagent/runtime/policy.py +50 -0
- package/src/kagent/runtime/presentation.py +205 -0
- package/src/kagent/runtime/redaction.py +130 -0
- package/src/kagent/runtime/sandbox.py +331 -0
- package/src/kagent/runtime/skills.py +66 -0
- package/src/kagent/runtime/steering.py +56 -0
- package/src/kagent/runtime/steps.py +255 -0
- package/src/kagent/runtime/task_state.py +40 -0
- package/src/kagent/runtime/tools.py +3532 -0
- package/src/kagent/runtime/types.py +240 -0
- package/src/kagent/runtime/workspace.py +597 -0
- package/src/kagent/service/__init__.py +26 -0
- package/src/kagent/service/__main__.py +6 -0
- package/src/kagent/service/active_runs.py +178 -0
- package/src/kagent/service/cli.py +737 -0
- package/src/kagent/service/contract.py +2571 -0
- package/src/kagent/service/errors.py +71 -0
- package/src/kagent/service/idempotency.py +584 -0
- package/src/kagent/service/router.py +884 -0
- package/src/kagent/service/run.py +150 -0
- package/src/kagent/service/runtime.py +1915 -0
- package/src/kagent/service/runtime_approval.py +20 -0
- package/src/kagent/service/runtime_cancel.py +192 -0
- package/src/kagent/service/runtime_lifecycle.py +229 -0
- package/src/kagent/service/runtime_metadata.py +21 -0
- package/src/kagent/service/runtime_policy.py +115 -0
- package/src/kagent/service/runtime_recovery.py +573 -0
- package/src/kagent/service/runtime_resume.py +382 -0
- package/src/kagent/service/runtime_resume_claim.py +116 -0
- package/src/kagent/service/runtime_run.py +350 -0
- package/src/kagent/service/runtime_status.py +2007 -0
- package/src/kagent/service/safety.py +139 -0
- package/src/kagent/service/server.py +114 -0
- package/src/kagent/service/status.py +233 -0
- package/src/kagent/service/trace_store.py +322 -0
- package/src/kagent/service/transport.py +24 -0
- package/src/kagent/utils/__init__.py +0 -0
- package/src/kagent/utils/config_validation.py +21 -0
- package/src/kagent/utils/json_output.py +23 -0
- package/src/kagent/utils/paths.py +473 -0
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
from kagent.cli.memory import (
|
|
6
|
+
RuntimeSessionMemory,
|
|
7
|
+
compact_runtime_session_memory,
|
|
8
|
+
redact_runtime_session_memory_text,
|
|
9
|
+
)
|
|
10
|
+
from kagent.cli.ui import join_non_empty, summarize_runtime_output
|
|
11
|
+
|
|
12
|
+
RUNTIME_MEMORY_MAX_TURNS = 12
|
|
13
|
+
_MEMORY_MAX_CHARS = 4000
|
|
14
|
+
_MEMORY_RECENT_TURNS = 6
|
|
15
|
+
_MEMORY_SUMMARY_CHARS = 2400
|
|
16
|
+
_MEMORY_MAX_FACTS = 16
|
|
17
|
+
_MEMORY_MAX_OPEN_ITEMS = 16
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def runtime_goal_with_memory(
|
|
21
|
+
goal: str,
|
|
22
|
+
session_memory: RuntimeSessionMemory,
|
|
23
|
+
) -> str:
|
|
24
|
+
if not session_memory:
|
|
25
|
+
return goal
|
|
26
|
+
memory_lines = _runtime_compact_memory_lines(session_memory)
|
|
27
|
+
recent_lines = []
|
|
28
|
+
for turn in session_memory.turns[-RUNTIME_MEMORY_MAX_TURNS:]:
|
|
29
|
+
user = _compact_runtime_memory_text(turn.get("user", ""))
|
|
30
|
+
assistant = _compact_runtime_memory_text(turn.get("assistant", ""))
|
|
31
|
+
if user:
|
|
32
|
+
recent_lines.append(f"User: {user}")
|
|
33
|
+
if assistant:
|
|
34
|
+
recent_lines.append(f"Assistant: {assistant}")
|
|
35
|
+
if recent_lines:
|
|
36
|
+
memory_lines.append("Recent turns:")
|
|
37
|
+
memory_lines.extend(recent_lines)
|
|
38
|
+
memory_text = "\n".join(memory_lines)
|
|
39
|
+
if len(memory_text) > _MEMORY_MAX_CHARS:
|
|
40
|
+
memory_text = memory_text[-_MEMORY_MAX_CHARS:]
|
|
41
|
+
return (
|
|
42
|
+
"Compacted conversation memory from this interactive session:\n"
|
|
43
|
+
f"{memory_text}\n\n"
|
|
44
|
+
"Use the memory above to resolve references, user identity, prior "
|
|
45
|
+
"requests, and follow-up questions. Answer the current user message; "
|
|
46
|
+
"do not answer as if the user is asking about the model identity unless "
|
|
47
|
+
"they explicitly ask who the assistant/model is.\n\n"
|
|
48
|
+
"Current user message:\n"
|
|
49
|
+
f"{goal}"
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def remember_runtime_turn(
|
|
54
|
+
session_memory: RuntimeSessionMemory,
|
|
55
|
+
goal: str,
|
|
56
|
+
payload: Any,
|
|
57
|
+
) -> None:
|
|
58
|
+
if not isinstance(payload, dict):
|
|
59
|
+
return
|
|
60
|
+
answer = str(payload.get("answer", "")).strip()
|
|
61
|
+
if not answer:
|
|
62
|
+
answer = _runtime_memory_answer_from_observations(payload.get("observations"))
|
|
63
|
+
session_memory.append(
|
|
64
|
+
{
|
|
65
|
+
"user": _compact_runtime_memory_text(goal),
|
|
66
|
+
"assistant": _compact_runtime_memory_text(answer),
|
|
67
|
+
}
|
|
68
|
+
)
|
|
69
|
+
compact_runtime_conversation_memory(session_memory)
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def compact_runtime_conversation_memory(
|
|
73
|
+
session_memory: RuntimeSessionMemory,
|
|
74
|
+
) -> int:
|
|
75
|
+
"""Compact a runtime conversation using the same limits as automatic memory."""
|
|
76
|
+
before_count = session_memory.compacted_turn_count
|
|
77
|
+
compact_runtime_session_memory(
|
|
78
|
+
session_memory,
|
|
79
|
+
max_recent_turns=_MEMORY_RECENT_TURNS,
|
|
80
|
+
max_summary_chars=_MEMORY_SUMMARY_CHARS,
|
|
81
|
+
max_facts=_MEMORY_MAX_FACTS,
|
|
82
|
+
max_open_items=_MEMORY_MAX_OPEN_ITEMS,
|
|
83
|
+
)
|
|
84
|
+
return session_memory.compacted_turn_count - before_count
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def _runtime_compact_memory_lines(session_memory: RuntimeSessionMemory) -> list[str]:
|
|
88
|
+
lines = []
|
|
89
|
+
if session_memory.summary:
|
|
90
|
+
lines.append("Summary:")
|
|
91
|
+
lines.extend(f" {line}" for line in session_memory.summary.splitlines() if line)
|
|
92
|
+
if session_memory.facts:
|
|
93
|
+
lines.append("Durable facts:")
|
|
94
|
+
lines.extend(f" - {fact}" for fact in session_memory.facts)
|
|
95
|
+
if session_memory.open_items:
|
|
96
|
+
lines.append("Open items:")
|
|
97
|
+
lines.extend(f" - {item}" for item in session_memory.open_items)
|
|
98
|
+
return lines
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def _runtime_memory_answer_from_observations(observations: Any) -> str:
|
|
102
|
+
if not isinstance(observations, list):
|
|
103
|
+
return ""
|
|
104
|
+
snippets = []
|
|
105
|
+
for observation in observations[-3:]:
|
|
106
|
+
if not isinstance(observation, dict):
|
|
107
|
+
continue
|
|
108
|
+
tool = str(observation.get("tool", "")).strip()
|
|
109
|
+
status = str(observation.get("status", "")).strip()
|
|
110
|
+
output_summary = summarize_runtime_output(observation.get("output"))
|
|
111
|
+
snippets.append(join_non_empty([tool, status, output_summary], " "))
|
|
112
|
+
return "; ".join(snippet for snippet in snippets if snippet)
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def _compact_runtime_memory_text(text: str) -> str:
|
|
116
|
+
compact = " ".join(redact_runtime_session_memory_text(str(text)).split())
|
|
117
|
+
if len(compact) > 500:
|
|
118
|
+
return compact[:497] + "..."
|
|
119
|
+
return compact
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
__all__ = [
|
|
123
|
+
"RUNTIME_MEMORY_MAX_TURNS",
|
|
124
|
+
"compact_runtime_conversation_memory",
|
|
125
|
+
"remember_runtime_turn",
|
|
126
|
+
"runtime_goal_with_memory",
|
|
127
|
+
]
|