akernel-runtime 0.1.6__tar.gz → 0.1.7__tar.gz

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 (97) hide show
  1. akernel_runtime-0.1.7/.github/release-notes/v0.1.7.md +32 -0
  2. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/CHANGELOG.md +10 -0
  3. {akernel_runtime-0.1.6/src/akernel_runtime.egg-info → akernel_runtime-0.1.7}/PKG-INFO +2 -1
  4. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/packages/npm/akernel/package.json +1 -1
  5. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/pyproject.toml +2 -2
  6. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7/src/akernel_runtime.egg-info}/PKG-INFO +2 -1
  7. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/src/akernel_runtime.egg-info/SOURCES.txt +1 -0
  8. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/src/akernel_runtime.egg-info/requires.txt +1 -0
  9. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/src/context_kernel/__init__.py +1 -1
  10. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/src/context_kernel/cli.py +69 -18
  11. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/tests/test_runtime.py +14 -1
  12. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/.env.example +0 -0
  13. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  14. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  15. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/.github/pull_request_template.md +0 -0
  16. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/.github/release-notes/v0.1.0.md +0 -0
  17. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/.github/release-notes/v0.1.1.md +0 -0
  18. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/.github/release-notes/v0.1.2.md +0 -0
  19. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/.github/release-notes/v0.1.3.md +0 -0
  20. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/.github/release-notes/v0.1.4.md +0 -0
  21. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/.github/release-notes/v0.1.5.md +0 -0
  22. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/.github/release-notes/v0.1.6.md +0 -0
  23. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/.github/workflows/ci.yml +0 -0
  24. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/.github/workflows/release.yml +0 -0
  25. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/CODE_OF_CONDUCT.md +0 -0
  26. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/CONTRIBUTING.md +0 -0
  27. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/LICENSE +0 -0
  28. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/MANIFEST.in +0 -0
  29. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/NOTICE +0 -0
  30. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/README.md +0 -0
  31. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/SECURITY.md +0 -0
  32. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/docs/00-vision.md +0 -0
  33. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/docs/01-architecture.md +0 -0
  34. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/docs/02-execution-plan.md +0 -0
  35. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/docs/03-cli-mvp.md +0 -0
  36. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/docs/04-evaluation.md +0 -0
  37. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/docs/05-local-wake.md +0 -0
  38. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/docs/06-skill-compiler.md +0 -0
  39. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/docs/07-release-and-ci.md +0 -0
  40. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/docs/08-open-source-plan.md +0 -0
  41. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/docs/09-product-roadmap.md +0 -0
  42. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/docs/10-benchmark-evidence.md +0 -0
  43. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/docs/11-publishing-setup.md +0 -0
  44. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/examples/benchmarks/phase2/01-routing.json +0 -0
  45. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/examples/benchmarks/phase2/02-memory.json +0 -0
  46. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/examples/benchmarks/phase2/03-budget-profiles.json +0 -0
  47. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/examples/benchmarks/scale/01-context-pressure.json +0 -0
  48. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/examples/benchmarks/scale/02-agent-editing.json +0 -0
  49. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/examples/benchmarks/scale/03-global-memory-marketplace.json +0 -0
  50. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/examples/evals/phase2.json +0 -0
  51. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/examples/marketplace/skills/index.json +0 -0
  52. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/examples/skills/context_budget.json +0 -0
  53. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/examples/skills/edit_file.json +0 -0
  54. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/examples/skills/markdown/context_budget.md +0 -0
  55. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/packages/npm/akernel/README.md +0 -0
  56. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/packages/npm/akernel/bin/akernel.js +0 -0
  57. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/scripts/install_remote.ps1 +0 -0
  58. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/scripts/release_check.ps1 +0 -0
  59. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/setup.cfg +0 -0
  60. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/setup.cmd +0 -0
  61. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/setup.ps1 +0 -0
  62. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/src/akernel_runtime.egg-info/dependency_links.txt +0 -0
  63. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/src/akernel_runtime.egg-info/entry_points.txt +0 -0
  64. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/src/akernel_runtime.egg-info/top_level.txt +0 -0
  65. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/src/context_kernel/__main__.py +0 -0
  66. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/src/context_kernel/agent_reports.py +0 -0
  67. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/src/context_kernel/benchmarks.py +0 -0
  68. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/src/context_kernel/budget.py +0 -0
  69. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/src/context_kernel/context.py +0 -0
  70. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/src/context_kernel/evals.py +0 -0
  71. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/src/context_kernel/global_memory.py +0 -0
  72. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/src/context_kernel/loop.py +0 -0
  73. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/src/context_kernel/marketplace.py +0 -0
  74. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/src/context_kernel/marketplace_data/skills/context_budget.json +0 -0
  75. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/src/context_kernel/marketplace_data/skills/context_compaction.json +0 -0
  76. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/src/context_kernel/marketplace_data/skills/edit_file.json +0 -0
  77. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/src/context_kernel/marketplace_data/skills/index.json +0 -0
  78. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/src/context_kernel/marketplace_data/skills/long_task_planning.json +0 -0
  79. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/src/context_kernel/marketplace_data/skills/multi_file_bugfix.json +0 -0
  80. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/src/context_kernel/memory.py +0 -0
  81. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/src/context_kernel/models.py +0 -0
  82. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/src/context_kernel/planner.py +0 -0
  83. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/src/context_kernel/policy.py +0 -0
  84. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/src/context_kernel/project.py +0 -0
  85. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/src/context_kernel/providers.py +0 -0
  86. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/src/context_kernel/report_costs.py +0 -0
  87. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/src/context_kernel/runner.py +0 -0
  88. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/src/context_kernel/skills.py +0 -0
  89. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/src/context_kernel/state_writer.py +0 -0
  90. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/src/context_kernel/storage.py +0 -0
  91. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/src/context_kernel/tasks.py +0 -0
  92. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/src/context_kernel/text.py +0 -0
  93. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/src/context_kernel/tokenizer.py +0 -0
  94. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/src/context_kernel/tools.py +0 -0
  95. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/src/context_kernel/verifier.py +0 -0
  96. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/wake.cmd +0 -0
  97. {akernel_runtime-0.1.6 → akernel_runtime-0.1.7}/wake.ps1 +0 -0
@@ -0,0 +1,32 @@
1
+ # Context Kernel v0.1.7
2
+
3
+ This release adds real-time interactive completions to `akernel`.
4
+
5
+ ## Install
6
+
7
+ Python:
8
+
9
+ ```powershell
10
+ python -m pip install --user --upgrade akernel-runtime
11
+ akernel setup
12
+ akernel
13
+ ```
14
+
15
+ npm launcher:
16
+
17
+ ```powershell
18
+ npm install -g @context-akernel/akernel
19
+ akernel setup
20
+ akernel
21
+ ```
22
+
23
+ ## Highlights
24
+
25
+ - Typing `/` now opens command completions such as `/help`, `/status`, `/model`, and `/cost`.
26
+ - Typing `@` now opens workspace file completions for attaching files.
27
+ - Non-interactive shells and scripts still fall back to standard `input()` behavior.
28
+
29
+ ## Verification
30
+
31
+ - Added completion unit coverage for slash commands and `@` file candidates.
32
+ - Ran the full Python test suite.
@@ -8,6 +8,16 @@ The project follows a pragmatic pre-1.0 changelog: breaking changes may occur, b
8
8
 
9
9
  No changes yet.
10
10
 
11
+ ## 0.1.7 - 2026-05-14
12
+
13
+ ### Added
14
+
15
+ - Added real-time chat input completions for slash commands and `@` workspace file search.
16
+
17
+ ### Changed
18
+
19
+ - Added `prompt_toolkit` as the interactive input dependency, with automatic fallback to native `input()` in non-interactive terminals.
20
+
11
21
  ## 0.1.6 - 2026-05-14
12
22
 
13
23
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: akernel-runtime
3
- Version: 0.1.6
3
+ Version: 0.1.7
4
4
  Summary: Agent Kernel: a CLI-first context-native agent runtime prototype.
5
5
  Author: Context Kernel contributors
6
6
  License-Expression: Apache-2.0
@@ -20,6 +20,7 @@ Requires-Python: >=3.10
20
20
  Description-Content-Type: text/markdown
21
21
  License-File: LICENSE
22
22
  License-File: NOTICE
23
+ Requires-Dist: prompt_toolkit>=3.0.43
23
24
  Provides-Extra: dev
24
25
  Requires-Dist: build>=1.2; extra == "dev"
25
26
  Requires-Dist: twine>=5.0; extra == "dev"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@context-akernel/akernel",
3
- "version": "0.1.6",
3
+ "version": "0.1.7",
4
4
  "description": "npm launcher wrapper for the Context Kernel akernel CLI.",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://github.com/huanxin0825-ctrl/context-akernel#readme",
@@ -4,13 +4,13 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "akernel-runtime"
7
- version = "0.1.6"
7
+ version = "0.1.7"
8
8
  description = "Agent Kernel: a CLI-first context-native agent runtime prototype."
9
9
  readme = "README.md"
10
10
  license = "Apache-2.0"
11
11
  license-files = ["LICENSE", "NOTICE"]
12
12
  requires-python = ">=3.10"
13
- dependencies = []
13
+ dependencies = ["prompt_toolkit>=3.0.43"]
14
14
  keywords = ["agent", "cli", "context", "llm", "token-budget"]
15
15
  authors = [
16
16
  { name = "Context Kernel contributors" },
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: akernel-runtime
3
- Version: 0.1.6
3
+ Version: 0.1.7
4
4
  Summary: Agent Kernel: a CLI-first context-native agent runtime prototype.
5
5
  Author: Context Kernel contributors
6
6
  License-Expression: Apache-2.0
@@ -20,6 +20,7 @@ Requires-Python: >=3.10
20
20
  Description-Content-Type: text/markdown
21
21
  License-File: LICENSE
22
22
  License-File: NOTICE
23
+ Requires-Dist: prompt_toolkit>=3.0.43
23
24
  Provides-Extra: dev
24
25
  Requires-Dist: build>=1.2; extra == "dev"
25
26
  Requires-Dist: twine>=5.0; extra == "dev"
@@ -22,6 +22,7 @@ wake.ps1
22
22
  .github/release-notes/v0.1.4.md
23
23
  .github/release-notes/v0.1.5.md
24
24
  .github/release-notes/v0.1.6.md
25
+ .github/release-notes/v0.1.7.md
25
26
  .github/workflows/ci.yml
26
27
  .github/workflows/release.yml
27
28
  docs/00-vision.md
@@ -1,3 +1,4 @@
1
+ prompt_toolkit>=3.0.43
1
2
 
2
3
  [dev]
3
4
  build>=1.2
@@ -1,3 +1,3 @@
1
1
  """Context Kernel CLI-first agent runtime prototype."""
2
2
 
3
- __version__ = "0.1.6"
3
+ __version__ = "0.1.7"
@@ -43,6 +43,22 @@ from .verifier import verify_trace
43
43
 
44
44
  DEFAULT_PRIMARY_MODEL = "gpt-5.5"
45
45
  DEFAULT_AUXILIARY_MODEL = "gpt-5.3-codex"
46
+ CHAT_COMMANDS: list[tuple[str, str]] = [
47
+ ("/help", "show command palette"),
48
+ ("/status", "show workspace and runtime status"),
49
+ ("/model", "show primary and auxiliary model roles"),
50
+ ("/config", "show setup and environment guidance"),
51
+ ("/compact", "show compact task brief"),
52
+ ("/paste", "enter a multi-line task"),
53
+ ("/task", "print current task session JSON"),
54
+ ("/runs", "list recent agent runs"),
55
+ ("/cost", "print last run cost report"),
56
+ ("/up", "show older transcript lines"),
57
+ ("/down", "move back toward latest messages"),
58
+ ("/latest", "jump to latest messages"),
59
+ ("/clear", "clear transcript"),
60
+ ("/exit", "leave interactive session"),
61
+ ]
46
62
  OPENAI_ENV_KEYS = {
47
63
  "api_key": "AKERNEL_OPENAI_API_KEY",
48
64
  "base_url": "AKERNEL_OPENAI_BASE_URL",
@@ -1075,7 +1091,7 @@ def cmd_chat(args: argparse.Namespace) -> None:
1075
1091
  print_chat_header(workspace, task_id, args)
1076
1092
  while True:
1077
1093
  try:
1078
- request = input(chat_prompt(args)).strip()
1094
+ request = read_chat_input(chat_prompt(args), workspace).strip()
1079
1095
  except EOFError:
1080
1096
  print("")
1081
1097
  break
@@ -1236,7 +1252,7 @@ def run_chat_loop_tui(
1236
1252
  render_chat_tui_screen(workspace, task_id, args, transcript, last_report, pending_context, status="ready", state=state, clear=use_alt_screen)
1237
1253
  while True:
1238
1254
  try:
1239
- request = input(tui_prompt(args)).strip()
1255
+ request = read_chat_input(tui_prompt(args), workspace).strip()
1240
1256
  except EOFError:
1241
1257
  break
1242
1258
  except KeyboardInterrupt:
@@ -1392,27 +1408,62 @@ def capture_chat_output(func: Any) -> str:
1392
1408
 
1393
1409
  def format_chat_help_text() -> str:
1394
1410
  rows = [
1395
- ("/help", "show this command palette"),
1396
- ("/status", "show workspace and runtime status"),
1397
- ("/model", "show primary and auxiliary model roles"),
1398
- ("/config", "show setup and environment guidance"),
1399
- ("/compact", "show the compact task brief used for resume context"),
1400
- ("/paste", "enter a multi-line task; finish with /end"),
1401
- ("@path", "attach a workspace file to the next task"),
1402
- ("!command", "run a policy-checked command and attach its summary"),
1403
- ("/task", "print the current task session JSON"),
1404
- ("/runs", "list recent agent runs"),
1405
- ("/cost", "print the last agent run cost report"),
1406
- ("/up", "show older transcript lines in the viewport"),
1407
- ("/down", "move the viewport back toward latest messages"),
1408
- ("/latest", "jump to the newest transcript lines"),
1409
- ("/clear", "clear the transcript"),
1410
- ("/exit", "leave the interactive session"),
1411
+ *CHAT_COMMANDS,
1411
1412
  ("@query", "search current workspace files; use @1, @2... to attach a listed match"),
1413
+ ("!command", "run a policy-checked command and attach its summary"),
1412
1414
  ]
1413
1415
  return "\n".join(f"{name:<10} {description}" for name, description in rows)
1414
1416
 
1415
1417
 
1418
+ def read_chat_input(prompt: str, workspace: Workspace) -> str:
1419
+ if not should_use_prompt_toolkit():
1420
+ return input(prompt)
1421
+ try:
1422
+ from prompt_toolkit import PromptSession
1423
+ from prompt_toolkit.completion import Completer, Completion
1424
+ from prompt_toolkit.formatted_text import ANSI
1425
+ from prompt_toolkit.shortcuts import CompleteStyle
1426
+ except ImportError:
1427
+ return input(prompt)
1428
+
1429
+ class ChatCompleter(Completer):
1430
+ def get_completions(self, document: Any, complete_event: Any) -> Any:
1431
+ text = document.text_before_cursor
1432
+ for value, description in chat_completion_items(workspace.root, text):
1433
+ yield Completion(value, start_position=-len(text), display=value, display_meta=description)
1434
+
1435
+ session = PromptSession(
1436
+ completer=ChatCompleter(),
1437
+ complete_while_typing=True,
1438
+ complete_in_thread=True,
1439
+ complete_style=CompleteStyle.MULTI_COLUMN,
1440
+ reserve_space_for_menu=6,
1441
+ )
1442
+ return session.prompt(ANSI(prompt))
1443
+
1444
+
1445
+ def should_use_prompt_toolkit() -> bool:
1446
+ if os.environ.get("AKERNEL_NO_COMPLETION"):
1447
+ return False
1448
+ return bool(sys.stdin.isatty() and sys.stdout.isatty())
1449
+
1450
+
1451
+ def chat_completion_items(root: Path, text: str, *, limit: int = 12) -> list[tuple[str, str]]:
1452
+ value = text.strip()
1453
+ if value.startswith("/"):
1454
+ query = value.casefold()
1455
+ return [
1456
+ (command, description)
1457
+ for command, description in CHAT_COMMANDS
1458
+ if command.casefold().startswith(query)
1459
+ ][:limit]
1460
+ if value.startswith("@"):
1461
+ query = value[1:].strip()
1462
+ matches = find_workspace_files(root, query, limit=limit)
1463
+ return [(f"@{path}", "attach file") for path in matches]
1464
+ return []
1465
+
1466
+
1416
1467
  def tui_prompt(args: argparse.Namespace) -> str:
1417
1468
  return chat_color("\nakernel", "cyan", bold=True) + chat_color(f" [{primary_model(args)}]", "dim") + "> "
1418
1469
 
@@ -10,7 +10,7 @@ from unittest.mock import patch
10
10
  from context_kernel.agent_reports import build_agent_cost_report, render_agent_cost_report
11
11
  from context_kernel.benchmarks import BenchmarkRunner, render_benchmark_evidence_markdown, render_benchmark_markdown
12
12
  from context_kernel.budget import allocate_budget
13
- from context_kernel.cli import build_chat_tui_screen, load_batch_patch_specs, main, print_agent_report
13
+ from context_kernel.cli import build_chat_tui_screen, chat_completion_items, load_batch_patch_specs, main, print_agent_report
14
14
  from context_kernel.context import ContextBuilder
15
15
  from context_kernel.evals import EvalRunner
16
16
  from context_kernel.global_memory import pull_global_memories, push_global_memories
@@ -1417,6 +1417,19 @@ class RuntimeTests(unittest.TestCase):
1417
1417
  self.assertIn("Attached File", output)
1418
1418
  self.assertIn("Mock agent response", output)
1419
1419
 
1420
+ def test_chat_completion_items_include_commands_and_files(self) -> None:
1421
+ with tempfile.TemporaryDirectory() as tmp:
1422
+ root = Path(tmp)
1423
+ (root / "README.md").write_text("demo", encoding="utf-8")
1424
+ (root / "src").mkdir()
1425
+ (root / "src" / "runtime.py").write_text("print('ok')", encoding="utf-8")
1426
+
1427
+ command_items = chat_completion_items(root, "/mo")
1428
+ file_items = chat_completion_items(root, "@run")
1429
+
1430
+ self.assertIn(("/model", "show primary and auxiliary model roles"), command_items)
1431
+ self.assertIn(("@src/runtime.py", "attach file"), file_items)
1432
+
1420
1433
  def test_tui_screen_surfaces_task_plan_and_command_strip(self) -> None:
1421
1434
  with tempfile.TemporaryDirectory() as tmp:
1422
1435
  workspace = Workspace(Path(tmp))
File without changes
File without changes