unique-sdk 2026.28.0.dev1__tar.gz → 2026.28.0.dev3__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 (85) hide show
  1. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/PKG-INFO +1 -1
  2. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/pyproject.toml +1 -1
  3. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/api_resources/_folder.py +50 -0
  4. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/cli/commands/files.py +20 -3
  5. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/README.md +0 -0
  6. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/__init__.py +0 -0
  7. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/_api_requestor.py +0 -0
  8. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/_api_resource.py +0 -0
  9. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/_api_version.py +0 -0
  10. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/_error.py +0 -0
  11. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/_http_client.py +0 -0
  12. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/_list_object.py +0 -0
  13. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/_object_classes.py +0 -0
  14. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/_request_options.py +0 -0
  15. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/_unique_object.py +0 -0
  16. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/_unique_ql.py +0 -0
  17. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/_unique_response.py +0 -0
  18. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/_util.py +0 -0
  19. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/_version.py +0 -0
  20. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/_webhook.py +0 -0
  21. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/api_resources/__init__.py +0 -0
  22. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/api_resources/_acronyms.py +0 -0
  23. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/api_resources/_agentic_table.py +0 -0
  24. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/api_resources/_analytics_order.py +0 -0
  25. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/api_resources/_benchmarking.py +0 -0
  26. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/api_resources/_briefing.py +0 -0
  27. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/api_resources/_chat_completion.py +0 -0
  28. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/api_resources/_content.py +0 -0
  29. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/api_resources/_dynamic_frontend.py +0 -0
  30. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/api_resources/_elicitation.py +0 -0
  31. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/api_resources/_embedding.py +0 -0
  32. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/api_resources/_event.py +0 -0
  33. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/api_resources/_group.py +0 -0
  34. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/api_resources/_integrated.py +0 -0
  35. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/api_resources/_llm_models.py +0 -0
  36. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/api_resources/_mcp.py +0 -0
  37. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/api_resources/_message.py +0 -0
  38. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/api_resources/_message_assessment.py +0 -0
  39. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/api_resources/_message_execution.py +0 -0
  40. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/api_resources/_message_log.py +0 -0
  41. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/api_resources/_message_tool.py +0 -0
  42. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/api_resources/_module.py +0 -0
  43. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/api_resources/_scheduled_task.py +0 -0
  44. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/api_resources/_search.py +0 -0
  45. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/api_resources/_search_string.py +0 -0
  46. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/api_resources/_short_term_memory.py +0 -0
  47. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/api_resources/_space.py +0 -0
  48. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/api_resources/_user.py +0 -0
  49. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/api_resources/_web_search.py +0 -0
  50. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/cli/__init__.py +0 -0
  51. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/cli/__main__.py +0 -0
  52. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/cli/cli.py +0 -0
  53. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/cli/commands/__init__.py +0 -0
  54. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/cli/commands/_citation_manifest.py +0 -0
  55. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/cli/commands/cite_file.py +0 -0
  56. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/cli/commands/dynamic_frontend.py +0 -0
  57. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/cli/commands/elicitation.py +0 -0
  58. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/cli/commands/folders.py +0 -0
  59. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/cli/commands/mcp.py +0 -0
  60. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/cli/commands/navigation.py +0 -0
  61. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/cli/commands/read.py +0 -0
  62. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/cli/commands/scheduled_tasks.py +0 -0
  63. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/cli/commands/search.py +0 -0
  64. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/cli/commands/subagent.py +0 -0
  65. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/cli/commands/web_search.py +0 -0
  66. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/cli/commands/web_search_config.py +0 -0
  67. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/cli/config.py +0 -0
  68. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/cli/formatting.py +0 -0
  69. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/cli/shell.py +0 -0
  70. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/cli/skills/unique-cli-dynamic-frontend/SKILL.md +0 -0
  71. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/cli/skills/unique-cli-elicitation/SKILL.md +0 -0
  72. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/cli/skills/unique-cli-file-management/SKILL.md +0 -0
  73. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/cli/skills/unique-cli-mcp/SKILL.md +0 -0
  74. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/cli/skills/unique-cli-scheduled-tasks/SKILL.md +0 -0
  75. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/cli/skills/unique-cli-search/SKILL.md +0 -0
  76. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/cli/skills/unique-cli-subagent/SKILL.md +0 -0
  77. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/cli/skills/unique-cli-web-search/SKILL.md +0 -0
  78. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/cli/state.py +0 -0
  79. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/utils/analytics_order_run.py +0 -0
  80. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/utils/benchmarking_run.py +0 -0
  81. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/utils/chat_history.py +0 -0
  82. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/utils/chat_in_space.py +0 -0
  83. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/utils/file_io.py +0 -0
  84. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/unique_sdk/utils/sources.py +0 -0
  85. {unique_sdk-2026.28.0.dev1 → unique_sdk-2026.28.0.dev3}/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.dev1
3
+ Version: 2026.28.0.dev3
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.dev1"
3
+ version = "2026.28.0.dev3"
4
4
  description = ""
5
5
  readme = "README.md"
6
6
  license = { text = "MIT" }
@@ -155,6 +155,18 @@ class Folder(APIResource["Folder"]):
155
155
  parentId: NotRequired[str]
156
156
  name: NotRequired[str]
157
157
 
158
+ class MoveParams(RequestOptions):
159
+ folderId: str
160
+ newParentId: str
161
+
162
+ class MoveResult(TypedDict):
163
+ scopeId: str
164
+ asyncMetadataRebuild: bool
165
+ jobId: NotRequired[str | None]
166
+ affectedFiles: NotRequired[int | None]
167
+ message: NotRequired[str | None]
168
+ object: Literal["folder-move"]
169
+
158
170
  class GetInfosParams(RequestOptions):
159
171
  """
160
172
  Parameters for getting multiple paginated folders by their parent Id.
@@ -556,6 +568,44 @@ class Folder(APIResource["Folder"]):
556
568
  ),
557
569
  )
558
570
 
571
+ @classmethod
572
+ def move(
573
+ cls,
574
+ user_id: str,
575
+ company_id: str,
576
+ **params: Unpack["Folder.MoveParams"],
577
+ ) -> "Folder.MoveResult":
578
+ folder_id = params.pop("folderId")
579
+ return cast(
580
+ "Folder.MoveResult",
581
+ cls._static_request(
582
+ "post",
583
+ f"{cls.RESOURCE_URL}/{folder_id}/move",
584
+ user_id,
585
+ company_id=company_id,
586
+ params=params,
587
+ ),
588
+ )
589
+
590
+ @classmethod
591
+ async def move_async(
592
+ cls,
593
+ user_id: str,
594
+ company_id: str,
595
+ **params: Unpack["Folder.MoveParams"],
596
+ ) -> "Folder.MoveResult":
597
+ folder_id = params.pop("folderId")
598
+ return cast(
599
+ "Folder.MoveResult",
600
+ await cls._static_request_async(
601
+ "post",
602
+ f"{cls.RESOURCE_URL}/{folder_id}/move",
603
+ user_id,
604
+ company_id=company_id,
605
+ params=params,
606
+ ),
607
+ )
608
+
559
609
  @classmethod
560
610
  def delete(
561
611
  cls,
@@ -13,6 +13,16 @@ from unique_sdk.cli.formatting import format_content_info
13
13
  from unique_sdk.cli.state import ShellState
14
14
  from unique_sdk.utils.file_io import download_content, upload_file
15
15
 
16
+ _SUPPORTED_UPLOAD_MIME_TYPES = {
17
+ ".pdf": "application/pdf",
18
+ ".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
19
+ ".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
20
+ ".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
21
+ ".txt": "text/plain",
22
+ ".html": "text/html",
23
+ ".md": "text/markdown",
24
+ }
25
+
16
26
 
17
27
  def _normalize_unique_file_path(cwd: str, path: str) -> str:
18
28
  """Normalize a Unique file path without allowing traversal above root."""
@@ -95,6 +105,15 @@ def _resolve_content_id(state: ShellState, name_or_id: str) -> tuple[str, str]:
95
105
  raise ValueError(f"File not found: {name_or_id}")
96
106
 
97
107
 
108
+ def _detect_upload_mime_type(path: Path) -> str:
109
+ mime_type = _SUPPORTED_UPLOAD_MIME_TYPES.get(path.suffix.lower())
110
+ if mime_type:
111
+ return mime_type
112
+
113
+ mime_type, _ = mimetypes.guess_type(str(path))
114
+ return mime_type or "application/octet-stream"
115
+
116
+
98
117
  def _format_version_value(value: Any) -> str:
99
118
  if value is None:
100
119
  return ""
@@ -215,9 +234,7 @@ def cmd_upload(
215
234
  destination,
216
235
  )
217
236
 
218
- mime_type, _ = mimetypes.guess_type(str(path))
219
- if not mime_type:
220
- mime_type = "application/octet-stream"
237
+ mime_type = _detect_upload_mime_type(path)
221
238
 
222
239
  result = upload_file(
223
240
  userId=state.config.user_id,