Core changes: - Add @defgroup/@ingroup to 1791 C2+ contracts (555 files) for HCA 128× pre-training DSA grouping - Add §0.1 Pre-Training Frequency matrix to semantics-core - Add §VIII Attention Architecture rules (ATTN_1-4) with MLA/CSA/HCA/DSA mechanics - Add @defgroup/@ingroup to canonical syntax (§II) and all contract examples Agent prompts (5 files): - Add ZERO-STATE RATIONALE with MLA/CSA/HCA/DSA compression mechanics - Add pre-training note: @RATIONALE/@REJECTED are in-context learned tags - svelte-coder: add missing #region contract, fix Svelte rule violations - python-coder/fullstack-coder: honor function contracts from speckit plan - qa-tester: add attention compliance audit (P3 ATTN_1-4 checks) Skills (6 files): - Translate all axiom_config descriptions to English - Fix doc_dirs to index .opencode/ and .specify/ - Deduplicate 5× complexity_rules → single global_tags catalog - Reduce semantics-svelte 591→485 lines (remove duplicate code blocks) - Fix semantics-testing: 'Short IDs' → 'Short hierarchical IDs' - Fix all examples: flat IDs → hierarchical Domain.Name format - Fix Svelte examples: replace raw Tailwind + <button> with semantic tokens + /ui Speckit workflow (commands + templates): - speckit.plan: add Function-Level Contracts for C3+ with @PRE/@POST/@TEST_EDGE - speckit.plan: add Attention Compliance Gate (ATTN_1-4 before contract generation) - speckit.tasks: add function contract inlining format (constraints in task description) - speckit.specify: load semantics-core for spec density rules - spec-template: add #region contract, @SEMANTICS grouping, hierarchical IDs - ux-reference-template: add #region wrapper - plan-template: add attention gate, @defgroup/@ingroup guidance - tasks-template: add attention audit + rebuild + orphan check tasks - constitution.md: translate to English, add Principle VIII (attention-optimized contracts) Reference modules rewritten (hierarchical IDs + full contracts): - Auth.Jwt: 6 child contracts with @RATIONALE/@REJECTED/@TEST_EDGE - Api.Auth: 5 endpoints with @TEST_EDGE + molecular CoT markers - Migration.Model: @defgroup Migration with 18 @ACTION + 6 @INVARIANT Scripts: - add_defgroup_ingroup.py: zero-risk additive @ingroup migration (1791 insertions) - migrate_hierarchical.py: flat→hierarchical ID dry-run analysis (792 contracts) - merge_prompts.py: merge all prompts/skills/commands into one review file Config: - axiom_config.yaml: 749→395 lines (-47%), English, doc_dirs include prompts - Fix test_datasets.py import collision (rename → test_datasets_routes.py) - Fix test_preview.py: SupersetClient→get_superset_client, AsyncMock, logger f-string
152 lines
6.0 KiB
Python
152 lines
6.0 KiB
Python
# #region AssistantSchemas [C:2] [TYPE Module] [SEMANTICS assistant, pydantic, schema, store, permission]
|
|
# @defgroup AssistantApi Module group.
|
|
# @BRIEF Pydantic models, in-memory stores, and permission mappings for the assistant API.
|
|
# @LAYER API
|
|
# @RELATION CALLED_BY -> [AssistantHistory]
|
|
# @RELATION CALLED_BY -> [AssistantHistory]
|
|
# @INVARIANT In-memory stores are module-level singletons shared across the assistant package.
|
|
# @RATIONALE In-memory stores documented with NOTE about restart loss. ASSISTANT_ARCHIVE_AFTER_DAYS and ASSISTANT_MESSAGE_TTL_DAYS kept as module-level constants with TODO for config migration — Pydantic schemas module should not depend on ConfigManager for architectural purity.
|
|
|
|
from __future__ import annotations
|
|
|
|
from datetime import datetime
|
|
from typing import Any
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
# #region AssistantMessageRequest [C:1] [TYPE Class]
|
|
# @BRIEF Input payload for assistant message endpoint.
|
|
# @DATA_CONTRACT Input[conversation_id?:str, message:str(1..4000)] -> Output[AssistantMessageRequest]
|
|
# @RELATION CALLED_BY -> [send_message]
|
|
# @SIDE_EFFECT None (schema declaration only).
|
|
# @PRE message length is within accepted bounds.
|
|
# @POST Request object provides message text and optional conversation binding.
|
|
# @INVARIANT message is always non-empty and no longer than 4000 characters.
|
|
class AssistantMessageRequest(BaseModel):
|
|
conversation_id: str | None = None
|
|
message: str = Field(..., min_length=1, max_length=4000)
|
|
dataset_review_session_id: str | None = None
|
|
|
|
|
|
# #endregion AssistantMessageRequest
|
|
|
|
|
|
# #region AssistantAction [C:1] [TYPE Class]
|
|
# @BRIEF UI action descriptor returned with assistant responses.
|
|
# @DATA_CONTRACT Input[type:str, label:str, target?:str] -> Output[AssistantAction]
|
|
# @RELATION CALLED_BY -> [AssistantMessageResponse]
|
|
# @SIDE_EFFECT None (schema declaration only).
|
|
# @PRE type and label are provided by orchestration logic.
|
|
# @POST Action can be rendered as button on frontend.
|
|
# @INVARIANT type and label are required for every UI action.
|
|
class AssistantAction(BaseModel):
|
|
type: str
|
|
label: str
|
|
target: str | None = None
|
|
|
|
|
|
# #endregion AssistantAction
|
|
|
|
|
|
# #region AssistantMessageResponse [C:1] [TYPE Class]
|
|
# @BRIEF Output payload contract for assistant interaction endpoints.
|
|
# @DATA_CONTRACT Input[conversation_id,response_id,state,text,intent?,confirmation_id?,task_id?,actions[],created_at] -> Output[AssistantMessageResponse]
|
|
# @RELATION CALLED_BY -> [send_message]
|
|
# @RELATION CALLED_BY -> [confirm_operation]
|
|
# @RELATION CALLED_BY -> [cancel_operation]
|
|
# @SIDE_EFFECT None (schema declaration only).
|
|
# @PRE Response includes deterministic state and text.
|
|
# @POST Payload may include task_id/confirmation_id/actions for UI follow-up.
|
|
# @INVARIANT created_at and state are always present in endpoint responses.
|
|
class AssistantMessageResponse(BaseModel):
|
|
conversation_id: str
|
|
response_id: str
|
|
state: str
|
|
text: str
|
|
intent: dict[str, Any] | None = None
|
|
confirmation_id: str | None = None
|
|
task_id: str | None = None
|
|
actions: list[AssistantAction] = Field(default_factory=list)
|
|
created_at: datetime
|
|
|
|
|
|
# #endregion AssistantMessageResponse
|
|
|
|
|
|
# #region ConfirmationRecord [C:1] [TYPE Class]
|
|
# @BRIEF In-memory confirmation token model for risky operation dispatch.
|
|
# @DATA_CONTRACT Input[id,user_id,conversation_id,intent,dispatch,expires_at,state?,created_at] -> Output[ConfirmationRecord]
|
|
# @RELATION CALLED_BY -> [send_message]
|
|
# @RELATION CALLED_BY -> [confirm_operation]
|
|
# @RELATION CALLED_BY -> [cancel_operation]
|
|
# @SIDE_EFFECT None (schema declaration only).
|
|
# @PRE intent/dispatch/user_id are populated at confirmation request time.
|
|
# @POST Record tracks lifecycle state and expiry timestamp.
|
|
# @INVARIANT state defaults to "pending" and expires_at bounds confirmation validity.
|
|
class ConfirmationRecord(BaseModel):
|
|
id: str
|
|
user_id: str
|
|
conversation_id: str
|
|
intent: dict[str, Any]
|
|
dispatch: dict[str, Any]
|
|
expires_at: datetime
|
|
state: str = "pending"
|
|
created_at: datetime
|
|
|
|
|
|
# #endregion ConfirmationRecord
|
|
|
|
|
|
# --- In-memory stores ---
|
|
|
|
# #region CONVERSATIONS [C:1] [TYPE Constant]
|
|
# @BRIEF In-memory conversation history store: {(user_id, conversation_id) -> [message_records]}
|
|
# #endregion CONVERSATIONS
|
|
CONVERSATIONS: dict[tuple[str, str], list[dict[str, Any]]] = {}
|
|
|
|
# #region ASSISTANT_AUDIT [C:1] [TYPE Constant]
|
|
# @BRIEF In-memory assistant audit trail: {user_id -> [audit_records]}. Volatile — lost on restart.
|
|
# #endregion ASSISTANT_AUDIT
|
|
USER_ACTIVE_CONVERSATION: dict[str, str] = {}
|
|
CONFIRMATIONS: dict[str, ConfirmationRecord] = {}
|
|
ASSISTANT_AUDIT: dict[str, list[dict[str, Any]]] = {}
|
|
ASSISTANT_ARCHIVE_AFTER_DAYS = 14
|
|
ASSISTANT_MESSAGE_TTL_DAYS = 90
|
|
|
|
# Operations that are read-only and do not require confirmation.
|
|
_SAFE_OPS = {
|
|
"show_capabilities",
|
|
"get_task_status",
|
|
"get_health_summary",
|
|
"dataset_review_answer_context",
|
|
}
|
|
|
|
_DATASET_REVIEW_OPS = {
|
|
"dataset_review_approve_mappings",
|
|
"dataset_review_set_field_semantics",
|
|
"dataset_review_generate_sql_preview",
|
|
}
|
|
|
|
INTENT_PERMISSION_CHECKS: dict[str, list[tuple[str, str]]] = {
|
|
"get_task_status": [("tasks", "READ")],
|
|
"create_branch": [("plugin:git", "EXECUTE")],
|
|
"commit_changes": [("plugin:git", "EXECUTE")],
|
|
"deploy_dashboard": [("plugin:git", "EXECUTE")],
|
|
"execute_migration": [
|
|
("plugin:migration", "EXECUTE"),
|
|
("plugin:superset-migration", "EXECUTE"),
|
|
],
|
|
"run_backup": [("plugin:superset-backup", "EXECUTE"), ("plugin:backup", "EXECUTE")],
|
|
"run_llm_validation": [("plugin:llm_dashboard_validation", "EXECUTE")],
|
|
"run_llm_documentation": [("plugin:llm_documentation", "EXECUTE")],
|
|
"get_health_summary": [("plugin:migration", "READ")],
|
|
"dataset_review_answer_context": [("dataset:session", "READ")],
|
|
"dataset_review_approve_mappings": [("dataset:session", "MANAGE")],
|
|
"dataset_review_set_field_semantics": [("dataset:session", "MANAGE")],
|
|
"dataset_review_generate_sql_preview": [("dataset:session", "MANAGE")],
|
|
}
|
|
|
|
|
|
# #endregion AssistantSchemas
|