gumloop 0.5.1__tar.gz → 0.5.2__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 (186) hide show
  1. {gumloop-0.5.1 → gumloop-0.5.2}/PKG-INFO +1 -1
  2. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/_version.py +1 -1
  3. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/cli/commands/sessions.py +11 -3
  4. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/cli/plugin_assets/gumloop/skills/gumloop-cli/references/commands.md +5 -1
  5. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/types.py +1 -0
  6. {gumloop-0.5.1 → gumloop-0.5.2}/tests/cli/test_sessions.py +32 -0
  7. {gumloop-0.5.1 → gumloop-0.5.2}/.env.example +0 -0
  8. {gumloop-0.5.1 → gumloop-0.5.2}/.github/workflows/ci.yml +0 -0
  9. {gumloop-0.5.1 → gumloop-0.5.2}/.github/workflows/release.yml +0 -0
  10. {gumloop-0.5.1 → gumloop-0.5.2}/.gitignore +0 -0
  11. {gumloop-0.5.1 → gumloop-0.5.2}/.pre-commit-config.yaml +0 -0
  12. {gumloop-0.5.1 → gumloop-0.5.2}/.python-version +0 -0
  13. {gumloop-0.5.1 → gumloop-0.5.2}/LICENSE +0 -0
  14. {gumloop-0.5.1 → gumloop-0.5.2}/README.md +0 -0
  15. {gumloop-0.5.1 → gumloop-0.5.2}/pyproject.toml +0 -0
  16. {gumloop-0.5.1 → gumloop-0.5.2}/scripts/check +0 -0
  17. {gumloop-0.5.1 → gumloop-0.5.2}/scripts/fmt +0 -0
  18. {gumloop-0.5.1 → gumloop-0.5.2}/scripts/import-logins.sh +0 -0
  19. {gumloop-0.5.1 → gumloop-0.5.2}/scripts/install.sh +0 -0
  20. {gumloop-0.5.1 → gumloop-0.5.2}/scripts/sdk_examples.py +0 -0
  21. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/__init__.py +0 -0
  22. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/_auth.py +0 -0
  23. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/_client.py +0 -0
  24. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/_gumcp_transport.py +0 -0
  25. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/_http.py +0 -0
  26. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/brain_sync.py +0 -0
  27. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/browser_logins/__init__.py +0 -0
  28. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/browser_logins/chromium_cookies.py +0 -0
  29. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/browser_logins/discovery.py +0 -0
  30. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/browser_logins/extract.py +0 -0
  31. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/browser_logins/filter.py +0 -0
  32. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/browser_logins/firefox_cookies.py +0 -0
  33. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/cli/__init__.py +0 -0
  34. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/cli/commands/__init__.py +0 -0
  35. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/cli/commands/_args_input.py +0 -0
  36. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/cli/commands/_downloads.py +0 -0
  37. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/cli/commands/_sync_output.py +0 -0
  38. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/cli/commands/agents.py +0 -0
  39. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/cli/commands/artifacts.py +0 -0
  40. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/cli/commands/auth.py +0 -0
  41. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/cli/commands/brain.py +0 -0
  42. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/cli/commands/browser.py +0 -0
  43. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/cli/commands/chat.py +0 -0
  44. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/cli/commands/evaluations.py +0 -0
  45. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/cli/commands/mcp.py +0 -0
  46. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/cli/commands/models.py +0 -0
  47. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/cli/commands/plugin.py +0 -0
  48. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/cli/commands/skills.py +0 -0
  49. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/cli/commands/sync.py +0 -0
  50. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/cli/commands/update.py +0 -0
  51. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/cli/console.py +0 -0
  52. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/cli/context.py +0 -0
  53. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/cli/credentials.py +0 -0
  54. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/cli/errors.py +0 -0
  55. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/cli/main.py +0 -0
  56. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/cli/oauth.py +0 -0
  57. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/cli/plugin_assets/gumloop/plugin.json +0 -0
  58. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/cli/plugin_assets/gumloop/skills/gumloop-cli/SKILL.md +0 -0
  59. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/errors.py +0 -0
  60. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/oauth.py +0 -0
  61. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/py.typed +0 -0
  62. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/resources/__init__.py +0 -0
  63. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/resources/agents.py +0 -0
  64. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/resources/artifacts.py +0 -0
  65. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/resources/brain.py +0 -0
  66. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/resources/browser_profiles.py +0 -0
  67. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/resources/chat.py +0 -0
  68. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/resources/evaluations.py +0 -0
  69. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/resources/mcp.py +0 -0
  70. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/resources/organizations.py +0 -0
  71. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/resources/sessions.py +0 -0
  72. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/resources/skills.py +0 -0
  73. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/resources/sync.py +0 -0
  74. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/resources/teams.py +0 -0
  75. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/spec/__init__.py +0 -0
  76. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/spec/_compat.py +0 -0
  77. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/spec/_extensions.py +0 -0
  78. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/sync/__init__.py +0 -0
  79. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/sync/archive.py +0 -0
  80. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/sync/bundle.py +0 -0
  81. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/sync/bundle_validation.py +0 -0
  82. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/sync/errors.py +0 -0
  83. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/sync/hashing.py +0 -0
  84. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/sync/installed.py +0 -0
  85. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/sync/local_state.py +0 -0
  86. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/sync/lock.py +0 -0
  87. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/sync/markers.py +0 -0
  88. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/sync/reconcile.py +0 -0
  89. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/sync/reporting.py +0 -0
  90. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/sync/results.py +0 -0
  91. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/sync/run.py +0 -0
  92. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/sync/scheduler.py +0 -0
  93. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/sync/target_files.py +0 -0
  94. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/sync/targets.py +0 -0
  95. {gumloop-0.5.1 → gumloop-0.5.2}/src/gumloop/sync/wire.py +0 -0
  96. {gumloop-0.5.1 → gumloop-0.5.2}/tests/__init__.py +0 -0
  97. {gumloop-0.5.1 → gumloop-0.5.2}/tests/cli/__init__.py +0 -0
  98. {gumloop-0.5.1 → gumloop-0.5.2}/tests/cli/conftest.py +0 -0
  99. {gumloop-0.5.1 → gumloop-0.5.2}/tests/cli/sync_scenario_helpers.py +0 -0
  100. {gumloop-0.5.1 → gumloop-0.5.2}/tests/cli/sync_test_fakes.py +0 -0
  101. {gumloop-0.5.1 → gumloop-0.5.2}/tests/cli/test_agents.py +0 -0
  102. {gumloop-0.5.1 → gumloop-0.5.2}/tests/cli/test_args_input.py +0 -0
  103. {gumloop-0.5.1 → gumloop-0.5.2}/tests/cli/test_artifacts.py +0 -0
  104. {gumloop-0.5.1 → gumloop-0.5.2}/tests/cli/test_brain.py +0 -0
  105. {gumloop-0.5.1 → gumloop-0.5.2}/tests/cli/test_brain_sync.py +0 -0
  106. {gumloop-0.5.1 → gumloop-0.5.2}/tests/cli/test_browser_logins.py +0 -0
  107. {gumloop-0.5.1 → gumloop-0.5.2}/tests/cli/test_chat.py +0 -0
  108. {gumloop-0.5.1 → gumloop-0.5.2}/tests/cli/test_context.py +0 -0
  109. {gumloop-0.5.1 → gumloop-0.5.2}/tests/cli/test_credentials.py +0 -0
  110. {gumloop-0.5.1 → gumloop-0.5.2}/tests/cli/test_evaluations.py +0 -0
  111. {gumloop-0.5.1 → gumloop-0.5.2}/tests/cli/test_home_isolation.py +0 -0
  112. {gumloop-0.5.1 → gumloop-0.5.2}/tests/cli/test_login.py +0 -0
  113. {gumloop-0.5.1 → gumloop-0.5.2}/tests/cli/test_main.py +0 -0
  114. {gumloop-0.5.1 → gumloop-0.5.2}/tests/cli/test_mcp.py +0 -0
  115. {gumloop-0.5.1 → gumloop-0.5.2}/tests/cli/test_models.py +0 -0
  116. {gumloop-0.5.1 → gumloop-0.5.2}/tests/cli/test_plugin.py +0 -0
  117. {gumloop-0.5.1 → gumloop-0.5.2}/tests/cli/test_skills.py +0 -0
  118. {gumloop-0.5.1 → gumloop-0.5.2}/tests/cli/test_sync_bundle.py +0 -0
  119. {gumloop-0.5.1 → gumloop-0.5.2}/tests/cli/test_sync_command.py +0 -0
  120. {gumloop-0.5.1 → gumloop-0.5.2}/tests/cli/test_sync_command_safety.py +0 -0
  121. {gumloop-0.5.1 → gumloop-0.5.2}/tests/cli/test_sync_contract_fixtures.py +0 -0
  122. {gumloop-0.5.1 → gumloop-0.5.2}/tests/cli/test_sync_enrollment.py +0 -0
  123. {gumloop-0.5.1 → gumloop-0.5.2}/tests/cli/test_sync_fixture_corpus.py +0 -0
  124. {gumloop-0.5.1 → gumloop-0.5.2}/tests/cli/test_sync_hashing.py +0 -0
  125. {gumloop-0.5.1 → gumloop-0.5.2}/tests/cli/test_sync_installed.py +0 -0
  126. {gumloop-0.5.1 → gumloop-0.5.2}/tests/cli/test_sync_reconciliation_safety.py +0 -0
  127. {gumloop-0.5.1 → gumloop-0.5.2}/tests/cli/test_sync_scheduler_macos.py +0 -0
  128. {gumloop-0.5.1 → gumloop-0.5.2}/tests/cli/test_sync_targets.py +0 -0
  129. {gumloop-0.5.1 → gumloop-0.5.2}/tests/conftest.py +0 -0
  130. {gumloop-0.5.1 → gumloop-0.5.2}/tests/fixtures/skill_sync/v1/README.md +0 -0
  131. {gumloop-0.5.1 → gumloop-0.5.2}/tests/fixtures/skill_sync/v1/archives/generated-bundle-transfer-limit.json +0 -0
  132. {gumloop-0.5.1 → gumloop-0.5.2}/tests/fixtures/skill_sync/v1/archives/invalid-absolute-path.zip +0 -0
  133. {gumloop-0.5.1 → gumloop-0.5.2}/tests/fixtures/skill_sync/v1/archives/invalid-bytes-per-file-limit.zip +0 -0
  134. {gumloop-0.5.1 → gumloop-0.5.2}/tests/fixtures/skill_sync/v1/archives/invalid-device.zip +0 -0
  135. {gumloop-0.5.1 → gumloop-0.5.2}/tests/fixtures/skill_sync/v1/archives/invalid-duplicate-entry.zip +0 -0
  136. {gumloop-0.5.1 → gumloop-0.5.2}/tests/fixtures/skill_sync/v1/archives/invalid-fifo.zip +0 -0
  137. {gumloop-0.5.1 → gumloop-0.5.2}/tests/fixtures/skill_sync/v1/archives/invalid-files-per-skill-limit.zip +0 -0
  138. {gumloop-0.5.1 → gumloop-0.5.2}/tests/fixtures/skill_sync/v1/archives/invalid-nul-name.zip +0 -0
  139. {gumloop-0.5.1 → gumloop-0.5.2}/tests/fixtures/skill_sync/v1/archives/invalid-parent-traversal.zip +0 -0
  140. {gumloop-0.5.1 → gumloop-0.5.2}/tests/fixtures/skill_sync/v1/archives/invalid-reserved-marker.zip +0 -0
  141. {gumloop-0.5.1 → gumloop-0.5.2}/tests/fixtures/skill_sync/v1/archives/invalid-socket.zip +0 -0
  142. {gumloop-0.5.1 → gumloop-0.5.2}/tests/fixtures/skill_sync/v1/archives/invalid-symlink.zip +0 -0
  143. {gumloop-0.5.1 → gumloop-0.5.2}/tests/fixtures/skill_sync/v1/archives/invalid-total-uncompressed-limit.zip +0 -0
  144. {gumloop-0.5.1 → gumloop-0.5.2}/tests/fixtures/skill_sync/v1/archives/invalid-windows-drive-prefix.zip +0 -0
  145. {gumloop-0.5.1 → gumloop-0.5.2}/tests/fixtures/skill_sync/v1/archives/valid-single-skill-stored.zip +0 -0
  146. {gumloop-0.5.1 → gumloop-0.5.2}/tests/fixtures/skill_sync/v1/archives/valid-single-skill.zip +0 -0
  147. {gumloop-0.5.1 → gumloop-0.5.2}/tests/fixtures/skill_sync/v1/bundles/newer-than-plan.zip +0 -0
  148. {gumloop-0.5.1 → gumloop-0.5.2}/tests/fixtures/skill_sync/v1/bundles/normal.zip +0 -0
  149. {gumloop-0.5.1 → gumloop-0.5.2}/tests/fixtures/skill_sync/v1/catalog.json +0 -0
  150. {gumloop-0.5.1 → gumloop-0.5.2}/tests/fixtures/skill_sync/v1/corpus.sha256 +0 -0
  151. {gumloop-0.5.1 → gumloop-0.5.2}/tests/fixtures/skill_sync/v1/hashes/content-v1.json +0 -0
  152. {gumloop-0.5.1 → gumloop-0.5.2}/tests/fixtures/skill_sync/v1/hashes/manifest-v1.json +0 -0
  153. {gumloop-0.5.1 → gumloop-0.5.2}/tests/fixtures/skill_sync/v1/manifests/invalid-duplicate-identity.json +0 -0
  154. {gumloop-0.5.1 → gumloop-0.5.2}/tests/fixtures/skill_sync/v1/manifests/invalid-duplicate-install-name.json +0 -0
  155. {gumloop-0.5.1 → gumloop-0.5.2}/tests/fixtures/skill_sync/v1/manifests/invalid-manifest-hash.json +0 -0
  156. {gumloop-0.5.1 → gumloop-0.5.2}/tests/fixtures/skill_sync/v1/manifests/newer-than-plan.json +0 -0
  157. {gumloop-0.5.1 → gumloop-0.5.2}/tests/fixtures/skill_sync/v1/manifests/normal-bundle.json +0 -0
  158. {gumloop-0.5.1 → gumloop-0.5.2}/tests/fixtures/skill_sync/v1/responses/below-pro.json +0 -0
  159. {gumloop-0.5.1 → gumloop-0.5.2}/tests/fixtures/skill_sync/v1/responses/cli-upgrade-required.json +0 -0
  160. {gumloop-0.5.1 → gumloop-0.5.2}/tests/fixtures/skill_sync/v1/responses/lost-membership.json +0 -0
  161. {gumloop-0.5.1 → gumloop-0.5.2}/tests/fixtures/skill_sync/v1/responses/normal-empty-plan.json +0 -0
  162. {gumloop-0.5.1 → gumloop-0.5.2}/tests/fixtures/skill_sync/v1/responses/normal-plan.json +0 -0
  163. {gumloop-0.5.1 → gumloop-0.5.2}/tests/integration/conftest.py +0 -0
  164. {gumloop-0.5.1 → gumloop-0.5.2}/tests/integration/test_live.py +0 -0
  165. {gumloop-0.5.1 → gumloop-0.5.2}/tests/sdk/__init__.py +0 -0
  166. {gumloop-0.5.1 → gumloop-0.5.2}/tests/sdk/conftest.py +0 -0
  167. {gumloop-0.5.1 → gumloop-0.5.2}/tests/sdk/helpers.py +0 -0
  168. {gumloop-0.5.1 → gumloop-0.5.2}/tests/sdk/test_agents.py +0 -0
  169. {gumloop-0.5.1 → gumloop-0.5.2}/tests/sdk/test_artifacts.py +0 -0
  170. {gumloop-0.5.1 → gumloop-0.5.2}/tests/sdk/test_brain.py +0 -0
  171. {gumloop-0.5.1 → gumloop-0.5.2}/tests/sdk/test_chat.py +0 -0
  172. {gumloop-0.5.1 → gumloop-0.5.2}/tests/sdk/test_client.py +0 -0
  173. {gumloop-0.5.1 → gumloop-0.5.2}/tests/sdk/test_errors.py +0 -0
  174. {gumloop-0.5.1 → gumloop-0.5.2}/tests/sdk/test_evaluations.py +0 -0
  175. {gumloop-0.5.1 → gumloop-0.5.2}/tests/sdk/test_gumcp_transport.py +0 -0
  176. {gumloop-0.5.1 → gumloop-0.5.2}/tests/sdk/test_mcp.py +0 -0
  177. {gumloop-0.5.1 → gumloop-0.5.2}/tests/sdk/test_models.py +0 -0
  178. {gumloop-0.5.1 → gumloop-0.5.2}/tests/sdk/test_oauth.py +0 -0
  179. {gumloop-0.5.1 → gumloop-0.5.2}/tests/sdk/test_organizations.py +0 -0
  180. {gumloop-0.5.1 → gumloop-0.5.2}/tests/sdk/test_sessions.py +0 -0
  181. {gumloop-0.5.1 → gumloop-0.5.2}/tests/sdk/test_skills.py +0 -0
  182. {gumloop-0.5.1 → gumloop-0.5.2}/tests/sdk/test_sync.py +0 -0
  183. {gumloop-0.5.1 → gumloop-0.5.2}/tests/sdk/test_teams.py +0 -0
  184. {gumloop-0.5.1 → gumloop-0.5.2}/tests/skill_sync_fixtures.py +0 -0
  185. {gumloop-0.5.1 → gumloop-0.5.2}/tests/test_client.py +0 -0
  186. {gumloop-0.5.1 → gumloop-0.5.2}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: gumloop
3
- Version: 0.5.1
3
+ Version: 0.5.2
4
4
  Summary: Python client for the Gumloop API
5
5
  Project-URL: Homepage, https://github.com/gumloop/gumloop-py
6
6
  Project-URL: Bug Tracker, https://github.com/gumloop/gumloop-py/issues
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.5.1"
3
+ __version__ = "0.5.2"
@@ -24,6 +24,7 @@ sessions_app = typer.Typer(
24
24
  epilog=(
25
25
  "Examples:\n"
26
26
  " gumloop sessions create agent_abc --input 'Hello!'\n"
27
+ " gumloop sessions create agent_abc --name 'Invoice 4471' --input 'Reconcile invoice 4471'\n"
27
28
  " echo 'Hi from a file' | gumloop sessions create agent_abc --input-stdin -"
28
29
  ),
29
30
  )
@@ -42,6 +43,10 @@ def create_session(
42
43
  str | None,
43
44
  typer.Option("--session-id", help="Optional client-side id for the new session."),
44
45
  ] = None,
46
+ name: Annotated[
47
+ str | None,
48
+ typer.Option("--name", help="Session name shown in the sidebar (1-256 characters)."),
49
+ ] = None,
45
50
  json_output: Annotated[
46
51
  bool,
47
52
  typer.Option("--json", help="Print the raw SDK response as JSON."),
@@ -56,6 +61,8 @@ def create_session(
56
61
  raise GumloopError("Pass at most one of --input or --input-stdin.")
57
62
  if input_stdin is not None and input_stdin != "-":
58
63
  raise GumloopError("--input-stdin only accepts '-' (reads from stdin).")
64
+ if name is not None and not name.strip():
65
+ raise GumloopError("Pass a non-empty --name.")
59
66
  message = sys.stdin.read() if input_stdin == "-" else input_text
60
67
 
61
68
  # cast narrows SessionResponse | Iterator to the non-streaming branch
@@ -67,6 +74,7 @@ def create_session(
67
74
  agent_id,
68
75
  input=message,
69
76
  session_id=session_id,
77
+ name=name,
70
78
  )
71
79
  ),
72
80
  )
@@ -82,7 +90,7 @@ def create_session(
82
90
  # message bodies go through rich.text.Text.
83
91
  session = response.session
84
92
  console.print(f"[bold]Session {escape_markup(session.id)}[/bold]", markup=True, highlight=False)
85
- for field in ("agent_id", "agent_name", "state", "created_at"):
93
+ for field in ("name", "agent_id", "agent_name", "state", "created_at"):
86
94
  value = getattr(session, field, None)
87
95
  if value not in (None, ""):
88
96
  console.print(f" {field}: {value}", markup=False, highlight=False)
@@ -208,7 +216,7 @@ def get_session(
208
216
 
209
217
  session = response.session
210
218
  console.print(f"[bold]Session {escape_markup(session.id)}[/bold]", markup=True, highlight=False)
211
- for field in ("agent_id", "agent_name", "state", "created_at"):
219
+ for field in ("name", "agent_id", "agent_name", "state", "created_at"):
212
220
  value = getattr(session, field, None)
213
221
  if value not in (None, ""):
214
222
  console.print(f" {field}: {value}", markup=False, highlight=False)
@@ -272,7 +280,7 @@ def send_session(
272
280
  return
273
281
 
274
282
  console.print(f"[bold]Session {escape_markup(session.id)}[/bold]", markup=True, highlight=False)
275
- for field in ("agent_id", "agent_name", "state", "created_at"):
283
+ for field in ("name", "agent_id", "agent_name", "state", "created_at"):
276
284
  value = getattr(session, field, None)
277
285
  if value not in (None, ""):
278
286
  console.print(f" {field}: {value}", markup=False, highlight=False)
@@ -51,12 +51,16 @@ cat task.txt | gumloop models route --input-stdin - --model gpt-5.6-luna --model
51
51
  ## Sessions
52
52
 
53
53
  ```bash
54
- gumloop sessions create <agent_id> [--input text | --input-stdin -] [--session-id id] [--json]
54
+ gumloop sessions create <agent_id> [--input text | --input-stdin -] [--session-id id] [--name name] [--json]
55
+ gumloop sessions list <agent_id> [--search text] [--state s] [--type t] [--sort order] [--limit n] [--json]
55
56
  gumloop sessions get <session_id> [--json] # --json returns the full transcript
56
57
  gumloop sessions send <session_id> [--input text | --input-stdin -] [--json]
58
+ gumloop sessions rename <session_id> <name>
57
59
  gumloop sessions cancel <session_id>
58
60
  ```
59
61
 
62
+ `--name` sets the name shown in the sidebar; without it the session keeps the agent's name until renamed. `list --search` matches session names (and message content), so named sessions are findable by name.
63
+
60
64
  ## Chat completions
61
65
 
62
66
  ```bash
@@ -329,6 +329,7 @@ class SessionCreateRequest(_Model):
329
329
  input: str | list[Any] | None = None
330
330
  message: str | list[Any] | None = None
331
331
  session_id: str | None = None
332
+ name: str | None = None
332
333
  metadata: dict[str, Any] | None = None
333
334
  stream: bool = False
334
335
 
@@ -29,6 +29,38 @@ def test_sessions_create_posts_to_per_agent_endpoint_with_inline_input(cli_runne
29
29
  assert sent["input"] == "hello there"
30
30
 
31
31
 
32
+ @respx.mock
33
+ def test_sessions_create_sends_name(cli_runner: CliRunner) -> None:
34
+ route = respx.post(f"{API_BASE}/agents/agent_abc/sessions").mock(
35
+ return_value=httpx.Response(
36
+ 201,
37
+ json={"session": {"id": "session_xyz", "agent_id": "agent_abc", "name": "CDE Lightband ebff4bf3"}},
38
+ )
39
+ )
40
+ save_credentials(Credentials(api_key="key"))
41
+
42
+ result = cli_runner.invoke(
43
+ app,
44
+ ["sessions", "create", "agent_abc", "--name", "CDE Lightband ebff4bf3", "--input", "start"],
45
+ )
46
+
47
+ assert result.exit_code == 0, result.output
48
+ sent = json.loads(route.calls[0].request.content)
49
+ assert sent["name"] == "CDE Lightband ebff4bf3"
50
+ assert "CDE Lightband ebff4bf3" in result.output
51
+
52
+
53
+ @respx.mock
54
+ def test_sessions_create_rejects_blank_name(cli_runner: CliRunner) -> None:
55
+ route = respx.post(f"{API_BASE}/agents/agent_abc/sessions")
56
+ save_credentials(Credentials(api_key="key"))
57
+
58
+ result = cli_runner.invoke(app, ["sessions", "create", "agent_abc", "--name", " ", "--json"])
59
+
60
+ assert result.exit_code != 0
61
+ assert not route.called
62
+
63
+
32
64
  @respx.mock
33
65
  def test_sessions_create_reads_input_from_stdin(cli_runner: CliRunner) -> None:
34
66
  route = respx.post(f"{API_BASE}/agents/agent_abc/sessions").mock(
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes