1154 lines
32 KiB
TypeScript
1154 lines
32 KiB
TypeScript
import type { PluginConfigSchema } from '@/lib/plugin-api'
|
|
|
|
import { getApiBaseUrl } from './api-base'
|
|
import { isElectron } from './runtime'
|
|
|
|
async function getMemoryApiBase(): Promise<string> {
|
|
if (isElectron()) {
|
|
const base = await getApiBaseUrl()
|
|
return base ? `${base}/api/webui/memory` : '/api/webui/memory'
|
|
}
|
|
return import.meta.env.VITE_API_BASE_URL
|
|
? `${import.meta.env.VITE_API_BASE_URL}/memory`
|
|
: '/api/webui/memory'
|
|
}
|
|
|
|
async function requestJson<T>(path: string, init?: RequestInit): Promise<T> {
|
|
const response = await fetch(`${await getMemoryApiBase()}${path}`, init)
|
|
if (!response.ok) {
|
|
let detail = `${response.status}`
|
|
try {
|
|
const payload = await response.json()
|
|
detail = String(payload?.detail ?? payload?.error ?? detail)
|
|
} catch {
|
|
// ignore json parsing fallback
|
|
}
|
|
throw new Error(detail)
|
|
}
|
|
return response.json() as Promise<T>
|
|
}
|
|
|
|
export interface MemoryGraphNodePayload {
|
|
id: string
|
|
name: string
|
|
attributes?: Record<string, unknown>
|
|
}
|
|
|
|
export interface MemoryGraphEdgePayload {
|
|
source: string
|
|
target: string
|
|
weight: number
|
|
relation_hashes?: string[]
|
|
predicates?: string[]
|
|
relation_count?: number
|
|
evidence_count?: number
|
|
label?: string
|
|
}
|
|
|
|
export interface MemoryGraphPayload {
|
|
success: boolean
|
|
nodes: MemoryGraphNodePayload[]
|
|
edges: MemoryGraphEdgePayload[]
|
|
total_nodes: number
|
|
total_edges: number
|
|
}
|
|
|
|
export interface MemoryGraphSearchItem {
|
|
type: 'entity' | 'relation'
|
|
title: string
|
|
matched_field: string
|
|
matched_value: string
|
|
entity_name?: string
|
|
entity_hash?: string
|
|
appearance_count?: number
|
|
subject?: string
|
|
predicate?: string
|
|
object?: string
|
|
relation_hash?: string
|
|
confidence?: number
|
|
created_at?: number
|
|
}
|
|
|
|
export interface MemoryGraphSearchPayload {
|
|
success: boolean
|
|
query: string
|
|
limit: number
|
|
count: number
|
|
items: MemoryGraphSearchItem[]
|
|
error?: string
|
|
}
|
|
|
|
export interface MemoryGraphRelationDetailPayload {
|
|
hash: string
|
|
subject: string
|
|
predicate: string
|
|
object: string
|
|
text: string
|
|
confidence: number
|
|
paragraph_count: number
|
|
paragraph_hashes: string[]
|
|
source_paragraph: string
|
|
}
|
|
|
|
export interface MemoryGraphParagraphDetailPayload {
|
|
hash: string
|
|
content: string
|
|
preview: string
|
|
source: string
|
|
created_at?: number | null
|
|
updated_at?: number | null
|
|
entity_count: number
|
|
relation_count: number
|
|
entities: string[]
|
|
relations: string[]
|
|
}
|
|
|
|
export interface MemoryEvidenceGraphNodePayload {
|
|
id: string
|
|
type: 'entity' | 'relation' | 'paragraph'
|
|
content: string
|
|
metadata?: MemoryEvidenceGraphNodeMetadata
|
|
}
|
|
|
|
export interface MemoryEvidenceGraphEdgePayload {
|
|
source: string
|
|
target: string
|
|
kind: 'mentions' | 'supports' | 'subject' | 'object'
|
|
label: string
|
|
weight: number
|
|
}
|
|
|
|
export interface MemoryEvidenceGraphPayload {
|
|
nodes: MemoryEvidenceGraphNodePayload[]
|
|
edges: MemoryEvidenceGraphEdgePayload[]
|
|
focus_entities: string[]
|
|
}
|
|
|
|
export interface MemoryEvidenceEntityNodeMetadata extends Record<string, unknown> {
|
|
entity_name?: string
|
|
}
|
|
|
|
export interface MemoryEvidenceRelationNodeMetadata extends Record<string, unknown> {
|
|
hash?: string
|
|
subject?: string
|
|
predicate?: string
|
|
object?: string
|
|
confidence?: number
|
|
paragraph_count?: number
|
|
paragraph_hashes?: string[]
|
|
text?: string
|
|
}
|
|
|
|
export interface MemoryEvidenceParagraphNodeMetadata extends Record<string, unknown> {
|
|
hash?: string
|
|
source?: string
|
|
updated_at?: number | null
|
|
entity_count?: number
|
|
relation_count?: number
|
|
preview?: string
|
|
}
|
|
|
|
export type MemoryEvidenceGraphNodeMetadata =
|
|
| MemoryEvidenceEntityNodeMetadata
|
|
| MemoryEvidenceRelationNodeMetadata
|
|
| MemoryEvidenceParagraphNodeMetadata
|
|
| Record<string, unknown>
|
|
|
|
export interface MemoryGraphNodeDetailPayload {
|
|
success: boolean
|
|
node: {
|
|
id: string
|
|
type: 'entity'
|
|
content: string
|
|
hash?: string
|
|
appearance_count?: number
|
|
}
|
|
relations: MemoryGraphRelationDetailPayload[]
|
|
paragraphs: MemoryGraphParagraphDetailPayload[]
|
|
evidence_graph: MemoryEvidenceGraphPayload
|
|
}
|
|
|
|
export interface MemoryGraphEdgeDetailPayload {
|
|
success: boolean
|
|
edge: MemoryGraphEdgePayload
|
|
relations: MemoryGraphRelationDetailPayload[]
|
|
paragraphs: MemoryGraphParagraphDetailPayload[]
|
|
evidence_graph: MemoryEvidenceGraphPayload
|
|
}
|
|
|
|
export interface MemoryRuntimeConfigPayload {
|
|
success: boolean
|
|
config: Record<string, unknown>
|
|
data_dir: string
|
|
embedding_dimension: number
|
|
auto_save: boolean
|
|
relation_vectors_enabled: boolean
|
|
runtime_ready: boolean
|
|
embedding_degraded: boolean
|
|
embedding_degraded_reason: string
|
|
embedding_degraded_since?: number | null
|
|
embedding_last_check?: number | null
|
|
paragraph_vector_backfill_pending: number
|
|
paragraph_vector_backfill_running: number
|
|
paragraph_vector_backfill_failed: number
|
|
paragraph_vector_backfill_done: number
|
|
}
|
|
|
|
export interface MemoryRuntimeSelfCheckPayload {
|
|
success: boolean
|
|
report?: Record<string, unknown>
|
|
error?: string
|
|
}
|
|
|
|
export interface MemoryConfigPayload {
|
|
success: boolean
|
|
config: Record<string, unknown>
|
|
path: string
|
|
}
|
|
|
|
export interface MemoryRawConfigPayload {
|
|
success: boolean
|
|
config: string
|
|
path: string
|
|
exists?: boolean
|
|
using_default?: boolean
|
|
}
|
|
|
|
export interface MemoryConfigSchemaPayload {
|
|
success: boolean
|
|
schema: PluginConfigSchema
|
|
path: string
|
|
}
|
|
|
|
export interface MemoryImportGuidePayload {
|
|
success: boolean
|
|
content: string
|
|
source?: string
|
|
path?: string
|
|
settings?: MemoryImportSettings
|
|
}
|
|
|
|
export interface MemoryTaskPayload {
|
|
task_id?: string
|
|
status?: string
|
|
mode?: string
|
|
created_at?: number
|
|
updated_at?: number
|
|
[key: string]: unknown
|
|
}
|
|
|
|
export interface MemoryTaskListPayload {
|
|
success: boolean
|
|
items: MemoryTaskPayload[]
|
|
count?: number
|
|
settings?: Record<string, unknown>
|
|
}
|
|
|
|
export type MemoryImportInputMode = 'text' | 'json'
|
|
|
|
export type MemoryImportTaskKind =
|
|
| 'upload'
|
|
| 'paste'
|
|
| 'raw_scan'
|
|
| 'lpmm_openie'
|
|
| 'lpmm_convert'
|
|
| 'temporal_backfill'
|
|
| 'maibot_migration'
|
|
|
|
export interface MemoryImportSettings {
|
|
max_queue_size?: number
|
|
max_files_per_task?: number
|
|
max_file_size_mb?: number
|
|
max_paste_chars?: number
|
|
default_file_concurrency?: number
|
|
default_chunk_concurrency?: number
|
|
max_file_concurrency?: number
|
|
max_chunk_concurrency?: number
|
|
poll_interval_ms?: number
|
|
maibot_source_db_default?: string
|
|
maibot_target_data_dir?: string
|
|
path_aliases?: Record<string, string>
|
|
llm_retry?: Record<string, number>
|
|
convert_enable_staging_switch?: boolean
|
|
convert_keep_backup_count?: number
|
|
}
|
|
|
|
export interface MemoryImportSettingsPayload {
|
|
success: boolean
|
|
settings: MemoryImportSettings
|
|
}
|
|
|
|
export interface MemoryImportPathAliasesPayload {
|
|
success: boolean
|
|
path_aliases: Record<string, string>
|
|
}
|
|
|
|
export interface MemoryImportResolvePathPayload {
|
|
success?: boolean
|
|
alias: string
|
|
relative_path: string
|
|
resolved_path: string
|
|
exists: boolean
|
|
is_file: boolean
|
|
is_dir: boolean
|
|
error?: string
|
|
}
|
|
|
|
export interface MemoryImportChunkPayload {
|
|
chunk_id: string
|
|
index: number
|
|
chunk_type: string
|
|
status: string
|
|
step: string
|
|
failed_at: string
|
|
retryable: boolean
|
|
error: string
|
|
progress: number
|
|
content_preview: string
|
|
updated_at: number
|
|
}
|
|
|
|
export interface MemoryImportFilePayload {
|
|
file_id: string
|
|
name: string
|
|
source_kind: string
|
|
input_mode: MemoryImportInputMode
|
|
status: string
|
|
current_step: string
|
|
detected_strategy_type: string
|
|
total_chunks: number
|
|
done_chunks: number
|
|
failed_chunks: number
|
|
cancelled_chunks: number
|
|
progress: number
|
|
error: string
|
|
created_at: number
|
|
updated_at: number
|
|
source_path?: string
|
|
content_hash?: string
|
|
retry_chunk_indexes?: number[]
|
|
retry_mode?: string
|
|
chunks?: MemoryImportChunkPayload[]
|
|
}
|
|
|
|
export interface MemoryImportRetrySummary {
|
|
chunk_retry_files?: number
|
|
chunk_retry_chunks?: number
|
|
file_fallback_files?: number
|
|
skipped_files?: number
|
|
parent_task_id?: string
|
|
skipped_details?: Array<Record<string, string>>
|
|
}
|
|
|
|
export interface MemoryImportTaskPayload extends MemoryTaskPayload {
|
|
task_id: string
|
|
source: string
|
|
status: string
|
|
current_step: string
|
|
total_chunks: number
|
|
done_chunks: number
|
|
failed_chunks: number
|
|
cancelled_chunks: number
|
|
progress: number
|
|
error: string
|
|
file_count: number
|
|
created_at: number
|
|
started_at?: number | null
|
|
finished_at?: number | null
|
|
updated_at: number
|
|
task_kind?: MemoryImportTaskKind | string
|
|
schema_detected?: string
|
|
artifact_paths?: Record<string, string>
|
|
rollback_info?: Record<string, unknown>
|
|
retry_parent_task_id?: string
|
|
retry_summary?: MemoryImportRetrySummary
|
|
params?: Record<string, unknown>
|
|
files?: MemoryImportFilePayload[]
|
|
}
|
|
|
|
export interface MemoryImportTaskListPayload {
|
|
success: boolean
|
|
items: MemoryImportTaskPayload[]
|
|
count?: number
|
|
settings?: MemoryImportSettings
|
|
}
|
|
|
|
export interface MemoryImportTaskDetailPayload {
|
|
success: boolean
|
|
task?: MemoryImportTaskPayload
|
|
error?: string
|
|
}
|
|
|
|
export interface MemoryImportChunkListPayload {
|
|
success: boolean
|
|
task_id?: string
|
|
file_id?: string
|
|
offset?: number
|
|
limit?: number
|
|
total?: number
|
|
items?: MemoryImportChunkPayload[]
|
|
error?: string
|
|
}
|
|
|
|
export interface MemoryImportActionPayload {
|
|
success: boolean
|
|
task?: MemoryImportTaskPayload
|
|
error?: string
|
|
}
|
|
|
|
export interface MemoryTuningProfilePayload {
|
|
success: boolean
|
|
profile?: Record<string, unknown>
|
|
settings?: Record<string, unknown>
|
|
toml?: string
|
|
}
|
|
|
|
export interface MemoryDeleteCountsPayload {
|
|
relations?: number
|
|
paragraphs?: number
|
|
entities?: number
|
|
sources?: number
|
|
requested_sources?: number
|
|
matched_sources?: number
|
|
[key: string]: number | undefined
|
|
}
|
|
|
|
export interface MemoryDeletePreviewItemPayload {
|
|
item_type: string
|
|
item_hash: string
|
|
item_key?: string
|
|
label?: string
|
|
preview?: string
|
|
source?: string
|
|
}
|
|
|
|
export interface MemoryDeleteRequestPayload {
|
|
mode: string
|
|
selector: Record<string, unknown> | string
|
|
reason?: string
|
|
requested_by?: string
|
|
}
|
|
|
|
export interface MemoryDeletePreviewPayload {
|
|
success: boolean
|
|
mode: string
|
|
selector: Record<string, unknown> | string
|
|
counts: MemoryDeleteCountsPayload
|
|
sources: string[]
|
|
items: MemoryDeletePreviewItemPayload[]
|
|
item_count: number
|
|
dry_run?: boolean
|
|
requested_source_count?: number
|
|
matched_source_count?: number
|
|
vector_ids?: string[]
|
|
error?: string
|
|
}
|
|
|
|
export interface MemoryDeleteExecutePayload {
|
|
success: boolean
|
|
mode: string
|
|
operation_id: string
|
|
counts: MemoryDeleteCountsPayload
|
|
sources: string[]
|
|
deleted_count: number
|
|
deleted_entity_count: number
|
|
deleted_relation_count: number
|
|
deleted_paragraph_count: number
|
|
deleted_source_count: number
|
|
deleted_vector_count?: number
|
|
requested_source_count?: number
|
|
matched_source_count?: number
|
|
error?: string
|
|
deleted?: boolean | number
|
|
}
|
|
|
|
export interface MemoryDeleteOperationItemPayload {
|
|
item_type: string
|
|
item_hash: string
|
|
item_key?: string
|
|
payload?: Record<string, unknown>
|
|
created_at?: number
|
|
}
|
|
|
|
export interface MemoryDeleteOperationPayload {
|
|
operation_id: string
|
|
mode: string
|
|
selector?: Record<string, unknown> | string
|
|
reason?: string | null
|
|
requested_by?: string | null
|
|
status?: string
|
|
created_at?: number
|
|
restored_at?: number | null
|
|
summary?: Record<string, unknown>
|
|
items?: MemoryDeleteOperationItemPayload[]
|
|
}
|
|
|
|
export interface MemoryDeleteOperationListPayload {
|
|
success: boolean
|
|
items: MemoryDeleteOperationPayload[]
|
|
count?: number
|
|
error?: string
|
|
}
|
|
|
|
export interface MemoryDeleteOperationDetailPayload {
|
|
success: boolean
|
|
operation?: MemoryDeleteOperationPayload | null
|
|
error?: string
|
|
}
|
|
|
|
export interface MemoryFeedbackAffectedCountsPayload {
|
|
relations?: number
|
|
stale_paragraphs?: number
|
|
episode_sources?: number
|
|
profile_person_ids?: number
|
|
correction_paragraphs?: number
|
|
corrected_relations?: number
|
|
}
|
|
|
|
export interface MemoryFeedbackActionLogPayload {
|
|
id: number
|
|
task_id: number
|
|
query_tool_id: string
|
|
action_type: string
|
|
target_hash: string
|
|
reason?: string
|
|
before_payload?: Record<string, unknown>
|
|
after_payload?: Record<string, unknown>
|
|
created_at?: number
|
|
}
|
|
|
|
export interface MemoryFeedbackCorrectionSummaryPayload {
|
|
task_id: number
|
|
query_tool_id: string
|
|
session_id: string
|
|
query_text: string
|
|
query_timestamp?: number
|
|
task_status: string
|
|
decision: string
|
|
decision_confidence: number
|
|
feedback_message_count: number
|
|
rollback_status: string
|
|
affected_counts: MemoryFeedbackAffectedCountsPayload
|
|
created_at?: number
|
|
updated_at?: number
|
|
}
|
|
|
|
export interface MemoryFeedbackCorrectionDetailTaskPayload extends MemoryFeedbackCorrectionSummaryPayload {
|
|
query_snapshot?: Record<string, unknown>
|
|
decision_payload?: Record<string, unknown>
|
|
rollback_plan_summary?: Record<string, unknown>
|
|
rollback_result?: Record<string, unknown>
|
|
rollback_error?: string
|
|
rollback_requested_by?: string
|
|
rollback_reason?: string
|
|
rollback_requested_at?: number
|
|
rolled_back_at?: number
|
|
action_logs?: MemoryFeedbackActionLogPayload[]
|
|
}
|
|
|
|
export interface MemoryFeedbackCorrectionListPayload {
|
|
success: boolean
|
|
items: MemoryFeedbackCorrectionSummaryPayload[]
|
|
count?: number
|
|
error?: string
|
|
}
|
|
|
|
export interface MemoryFeedbackCorrectionDetailPayload {
|
|
success: boolean
|
|
task?: MemoryFeedbackCorrectionDetailTaskPayload | null
|
|
error?: string
|
|
}
|
|
|
|
export interface MemoryFeedbackCorrectionRollbackPayload {
|
|
success: boolean
|
|
already_rolled_back?: boolean
|
|
result?: Record<string, unknown>
|
|
task?: MemoryFeedbackCorrectionDetailTaskPayload | null
|
|
error?: string
|
|
}
|
|
|
|
export interface MemorySourceItemPayload {
|
|
source: string
|
|
paragraph_count?: number
|
|
relation_count?: number
|
|
episode_rebuild_blocked?: boolean
|
|
[key: string]: unknown
|
|
}
|
|
|
|
export interface MemorySourceListPayload {
|
|
success: boolean
|
|
items: MemorySourceItemPayload[]
|
|
count: number
|
|
}
|
|
|
|
export interface MemoryEpisodeItemPayload extends Record<string, unknown> {
|
|
episode_id?: string
|
|
id?: string
|
|
title?: string
|
|
summary?: string
|
|
content?: string
|
|
source?: string
|
|
person_id?: string
|
|
time_start?: number | null
|
|
time_end?: number | null
|
|
created_at?: number | null
|
|
updated_at?: number | null
|
|
}
|
|
|
|
export interface MemoryEpisodeParagraphPayload extends Record<string, unknown> {
|
|
hash?: string
|
|
content?: string
|
|
preview?: string
|
|
source?: string
|
|
created_at?: number | null
|
|
updated_at?: number | null
|
|
}
|
|
|
|
export interface MemoryEpisodeListPayload {
|
|
success: boolean
|
|
items: MemoryEpisodeItemPayload[]
|
|
count?: number
|
|
error?: string
|
|
}
|
|
|
|
export interface MemoryEpisodeDetailPayload {
|
|
success: boolean
|
|
episode?: MemoryEpisodeItemPayload & {
|
|
paragraphs?: MemoryEpisodeParagraphPayload[]
|
|
}
|
|
error?: string
|
|
}
|
|
|
|
export interface MemoryEpisodeStatusPayload extends Record<string, unknown> {
|
|
success: boolean
|
|
pending_queue?: number
|
|
counts?: Record<string, number>
|
|
failed?: Array<Record<string, unknown>>
|
|
error?: string
|
|
}
|
|
|
|
export interface MemoryEpisodeActionPayload extends Record<string, unknown> {
|
|
success: boolean
|
|
error?: string
|
|
detail?: string
|
|
}
|
|
|
|
export interface MemoryProfileItemPayload extends Record<string, unknown> {
|
|
person_id: string
|
|
profile_version?: number
|
|
profile_text?: string
|
|
updated_at?: number | null
|
|
expires_at?: number | null
|
|
source_note?: string
|
|
has_manual_override?: boolean
|
|
manual_override?: Record<string, unknown> | string | null
|
|
}
|
|
|
|
export interface MemoryProfileListPayload {
|
|
success: boolean
|
|
items: MemoryProfileItemPayload[]
|
|
count?: number
|
|
error?: string
|
|
}
|
|
|
|
export interface MemoryProfileQueryPayload extends Record<string, unknown> {
|
|
success?: boolean
|
|
profile?: MemoryProfileItemPayload | Record<string, unknown>
|
|
person_id?: string
|
|
profile_text?: string
|
|
evidence?: Array<Record<string, unknown>>
|
|
error?: string
|
|
}
|
|
|
|
export interface MemoryProfileOverridePayload extends Record<string, unknown> {
|
|
success: boolean
|
|
override?: Record<string, unknown>
|
|
deleted?: boolean
|
|
person_id?: string
|
|
error?: string
|
|
}
|
|
|
|
export interface MemoryMaintenanceItemPayload extends Record<string, unknown> {
|
|
hash?: string
|
|
relation_hash?: string
|
|
subject?: string
|
|
predicate?: string
|
|
object?: string
|
|
text?: string
|
|
deleted_at?: number | null
|
|
updated_at?: number | null
|
|
source?: string
|
|
}
|
|
|
|
export interface MemoryRecycleBinPayload {
|
|
success: boolean
|
|
items: MemoryMaintenanceItemPayload[]
|
|
count?: number
|
|
error?: string
|
|
}
|
|
|
|
export interface MemoryMaintenanceActionPayload extends Record<string, unknown> {
|
|
success: boolean
|
|
detail?: string
|
|
error?: string
|
|
}
|
|
|
|
export async function getMemoryGraph(limit: number = 120): Promise<MemoryGraphPayload> {
|
|
return requestJson<MemoryGraphPayload>(`/graph?limit=${limit}`)
|
|
}
|
|
|
|
export async function getMemoryGraphSearch(
|
|
query: string,
|
|
limit: number = 50,
|
|
): Promise<MemoryGraphSearchPayload> {
|
|
const params = new URLSearchParams({
|
|
query,
|
|
limit: String(limit),
|
|
})
|
|
return requestJson<MemoryGraphSearchPayload>(`/graph/search?${params.toString()}`)
|
|
}
|
|
|
|
export async function getMemoryGraphNodeDetail(
|
|
nodeId: string,
|
|
options?: {
|
|
relationLimit?: number
|
|
paragraphLimit?: number
|
|
evidenceNodeLimit?: number
|
|
},
|
|
): Promise<MemoryGraphNodeDetailPayload> {
|
|
const params = new URLSearchParams({
|
|
node_id: nodeId,
|
|
relation_limit: String(options?.relationLimit ?? 20),
|
|
paragraph_limit: String(options?.paragraphLimit ?? 20),
|
|
evidence_node_limit: String(options?.evidenceNodeLimit ?? 80),
|
|
})
|
|
return requestJson<MemoryGraphNodeDetailPayload>(`/graph/node-detail?${params.toString()}`)
|
|
}
|
|
|
|
export async function getMemoryGraphEdgeDetail(
|
|
source: string,
|
|
target: string,
|
|
options?: {
|
|
paragraphLimit?: number
|
|
evidenceNodeLimit?: number
|
|
},
|
|
): Promise<MemoryGraphEdgeDetailPayload> {
|
|
const params = new URLSearchParams({
|
|
source,
|
|
target,
|
|
paragraph_limit: String(options?.paragraphLimit ?? 20),
|
|
evidence_node_limit: String(options?.evidenceNodeLimit ?? 80),
|
|
})
|
|
return requestJson<MemoryGraphEdgeDetailPayload>(`/graph/edge-detail?${params.toString()}`)
|
|
}
|
|
|
|
export async function previewMemoryDelete(
|
|
payload: MemoryDeleteRequestPayload,
|
|
): Promise<MemoryDeletePreviewPayload> {
|
|
return requestJson<MemoryDeletePreviewPayload>('/delete/preview', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify(payload),
|
|
})
|
|
}
|
|
|
|
export async function executeMemoryDelete(
|
|
payload: MemoryDeleteRequestPayload,
|
|
): Promise<MemoryDeleteExecutePayload> {
|
|
return requestJson<MemoryDeleteExecutePayload>('/delete/execute', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify(payload),
|
|
})
|
|
}
|
|
|
|
export async function restoreMemoryDelete(payload: {
|
|
operation_id: string
|
|
mode?: string
|
|
selector?: Record<string, unknown> | string
|
|
reason?: string
|
|
requested_by?: string
|
|
}): Promise<Record<string, unknown>> {
|
|
return requestJson('/delete/restore', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify(payload),
|
|
})
|
|
}
|
|
|
|
export async function getMemoryDeleteOperations(
|
|
limit: number = 20,
|
|
mode: string = '',
|
|
): Promise<MemoryDeleteOperationListPayload> {
|
|
const params = new URLSearchParams({ limit: String(limit) })
|
|
if (mode.trim()) {
|
|
params.set('mode', mode)
|
|
}
|
|
return requestJson<MemoryDeleteOperationListPayload>(`/delete/operations?${params.toString()}`)
|
|
}
|
|
|
|
export async function getMemoryDeleteOperation(
|
|
operationId: string,
|
|
): Promise<MemoryDeleteOperationDetailPayload> {
|
|
return requestJson<MemoryDeleteOperationDetailPayload>(`/delete/operations/${encodeURIComponent(operationId)}`)
|
|
}
|
|
|
|
export async function getMemoryFeedbackCorrections(
|
|
options?: {
|
|
limit?: number
|
|
status?: string
|
|
rollbackStatus?: string
|
|
query?: string
|
|
},
|
|
): Promise<MemoryFeedbackCorrectionListPayload> {
|
|
const params = new URLSearchParams({
|
|
limit: String(options?.limit ?? 50),
|
|
})
|
|
if (options?.status?.trim()) {
|
|
params.set('status', options.status.trim())
|
|
}
|
|
if (options?.rollbackStatus?.trim()) {
|
|
params.set('rollback_status', options.rollbackStatus.trim())
|
|
}
|
|
if (options?.query?.trim()) {
|
|
params.set('query', options.query.trim())
|
|
}
|
|
return requestJson<MemoryFeedbackCorrectionListPayload>(`/feedback-corrections?${params.toString()}`)
|
|
}
|
|
|
|
export async function getMemoryFeedbackCorrection(
|
|
taskId: number,
|
|
): Promise<MemoryFeedbackCorrectionDetailPayload> {
|
|
return requestJson<MemoryFeedbackCorrectionDetailPayload>(`/feedback-corrections/${taskId}`)
|
|
}
|
|
|
|
export async function rollbackMemoryFeedbackCorrection(
|
|
taskId: number,
|
|
payload: {
|
|
requested_by?: string
|
|
reason?: string
|
|
},
|
|
): Promise<MemoryFeedbackCorrectionRollbackPayload> {
|
|
return requestJson<MemoryFeedbackCorrectionRollbackPayload>(`/feedback-corrections/${taskId}/rollback`, {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify(payload),
|
|
})
|
|
}
|
|
|
|
export async function getMemorySources(): Promise<MemorySourceListPayload> {
|
|
return requestJson<MemorySourceListPayload>('/sources')
|
|
}
|
|
|
|
export async function getMemoryEpisodes(options?: {
|
|
query?: string
|
|
limit?: number
|
|
source?: string
|
|
personId?: string
|
|
timeStart?: number
|
|
timeEnd?: number
|
|
}): Promise<MemoryEpisodeListPayload> {
|
|
const params = new URLSearchParams({
|
|
query: options?.query ?? '',
|
|
limit: String(options?.limit ?? 20),
|
|
source: options?.source ?? '',
|
|
person_id: options?.personId ?? '',
|
|
})
|
|
if (options?.timeStart !== undefined) {
|
|
params.set('time_start', String(options.timeStart))
|
|
}
|
|
if (options?.timeEnd !== undefined) {
|
|
params.set('time_end', String(options.timeEnd))
|
|
}
|
|
return requestJson<MemoryEpisodeListPayload>(`/episodes?${params.toString()}`)
|
|
}
|
|
|
|
export async function getMemoryEpisode(episodeId: string): Promise<MemoryEpisodeDetailPayload> {
|
|
return requestJson<MemoryEpisodeDetailPayload>(`/episodes/${encodeURIComponent(episodeId)}`)
|
|
}
|
|
|
|
export async function rebuildMemoryEpisodes(payload: {
|
|
source?: string
|
|
sources?: string[]
|
|
all?: boolean
|
|
}): Promise<MemoryEpisodeActionPayload> {
|
|
return requestJson<MemoryEpisodeActionPayload>('/episodes/rebuild', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify(payload),
|
|
})
|
|
}
|
|
|
|
export async function getMemoryEpisodeStatus(limit: number = 20): Promise<MemoryEpisodeStatusPayload> {
|
|
return requestJson<MemoryEpisodeStatusPayload>(`/episodes/status?limit=${limit}`)
|
|
}
|
|
|
|
export async function processMemoryEpisodePending(payload: {
|
|
limit?: number
|
|
max_retry?: number
|
|
}): Promise<MemoryEpisodeActionPayload> {
|
|
return requestJson<MemoryEpisodeActionPayload>('/episodes/process-pending', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify(payload),
|
|
})
|
|
}
|
|
|
|
export async function getMemoryProfiles(limit: number = 50): Promise<MemoryProfileListPayload> {
|
|
return requestJson<MemoryProfileListPayload>(`/profiles?limit=${limit}`)
|
|
}
|
|
|
|
export async function queryMemoryProfile(options: {
|
|
personId?: string
|
|
personKeyword?: string
|
|
platform?: string
|
|
userId?: string
|
|
limit?: number
|
|
forceRefresh?: boolean
|
|
}): Promise<MemoryProfileQueryPayload> {
|
|
const params = new URLSearchParams({
|
|
person_id: options.personId ?? '',
|
|
person_keyword: options.personKeyword ?? '',
|
|
platform: options.platform ?? '',
|
|
user_id: options.userId ?? '',
|
|
limit: String(options.limit ?? 12),
|
|
force_refresh: options.forceRefresh ? 'true' : 'false',
|
|
})
|
|
return requestJson<MemoryProfileQueryPayload>(`/profiles/query?${params.toString()}`)
|
|
}
|
|
|
|
export async function setMemoryProfileOverride(payload: {
|
|
person_id: string
|
|
override_text: string
|
|
updated_by?: string
|
|
source?: string
|
|
}): Promise<MemoryProfileOverridePayload> {
|
|
return requestJson<MemoryProfileOverridePayload>('/profiles/override', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify(payload),
|
|
})
|
|
}
|
|
|
|
export async function deleteMemoryProfileOverride(personId: string): Promise<MemoryProfileOverridePayload> {
|
|
return requestJson<MemoryProfileOverridePayload>(`/profiles/override/${encodeURIComponent(personId)}`, {
|
|
method: 'DELETE',
|
|
})
|
|
}
|
|
|
|
export async function getMemoryRecycleBin(limit: number = 50): Promise<MemoryRecycleBinPayload> {
|
|
return requestJson<MemoryRecycleBinPayload>(`/maintenance/recycle-bin?limit=${limit}`)
|
|
}
|
|
|
|
function maintainMemory(path: string, payload: { target: string; hours?: number }): Promise<MemoryMaintenanceActionPayload> {
|
|
return requestJson<MemoryMaintenanceActionPayload>(path, {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify(payload),
|
|
})
|
|
}
|
|
|
|
export async function restoreMaintainedMemory(target: string): Promise<MemoryMaintenanceActionPayload> {
|
|
return maintainMemory('/maintenance/restore', { target })
|
|
}
|
|
|
|
export async function reinforceMemory(target: string): Promise<MemoryMaintenanceActionPayload> {
|
|
return maintainMemory('/maintenance/reinforce', { target })
|
|
}
|
|
|
|
export async function freezeMemory(target: string): Promise<MemoryMaintenanceActionPayload> {
|
|
return maintainMemory('/maintenance/freeze', { target })
|
|
}
|
|
|
|
export async function protectMemory(target: string, hours?: number): Promise<MemoryMaintenanceActionPayload> {
|
|
return maintainMemory('/maintenance/protect', hours === undefined ? { target } : { target, hours })
|
|
}
|
|
|
|
export async function getMemoryRuntimeConfig(): Promise<MemoryRuntimeConfigPayload> {
|
|
return requestJson<MemoryRuntimeConfigPayload>('/runtime/config')
|
|
}
|
|
|
|
export async function refreshMemoryRuntimeSelfCheck(): Promise<MemoryRuntimeSelfCheckPayload> {
|
|
return requestJson<MemoryRuntimeSelfCheckPayload>('/runtime/self-check/refresh', {
|
|
method: 'POST',
|
|
})
|
|
}
|
|
|
|
export async function getMemoryConfigSchema(): Promise<MemoryConfigSchemaPayload> {
|
|
return requestJson<MemoryConfigSchemaPayload>('/config/schema')
|
|
}
|
|
|
|
export async function getMemoryConfig(): Promise<MemoryConfigPayload> {
|
|
return requestJson<MemoryConfigPayload>('/config')
|
|
}
|
|
|
|
export async function updateMemoryConfig(config: Record<string, unknown>): Promise<{ success: boolean; message?: string }> {
|
|
return requestJson('/config', {
|
|
method: 'PUT',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify({ config }),
|
|
})
|
|
}
|
|
|
|
export async function getMemoryConfigRaw(): Promise<MemoryRawConfigPayload> {
|
|
return requestJson<MemoryRawConfigPayload>('/config/raw')
|
|
}
|
|
|
|
export async function updateMemoryConfigRaw(config: string): Promise<{ success: boolean; message?: string }> {
|
|
return requestJson('/config/raw', {
|
|
method: 'PUT',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify({ config }),
|
|
})
|
|
}
|
|
|
|
export async function getMemoryImportGuide(): Promise<MemoryImportGuidePayload> {
|
|
return requestJson<MemoryImportGuidePayload>('/import/guide')
|
|
}
|
|
|
|
export async function getMemoryImportSettings(): Promise<MemoryImportSettingsPayload> {
|
|
return requestJson<MemoryImportSettingsPayload>('/import/settings')
|
|
}
|
|
|
|
export async function getMemoryImportPathAliases(): Promise<MemoryImportPathAliasesPayload> {
|
|
return requestJson<MemoryImportPathAliasesPayload>('/import/path-aliases')
|
|
}
|
|
|
|
export async function resolveMemoryImportPath(payload: {
|
|
alias: string
|
|
relative_path?: string
|
|
must_exist?: boolean
|
|
}): Promise<MemoryImportResolvePathPayload> {
|
|
return requestJson<MemoryImportResolvePathPayload>('/import/resolve-path', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify(payload),
|
|
})
|
|
}
|
|
|
|
export async function getMemoryImportTasks(limit: number = 20): Promise<MemoryImportTaskListPayload> {
|
|
return requestJson<MemoryImportTaskListPayload>(`/import/tasks?limit=${limit}`)
|
|
}
|
|
|
|
export async function getMemoryImportTask(taskId: string, includeChunks: boolean = false): Promise<MemoryImportTaskDetailPayload> {
|
|
return requestJson<MemoryImportTaskDetailPayload>(
|
|
`/import/tasks/${encodeURIComponent(taskId)}?include_chunks=${includeChunks ? 'true' : 'false'}`,
|
|
)
|
|
}
|
|
|
|
export async function getMemoryImportTaskChunks(
|
|
taskId: string,
|
|
fileId: string,
|
|
offset: number = 0,
|
|
limit: number = 50,
|
|
): Promise<MemoryImportChunkListPayload> {
|
|
return requestJson<MemoryImportChunkListPayload>(
|
|
`/import/tasks/${encodeURIComponent(taskId)}/chunks/${encodeURIComponent(fileId)}?offset=${offset}&limit=${limit}`,
|
|
)
|
|
}
|
|
|
|
export async function createMemoryUploadImport(files: File[], payload: Record<string, unknown>): Promise<MemoryImportActionPayload> {
|
|
const formData = new FormData()
|
|
files.forEach((file) => {
|
|
formData.append('files', file)
|
|
})
|
|
formData.append('payload_json', JSON.stringify(payload))
|
|
return requestJson<MemoryImportActionPayload>('/import/upload', {
|
|
method: 'POST',
|
|
body: formData,
|
|
})
|
|
}
|
|
|
|
export async function createMemoryPasteImport(payload: Record<string, unknown>): Promise<MemoryImportActionPayload> {
|
|
return requestJson<MemoryImportActionPayload>('/import/paste', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify(payload),
|
|
})
|
|
}
|
|
|
|
export async function createMemoryRawScanImport(payload: Record<string, unknown>): Promise<MemoryImportActionPayload> {
|
|
return requestJson<MemoryImportActionPayload>('/import/raw-scan', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify(payload),
|
|
})
|
|
}
|
|
|
|
export async function createMemoryLpmmOpenieImport(payload: Record<string, unknown>): Promise<MemoryImportActionPayload> {
|
|
return requestJson<MemoryImportActionPayload>('/import/lpmm-openie', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify(payload),
|
|
})
|
|
}
|
|
|
|
export async function createMemoryLpmmConvertImport(payload: Record<string, unknown>): Promise<MemoryImportActionPayload> {
|
|
return requestJson<MemoryImportActionPayload>('/import/lpmm-convert', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify(payload),
|
|
})
|
|
}
|
|
|
|
export async function createMemoryTemporalBackfillImport(payload: Record<string, unknown>): Promise<MemoryImportActionPayload> {
|
|
return requestJson<MemoryImportActionPayload>('/import/temporal-backfill', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify(payload),
|
|
})
|
|
}
|
|
|
|
export async function createMemoryMaibotMigrationImport(payload: Record<string, unknown>): Promise<MemoryImportActionPayload> {
|
|
return requestJson<MemoryImportActionPayload>('/import/maibot-migration', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify(payload),
|
|
})
|
|
}
|
|
|
|
export async function cancelMemoryImportTask(taskId: string): Promise<MemoryImportActionPayload> {
|
|
return requestJson<MemoryImportActionPayload>(`/import/tasks/${encodeURIComponent(taskId)}/cancel`, {
|
|
method: 'POST',
|
|
})
|
|
}
|
|
|
|
export async function retryMemoryImportTask(
|
|
taskId: string,
|
|
payload: {
|
|
overrides?: Record<string, unknown>
|
|
} = {},
|
|
): Promise<MemoryImportActionPayload> {
|
|
return requestJson<MemoryImportActionPayload>(`/import/tasks/${encodeURIComponent(taskId)}/retry`, {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify(payload),
|
|
})
|
|
}
|
|
|
|
export async function getMemoryTuningProfile(): Promise<MemoryTuningProfilePayload> {
|
|
return requestJson<MemoryTuningProfilePayload>('/retrieval_tuning/profile')
|
|
}
|
|
|
|
export async function getMemoryTuningTasks(limit: number = 20): Promise<MemoryTaskListPayload> {
|
|
return requestJson<MemoryTaskListPayload>(`/retrieval_tuning/tasks?limit=${limit}`)
|
|
}
|
|
|
|
export async function createMemoryTuningTask(payload: Record<string, unknown>): Promise<{ success: boolean; task?: MemoryTaskPayload }> {
|
|
return requestJson('/retrieval_tuning/tasks', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify(payload),
|
|
})
|
|
}
|
|
|
|
export async function applyBestMemoryTuningProfile(taskId: string): Promise<{ success: boolean; error?: string }> {
|
|
return requestJson(`/retrieval_tuning/tasks/${encodeURIComponent(taskId)}/apply-best`, {
|
|
method: 'POST',
|
|
})
|
|
}
|
|
|
|
export async function getMemoryTuningReport(taskId: string, format: 'md' | 'json' = 'md'): Promise<{ success: boolean; content: string; path: string; error?: string }> {
|
|
return requestJson(`/retrieval_tuning/tasks/${encodeURIComponent(taskId)}/report?format=${format}`)
|
|
}
|