netizen-cli 0.11.1__tar.gz → 0.11.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.
- {netizen_cli-0.11.1/netizen_cli.egg-info → netizen_cli-0.11.2}/PKG-INFO +1 -1
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/__init__.py +1 -1
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/admin/presentation.py +23 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/admin/queries.py +45 -3
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/admin/static/admin.css +89 -26
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/admin/static/admin.js +545 -338
- netizen_cli-0.11.2/netizen_cli/admin/static/chat-picker.css +37 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/admin/static/chat-picker.js +85 -47
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/admin/static/index.html +141 -91
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/admin/web.py +88 -12
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/bindings.py +97 -14
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/channel_app.py +5 -2
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/codex_runtime.py +27 -1
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/management/__init__.py +2 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/management/service.py +249 -34
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/management/updates.py +26 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/runtime/contracts.py +1 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2/netizen_cli.egg-info}/PKG-INFO +1 -1
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/pyproject.toml +1 -1
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/skills/netizen-user-guide/references/user-guide.md +43 -14
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_bindings.py +202 -1
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_codex_runtime.py +116 -1
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_migration_schema_validation.py +47 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_service_launcher.py +102 -2
- netizen_cli-0.11.1/netizen_cli/admin/static/chat-picker.css +0 -28
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/MANIFEST.in +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/README.md +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/_build.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/config.example.yaml +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/__main__.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/account_rate_limits.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/admin/__init__.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/admin/auth.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/admin/credentials.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/admin/errors.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/admin/feishu.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/admin/login.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/admin/port_config.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/admin/static/identity.js +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/admin/static/login.html +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/admin/static/login.js +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/admin/transport.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/admin/users.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/builtin_skills.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/cards/__init__.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/cards/callbacks.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/cards/chat_target.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/cards/controls.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/cards/defaults.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/cards/fork.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/cards/model_info.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/cards/pagination.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/cards/questions.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/cards/reply.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/cards/scheduled.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/cards/usage.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/channel/__init__.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/channel/completion_mentions.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/channel/input_preparation.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/channel/messages.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/channel/ports.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/channel/question_inputs.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/channel/reactions.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/channel/reply_presenter.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/channel/topics.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/chat_avatars.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/chat_targets.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/cli.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/cli_data.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/cli_packages.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/cli_services.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/cli_setup.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/cli_update.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/cli_update_restore.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/cli_update_worker.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/completion_mention.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/database_migrations.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/defaults/__init__.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/defaults/models.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/defaults/service.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/defaults/store.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/deployment/__init__.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/deployment/restart_worker.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/deployment/update_executor.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/deployment/update_protocol.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/domain.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/error_messages.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/experience.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/feishu_app_onboarding.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/feishu_app_permissions.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/feishu_links.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/git_status.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/image_inputs.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/instance.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/lark_app.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/main.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/management/blocking_io.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/management/chat_directory.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/management/chat_labels.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/management/coordination.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/markdown_images.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/message_content.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/message_history.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/message_preparation.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/message_projection.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/migrations/__init__.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/migrations/schema.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/migrations/v14.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/model_settings.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/package_resources.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/pagination.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/partial_answers.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/projects.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/prompt_projection.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/quoted_context.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/result_images.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/runtime/__init__.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/runtime/name_writes.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/runtime/thread_naming.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/schedules/__init__.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/schedules/mcp.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/schedules/models.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/schedules/scheduler.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/schedules/service.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/schedules/store.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/sdk_gap_adapter.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/service_launcher.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/session_settings.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/settings.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/skill_references.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/task_text.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/terminal_cleanup.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/turn_activity.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/turn_files.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/turn_patch_children.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/turn_plan_observer.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli/user_questions.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli.egg-info/SOURCES.txt +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli.egg-info/dependency_links.txt +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli.egg-info/entry_points.txt +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli.egg-info/requires.txt +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/netizen_cli.egg-info/top_level.txt +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/setup.cfg +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/skills/netizen-lark/SKILL.md +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/skills/netizen-user-guide/SKILL.md +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_account_rate_limits.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_admin_update_executor_probe.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_binding_scheduled_channel.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_cards.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_channel_app.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_channel_fixtures.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_channel_input_preparation.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_chat_avatars.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_chat_target_cards.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_check_sdk.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_cli.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_cli_data.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_cli_distribution.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_cli_integration.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_cli_packages.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_cli_packaging.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_cli_services.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_cli_setup.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_cli_update.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_codex_sdk_capabilities.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_codex_sdk_upgrade_0161.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_completion_mention_cards.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_completion_mentions.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_completion_topic_delivery.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_cron_chat_targets.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_database_migrations.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_defaults_cards.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_defaults_channel.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_defaults_runtime.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_deployment.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_documentation_links.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_domain_experience.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_error_messages.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_feishu_app_onboarding.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_feishu_app_permissions.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_file_pagination.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_fork_cards.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_git_status.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_image_inputs.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_lark_app.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_lark_sdk_contract.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_main.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_markdown_images.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_message_content.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_message_history.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_message_material_inputs.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_message_preparation.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_model_info_cards.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_model_settings.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_name_writes.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_pagination.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_partial_answer_delivery.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_partial_answers.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_persistent_fork_bindings.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_persistent_fork_channel.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_persistent_fork_runtime.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_probe_child_files.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_probe_feishu_completion_mention.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_probe_feishu_partial_answers.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_probe_feishu_turn_file_card.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_probe_persistent_fork.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_probe_python_sdk.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_probe_scheduled_tasks.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_probe_sdk_completion_race.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_probe_skill_execution.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_probe_thread_naming.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_project_delete_channel.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_project_delete_runtime.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_project_deletion_storage.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_prompt_projection.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_question_cards.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_question_channel.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_question_target_parity.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_quoted_context.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_release_script.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_repository_hygiene.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_result_images.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_resume_channel.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_retired_deployment.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_runtime_resume_activation.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_runtime_thread_naming.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_schedule_card_retry.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_schedule_cards.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_schedule_mcp.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_schedule_run_now.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_schedule_scope_matrix.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_schedule_service.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_scheduled_channel.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_scheduled_runtime.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_scheduler.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_scheduler_presenter.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_schedules_storage.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_sdk_gap_adapter.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_session_defaults.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_session_settings.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_settings_projects.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_task_text.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_terminal_cleanup.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_thread_naming.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_turn_activity.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_turn_files.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_turn_patch_children.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_turn_patch_statistics.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_turn_plan_observer.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_update_executor.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_usage_card.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_usage_control.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_user_guide_skill.py +0 -0
- {netizen_cli-0.11.1 → netizen_cli-0.11.2}/tests/test_user_questions.py +0 -0
|
@@ -169,6 +169,8 @@ def _runtime_side_json(snapshot: Any) -> dict[str, object]:
|
|
|
169
169
|
"parentBindingId": snapshot.parent_binding_id,
|
|
170
170
|
"threadId": snapshot.thread_id,
|
|
171
171
|
"state": snapshot.state.value,
|
|
172
|
+
"sessionState": snapshot.state.value,
|
|
173
|
+
"revision": snapshot.revision,
|
|
172
174
|
"turnId": snapshot.turn_id,
|
|
173
175
|
"turnState": (
|
|
174
176
|
snapshot.turn_state.value if snapshot.turn_state is not None else None
|
|
@@ -176,6 +178,27 @@ def _runtime_side_json(snapshot: Any) -> dict[str, object]:
|
|
|
176
178
|
}
|
|
177
179
|
|
|
178
180
|
|
|
181
|
+
def _side_parent_json(item: Any) -> dict[str, object]:
|
|
182
|
+
metadata = item.parent_metadata
|
|
183
|
+
title = None
|
|
184
|
+
if item.parent_binding is not None:
|
|
185
|
+
if item.parent_binding.native_thread_id is None:
|
|
186
|
+
title = "新会话"
|
|
187
|
+
elif metadata is None:
|
|
188
|
+
title = "会话信息暂不可用"
|
|
189
|
+
else:
|
|
190
|
+
title = (
|
|
191
|
+
" ".join((metadata.name or "").split())
|
|
192
|
+
or " ".join((metadata.preview or "").split())
|
|
193
|
+
or "未命名会话"
|
|
194
|
+
)[:120]
|
|
195
|
+
return {
|
|
196
|
+
"bindingId": item.record.side_topic.parent_binding_id,
|
|
197
|
+
"title": title,
|
|
198
|
+
"available": item.parent_binding is not None,
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
|
|
179
202
|
def _project_result(request_id: str, project: Any) -> dict[str, object]:
|
|
180
203
|
return {
|
|
181
204
|
"requestId": request_id,
|
|
@@ -12,7 +12,7 @@ from datetime import UTC, datetime
|
|
|
12
12
|
from .errors import AdminWebError
|
|
13
13
|
from ..bindings import BindingCursor, SideTopicCursor
|
|
14
14
|
from ..domain import ScopeKind
|
|
15
|
-
from ..management import SessionInventoryState
|
|
15
|
+
from ..management import SessionInventoryState, SessionUpdatedCursor
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
_MAX_TEXT_BYTES = 4_096
|
|
@@ -71,6 +71,14 @@ def _session_page_size(values: Mapping[str, list[str]]) -> int:
|
|
|
71
71
|
return value
|
|
72
72
|
|
|
73
73
|
|
|
74
|
+
def _session_order_query(values: Mapping[str, list[str]]) -> tuple[str, str]:
|
|
75
|
+
sort_by = _optional_one(values, "sortBy") or "updatedAt"
|
|
76
|
+
direction = _optional_one(values, "sortDirection") or "desc"
|
|
77
|
+
if sort_by not in {"createdAt", "updatedAt"} or direction not in {"asc", "desc"}:
|
|
78
|
+
raise AdminWebError(400, "invalid_sort", "排序字段或方向无效。")
|
|
79
|
+
return ("created_at" if sort_by == "createdAt" else "updated_at"), direction
|
|
80
|
+
|
|
81
|
+
|
|
74
82
|
def _optional_text_query(
|
|
75
83
|
values: Mapping[str, list[str]],
|
|
76
84
|
name: str,
|
|
@@ -299,23 +307,57 @@ def _decode_binding_cursor(
|
|
|
299
307
|
return BindingCursor(*values) if values is not None else None
|
|
300
308
|
|
|
301
309
|
|
|
310
|
+
def _encode_session_cursor(
|
|
311
|
+
cursor: BindingCursor | SessionUpdatedCursor | None,
|
|
312
|
+
fingerprint: str,
|
|
313
|
+
) -> str | None:
|
|
314
|
+
if not isinstance(cursor, SessionUpdatedCursor):
|
|
315
|
+
return _encode_binding_cursor(cursor, fingerprint)
|
|
316
|
+
return _encode_cursor(
|
|
317
|
+
"session-updated", (str(cursor.updated_at) if cursor.updated_at is not None else "unknown", cursor.binding_id), fingerprint,
|
|
318
|
+
)
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
def _decode_session_cursor(
|
|
322
|
+
encoded: str | None,
|
|
323
|
+
fingerprint: str,
|
|
324
|
+
*,
|
|
325
|
+
sort_by: str,
|
|
326
|
+
) -> BindingCursor | SessionUpdatedCursor | None:
|
|
327
|
+
if sort_by == "created_at":
|
|
328
|
+
return _decode_binding_cursor(encoded, fingerprint)
|
|
329
|
+
values = _decode_cursor(encoded, kind="session-updated", length=2, fingerprint=fingerprint)
|
|
330
|
+
if values is None:
|
|
331
|
+
return None
|
|
332
|
+
raw_time, binding_id = values
|
|
333
|
+
if raw_time == "unknown":
|
|
334
|
+
return SessionUpdatedCursor(None, binding_id)
|
|
335
|
+
if not re.fullmatch(r"0|[1-9][0-9]{0,15}", raw_time):
|
|
336
|
+
raise AdminWebError(400, "invalid_cursor", "分页游标无效。")
|
|
337
|
+
return SessionUpdatedCursor(int(raw_time), binding_id)
|
|
338
|
+
|
|
339
|
+
|
|
302
340
|
def _encode_side_cursor(
|
|
303
341
|
cursor: SideTopicCursor | None,
|
|
304
342
|
fingerprint: str,
|
|
305
343
|
) -> str | None:
|
|
306
344
|
if cursor is None:
|
|
307
345
|
return None
|
|
346
|
+
if cursor.updated_at is not None:
|
|
347
|
+
return _encode_cursor("side-updated", (cursor.created_at, cursor.side_id, cursor.updated_at), fingerprint)
|
|
308
348
|
return _encode_cursor("side", (cursor.created_at, cursor.side_id), fingerprint)
|
|
309
349
|
|
|
310
350
|
|
|
311
351
|
def _decode_side_cursor(
|
|
312
352
|
encoded: str | None,
|
|
313
353
|
fingerprint: str,
|
|
354
|
+
*,
|
|
355
|
+
sort_by: str = "created_at",
|
|
314
356
|
) -> SideTopicCursor | None:
|
|
315
357
|
values = _decode_cursor(
|
|
316
358
|
encoded,
|
|
317
|
-
kind="side",
|
|
318
|
-
length=2,
|
|
359
|
+
kind="side-updated" if sort_by == "updated_at" else "side",
|
|
360
|
+
length=3 if sort_by == "updated_at" else 2,
|
|
319
361
|
fingerprint=fingerprint,
|
|
320
362
|
)
|
|
321
363
|
return SideTopicCursor(*values) if values is not None else None
|
|
@@ -15,7 +15,12 @@ body { margin: 0; color: var(--ink); background: var(--wash); }
|
|
|
15
15
|
body.time-range-modal-open { overflow: hidden; }
|
|
16
16
|
button, input, select, textarea { font: inherit; }
|
|
17
17
|
button { cursor: pointer; }
|
|
18
|
-
.topbar { display: flex; justify-content: space-between; align-items: center;
|
|
18
|
+
.topbar { display: flex; justify-content: space-between; align-items: center; gap: 24px; padding: 12px clamp(20px, 4vw, 56px); background: #10213f; color: white; }
|
|
19
|
+
.topbar-brand { flex: 1; min-width: 0; }
|
|
20
|
+
.topbar h1 { font-size: 24px; line-height: 1.2; }
|
|
21
|
+
.topbar .instance-root { margin: 4px 0 0; line-height: 1.4; }
|
|
22
|
+
.topbar .identity-toolbar { flex-wrap: nowrap; max-width: 50%; }
|
|
23
|
+
.topbar .quiet { flex-shrink: 0; white-space: nowrap; }
|
|
19
24
|
h1, h2, h3, p { margin-top: 0; }
|
|
20
25
|
h1 { margin-bottom: 0; letter-spacing: -0.03em; }
|
|
21
26
|
.eyebrow { margin-bottom: 5px; font-size: 11px; font-weight: 750; letter-spacing: .14em; color: #86a9ec; }
|
|
@@ -23,6 +28,11 @@ h1 { margin-bottom: 0; letter-spacing: -0.03em; }
|
|
|
23
28
|
.tabs { display: flex; gap: 6px; padding: 12px clamp(20px, 4vw, 56px); background: var(--paper); border-bottom: 1px solid var(--line); }
|
|
24
29
|
.tab, .quiet, .refresh, .next { border: 1px solid var(--line); border-radius: 8px; background: white; padding: 8px 13px; color: var(--ink); }
|
|
25
30
|
.tab.active { border-color: var(--blue); color: var(--blue); background: var(--blue-soft); }
|
|
31
|
+
.session-tabs { display: flex; gap: 6px; margin-top: 20px; border-bottom: 1px solid var(--line); }
|
|
32
|
+
.session-tab { border: 0; border-bottom: 2px solid transparent; padding: 10px 14px; background: transparent; color: var(--muted); }
|
|
33
|
+
.session-tab[aria-selected="true"] { border-bottom-color: var(--blue); color: var(--blue); font-weight: 700; }
|
|
34
|
+
.side-identities { margin-top: 8px; }
|
|
35
|
+
.side-identities summary { cursor: pointer; color: var(--muted); font-size: 12px; }
|
|
26
36
|
.quiet { background: transparent; color: white; border-color: #52627d; }
|
|
27
37
|
main { max-width: 1500px; margin: 0 auto; padding: 24px clamp(14px, 3vw, 42px) 56px; }
|
|
28
38
|
.status { min-height: 24px; color: var(--muted); }
|
|
@@ -100,18 +110,24 @@ input, select, textarea { min-width: 0; border: 1px solid #bac3d0; border-radius
|
|
|
100
110
|
.time-range-backdrop { display: none; }
|
|
101
111
|
.table-wrap { overflow: auto; border: 1px solid var(--line); border-radius: 9px; }
|
|
102
112
|
table { width: 100%; border-collapse: collapse; min-width: 900px; }
|
|
103
|
-
#sessions table { min-width:
|
|
104
|
-
#sessions th:nth-child(1) { width:
|
|
105
|
-
#sessions th:nth-child(2) { width: 5%; }
|
|
106
|
-
#sessions th:nth-child(3) { width:
|
|
107
|
-
#sessions th:nth-child(4) { width:
|
|
108
|
-
#sessions th:nth-child(5) { width: 6%; }
|
|
109
|
-
#sessions th:nth-child(6) { width: 6%; }
|
|
110
|
-
#sessions th:nth-child(7) { width:
|
|
111
|
-
#sessions th:nth-child(8) { width:
|
|
112
|
-
#sessions
|
|
113
|
+
#sessions-ordinary table { min-width: 1450px; table-layout: fixed; }
|
|
114
|
+
#sessions-ordinary th:nth-child(1) { width: 12%; }
|
|
115
|
+
#sessions-ordinary th:nth-child(2) { width: 5%; }
|
|
116
|
+
#sessions-ordinary th:nth-child(3) { width: 22%; }
|
|
117
|
+
#sessions-ordinary th:nth-child(4) { width: 9%; }
|
|
118
|
+
#sessions-ordinary th:nth-child(5) { width: 6%; }
|
|
119
|
+
#sessions-ordinary th:nth-child(6) { width: 6%; }
|
|
120
|
+
#sessions-ordinary th:nth-child(7) { width: 7%; }
|
|
121
|
+
#sessions-ordinary th:nth-child(8), #sessions-ordinary th:nth-child(9), #sessions-ordinary th:nth-child(10) { width: 11%; }
|
|
122
|
+
#sessions-temporary td { max-width: 320px; overflow-wrap: anywhere; }
|
|
123
|
+
.session-time { white-space: nowrap; font-variant-numeric: tabular-nums; }
|
|
113
124
|
th, td { padding: 11px 12px; border-bottom: 1px solid var(--line); text-align: left; vertical-align: top; font-size: 13px; }
|
|
114
125
|
th { position: sticky; top: 0; background: #f7f9fc; color: var(--muted); font-size: 11px; text-transform: uppercase; letter-spacing: .04em; }
|
|
126
|
+
.session-sort { display: inline-flex; align-items: center; gap: 6px; border: 0; border-radius: 4px; padding: 5px 0; background: transparent; color: inherit; font: inherit; letter-spacing: inherit; white-space: nowrap; }
|
|
127
|
+
.session-sort:hover, th[aria-sort="ascending"] .session-sort, th[aria-sort="descending"] .session-sort { color: var(--blue); }
|
|
128
|
+
.sort-indicator { font-size: 14px; }
|
|
129
|
+
.session-refresh { display: flex; align-items: center; justify-content: flex-end; flex-wrap: wrap; gap: 8px 12px; }
|
|
130
|
+
.session-refresh time { white-space: nowrap; }
|
|
115
131
|
tr:last-child td { border-bottom: 0; }
|
|
116
132
|
.id { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 11px; color: var(--muted); word-break: break-all; }
|
|
117
133
|
.chat-link { color: var(--blue); font-weight: 700; text-decoration: none; }
|
|
@@ -138,6 +154,18 @@ button:disabled { cursor: default; opacity: .48; }
|
|
|
138
154
|
.update-versions strong { font-size: 24px; overflow-wrap: anywhere; }
|
|
139
155
|
.update-operation { padding: 16px; margin: 20px 0; border-radius: 9px; background: var(--wash); }
|
|
140
156
|
.update-operation p { margin: 8px 0 0; line-height: 1.6; }
|
|
157
|
+
.instance-diagnostics { margin: 20px 0; padding: 18px; border: 1px solid var(--line); border-radius: 9px; }
|
|
158
|
+
.diagnostics-head { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 8px; }
|
|
159
|
+
.diagnostics-head h3 { margin: 0; font-size: 16px; }
|
|
160
|
+
.diagnostics-head p, .diagnostics-help, #diagnostics-message { margin: 8px 0; color: var(--muted); font-size: 12px; line-height: 1.6; }
|
|
161
|
+
#diagnostics-message.error { color: var(--danger); }
|
|
162
|
+
.diagnostics-status { display: grid; grid-template-columns: repeat(auto-fit, minmax(110px, 1fr)); gap: 16px; margin: 18px 0; }
|
|
163
|
+
.diagnostics-status dt, .diagnostics-environment dt { margin-bottom: 7px; color: var(--muted); font-size: 12px; }
|
|
164
|
+
.diagnostics-status dd { margin: 0; }
|
|
165
|
+
.diagnostics-environment { padding-top: 14px; border-top: 1px solid var(--line); font-size: 13px; }
|
|
166
|
+
.diagnostics-environment summary { cursor: pointer; }
|
|
167
|
+
.diagnostics-environment dl { display: grid; gap: 14px; margin: 16px 0 0; }
|
|
168
|
+
.diagnostics-environment dd { margin: 0; overflow-wrap: anywhere; font-size: 12px; }
|
|
141
169
|
.update-warning { color: var(--muted); font-size: 13px; line-height: 1.6; }
|
|
142
170
|
.update-help { margin-top: 16px; font-size: 13px; }
|
|
143
171
|
.service-restart { margin-top: 28px; padding-top: 20px; border-top: 1px solid var(--line); }
|
|
@@ -150,7 +178,7 @@ button:focus-visible, input:focus-visible, select:focus-visible { outline: 3px s
|
|
|
150
178
|
.login-card input { margin-bottom: 14px; }
|
|
151
179
|
.login-card button { width: 100%; border: 0; border-radius: 8px; padding: 10px; background: var(--blue); color: white; }
|
|
152
180
|
@media (max-width: 650px) {
|
|
153
|
-
.topbar { padding: 18px; }
|
|
181
|
+
.topbar { padding: 12px 18px; }
|
|
154
182
|
.tabs { overflow-x: auto; padding: 10px 14px; }
|
|
155
183
|
main { padding: 14px 8px 40px; }
|
|
156
184
|
.panel { border-radius: 9px; padding: 12px; }
|
|
@@ -173,12 +201,36 @@ body.schedule-drawer-open, body.defaults-drawer-open, body.session-settings-draw
|
|
|
173
201
|
.schedule-editor-head .eyebrow { color: var(--muted); }
|
|
174
202
|
#schedule-editor #schedule-close { padding: 4px 12px; font-size: 28px; background: transparent; color: var(--muted); }
|
|
175
203
|
#schedule-editor #schedule-fields { flex: 1; min-height: 0; display: flex; flex-direction: column; }
|
|
176
|
-
.schedule-editor-body { flex: 1; overflow-y: auto; padding: 24px; }
|
|
177
|
-
.schedule-editor-
|
|
178
|
-
.schedule-editor-
|
|
204
|
+
.schedule-editor-body { flex: 1; min-height: 0; overflow-y: auto; padding: 20px 24px; background: var(--wash); }
|
|
205
|
+
.schedule-editor-section { min-width: 0; margin: 0 0 16px; padding: 18px; border: 1px solid var(--line); border-radius: 10px; background: var(--paper); }
|
|
206
|
+
.schedule-editor-section:last-child { margin-bottom: 0; }
|
|
207
|
+
.schedule-editor-section h4 { margin: 0 0 16px; font-size: 15px; }
|
|
208
|
+
.schedule-section-fields { display: grid; gap: 14px; min-width: 0; }
|
|
209
|
+
#schedule-editor .schedule-section-fields > *, #schedule-editor .schedule-form-grid > * { min-width: 0; }
|
|
210
|
+
#schedule-editor .schedule-form-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); margin: 0; }
|
|
211
|
+
#schedule-editor .schedule-field-help { margin: 0; color: var(--muted); font-size: 12px; line-height: 1.6; overflow-wrap: anywhere; }
|
|
212
|
+
#schedule-editor .schedule-field-help p { margin: 0 0 6px; }
|
|
213
|
+
#schedule-editor .schedule-field-help p:last-child { margin-bottom: 0; }
|
|
214
|
+
#schedule-editor .schedule-target-choices { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; min-width: 0; margin: 0; padding: 0; border: 0; }
|
|
215
|
+
.schedule-target-choices legend { margin-bottom: 7px; padding: 0; color: var(--muted); font-size: 13px; }
|
|
216
|
+
#schedule-editor .schedule-target-choices label { display: flex; align-items: flex-start; gap: 8px; padding: 12px; border: 1px solid var(--line); border-radius: 8px; color: var(--ink); cursor: pointer; }
|
|
217
|
+
#schedule-editor .schedule-target-choices input { width: 15px; height: 15px; flex-shrink: 0; margin: 2px 0 0; accent-color: var(--blue); }
|
|
218
|
+
.schedule-target-choices small { display: block; margin-top: 5px; color: var(--muted); font-size: 12px; line-height: 1.5; }
|
|
219
|
+
#schedule-editor .schedule-target-choices label:has(input:checked) { border-color: var(--blue); background: var(--blue-soft); }
|
|
220
|
+
#schedule-editor .schedule-target-choices label:focus-within { outline: 2px solid var(--blue); outline-offset: 2px; }
|
|
221
|
+
#schedule-editor .schedule-target-choices:disabled label { cursor: default; }
|
|
222
|
+
#schedule-editor .chat-manual-toggle { font-size: 12px; }
|
|
223
|
+
.schedule-preview-panel { padding: 14px; border-radius: 8px; background: var(--wash); font-size: 12px; line-height: 1.6; }
|
|
224
|
+
.schedule-preview-panel ol { margin: 10px 0 0; padding-left: 20px; overflow-wrap: anywhere; }
|
|
225
|
+
.schedule-preview-panel ol:empty { display: none; }
|
|
226
|
+
.schedule-editor-footer { display: flex; flex-direction: column; gap: 12px; padding: 16px 24px; border-top: 1px solid var(--line); background: var(--paper); }
|
|
227
|
+
.schedule-editor-actions { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 12px; width: 100%; }
|
|
228
|
+
#schedule-form-error { margin: 0; width: 100%; max-height: 20vh; overflow-y: auto; color: var(--danger); font-size: 13px; line-height: 1.5; overflow-wrap: anywhere; }
|
|
229
|
+
#schedule-editor .schedule-field-error { display: block; flex-basis: 100%; margin-top: 6px; color: var(--danger); font-size: 12px; line-height: 1.5; }
|
|
230
|
+
#schedule-editor [aria-invalid="true"] { border-color: var(--danger); outline: 1px solid var(--danger); outline-offset: 1px; }
|
|
179
231
|
#schedule-editor #schedule-cancel, #schedule-editor #schedule-preview { color: var(--ink); background: white; border: 1px solid var(--line); }
|
|
180
232
|
#schedule-editor input { margin: 0; }
|
|
181
|
-
#schedule-timezone-note { margin-
|
|
233
|
+
#schedule-editor #schedule-timezone-note { margin-top: -8px; }
|
|
182
234
|
#schedule-filter { grid-template-columns: minmax(160px, 260px) repeat(2, minmax(120px, 180px)) max-content; justify-content: start; }
|
|
183
235
|
#schedules-body td { min-width: 90px; }
|
|
184
236
|
#schedules-body td:first-child { min-width: 150px; }
|
|
@@ -192,17 +244,18 @@ body.schedule-drawer-open, body.defaults-drawer-open, body.session-settings-draw
|
|
|
192
244
|
.schedule-editor-footer { padding: 12px 16px; flex-wrap: wrap; }
|
|
193
245
|
#schedule-filter { grid-template-columns: 1fr; }
|
|
194
246
|
}
|
|
195
|
-
#schedule-editor[hidden], #schedule-detail[hidden] { display: none; }
|
|
247
|
+
#schedule-editor[hidden], #schedule-editor [hidden], #schedule-detail[hidden] { display: none; }
|
|
196
248
|
#schedule-fields { border: 0; padding: 0; margin: 0; min-width: 0; }
|
|
197
249
|
.schedule-form-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 12px; margin-bottom: 14px; }
|
|
198
250
|
.schedule-form-grid [hidden], #schedule-weekdays[hidden], #schedule-end-condition[hidden] { display: none; }
|
|
199
|
-
#schedule-end-condition { border: 1px solid var(--line);
|
|
200
|
-
#schedule-end-condition
|
|
201
|
-
#schedule-end-condition .
|
|
202
|
-
#schedule-weekdays { display: flex; flex-wrap: wrap; gap:
|
|
251
|
+
#schedule-end-condition { min-width: 0; border: 0; border-top: 1px solid var(--line); margin: 0; padding: 14px 0 0; }
|
|
252
|
+
#schedule-end-condition summary { color: var(--muted); cursor: pointer; font-size: 13px; }
|
|
253
|
+
#schedule-end-condition .schedule-form-grid { margin: 14px 0 8px; }
|
|
254
|
+
#schedule-weekdays { display: flex; flex-wrap: wrap; gap: 10px 14px; border: 0; margin: 0; padding: 0; }
|
|
255
|
+
#schedule-weekdays legend { margin-bottom: 8px; padding: 0; color: var(--muted); font-size: 13px; }
|
|
203
256
|
#schedule-weekdays label, #schedule-editor .schedule-checkbox { display: flex; align-items: center; gap: 7px; }
|
|
204
257
|
#schedule-weekdays input, #schedule-editor .schedule-checkbox input { width: auto; margin: 0; }
|
|
205
|
-
#schedule-editor .schedule-checkbox { margin:
|
|
258
|
+
#schedule-editor .schedule-checkbox { margin: 0; }
|
|
206
259
|
#schedule-instructions { width: 100%; resize: vertical; }
|
|
207
260
|
#schedule-editor button:disabled { opacity: .5; cursor: default; }
|
|
208
261
|
#schedule-preview-message { margin: 14px 0 0; }
|
|
@@ -211,8 +264,15 @@ body.schedule-drawer-open, body.defaults-drawer-open, body.session-settings-draw
|
|
|
211
264
|
#schedule-detail-instructions { white-space: pre-wrap; overflow-wrap: anywhere; font: inherit; background: var(--wash); padding: 14px; border-radius: 8px; }
|
|
212
265
|
.preserve-lines { white-space: pre-line; overflow-wrap: anywhere; }
|
|
213
266
|
@media (max-width: 700px) { .tabs { flex-wrap: wrap; } }
|
|
214
|
-
.schedule-session-settings {
|
|
215
|
-
|
|
267
|
+
.schedule-session-settings summary { cursor: pointer; font-size: 15px; font-weight: 700; overflow-wrap: anywhere; }
|
|
268
|
+
#schedule-session-summary { display: block; margin: 6px 0 0 18px; color: var(--muted); font-size: 12px; font-weight: 400; line-height: 1.6; }
|
|
269
|
+
.schedule-session-settings .schedule-section-fields { margin-top: 16px; }
|
|
270
|
+
#schedule-session-note { margin: 0; color: var(--muted); font-size: 12px; line-height: 1.5; }
|
|
271
|
+
#schedule-session-note:empty { display: none; }
|
|
272
|
+
@media (max-width: 540px) {
|
|
273
|
+
.schedule-editor-section { padding: 14px; }
|
|
274
|
+
#schedule-editor .schedule-form-grid, #schedule-editor .schedule-target-choices { grid-template-columns: 1fr; }
|
|
275
|
+
}
|
|
216
276
|
.drawer-form { height: 100%; display: flex; flex-direction: column; border: 0; border-radius: 0; padding: 0; margin: 0; }
|
|
217
277
|
.drawer-head { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 22px 24px; border-bottom: 1px solid var(--line); }
|
|
218
278
|
.drawer-head h3 { margin: 0; font-size: 22px; }
|
|
@@ -269,7 +329,6 @@ body.schedule-drawer-open, body.defaults-drawer-open, body.session-settings-draw
|
|
|
269
329
|
.defaults-toolbar { flex-wrap: wrap; gap: 12px; }
|
|
270
330
|
.defaults-tab { padding: 8px 12px; }
|
|
271
331
|
}
|
|
272
|
-
#schedule-session-note { color: var(--muted); margin: 12px 0; font-size: 13px; }
|
|
273
332
|
.identity-toolbar, .person { display: flex; align-items: center; gap: 10px; min-width: 0; }
|
|
274
333
|
.identity-toolbar { flex-wrap: wrap; justify-content: flex-end; }
|
|
275
334
|
.person-name { overflow-wrap: anywhere; }
|
|
@@ -291,4 +350,8 @@ body.schedule-drawer-open, body.defaults-drawer-open, body.session-settings-draw
|
|
|
291
350
|
.login-link { display: inline-block; margin-bottom: 14px; }
|
|
292
351
|
.login-actions { justify-content: flex-start; margin: 18px 0; }
|
|
293
352
|
#login-code { overflow-wrap: anywhere; }
|
|
294
|
-
@media (max-width: 600px) {
|
|
353
|
+
@media (max-width: 600px) {
|
|
354
|
+
.topbar { align-items: flex-start; gap: 12px; flex-wrap: wrap; }
|
|
355
|
+
.topbar-brand { flex-basis: 100%; }
|
|
356
|
+
.topbar .identity-toolbar { max-width: 100%; justify-content: flex-start; }
|
|
357
|
+
}
|