unique-sdk 2026.38.0.dev3__tar.gz → 2026.38.0.dev5__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 (89) hide show
  1. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/PKG-INFO +1 -1
  2. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/pyproject.toml +1 -1
  3. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/api_resources/_content.py +11 -2
  4. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/cli/skills/unique-cli-elicitation/SKILL.md +11 -2
  5. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/README.md +0 -0
  6. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/__init__.py +0 -0
  7. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/_api_requestor.py +0 -0
  8. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/_api_resource.py +0 -0
  9. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/_api_version.py +0 -0
  10. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/_error.py +0 -0
  11. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/_http_client.py +0 -0
  12. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/_list_object.py +0 -0
  13. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/_object_classes.py +0 -0
  14. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/_request_options.py +0 -0
  15. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/_unique_object.py +0 -0
  16. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/_unique_ql.py +0 -0
  17. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/_unique_response.py +0 -0
  18. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/_util.py +0 -0
  19. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/_version.py +0 -0
  20. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/_webhook.py +0 -0
  21. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/api_resources/__init__.py +0 -0
  22. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/api_resources/_acronyms.py +0 -0
  23. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/api_resources/_agentic_table.py +0 -0
  24. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/api_resources/_analytics_order.py +0 -0
  25. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/api_resources/_benchmarking.py +0 -0
  26. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/api_resources/_briefing.py +0 -0
  27. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/api_resources/_chat_completion.py +0 -0
  28. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/api_resources/_elicitation.py +0 -0
  29. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/api_resources/_embedding.py +0 -0
  30. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/api_resources/_event.py +0 -0
  31. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/api_resources/_folder.py +0 -0
  32. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/api_resources/_group.py +0 -0
  33. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/api_resources/_integrated.py +0 -0
  34. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/api_resources/_llm_models.py +0 -0
  35. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/api_resources/_mcp.py +0 -0
  36. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/api_resources/_message.py +0 -0
  37. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/api_resources/_message_assessment.py +0 -0
  38. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/api_resources/_message_execution.py +0 -0
  39. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/api_resources/_message_log.py +0 -0
  40. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/api_resources/_message_tool.py +0 -0
  41. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/api_resources/_module.py +0 -0
  42. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/api_resources/_scheduled_task.py +0 -0
  43. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/api_resources/_search.py +0 -0
  44. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/api_resources/_search_string.py +0 -0
  45. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/api_resources/_short_term_memory.py +0 -0
  46. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/api_resources/_space.py +0 -0
  47. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/api_resources/_user.py +0 -0
  48. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/api_resources/_web_search.py +0 -0
  49. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/cli/__init__.py +0 -0
  50. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/cli/__main__.py +0 -0
  51. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/cli/cli.py +0 -0
  52. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/cli/commands/__init__.py +0 -0
  53. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/cli/commands/_citation_manifest.py +0 -0
  54. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/cli/commands/agentic_table.py +0 -0
  55. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/cli/commands/agentic_table_write.py +0 -0
  56. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/cli/commands/browser.py +0 -0
  57. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/cli/commands/cite_file.py +0 -0
  58. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/cli/commands/elicitation.py +0 -0
  59. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/cli/commands/files.py +0 -0
  60. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/cli/commands/folders.py +0 -0
  61. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/cli/commands/mcp.py +0 -0
  62. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/cli/commands/navigation.py +0 -0
  63. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/cli/commands/read.py +0 -0
  64. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/cli/commands/scheduled_tasks.py +0 -0
  65. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/cli/commands/search.py +0 -0
  66. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/cli/commands/subagent.py +0 -0
  67. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/cli/commands/web_search.py +0 -0
  68. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/cli/commands/web_search_config.py +0 -0
  69. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/cli/config.py +0 -0
  70. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/cli/formatting.py +0 -0
  71. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/cli/identity.py +0 -0
  72. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/cli/metadata_filter.py +0 -0
  73. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/cli/shell.py +0 -0
  74. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/cli/skills/unique-cli-agentic-table/SKILL.md +0 -0
  75. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/cli/skills/unique-cli-file-management/SKILL.md +0 -0
  76. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/cli/skills/unique-cli-mcp/SKILL.md +0 -0
  77. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/cli/skills/unique-cli-scheduled-tasks/SKILL.md +0 -0
  78. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/cli/skills/unique-cli-search/SKILL.md +0 -0
  79. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/cli/skills/unique-cli-subagent/SKILL.md +0 -0
  80. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/cli/skills/unique-cli-uploaded-search/SKILL.md +0 -0
  81. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/cli/skills/unique-cli-web-search/SKILL.md +0 -0
  82. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/cli/state.py +0 -0
  83. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/utils/analytics_order_run.py +0 -0
  84. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/utils/benchmarking_run.py +0 -0
  85. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/utils/chat_history.py +0 -0
  86. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/utils/chat_in_space.py +0 -0
  87. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/utils/file_io.py +0 -0
  88. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/unique_sdk/utils/sources.py +0 -0
  89. {unique_sdk-2026.38.0.dev3 → unique_sdk-2026.38.0.dev5}/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.38.0.dev3
3
+ Version: 2026.38.0.dev5
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.38.0.dev3"
3
+ version = "2026.38.0.dev5"
4
4
  description = ""
5
5
  readme = "README.md"
6
6
  license = { text = "MIT" }
@@ -227,6 +227,7 @@ class Content(APIResource["Content"]):
227
227
  class UpdateIngestionStateParams(RequestOptions):
228
228
  contentId: str
229
229
  ingestionState: str
230
+ chatId: NotRequired[str | None]
230
231
 
231
232
  class Chunk(TypedDict):
232
233
  id: str
@@ -743,6 +744,10 @@ class Content(APIResource["Content"]):
743
744
  ) -> "Content.ContentInfo":
744
745
  content_id = params.get("contentId")
745
746
  ingestion_state = params.get("ingestionState")
747
+ chat_id = params.get("chatId")
748
+ request_params = {"ingestionState": ingestion_state}
749
+ if chat_id is not None:
750
+ request_params["chatId"] = chat_id
746
751
 
747
752
  return cast(
748
753
  "Content.ContentInfo",
@@ -751,7 +756,7 @@ class Content(APIResource["Content"]):
751
756
  f"/content/{content_id}/ingestion-state",
752
757
  user_id,
753
758
  company_id,
754
- params={"ingestionState": ingestion_state},
759
+ params=request_params,
755
760
  ),
756
761
  )
757
762
 
@@ -764,6 +769,10 @@ class Content(APIResource["Content"]):
764
769
  ) -> "Content.ContentInfo":
765
770
  content_id = params.get("contentId")
766
771
  ingestion_state = params.get("ingestionState")
772
+ chat_id = params.get("chatId")
773
+ request_params = {"ingestionState": ingestion_state}
774
+ if chat_id is not None:
775
+ request_params["chatId"] = chat_id
767
776
 
768
777
  return cast(
769
778
  "Content.ContentInfo",
@@ -772,7 +781,7 @@ class Content(APIResource["Content"]):
772
781
  f"/content/{content_id}/ingestion-state",
773
782
  user_id,
774
783
  company_id,
775
- params={"ingestionState": ingestion_state},
784
+ params=request_params,
776
785
  ),
777
786
  )
778
787
 
@@ -251,6 +251,13 @@ unique-cli elicit ask "Permanently delete /Archive/2024 and everything inside it
251
251
 
252
252
  Proceed **only** if the `Status:` is `ACCEPTED`. Treat `DECLINED`, `REJECTED`, `CANCELLED`, or `EXPIRED` all as "do not proceed" -- tell the user you stopped and return control. Put everything the user needs to decide into the message text, since the form has no fields.
253
253
 
254
+ Confirm on a form with fields is the same consent. If you still need inputs
255
+ (e.g. which folder to delete), ask for them and state the consequence in the
256
+ same `elicit ask` message, then act on `ACCEPTED` -- do not add a checkbox for
257
+ the consent. Only split into a second, empty-schema confirmation when the
258
+ consequence depends on the answers and the user should see it before you act
259
+ (e.g. "Archive/2024 holds 1,234 files, 3 shared with other teams").
260
+
254
261
  ### Structured form (multiple fields)
255
262
 
256
263
  ```bash
@@ -262,7 +269,7 @@ unique-cli elicit ask "Please provide report settings" \
262
269
  "quarter": {"type": "string", "enum": ["Q1", "Q2", "Q3", "Q4"]},
263
270
  "year": {"type": "integer", "minimum": 2000, "maximum": 2100},
264
271
  "recipients":{"type": "array", "items": {"type": "string", "format": "email"}},
265
- "include_appendix": {"type": "boolean"}
272
+ "include_appendix": {"type": "boolean", "title": "Include appendix"}
266
273
  },
267
274
  "required": ["quarter", "year"]
268
275
  }'
@@ -382,7 +389,9 @@ esac
382
389
 
383
390
  - Always set `"required"` for fields you actually need -- this guarantees the user cannot submit an empty form.
384
391
  - Use `enum` for closed choices so the UI can render a selector.
385
- - For pure yes/no confirmations use an **empty-properties schema** (`{"type": "object", "properties": {}}`) and gate on `Status: ACCEPTED` — never add a boolean `confirm` field (the Confirm button and the checkbox are two separate signals that can disagree). Reserve `"type": "boolean"` for genuine data fields where `false` is a valid answer the user can still submit with Confirm (e.g. `include_appendix`).
392
+ - The Confirm button is the consent, on any form. Never add a boolean `confirm` or `acknowledge` field (the button and the checkbox are two separate signals that can disagree); put the consequence in the message text instead. When there is nothing else to ask, use an **empty-properties schema** (`{"type": "object", "properties": {}}`) and gate on `Status: ACCEPTED`. Reserve `"type": "boolean"` for genuine data fields where `false` is a valid answer the user can still submit with Confirm (e.g. `include_appendix`).
393
+ - `"required"` on a boolean means "must be answered", not "must be ticked". An unchecked box is a valid `false` and the form submits with it; there is no way to force a checkbox on.
394
+ - Always give booleans a `"title"`. The checkbox label and its required marker come from `title`; with only a `description` the box renders unlabelled.
386
395
  - Add short `description` strings -- they are shown as help text next to each field.
387
396
  - Keep schemas small. Ask at most 5 questions in a single elicitation; if you need more, split the flow so the user is not confused by an oversized form.
388
397