netizen-cli 0.12.0__tar.gz → 0.12.1__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 (283) hide show
  1. {netizen_cli-0.12.0/netizen_cli.egg-info → netizen_cli-0.12.1}/PKG-INFO +1 -1
  2. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/__init__.py +1 -1
  3. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/channel_app.py +9 -5
  4. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/management/service.py +38 -24
  5. {netizen_cli-0.12.0 → netizen_cli-0.12.1/netizen_cli.egg-info}/PKG-INFO +1 -1
  6. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/pyproject.toml +1 -1
  7. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_channel_app.py +27 -7
  8. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/MANIFEST.in +0 -0
  9. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/README.md +0 -0
  10. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/_build.py +0 -0
  11. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/config.example.yaml +0 -0
  12. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/__main__.py +0 -0
  13. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/account_rate_limits.py +0 -0
  14. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/admin/__init__.py +0 -0
  15. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/admin/auth.py +0 -0
  16. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/admin/credentials.py +0 -0
  17. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/admin/errors.py +0 -0
  18. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/admin/feishu.py +0 -0
  19. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/admin/login.py +0 -0
  20. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/admin/port_config.py +0 -0
  21. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/admin/presentation.py +0 -0
  22. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/admin/queries.py +0 -0
  23. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/admin/static/admin.css +0 -0
  24. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/admin/static/admin.js +0 -0
  25. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/admin/static/chat-picker.css +0 -0
  26. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/admin/static/chat-picker.js +0 -0
  27. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/admin/static/identity.js +0 -0
  28. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/admin/static/index.html +0 -0
  29. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/admin/static/login.html +0 -0
  30. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/admin/static/login.js +0 -0
  31. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/admin/static/session-access.js +0 -0
  32. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/admin/transport.py +0 -0
  33. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/admin/users.py +0 -0
  34. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/admin/web.py +0 -0
  35. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/bindings.py +0 -0
  36. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/builtin_skills.py +0 -0
  37. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/cards/__init__.py +0 -0
  38. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/cards/callbacks.py +0 -0
  39. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/cards/chat_target.py +0 -0
  40. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/cards/controls.py +0 -0
  41. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/cards/defaults.py +0 -0
  42. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/cards/fork.py +0 -0
  43. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/cards/model_info.py +0 -0
  44. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/cards/pagination.py +0 -0
  45. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/cards/questions.py +0 -0
  46. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/cards/reply.py +0 -0
  47. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/cards/scheduled.py +0 -0
  48. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/cards/session_ids.py +0 -0
  49. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/cards/status.py +0 -0
  50. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/cards/usage.py +0 -0
  51. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/channel/__init__.py +0 -0
  52. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/channel/completion_mentions.py +0 -0
  53. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/channel/input_preparation.py +0 -0
  54. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/channel/messages.py +0 -0
  55. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/channel/ports.py +0 -0
  56. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/channel/question_inputs.py +0 -0
  57. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/channel/reactions.py +0 -0
  58. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/channel/reply_presenter.py +0 -0
  59. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/channel/topics.py +0 -0
  60. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/chat_avatars.py +0 -0
  61. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/chat_targets.py +0 -0
  62. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/cli.py +0 -0
  63. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/cli_data.py +0 -0
  64. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/cli_packages.py +0 -0
  65. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/cli_services.py +0 -0
  66. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/cli_setup.py +0 -0
  67. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/cli_update.py +0 -0
  68. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/cli_update_restore.py +0 -0
  69. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/cli_update_worker.py +0 -0
  70. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/codex_runtime.py +0 -0
  71. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/completion_mention.py +0 -0
  72. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/database_migrations.py +0 -0
  73. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/defaults/__init__.py +0 -0
  74. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/defaults/models.py +0 -0
  75. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/defaults/service.py +0 -0
  76. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/defaults/store.py +0 -0
  77. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/deployment/__init__.py +0 -0
  78. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/deployment/restart_worker.py +0 -0
  79. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/deployment/update_executor.py +0 -0
  80. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/deployment/update_protocol.py +0 -0
  81. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/domain.py +0 -0
  82. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/error_messages.py +0 -0
  83. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/experience.py +0 -0
  84. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/feishu_app_onboarding.py +0 -0
  85. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/feishu_app_permissions.py +0 -0
  86. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/feishu_links.py +0 -0
  87. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/git_status.py +0 -0
  88. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/image_inputs.py +0 -0
  89. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/instance.py +0 -0
  90. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/lark_app.py +0 -0
  91. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/main.py +0 -0
  92. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/management/__init__.py +0 -0
  93. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/management/blocking_io.py +0 -0
  94. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/management/chat_directory.py +0 -0
  95. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/management/chat_labels.py +0 -0
  96. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/management/coordination.py +0 -0
  97. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/management/updates.py +0 -0
  98. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/markdown_images.py +0 -0
  99. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/mcp_transport.py +0 -0
  100. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/message_content.py +0 -0
  101. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/message_history.py +0 -0
  102. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/message_preparation.py +0 -0
  103. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/message_projection.py +0 -0
  104. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/migrations/__init__.py +0 -0
  105. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/migrations/schema.py +0 -0
  106. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/migrations/v14.py +0 -0
  107. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/model_settings.py +0 -0
  108. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/package_resources.py +0 -0
  109. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/pagination.py +0 -0
  110. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/partial_answers.py +0 -0
  111. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/projects.py +0 -0
  112. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/prompt_projection.py +0 -0
  113. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/quoted_context.py +0 -0
  114. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/result_images.py +0 -0
  115. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/runtime/__init__.py +0 -0
  116. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/runtime/contracts.py +0 -0
  117. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/runtime/name_writes.py +0 -0
  118. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/runtime/thread_naming.py +0 -0
  119. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/schedules/__init__.py +0 -0
  120. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/schedules/mcp.py +0 -0
  121. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/schedules/models.py +0 -0
  122. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/schedules/scheduler.py +0 -0
  123. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/schedules/service.py +0 -0
  124. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/schedules/store.py +0 -0
  125. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/sdk_gap_adapter.py +0 -0
  126. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/service_launcher.py +0 -0
  127. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/session_settings.py +0 -0
  128. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/sessions/__init__.py +0 -0
  129. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/sessions/errors.py +0 -0
  130. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/sessions/mcp.py +0 -0
  131. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/sessions/policy.py +0 -0
  132. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/sessions/presentation.py +0 -0
  133. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/sessions/schema.py +0 -0
  134. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/sessions/service.py +0 -0
  135. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/settings.py +0 -0
  136. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/skill_references.py +0 -0
  137. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/task_text.py +0 -0
  138. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/terminal_cleanup.py +0 -0
  139. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/turn_activity.py +0 -0
  140. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/turn_files.py +0 -0
  141. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/turn_patch_children.py +0 -0
  142. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/turn_plan_observer.py +0 -0
  143. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli/user_questions.py +0 -0
  144. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli.egg-info/SOURCES.txt +0 -0
  145. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli.egg-info/dependency_links.txt +0 -0
  146. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli.egg-info/entry_points.txt +0 -0
  147. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli.egg-info/requires.txt +0 -0
  148. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/netizen_cli.egg-info/top_level.txt +0 -0
  149. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/setup.cfg +0 -0
  150. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/skills/netizen-lark/SKILL.md +0 -0
  151. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/skills/netizen-user-guide/SKILL.md +0 -0
  152. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/skills/netizen-user-guide/references/admin.md +0 -0
  153. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/skills/netizen-user-guide/references/commands.md +0 -0
  154. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/skills/netizen-user-guide/references/concepts.md +0 -0
  155. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/skills/netizen-user-guide/references/faq.md +0 -0
  156. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/skills/netizen-user-guide/references/feedback-and-files.md +0 -0
  157. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/skills/netizen-user-guide/references/fork-side-goal.md +0 -0
  158. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/skills/netizen-user-guide/references/messages.md +0 -0
  159. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/skills/netizen-user-guide/references/native-capabilities.md +0 -0
  160. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/skills/netizen-user-guide/references/scheduled-tasks.md +0 -0
  161. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/skills/netizen-user-guide/references/session-collaboration.md +0 -0
  162. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/skills/netizen-user-guide/references/sessions.md +0 -0
  163. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/skills/netizen-user-guide/references/status-and-control.md +0 -0
  164. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/skills/netizen-user-guide/references/user-guide.md +0 -0
  165. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_account_rate_limits.py +0 -0
  166. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_admin_update_executor_probe.py +0 -0
  167. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_binding_scheduled_channel.py +0 -0
  168. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_bindings.py +0 -0
  169. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_cards.py +0 -0
  170. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_channel_fixtures.py +0 -0
  171. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_channel_input_preparation.py +0 -0
  172. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_chat_avatars.py +0 -0
  173. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_chat_target_cards.py +0 -0
  174. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_check_sdk.py +0 -0
  175. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_cli.py +0 -0
  176. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_cli_data.py +0 -0
  177. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_cli_distribution.py +0 -0
  178. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_cli_integration.py +0 -0
  179. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_cli_packages.py +0 -0
  180. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_cli_packaging.py +0 -0
  181. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_cli_services.py +0 -0
  182. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_cli_setup.py +0 -0
  183. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_cli_update.py +0 -0
  184. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_codex_runtime.py +0 -0
  185. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_codex_sdk_capabilities.py +0 -0
  186. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_codex_sdk_upgrade_0161.py +0 -0
  187. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_completion_mention_cards.py +0 -0
  188. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_completion_mentions.py +0 -0
  189. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_completion_topic_delivery.py +0 -0
  190. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_cron_chat_targets.py +0 -0
  191. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_database_migrations.py +0 -0
  192. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_defaults_cards.py +0 -0
  193. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_defaults_channel.py +0 -0
  194. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_defaults_runtime.py +0 -0
  195. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_deployment.py +0 -0
  196. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_documentation_links.py +0 -0
  197. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_domain_experience.py +0 -0
  198. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_error_messages.py +0 -0
  199. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_feishu_app_onboarding.py +0 -0
  200. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_feishu_app_permissions.py +0 -0
  201. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_file_pagination.py +0 -0
  202. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_fork_cards.py +0 -0
  203. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_git_status.py +0 -0
  204. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_image_inputs.py +0 -0
  205. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_lark_app.py +0 -0
  206. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_lark_sdk_contract.py +0 -0
  207. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_main.py +0 -0
  208. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_markdown_images.py +0 -0
  209. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_message_content.py +0 -0
  210. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_message_history.py +0 -0
  211. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_message_material_inputs.py +0 -0
  212. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_message_preparation.py +0 -0
  213. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_migration_schema_validation.py +0 -0
  214. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_model_info_cards.py +0 -0
  215. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_model_settings.py +0 -0
  216. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_name_writes.py +0 -0
  217. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_pagination.py +0 -0
  218. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_partial_answer_delivery.py +0 -0
  219. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_partial_answers.py +0 -0
  220. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_persistent_fork_bindings.py +0 -0
  221. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_persistent_fork_channel.py +0 -0
  222. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_persistent_fork_runtime.py +0 -0
  223. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_probe_child_files.py +0 -0
  224. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_probe_feishu_completion_mention.py +0 -0
  225. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_probe_feishu_partial_answers.py +0 -0
  226. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_probe_feishu_turn_file_card.py +0 -0
  227. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_probe_persistent_fork.py +0 -0
  228. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_probe_python_sdk.py +0 -0
  229. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_probe_scheduled_tasks.py +0 -0
  230. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_probe_sdk_completion_race.py +0 -0
  231. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_probe_skill_execution.py +0 -0
  232. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_probe_thread_naming.py +0 -0
  233. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_project_delete_channel.py +0 -0
  234. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_project_delete_runtime.py +0 -0
  235. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_project_deletion_storage.py +0 -0
  236. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_prompt_projection.py +0 -0
  237. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_question_cards.py +0 -0
  238. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_question_channel.py +0 -0
  239. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_question_target_parity.py +0 -0
  240. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_quoted_context.py +0 -0
  241. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_release_script.py +0 -0
  242. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_repository_hygiene.py +0 -0
  243. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_result_images.py +0 -0
  244. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_resume_channel.py +0 -0
  245. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_retired_deployment.py +0 -0
  246. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_runtime_resume_activation.py +0 -0
  247. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_runtime_thread_naming.py +0 -0
  248. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_schedule_card_retry.py +0 -0
  249. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_schedule_cards.py +0 -0
  250. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_schedule_mcp.py +0 -0
  251. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_schedule_run_now.py +0 -0
  252. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_schedule_scope_matrix.py +0 -0
  253. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_schedule_service.py +0 -0
  254. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_scheduled_channel.py +0 -0
  255. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_scheduled_runtime.py +0 -0
  256. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_scheduler.py +0 -0
  257. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_scheduler_presenter.py +0 -0
  258. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_schedules_storage.py +0 -0
  259. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_sdk_gap_adapter.py +0 -0
  260. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_service_launcher.py +0 -0
  261. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_session_collaboration_app.py +0 -0
  262. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_session_defaults.py +0 -0
  263. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_session_external_runtime.py +0 -0
  264. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_session_id_cards.py +0 -0
  265. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_session_policy.py +0 -0
  266. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_session_settings.py +0 -0
  267. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_session_tools.py +0 -0
  268. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_settings_projects.py +0 -0
  269. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_status_cards.py +0 -0
  270. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_status_commands.py +0 -0
  271. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_task_text.py +0 -0
  272. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_terminal_cleanup.py +0 -0
  273. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_thread_naming.py +0 -0
  274. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_turn_activity.py +0 -0
  275. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_turn_files.py +0 -0
  276. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_turn_patch_children.py +0 -0
  277. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_turn_patch_statistics.py +0 -0
  278. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_turn_plan_observer.py +0 -0
  279. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_update_executor.py +0 -0
  280. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_usage_card.py +0 -0
  281. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_usage_control.py +0 -0
  282. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_user_guide_skill.py +0 -0
  283. {netizen_cli-0.12.0 → netizen_cli-0.12.1}/tests/test_user_questions.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: netizen-cli
3
- Version: 0.12.0
3
+ Version: 0.12.1
4
4
  Summary: Use native Codex threads through a Feishu Channel.
5
5
  Requires-Python: <3.15,>=3.11
6
6
  Requires-Dist: h11==0.16.0
@@ -1,3 +1,3 @@
1
1
  """Netizen: a thin Feishu Channel for native Codex Threads."""
2
2
 
3
- __version__ = "0.12.0"
3
+ __version__ = "0.12.1"
@@ -5365,11 +5365,15 @@ class ChannelApplication:
5365
5365
  await self._reply_no_current_binding(message, intent.scope)
5366
5366
  return
5367
5367
  state = await self._binding_state(binding)
5368
- metadata = await self._read_thread_metadata((binding,))
5369
- thread_metadata_lines = _thread_metadata_status_lines(
5370
- binding,
5371
- metadata.get(binding.native_thread_id),
5372
- )
5368
+ try:
5369
+ metadata = await self._management.binding_metadata_exact(
5370
+ binding.id,
5371
+ deadline=asyncio.get_running_loop().time() + _SESSION_QUERY_TIMEOUT_SECONDS,
5372
+ )
5373
+ except Exception:
5374
+ logger.warning("Status metadata unavailable", exc_info=True)
5375
+ metadata = None
5376
+ thread_metadata_lines = _thread_metadata_status_lines(binding, metadata)
5373
5377
  try:
5374
5378
  project = self._projects.resolve_for_binding(binding.project_alias)
5375
5379
  except ProjectError:
@@ -318,7 +318,7 @@ def _session_inventory_state(
318
318
  return SessionInventoryState(native.state.value)
319
319
 
320
320
 
321
- def _indexed_updated_at(native: NativeThreadView | None) -> int | None:
321
+ def _native_updated_at(native: NativeThreadView | None) -> int | None:
322
322
  value = native.metadata.updated_at if native is not None and native.metadata is not None else None
323
323
  return value if type(value) is int and value >= 0 else None
324
324
 
@@ -1335,15 +1335,25 @@ class InstanceManagementService:
1335
1335
  if any(record.binding.native_thread_id is not None for record in records)
1336
1336
  else {}
1337
1337
  )
1338
+ records = tuple(
1339
+ record for record in records
1340
+ if _session_inventory_state(
1341
+ record.binding, (native or {}).get(record.binding.native_thread_id),
1342
+ ) in states
1343
+ )
1344
+ # The native catalog can omit readable Threads with an empty preview.
1345
+ # Recover their summaries before selecting a page, so its timestamps,
1346
+ # ordering and cursor all use the same metadata. Keep time for rendering.
1347
+ views = await self._session_native_views(
1348
+ tuple(record.binding for record in records), native=native,
1349
+ deadline=self._enrichment_deadline(deadline, _NATIVE_INDEX_READ_SECONDS),
1350
+ )
1338
1351
  descending = query.sort_direction == "desc"
1339
1352
 
1340
1353
  def candidates():
1341
1354
  for record in records:
1342
1355
  binding = record.binding
1343
- view = (native or {}).get(binding.native_thread_id)
1344
- if _session_inventory_state(binding, view) not in states:
1345
- continue
1346
- updated = _indexed_updated_at(view)
1356
+ updated = _native_updated_at(views.get(binding.native_thread_id))
1347
1357
  if cursor is not None:
1348
1358
  if cursor.updated_at is None:
1349
1359
  if updated is not None:
@@ -1378,7 +1388,7 @@ class InstanceManagementService:
1378
1388
  self._query_seconds(deadline)
1379
1389
  return await self._session_page(
1380
1390
  tuple(record for record, _updated in selected[:limit]), native=native,
1381
- next_cursor=next_cursor, deadline=deadline, indexed_update_times=True,
1391
+ next_cursor=next_cursor, deadline=deadline, views=views,
1382
1392
  )
1383
1393
 
1384
1394
  async def query_scope_sessions(
@@ -2195,21 +2205,12 @@ class InstanceManagementService:
2195
2205
  native: dict[str, NativeThreadView] | None,
2196
2206
  next_cursor: BindingCursor | SessionUpdatedCursor | None,
2197
2207
  deadline: float,
2198
- indexed_update_times: bool = False,
2208
+ views: dict[str, NativeThreadView] | None = None,
2199
2209
  ) -> SessionInventoryPage:
2200
- views = await self._session_native_views(
2201
- tuple(record.binding for record in records), native=native, deadline=deadline,
2202
- )
2203
- if indexed_update_times:
2204
- # Summary recovery is still page-only. Its timestamp cannot join an
2205
- # ordering already chosen from the index: show an unknown time rather
2206
- # than make recovered rows appear incorrectly sorted.
2207
- views = {
2208
- thread_id: replace(view, metadata=replace(
2209
- view.metadata, updated_at=_indexed_updated_at((native or {}).get(thread_id)),
2210
- )) if view.metadata is not None else view
2211
- for thread_id, view in views.items()
2212
- }
2210
+ if views is None:
2211
+ views = await self._session_native_views(
2212
+ tuple(record.binding for record in records), native=native, deadline=deadline,
2213
+ )
2213
2214
  labels = await self.resolve_chat_labels(
2214
2215
  (record.scope.chat_id for record in records), deadline=deadline,
2215
2216
  )
@@ -2239,9 +2240,9 @@ class InstanceManagementService:
2239
2240
  )
2240
2241
  for binding in bindings if binding.native_thread_id is not None
2241
2242
  }
2242
- # Only visible, unclassified rows need a summary. Reading one exact ID
2243
- # neither proves archive membership nor turns a read failure into Missing.
2244
- # Use the existing request deadline for the whole page, including queuing.
2243
+ # Read missing summaries for this page, or for candidates before time
2244
+ # ordering. An exact read cannot establish archive/existence state.
2245
+ # The caller's deadline covers both queuing and the actual reads.
2245
2246
 
2246
2247
  async def hydrate(thread_id: str) -> None:
2247
2248
  try:
@@ -2262,7 +2263,20 @@ class InstanceManagementService:
2262
2263
  thread_id for thread_id, view in views.items()
2263
2264
  if view.state is None and view.metadata is None
2264
2265
  )
2265
- await asyncio.gather(*(hydrate(thread_id) for thread_id in unresolved))
2266
+ pending = iter(unresolved)
2267
+
2268
+ async def hydrate_pending() -> None:
2269
+ for thread_id in pending:
2270
+ if self._summary_reads_closed or asyncio.get_running_loop().time() >= deadline:
2271
+ break
2272
+ await hydrate(thread_id)
2273
+
2274
+ # A large candidate set must not create one waiting Task per Thread.
2275
+ # The shared limiter still counts SDK requests after caller timeouts.
2276
+ await asyncio.gather(*(
2277
+ hydrate_pending()
2278
+ for _ in range(min(len(unresolved), _SESSION_SUMMARY_READ_CONCURRENCY))
2279
+ ))
2266
2280
  return views
2267
2281
 
2268
2282
  def _summary_read_finished(self, task: asyncio.Task[NativeThreadMetadata]) -> None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: netizen-cli
3
- Version: 0.12.0
3
+ Version: 0.12.1
4
4
  Summary: Use native Codex threads through a Feishu Channel.
5
5
  Requires-Python: <3.15,>=3.11
6
6
  Requires-Dist: h11==0.16.0
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "netizen-cli"
7
- version = "0.12.0"
7
+ version = "0.12.1"
8
8
  description = "Use native Codex threads through a Feishu Channel."
9
9
  requires-python = ">=3.11,<3.15"
10
10
  dependencies = [
@@ -5087,7 +5087,7 @@ class ChannelApplicationTest(unittest.IsolatedAsyncioTestCase):
5087
5087
  scope = FeishuScope("cli_test", "oc_direct", ScopeKind.DIRECT)
5088
5088
  binding = self.store.active_binding(scope.key)
5089
5089
  self.store.assign_native_thread_id(binding.id, "native-one")
5090
- self.runtime.thread_metadata_values["native-one"] = NativeThreadMetadata(
5090
+ self.runtime.thread_summary_values["native-one"] = NativeThreadMetadata(
5091
5091
  thread_id="native-one",
5092
5092
  name=" Release\nreview ",
5093
5093
  preview="Check\tcurrent changes",
@@ -5101,7 +5101,27 @@ class ChannelApplicationTest(unittest.IsolatedAsyncioTestCase):
5101
5101
  self.assertIn("名称:Release review", lines)
5102
5102
  self.assertIn("会话预览:Check current changes", lines)
5103
5103
  self.assertIn("上下文窗口:暂不可用(下次可观测 Turn 完成后更新)", lines)
5104
- self.assertEqual(self.runtime.thread_metadata_calls, [("native-one",)])
5104
+ self.assertEqual(self.runtime.thread_summary_calls, ["native-one"])
5105
+ self.assertEqual(self.runtime.thread_metadata_calls, [])
5106
+
5107
+ async def test_status_reads_named_external_only_thread_missing_from_catalog(self) -> None:
5108
+ await self.fixture.new()
5109
+ scope = FeishuScope("cli_test", "oc_direct", ScopeKind.DIRECT)
5110
+ binding = self.store.active_binding(scope.key)
5111
+ self.store.assign_native_thread_id(binding.id, "external-only")
5112
+ self.runtime.thread_summary_values["external-only"] = NativeThreadMetadata(
5113
+ "external-only", "协作会话", "", updated_at=1_792_074_779,
5114
+ )
5115
+
5116
+ await self.app.handle_message(FakeMessage("/status", message_id="om_status"))
5117
+
5118
+ lines = _status_text(self.channel.replies[-1][1]).splitlines()
5119
+ self.assertIn("名称:协作会话", lines)
5120
+ self.assertIn("会话预览:暂无", lines)
5121
+ self.assertEqual(self.runtime.thread_summary_calls, ["external-only"])
5122
+ self.assertEqual(self.runtime.thread_metadata_calls, [])
5123
+ self.assertEqual(self.runtime.submit_calls, [])
5124
+ self.assertEqual(self.store.active_binding(scope.key).id, binding.id)
5105
5125
 
5106
5126
  async def test_status_hides_source_trailer_from_native_preview(self) -> None:
5107
5127
  await self.fixture.new()
@@ -5113,7 +5133,7 @@ class ChannelApplicationTest(unittest.IsolatedAsyncioTestCase):
5113
5133
  '{"kind": "feishu_current_message", "sender":'
5114
5134
  )
5115
5135
  metadata = NativeThreadMetadata("native-one", "打招呼", preview)
5116
- self.runtime.thread_metadata_values["native-one"] = metadata
5136
+ self.runtime.thread_summary_values["native-one"] = metadata
5117
5137
 
5118
5138
  await self.app.handle_message(
5119
5139
  FakeMessage("/status", message_id="om_status")
@@ -5136,7 +5156,7 @@ class ChannelApplicationTest(unittest.IsolatedAsyncioTestCase):
5136
5156
  '[点击](https://example.test) `echo` <at id="ou_user">用户</at> '
5137
5157
  '<feishu_current_message_context> 示例'
5138
5158
  )
5139
- self.runtime.thread_metadata_values["native-one"] = NativeThreadMetadata(
5159
+ self.runtime.thread_summary_values["native-one"] = NativeThreadMetadata(
5140
5160
  "native-one", name, preview,
5141
5161
  )
5142
5162
 
@@ -5164,7 +5184,7 @@ class ChannelApplicationTest(unittest.IsolatedAsyncioTestCase):
5164
5184
  scope = FeishuScope("cli_test", "oc_direct", ScopeKind.DIRECT)
5165
5185
  binding = self.store.active_binding(scope.key)
5166
5186
  self.store.assign_native_thread_id(binding.id, "native-one")
5167
- self.runtime.thread_metadata_values["native-one"] = NativeThreadMetadata(
5187
+ self.runtime.thread_summary_values["native-one"] = NativeThreadMetadata(
5168
5188
  thread_id="native-one",
5169
5189
  name=None,
5170
5190
  preview="First task",
@@ -5255,7 +5275,7 @@ class ChannelApplicationTest(unittest.IsolatedAsyncioTestCase):
5255
5275
  scope = FeishuScope("cli_test", "oc_direct", ScopeKind.DIRECT)
5256
5276
  binding = self.store.active_binding(scope.key)
5257
5277
  self.store.assign_native_thread_id(binding.id, "native-one")
5258
- self.runtime.thread_metadata_values["native-one"] = NativeThreadMetadata(
5278
+ self.runtime.thread_summary_values["native-one"] = NativeThreadMetadata(
5259
5279
  thread_id="native-one",
5260
5280
  name=None,
5261
5281
  preview="First task",
@@ -5278,7 +5298,7 @@ class ChannelApplicationTest(unittest.IsolatedAsyncioTestCase):
5278
5298
  self.store.assign_native_thread_id(binding.id, "native-one")
5279
5299
  self.runtime.thread_metadata_error = RuntimeError("history unavailable")
5280
5300
 
5281
- with self.assertLogs("netizen_cli.channel_app", level="WARNING"):
5301
+ with patch.object(self.runtime, "thread_summary", side_effect=RuntimeError("read unavailable")):
5282
5302
  await self.app.handle_message(
5283
5303
  FakeMessage("/status", message_id="om_status")
5284
5304
  )
File without changes
File without changes
File without changes