unique-sdk 2026.28.0.dev13__tar.gz → 2026.28.0.dev14__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 (86) hide show
  1. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/PKG-INFO +1 -1
  2. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/pyproject.toml +1 -1
  3. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/cli/commands/mcp.py +59 -6
  4. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/README.md +0 -0
  5. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/__init__.py +0 -0
  6. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/_api_requestor.py +0 -0
  7. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/_api_resource.py +0 -0
  8. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/_api_version.py +0 -0
  9. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/_error.py +0 -0
  10. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/_http_client.py +0 -0
  11. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/_list_object.py +0 -0
  12. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/_object_classes.py +0 -0
  13. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/_request_options.py +0 -0
  14. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/_unique_object.py +0 -0
  15. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/_unique_ql.py +0 -0
  16. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/_unique_response.py +0 -0
  17. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/_util.py +0 -0
  18. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/_version.py +0 -0
  19. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/_webhook.py +0 -0
  20. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/api_resources/__init__.py +0 -0
  21. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/api_resources/_acronyms.py +0 -0
  22. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/api_resources/_agentic_table.py +0 -0
  23. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/api_resources/_analytics_order.py +0 -0
  24. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/api_resources/_benchmarking.py +0 -0
  25. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/api_resources/_briefing.py +0 -0
  26. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/api_resources/_chat_completion.py +0 -0
  27. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/api_resources/_content.py +0 -0
  28. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/api_resources/_dynamic_frontend.py +0 -0
  29. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/api_resources/_elicitation.py +0 -0
  30. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/api_resources/_embedding.py +0 -0
  31. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/api_resources/_event.py +0 -0
  32. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/api_resources/_folder.py +0 -0
  33. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/api_resources/_group.py +0 -0
  34. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/api_resources/_integrated.py +0 -0
  35. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/api_resources/_llm_models.py +0 -0
  36. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/api_resources/_mcp.py +0 -0
  37. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/api_resources/_message.py +0 -0
  38. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/api_resources/_message_assessment.py +0 -0
  39. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/api_resources/_message_execution.py +0 -0
  40. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/api_resources/_message_log.py +0 -0
  41. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/api_resources/_message_tool.py +0 -0
  42. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/api_resources/_module.py +0 -0
  43. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/api_resources/_scheduled_task.py +0 -0
  44. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/api_resources/_search.py +0 -0
  45. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/api_resources/_search_string.py +0 -0
  46. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/api_resources/_short_term_memory.py +0 -0
  47. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/api_resources/_space.py +0 -0
  48. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/api_resources/_user.py +0 -0
  49. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/api_resources/_web_search.py +0 -0
  50. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/cli/__init__.py +0 -0
  51. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/cli/__main__.py +0 -0
  52. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/cli/cli.py +0 -0
  53. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/cli/commands/__init__.py +0 -0
  54. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/cli/commands/_citation_manifest.py +0 -0
  55. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/cli/commands/cite_file.py +0 -0
  56. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/cli/commands/dynamic_frontend.py +0 -0
  57. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/cli/commands/elicitation.py +0 -0
  58. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/cli/commands/files.py +0 -0
  59. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/cli/commands/folders.py +0 -0
  60. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/cli/commands/navigation.py +0 -0
  61. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/cli/commands/read.py +0 -0
  62. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/cli/commands/scheduled_tasks.py +0 -0
  63. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/cli/commands/search.py +0 -0
  64. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/cli/commands/subagent.py +0 -0
  65. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/cli/commands/web_search.py +0 -0
  66. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/cli/commands/web_search_config.py +0 -0
  67. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/cli/config.py +0 -0
  68. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/cli/formatting.py +0 -0
  69. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/cli/metadata_filter.py +0 -0
  70. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/cli/shell.py +0 -0
  71. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/cli/skills/unique-cli-dynamic-frontend/SKILL.md +0 -0
  72. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/cli/skills/unique-cli-elicitation/SKILL.md +0 -0
  73. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/cli/skills/unique-cli-file-management/SKILL.md +0 -0
  74. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/cli/skills/unique-cli-mcp/SKILL.md +0 -0
  75. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/cli/skills/unique-cli-scheduled-tasks/SKILL.md +0 -0
  76. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/cli/skills/unique-cli-search/SKILL.md +0 -0
  77. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/cli/skills/unique-cli-subagent/SKILL.md +0 -0
  78. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/cli/skills/unique-cli-web-search/SKILL.md +0 -0
  79. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/cli/state.py +0 -0
  80. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/utils/analytics_order_run.py +0 -0
  81. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/utils/benchmarking_run.py +0 -0
  82. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/utils/chat_history.py +0 -0
  83. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/utils/chat_in_space.py +0 -0
  84. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/utils/file_io.py +0 -0
  85. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/utils/sources.py +0 -0
  86. {unique_sdk-2026.28.0.dev13 → unique_sdk-2026.28.0.dev14}/unique_sdk/utils/token.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: unique-sdk
3
- Version: 2026.28.0.dev13
3
+ Version: 2026.28.0.dev14
4
4
  Summary:
5
5
  Author: Martin Fadler, Konstantin Krauss, Andreas Hauri
6
6
  Author-email: Martin Fadler <martin.fadler@unique.ch>, Konstantin Krauss <konstantin@unique.ch>, Andreas Hauri <andreas@unique.ch>
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "unique_sdk"
3
- version = "2026.28.0.dev13"
3
+ version = "2026.28.0.dev14"
4
4
  description = ""
5
5
  readme = "README.md"
6
6
  license = { text = "MIT" }
@@ -337,16 +337,25 @@ def _citation_footer(annotated: list[tuple[int, dict[str, Any]]]) -> str:
337
337
 
338
338
 
339
339
  def _append_mcp_output_manifest(
340
- name: str, text: str, *, server_name: str | None = None
340
+ name: str,
341
+ text: str,
342
+ *,
343
+ server_name: str | None = None,
344
+ output_path: Path | None = None,
341
345
  ) -> None:
342
346
  """Best-effort append of one MCP tool result to the per-turn manifest.
343
347
 
344
348
  Never raises: a manifest failure must not change what the agent sees as
345
349
  the tool result. The groundedness check simply does not fire for this
346
350
  call when the write fails.
351
+
352
+ ``output_path`` is the full path of the ``mcp-output.jsonl`` manifest. It
353
+ defaults to ``Path.cwd() / .unique / mcp-output.jsonl`` so the CLI flow
354
+ (where cwd is the agent workspace) is unchanged; callers that run outside
355
+ the workspace cwd (e.g. the in-process tools-mode proxy) pass it explicitly.
347
356
  """
348
357
  try:
349
- refs_log_path = Path.cwd() / _MCP_OUTPUT_LOG_RELATIVE_PATH
358
+ refs_log_path = output_path or (Path.cwd() / _MCP_OUTPUT_LOG_RELATIVE_PATH)
350
359
  _append_turn_refs_manifest_entry(
351
360
  refs_log_path,
352
361
  {
@@ -359,6 +368,47 @@ def _append_mcp_output_manifest(
359
368
  _LOGGER.warning("mcp: failed to append output manifest: %s", exc)
360
369
 
361
370
 
371
+ def record_mcp_citations(
372
+ response: Any,
373
+ *,
374
+ tool_name: str,
375
+ server_name: str | None,
376
+ unique_dir: Path,
377
+ formatted_text: str,
378
+ ) -> str:
379
+ """Write both per-turn MCP manifests under ``unique_dir`` and return the
380
+ ``[mcpsourceN]`` citation footer for the agent.
381
+
382
+ Shared by the ``unique-cli mcp`` skills flow (``cmd_mcp``) and the
383
+ in-process tools-mode proxy in assistants-core, so both write identical
384
+ manifests and footers. ``unique_dir`` is the workspace ``.unique`` directory
385
+ (its filenames are joined directly here — do not pass the workspace root).
386
+
387
+ - ``response`` is the raw ``unique_sdk.MCP`` result, used for citation
388
+ extraction (titles from ``resource_link`` names / JSON bodies).
389
+ - ``formatted_text`` is the source text the model actually saw for this
390
+ tool result, recorded as the hallucination groundedness context.
391
+
392
+ Best-effort and never raises: the underlying manifest writers swallow their
393
+ own errors, and ``_annotate_mcp_results_for_citations`` owns the per-turn
394
+ file lock — this function must stay lock-free to avoid a same-process flock
395
+ self-deadlock.
396
+ """
397
+ _append_mcp_output_manifest(
398
+ tool_name,
399
+ formatted_text,
400
+ server_name=server_name,
401
+ output_path=unique_dir / _MCP_OUTPUT_LOG_RELATIVE_PATH.name,
402
+ )
403
+ annotated = _annotate_mcp_results_for_citations(
404
+ response,
405
+ tool_name=tool_name,
406
+ server_name=server_name,
407
+ refs_log_path=unique_dir / _MCP_REFS_LOG_RELATIVE_PATH.name,
408
+ )
409
+ return _citation_footer(annotated)
410
+
411
+
362
412
  def _read_payload(
363
413
  payload: str | None,
364
414
  file: str | None,
@@ -440,8 +490,11 @@ def cmd_mcp(
440
490
  formatted = f"mcp: formatter error ({fmt_exc}); raw response:\n{fallback}"
441
491
 
442
492
  server_name = _server_name_from_tool(name) or getattr(response, "mcpServerId", None)
443
- _append_mcp_output_manifest(name, formatted, server_name=server_name)
444
- annotated = _annotate_mcp_results_for_citations(
445
- response, tool_name=name, server_name=server_name
493
+ footer = record_mcp_citations(
494
+ response,
495
+ tool_name=name,
496
+ server_name=server_name,
497
+ unique_dir=Path.cwd() / ".unique",
498
+ formatted_text=formatted,
446
499
  )
447
- return formatted + _citation_footer(annotated)
500
+ return formatted + footer