unique-sdk 2026.26.0.dev15__tar.gz → 2026.26.0.dev17__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.26.0.dev15 → unique_sdk-2026.26.0.dev17}/PKG-INFO +1 -1
  2. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/pyproject.toml +1 -1
  3. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/api_resources/_dynamic_frontend.py +18 -0
  4. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/cli/cli.py +25 -1
  5. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/cli/commands/dynamic_frontend.py +24 -0
  6. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/cli/skills/unique-cli-dynamic-frontend/SKILL.md +29 -5
  7. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/utils/file_io.py +5 -3
  8. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/README.md +0 -0
  9. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/__init__.py +0 -0
  10. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/_api_requestor.py +0 -0
  11. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/_api_resource.py +0 -0
  12. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/_api_version.py +0 -0
  13. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/_error.py +0 -0
  14. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/_http_client.py +0 -0
  15. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/_list_object.py +0 -0
  16. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/_object_classes.py +0 -0
  17. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/_request_options.py +0 -0
  18. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/_unique_object.py +0 -0
  19. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/_unique_ql.py +0 -0
  20. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/_unique_response.py +0 -0
  21. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/_util.py +0 -0
  22. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/_version.py +0 -0
  23. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/_webhook.py +0 -0
  24. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/api_resources/__init__.py +0 -0
  25. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/api_resources/_acronyms.py +0 -0
  26. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/api_resources/_agentic_table.py +0 -0
  27. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/api_resources/_analytics_order.py +0 -0
  28. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/api_resources/_benchmarking.py +0 -0
  29. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/api_resources/_briefing.py +0 -0
  30. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/api_resources/_chat_completion.py +0 -0
  31. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/api_resources/_content.py +0 -0
  32. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/api_resources/_elicitation.py +0 -0
  33. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/api_resources/_embedding.py +0 -0
  34. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/api_resources/_event.py +0 -0
  35. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/api_resources/_folder.py +0 -0
  36. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/api_resources/_group.py +0 -0
  37. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/api_resources/_integrated.py +0 -0
  38. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/api_resources/_llm_models.py +0 -0
  39. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/api_resources/_mcp.py +0 -0
  40. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/api_resources/_message.py +0 -0
  41. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/api_resources/_message_assessment.py +0 -0
  42. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/api_resources/_message_execution.py +0 -0
  43. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/api_resources/_message_log.py +0 -0
  44. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/api_resources/_message_tool.py +0 -0
  45. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/api_resources/_module.py +0 -0
  46. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/api_resources/_scheduled_task.py +0 -0
  47. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/api_resources/_search.py +0 -0
  48. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/api_resources/_search_string.py +0 -0
  49. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/api_resources/_short_term_memory.py +0 -0
  50. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/api_resources/_space.py +0 -0
  51. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/api_resources/_user.py +0 -0
  52. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/api_resources/_web_search.py +0 -0
  53. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/cli/__init__.py +0 -0
  54. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/cli/__main__.py +0 -0
  55. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/cli/commands/__init__.py +0 -0
  56. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/cli/commands/_citation_manifest.py +0 -0
  57. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/cli/commands/cite_file.py +0 -0
  58. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/cli/commands/elicitation.py +0 -0
  59. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/cli/commands/files.py +0 -0
  60. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/cli/commands/folders.py +0 -0
  61. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/cli/commands/mcp.py +0 -0
  62. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/cli/commands/navigation.py +0 -0
  63. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/cli/commands/read.py +0 -0
  64. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/cli/commands/scheduled_tasks.py +0 -0
  65. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/cli/commands/search.py +0 -0
  66. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/cli/commands/subagent.py +0 -0
  67. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/cli/commands/web_search.py +0 -0
  68. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/cli/commands/web_search_config.py +0 -0
  69. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/cli/config.py +0 -0
  70. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/cli/formatting.py +0 -0
  71. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/cli/shell.py +0 -0
  72. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/cli/skills/unique-cli-elicitation/SKILL.md +0 -0
  73. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/cli/skills/unique-cli-file-management/SKILL.md +0 -0
  74. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/cli/skills/unique-cli-mcp/SKILL.md +0 -0
  75. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/cli/skills/unique-cli-scheduled-tasks/SKILL.md +0 -0
  76. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/cli/skills/unique-cli-search/SKILL.md +0 -0
  77. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/cli/skills/unique-cli-subagent/SKILL.md +0 -0
  78. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/cli/skills/unique-cli-web-search/SKILL.md +0 -0
  79. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/cli/state.py +0 -0
  80. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/utils/analytics_order_run.py +0 -0
  81. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/utils/benchmarking_run.py +0 -0
  82. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/utils/chat_history.py +0 -0
  83. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/utils/chat_in_space.py +0 -0
  84. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/unique_sdk/utils/sources.py +0 -0
  85. {unique_sdk-2026.26.0.dev15 → unique_sdk-2026.26.0.dev17}/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.26.0.dev15
3
+ Version: 2026.26.0.dev17
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.26.0.dev15"
3
+ version = "2026.26.0.dev17"
4
4
  description = ""
5
5
  readme = "README.md"
6
6
  license = { text = "MIT" }
@@ -65,6 +65,24 @@ class DynamicFrontend(APIResource["DynamicFrontend"]):
65
65
  ),
66
66
  )
67
67
 
68
+ @classmethod
69
+ def delete(
70
+ cls,
71
+ space_id: str,
72
+ user_id: str,
73
+ company_id: str,
74
+ ) -> "DynamicFrontend":
75
+ """Delete a deployed Dynamic Frontend space."""
76
+ return cast(
77
+ DynamicFrontend,
78
+ cls._static_request(
79
+ "delete",
80
+ f"/dynamic-frontend/{space_id}",
81
+ user_id,
82
+ company_id,
83
+ ),
84
+ )
85
+
68
86
  @classmethod
69
87
  def list(
70
88
  cls,
@@ -9,6 +9,7 @@ import click
9
9
  from unique_sdk.cli import __version__
10
10
  from unique_sdk.cli.commands.cite_file import cmd_cite_file
11
11
  from unique_sdk.cli.commands.dynamic_frontend import (
12
+ cmd_dynamic_frontend_delete,
12
13
  cmd_dynamic_frontend_deploy,
13
14
  cmd_dynamic_frontend_list,
14
15
  )
@@ -480,7 +481,7 @@ def read_cmd(
480
481
 
481
482
  @main.group(name="dynamic-frontend")
482
483
  def dynamic_frontend() -> None:
483
- """Deploy and list Dynamic Frontend spaces."""
484
+ """Deploy, list, and delete Dynamic Frontend spaces."""
484
485
 
485
486
 
486
487
  @dynamic_frontend.command(name="deploy")
@@ -550,6 +551,29 @@ def dynamic_frontend_list(ctx: click.Context, output_json: bool) -> None:
550
551
  ctx.exit(1)
551
552
 
552
553
 
554
+ @dynamic_frontend.command(name="delete")
555
+ @click.argument("space_id")
556
+ @click.option(
557
+ "--json", "output_json", is_flag=True, default=False, help="Print raw JSON."
558
+ )
559
+ @click.pass_context
560
+ def dynamic_frontend_delete(
561
+ ctx: click.Context, space_id: str, output_json: bool
562
+ ) -> None:
563
+ """Delete a deployed Dynamic Frontend space by its space id.
564
+
565
+ \b
566
+ Example:
567
+ unique-cli dynamic-frontend delete assistant_123
568
+ """
569
+ output = cmd_dynamic_frontend_delete(
570
+ LazyState.get(ctx), space_id, output_json=output_json
571
+ )
572
+ click.echo(output)
573
+ if output.startswith(_DYNAMIC_FRONTEND_ERROR_PREFIX):
574
+ ctx.exit(1)
575
+
576
+
553
577
  @main.command()
554
578
  @click.argument("name_or_id")
555
579
  @click.pass_context
@@ -116,6 +116,30 @@ def cmd_dynamic_frontend_deploy(
116
116
  return f"dynamic-frontend deploy: {e}"
117
117
 
118
118
 
119
+ def cmd_dynamic_frontend_delete(
120
+ state: ShellState,
121
+ space_id: str,
122
+ *,
123
+ output_json: bool = False,
124
+ ) -> str:
125
+ try:
126
+ if not space_id:
127
+ return "dynamic-frontend delete: provide a space id."
128
+ result = unique_sdk.DynamicFrontend.delete(
129
+ space_id,
130
+ user_id=state.config.user_id,
131
+ company_id=state.config.company_id,
132
+ )
133
+ if output_json:
134
+ return json.dumps(dict(result), indent=2, default=str)
135
+ deleted_id = (
136
+ getattr(result, "spaceId", None) or getattr(result, "id", None) or space_id
137
+ )
138
+ return f"Deleted Dynamic Frontend space {deleted_id}"
139
+ except (ValueError, unique_sdk.APIError) as e:
140
+ return f"dynamic-frontend delete: {e}"
141
+
142
+
119
143
  def cmd_dynamic_frontend_list(state: ShellState, *, output_json: bool = False) -> str:
120
144
  try:
121
145
  spaces = unique_sdk.DynamicFrontend.list(
@@ -1,17 +1,19 @@
1
1
  ---
2
2
  name: unique-cli-dynamic-frontend
3
3
  description: >-
4
- Create, update, and list Unique Dynamic Frontend Spaces using the
4
+ Create, update, list, and delete Unique Dynamic Frontend Spaces using the
5
5
  `unique-cli dynamic-frontend` command. Use when deploying a generated
6
6
  Dynamic Frontend ZIP, updating an existing Dynamic Frontend Space bundle,
7
- listing manageable Dynamic Frontend Spaces, or when the user mentions
8
- Dynamic Frontend Space deployment through the CLI.
7
+ listing manageable Dynamic Frontend Spaces, deleting a deployed Dynamic
8
+ Frontend Space, or when the user mentions Dynamic Frontend Space deployment
9
+ through the CLI.
9
10
  ---
10
11
 
11
12
  # Unique CLI -- Dynamic Frontend Spaces
12
13
 
13
- Use `unique-cli dynamic-frontend` to create or update Dynamic Frontend Spaces
14
- from upload-ready ZIP bundles or existing Knowledge Base content IDs.
14
+ Use `unique-cli dynamic-frontend` to create, update, list, and delete Dynamic
15
+ Frontend Spaces from upload-ready ZIP bundles or existing Knowledge Base
16
+ content IDs.
15
17
 
16
18
  The CLI is installed via `pip install unique-sdk` and uses the same
17
19
  `UNIQUE_USER_ID`, `UNIQUE_COMPANY_ID`, `UNIQUE_API_KEY`, `UNIQUE_APP_ID`, and
@@ -98,6 +100,25 @@ unique-cli dynamic-frontend deploy \
98
100
  The update command prints the same `spaceId`, `contentId`, view `URL`, and
99
101
  `Config URL` fields as create.
100
102
 
103
+ ## Delete a Space
104
+
105
+ Remove a deployed Dynamic Frontend Space by its space id. This deletes the
106
+ backing BYOC app and the owning space (and its access grants):
107
+
108
+ ```bash
109
+ unique-cli dynamic-frontend delete space_abc123
110
+ ```
111
+
112
+ The command prints a confirmation:
113
+
114
+ ```text
115
+ Deleted Dynamic Frontend space space_abc123
116
+ ```
117
+
118
+ Deletion is permanent and requires manage access on the space (or a
119
+ company-wide space-admin role). Always confirm the correct `spaceId` with the
120
+ user before deleting — there is no undo.
121
+
101
122
  ## List Spaces
102
123
 
103
124
  List Dynamic Frontend Spaces the current user can manage:
@@ -111,6 +132,7 @@ Use JSON output for scripts:
111
132
  ```bash
112
133
  unique-cli dynamic-frontend list --json
113
134
  unique-cli dynamic-frontend deploy --space-id space_abc123 --file ./app.zip --json
135
+ unique-cli dynamic-frontend delete space_abc123 --json
114
136
  ```
115
137
 
116
138
  ## Rules
@@ -120,6 +142,8 @@ unique-cli dynamic-frontend deploy --space-id space_abc123 --file ./app.zip --js
120
142
  - Use `--space-id` for updates. Without `--space-id`, `deploy` creates a new
121
143
  Dynamic Frontend Space and requires `--name`.
122
144
  - `--file` and `--content-id` are mutually exclusive.
145
+ - `delete` is permanent and has no undo — confirm the `spaceId` with the user
146
+ first, and never guess which space to delete.
123
147
  - After create or update, return the CLI output to the user, especially both the
124
148
  view `URL` (jump to the Space) and the `Config URL` (configure/share the Space).
125
149
  - Never report the BYOC iframe runtime URL
@@ -349,13 +349,15 @@ def download_content(
349
349
  if chat_id:
350
350
  url = f"{url}?chatId={chat_id}"
351
351
 
352
- headers = {
352
+ headers: dict[str, str] = {
353
353
  "x-api-version": unique_sdk.api_version,
354
- "x-app-id": unique_sdk.app_id,
355
354
  "x-user-id": userId,
356
355
  "x-company-id": companyId,
357
- "Authorization": "Bearer %s" % (unique_sdk.api_key,),
358
356
  }
357
+ if unique_sdk.app_id:
358
+ headers["x-app-id"] = unique_sdk.app_id
359
+ if unique_sdk.api_key:
360
+ headers["Authorization"] = "Bearer %s" % (unique_sdk.api_key,)
359
361
 
360
362
  # Issue the request before resolving the destination. A non-200
361
363
  # response should never leave a half-created directory or empty