@gdrl/kronos-lib 0.1.2 → 0.1.4
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.
- package/dist/index.d.mts +16 -3
- package/dist/index.d.ts +16 -3
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +33 -0
- package/dist/index.mjs.map +1 -1
- package/dist/react/index.d.mts +9 -1
- package/dist/react/index.d.ts +9 -1
- package/dist/react/index.js +59 -0
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +59 -0
- package/dist/react/index.mjs.map +1 -1
- package/dist/{types-Cn8Lsqkz.d.mts → types-CftFKnhs.d.mts} +20 -1
- package/dist/{types-Cn8Lsqkz.d.ts → types-CftFKnhs.d.ts} +20 -1
- package/package.json +1 -1
package/dist/react/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/react/index.ts","../../src/react/useKronos.ts","../../src/react/KronosProvider.tsx"],"sourcesContent":["export { useKronos } from './useKronos';\nexport type {\n KronosTriggerOps,\n UseKronosLegacyArgs,\n UseKronosArgs,\n UseKronosResult,\n} from './useKronos';\n\nexport { KronosProvider, useKronosContext } from './KronosProvider';\nexport type {\n KronosProviderProps,\n KronosContextValue,\n} from './KronosProvider';\n","import { useCallback, useEffect, useState } from 'react';\nimport type {\n TriggerRecord,\n ListTriggersResponse,\n UpdateTriggerResponse,\n DeleteTriggerResponse,\n MemoryStatsResponse,\n GetMCPServerResponse,\n ConnectMCPServerResponse,\n ScopeDetail,\n ListScopesResponse,\n CreateScopeResponse,\n UpdateScopeResponse,\n SkillSummaryRecord,\n SkillManageResponse,\n SkillFileInput,\n SkillReadMode,\n SkillFileContentMode,\n ContextGraphSummaryResponse,\n ContextGraphReadResponse,\n SkillFileRecord,\n} from '../types';\nimport { useKronosContext } from './KronosProvider';\n\nconst INTERNAL_CONTEXT_GRAPH_SKILL_NAME = '__internal_context_graph__';\n\n// ---------------------------------------------------------------------------\n// Legacy ops interface (kept for backward compatibility)\n// ---------------------------------------------------------------------------\n\nexport interface KronosTriggerOps {\n listTriggers(params: {\n tenantUserId: string;\n }): Promise<ListTriggersResponse>;\n\n createNlTrigger(params: {\n tenantUserId: string;\n title: string;\n nl: string;\n actionDescription: string;\n }): Promise<{ triggerId: string | null }>;\n}\n\nexport interface UseKronosLegacyArgs {\n ops: KronosTriggerOps;\n tenantUserId: string;\n}\n\n// ---------------------------------------------------------------------------\n// Result type\n// ---------------------------------------------------------------------------\n\nexport interface UseKronosResult {\n // -- Triggers --\n triggers: TriggerRecord[] | null;\n triggersLoading: boolean;\n triggersError: string | null;\n refreshTriggers: () => Promise<void>;\n\n createNlTrigger: (params: {\n title: string;\n nl: string;\n actionDescription: string;\n }) => Promise<{ triggerId: string | null }>;\n createLoading: boolean;\n createError: string | null;\n\n updateTrigger: (params: {\n triggerId: string;\n title?: string | null;\n actionDescription?: string;\n triggerSpec?: Record<string, unknown>;\n status?: string;\n }) => Promise<UpdateTriggerResponse>;\n updateLoading: boolean;\n updateError: string | null;\n\n deleteTrigger: (params: { triggerId: string }) => Promise<DeleteTriggerResponse>;\n deleteLoading: boolean;\n deleteError: string | null;\n\n // -- Memory stats --\n memoryStats: MemoryStatsResponse | null;\n memoryStatsLoading: boolean;\n memoryStatsError: string | null;\n refreshMemoryStats: () => Promise<void>;\n\n // -- Scopes --\n scopes: ScopeDetail[] | null;\n scopesLoading: boolean;\n scopesError: string | null;\n refreshScopes: () => Promise<void>;\n\n getMCPServer: (params: { serverId: string }) => Promise<GetMCPServerResponse>;\n connectMCPServer: (params: { serverId: string }) => Promise<ConnectMCPServerResponse>;\n\n createScope: (params: {\n name: string;\n include_query: string;\n description?: string;\n }) => Promise<{\n scope_id: string | null;\n backfill_job_id?: string;\n mcp_server_id?: string | null;\n mcp_server_error?: string | null;\n }>;\n createScopeLoading: boolean;\n createScopeError: string | null;\n\n updateScope: (params: {\n scopeId: string;\n patch: {\n name?: string;\n description?: string | null;\n include_query?: string;\n exclude_query?: string | null;\n };\n }) => Promise<UpdateScopeResponse>;\n updateScopeLoading: boolean;\n updateScopeError: string | null;\n\n deleteScope: (params: { scopeId: string }) => Promise<{ deleted: boolean }>;\n deleteScopeLoading: boolean;\n deleteScopeError: string | null;\n\n // -- Skills --\n skills: SkillSummaryRecord[] | null;\n skillsLoading: boolean;\n skillsError: string | null;\n refreshSkills: () => Promise<void>;\n\n createSkill: (params: {\n name: string;\n description: string;\n instructions: string;\n files?: SkillFileInput[];\n metadata?: Record<string, unknown>;\n }) => Promise<{ skillId: string | null }>;\n createSkillLoading: boolean;\n createSkillError: string | null;\n\n readSkill: (params: {\n skillId: string;\n mode: SkillReadMode;\n files?: string[];\n fileContent?: SkillFileContentMode;\n }) => Promise<SkillManageResponse>;\n\n updateSkill: (params: {\n skillId: string;\n patch: {\n name?: string;\n description?: string;\n instructions?: string;\n files?: {\n upsert?: SkillFileInput[];\n removePaths?: string[];\n };\n metadata?: Record<string, unknown> | null;\n };\n }) => Promise<SkillManageResponse>;\n updateSkillLoading: boolean;\n updateSkillError: string | null;\n\n deleteSkill: (params: { skillId: string }) => Promise<SkillManageResponse>;\n deleteSkillLoading: boolean;\n deleteSkillError: string | null;\n\n getContextGraph: () => Promise<ContextGraphSummaryResponse>;\n readContextGraph: (params?: { path?: string }) => Promise<ContextGraphReadResponse>;\n}\n\nexport type UseKronosArgs = UseKronosLegacyArgs | undefined;\n\n// ---------------------------------------------------------------------------\n// Direct-fetch helper\n// ---------------------------------------------------------------------------\n\nasync function directFetch<T>(\n baseUrl: string,\n token: string,\n path: string,\n options: { method?: string; body?: unknown } = {},\n): Promise<T> {\n const res = await fetch(`${baseUrl}${path}`, {\n method: options.method ?? 'GET',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n },\n body: options.body ? JSON.stringify(options.body) : undefined,\n });\n\n const text = await res.text();\n let data: unknown;\n try {\n data = text ? JSON.parse(text) : null;\n } catch {\n data = text;\n }\n\n if (!res.ok) {\n const msg =\n (data && typeof data === 'object' && 'error' in data && typeof (data as any).error === 'string')\n ? (data as any).error\n : `Request failed with status ${res.status}`;\n throw new Error(msg);\n }\n\n return data as T;\n}\n\nfunction parseContextGraphProcedures(\n files: SkillFileRecord[],\n): ContextGraphSummaryResponse['procedures'] {\n return files\n .filter((file) => file.path.startsWith('procedures/') && file.path.endsWith('.md'))\n .map((file) => {\n const content = file.content ?? '';\n const normalized = content.replace(/\\r\\n/g, '\\n');\n\n if (normalized.startsWith('---\\n')) {\n const endIndex = normalized.indexOf('\\n---\\n', 4);\n if (endIndex !== -1) {\n const frontmatter = normalized.slice(4, endIndex);\n const metadata: Record<string, string> = {};\n for (const line of frontmatter.split('\\n')) {\n const separatorIndex = line.indexOf(':');\n if (separatorIndex === -1) continue;\n const key = line.slice(0, separatorIndex).trim();\n const value = line.slice(separatorIndex + 1).trim();\n if (key && value) {\n metadata[key] = value;\n }\n }\n\n return {\n title: metadata.title || (file.path.split('/').pop() ?? file.path),\n description: metadata.description || '',\n path: file.path,\n };\n }\n }\n\n const lines = content.split(/\\r?\\n/);\n const titleLine = lines.find((line) => line.startsWith('# '));\n const title = titleLine\n ? titleLine.replace(/^#\\s+/, '').trim()\n : file.path.split('/').pop() ?? file.path;\n const description =\n lines\n .slice(1)\n .map((line) => line.trim())\n .find((line) => line.length > 0 && !line.startsWith('#')) ?? '';\n\n return {\n title,\n description,\n path: file.path,\n };\n })\n .sort((a, b) => a.path.localeCompare(b.path));\n}\n\nfunction assertReadableContextGraphPath(path: string): void {\n if (path === 'SKILL.md') return;\n if (/^procedures\\/[a-z0-9-]+\\.md$/.test(path)) return;\n throw new Error('Only SKILL.md or procedures/*.md paths are allowed');\n}\n\n// ---------------------------------------------------------------------------\n// Hook implementation\n// ---------------------------------------------------------------------------\n\nexport function useKronos(args?: UseKronosArgs): UseKronosResult {\n const ctx = useKronosContext();\n\n const isProvider = !!ctx && !args;\n const legacyArgs = args as UseKronosLegacyArgs | undefined;\n\n // --- Trigger state ---\n const [triggers, setTriggers] = useState<TriggerRecord[] | null>(null);\n const [triggersLoading, setTriggersLoading] = useState(true);\n const [triggersError, setTriggersError] = useState<string | null>(null);\n\n const [createLoading, setCreateLoading] = useState(false);\n const [createError, setCreateError] = useState<string | null>(null);\n\n const [updateLoading, setUpdateLoading] = useState(false);\n const [updateError, setUpdateError] = useState<string | null>(null);\n\n const [deleteLoading, setDeleteLoading] = useState(false);\n const [deleteError, setDeleteError] = useState<string | null>(null);\n\n // --- Memory stats state ---\n const [memoryStats, setMemoryStats] = useState<MemoryStatsResponse | null>(null);\n const [memoryStatsLoading, setMemoryStatsLoading] = useState(false);\n const [memoryStatsError, setMemoryStatsError] = useState<string | null>(null);\n\n // --- Scopes state ---\n const [scopes, setScopes] = useState<ScopeDetail[] | null>(null);\n const [scopesLoading, setScopesLoading] = useState(false);\n const [scopesError, setScopesError] = useState<string | null>(null);\n\n const [createScopeLoading, setCreateScopeLoading] = useState(false);\n const [createScopeError, setCreateScopeError] = useState<string | null>(null);\n\n const [updateScopeLoading, setUpdateScopeLoading] = useState(false);\n const [updateScopeError, setUpdateScopeError] = useState<string | null>(null);\n\n const [deleteScopeLoading, setDeleteScopeLoading] = useState(false);\n const [deleteScopeError, setDeleteScopeError] = useState<string | null>(null);\n\n // --- Skills state ---\n const [skills, setSkills] = useState<SkillSummaryRecord[] | null>(null);\n const [skillsLoading, setSkillsLoading] = useState(false);\n const [skillsError, setSkillsError] = useState<string | null>(null);\n\n const [createSkillLoading, setCreateSkillLoading] = useState(false);\n const [createSkillError, setCreateSkillError] = useState<string | null>(null);\n\n const [updateSkillLoading, setUpdateSkillLoading] = useState(false);\n const [updateSkillError, setUpdateSkillError] = useState<string | null>(null);\n\n const [deleteSkillLoading, setDeleteSkillLoading] = useState(false);\n const [deleteSkillError, setDeleteSkillError] = useState<string | null>(null);\n\n // =========================================================================\n // Triggers\n // =========================================================================\n\n const loadTriggers = useCallback(async () => {\n setTriggersLoading(true);\n setTriggersError(null);\n try {\n let response: ListTriggersResponse;\n\n if (isProvider && ctx?.token) {\n response = await directFetch<ListTriggersResponse>(\n ctx.baseUrl,\n ctx.token,\n '/v1/triggers',\n );\n } else if (legacyArgs) {\n response = await legacyArgs.ops.listTriggers({\n tenantUserId: legacyArgs.tenantUserId,\n });\n } else {\n throw new Error('useKronos: no KronosProvider and no ops provided');\n }\n\n setTriggers(Array.isArray(response.triggers) ? response.triggers : []);\n } catch (error: unknown) {\n setTriggersError(\n error instanceof Error ? error.message : 'Failed to load Kronos triggers',\n );\n setTriggers([]);\n } finally {\n setTriggersLoading(false);\n }\n }, [isProvider, ctx?.baseUrl, ctx?.token, legacyArgs?.ops, legacyArgs?.tenantUserId]);\n\n useEffect(() => {\n if (isProvider && !ctx?.isReady) return;\n void loadTriggers();\n }, [loadTriggers, isProvider, ctx?.isReady]);\n\n const refreshTriggers = useCallback(async () => {\n await loadTriggers();\n }, [loadTriggers]);\n\n const createNlTrigger = useCallback(\n async (params: { title: string; nl: string; actionDescription: string }) => {\n setCreateLoading(true);\n setCreateError(null);\n try {\n let triggerId: string | null = null;\n\n if (isProvider && ctx?.token) {\n const res = await directFetch<{ trigger_id?: string }>(\n ctx.baseUrl,\n ctx.token,\n '/v1/triggers',\n {\n method: 'POST',\n body: {\n trigger_type: 'nl_webhook',\n trigger_spec: { nl: params.nl },\n title: params.title.trim(),\n action_description: params.actionDescription,\n webhook_url: ctx.baseUrl + '/v1/triggers/execute',\n webhook_secret: 'frontend-managed',\n },\n },\n );\n triggerId = res.trigger_id ?? null;\n } else if (legacyArgs) {\n const res = await legacyArgs.ops.createNlTrigger({\n tenantUserId: legacyArgs.tenantUserId,\n title: params.title,\n nl: params.nl,\n actionDescription: params.actionDescription,\n });\n triggerId = res.triggerId;\n } else {\n throw new Error('useKronos: no KronosProvider and no ops provided');\n }\n\n void loadTriggers();\n return { triggerId };\n } catch (error: unknown) {\n const message =\n error instanceof Error ? error.message : 'Failed to create Kronos trigger';\n setCreateError(message);\n return { triggerId: null };\n } finally {\n setCreateLoading(false);\n }\n },\n [isProvider, ctx?.baseUrl, ctx?.token, legacyArgs?.ops, legacyArgs?.tenantUserId, loadTriggers],\n );\n\n const updateTrigger = useCallback(\n async (params: {\n triggerId: string;\n title?: string | null;\n actionDescription?: string;\n triggerSpec?: Record<string, unknown>;\n status?: string;\n }) => {\n setUpdateLoading(true);\n setUpdateError(null);\n try {\n if (!isProvider || !ctx?.token) {\n throw new Error('updateTrigger requires KronosProvider');\n }\n\n const body: Record<string, unknown> = {};\n if (params.title !== undefined) {\n body.title = params.title;\n }\n if (params.actionDescription !== undefined) {\n body.action_description = params.actionDescription;\n }\n if (params.triggerSpec !== undefined) {\n body.trigger_spec = params.triggerSpec;\n }\n if (params.status !== undefined) {\n body.status = params.status;\n }\n\n const res = await directFetch<UpdateTriggerResponse>(\n ctx.baseUrl,\n ctx.token,\n `/v1/triggers/${encodeURIComponent(params.triggerId)}`,\n {\n method: 'PUT',\n body,\n },\n );\n\n void loadTriggers();\n return res;\n } catch (error: unknown) {\n const message =\n error instanceof Error ? error.message : 'Failed to update trigger';\n setUpdateError(message);\n throw error;\n } finally {\n setUpdateLoading(false);\n }\n },\n [isProvider, ctx?.baseUrl, ctx?.token, loadTriggers],\n );\n\n const deleteTriggerFn = useCallback(\n async (params: { triggerId: string }) => {\n setDeleteLoading(true);\n setDeleteError(null);\n try {\n if (!isProvider || !ctx?.token) {\n throw new Error('deleteTrigger requires KronosProvider');\n }\n\n const res = await directFetch<DeleteTriggerResponse>(\n ctx.baseUrl,\n ctx.token,\n `/v1/triggers/${encodeURIComponent(params.triggerId)}`,\n { method: 'DELETE' },\n );\n\n void loadTriggers();\n return res;\n } catch (error: unknown) {\n const message =\n error instanceof Error ? error.message : 'Failed to delete trigger';\n setDeleteError(message);\n throw error;\n } finally {\n setDeleteLoading(false);\n }\n },\n [isProvider, ctx?.baseUrl, ctx?.token, loadTriggers],\n );\n\n // =========================================================================\n // Memory stats\n // =========================================================================\n\n const loadMemoryStats = useCallback(async () => {\n if (!isProvider || !ctx?.token) return;\n setMemoryStatsLoading(true);\n setMemoryStatsError(null);\n try {\n const res = await directFetch<MemoryStatsResponse>(\n ctx.baseUrl,\n ctx.token,\n '/v1/memory-stats',\n );\n setMemoryStats(res);\n } catch (error: unknown) {\n setMemoryStatsError(\n error instanceof Error ? error.message : 'Failed to load memory stats',\n );\n } finally {\n setMemoryStatsLoading(false);\n }\n }, [isProvider, ctx?.baseUrl, ctx?.token]);\n\n const refreshMemoryStats = useCallback(async () => {\n await loadMemoryStats();\n }, [loadMemoryStats]);\n\n // =========================================================================\n // Scopes\n // =========================================================================\n\n const loadScopes = useCallback(async () => {\n if (!isProvider || !ctx?.token) return;\n setScopesLoading(true);\n setScopesError(null);\n try {\n const res = await directFetch<ListScopesResponse>(\n ctx.baseUrl,\n ctx.token,\n '/v1/scopes',\n );\n setScopes(Array.isArray(res.scopes) ? res.scopes : []);\n } catch (error: unknown) {\n setScopesError(\n error instanceof Error ? error.message : 'Failed to load scopes',\n );\n setScopes([]);\n } finally {\n setScopesLoading(false);\n }\n }, [isProvider, ctx?.baseUrl, ctx?.token]);\n\n const refreshScopes = useCallback(async () => {\n await loadScopes();\n }, [loadScopes]);\n\n const getMCPServer = useCallback(\n async (params: { serverId: string }) => {\n if (!isProvider || !ctx?.token) {\n throw new Error('getMCPServer requires KronosProvider');\n }\n\n return directFetch<GetMCPServerResponse>(\n ctx.baseUrl,\n ctx.token,\n `/v1/mcp-servers/${encodeURIComponent(params.serverId)}`,\n );\n },\n [isProvider, ctx?.baseUrl, ctx?.token],\n );\n\n const connectMCPServer = useCallback(\n async (params: { serverId: string }) => {\n if (!isProvider || !ctx?.token) {\n throw new Error('connectMCPServer requires KronosProvider');\n }\n\n return directFetch<ConnectMCPServerResponse>(\n ctx.baseUrl,\n ctx.token,\n `/v1/mcp-servers/${encodeURIComponent(params.serverId)}/connect`,\n {\n method: 'POST',\n body: {},\n },\n );\n },\n [isProvider, ctx?.baseUrl, ctx?.token],\n );\n\n const createScope = useCallback(\n async (params: { name: string; include_query: string; description?: string }) => {\n setCreateScopeLoading(true);\n setCreateScopeError(null);\n try {\n if (!isProvider || !ctx?.token) {\n throw new Error('createScope requires KronosProvider');\n }\n\n const res = await directFetch<CreateScopeResponse>(\n ctx.baseUrl,\n ctx.token,\n '/v1/scopes',\n {\n method: 'POST',\n body: {\n name: params.name,\n include_query: params.include_query,\n description: params.description,\n },\n },\n );\n\n void loadScopes();\n if (res.mcp_server_error) {\n setCreateScopeError(res.mcp_server_error);\n }\n return {\n scope_id: res.scope_id ?? null,\n backfill_job_id: res.backfill_job_id,\n mcp_server_id: res.mcp_server_id ?? null,\n mcp_server_error: res.mcp_server_error ?? null,\n };\n } catch (error: unknown) {\n const message =\n error instanceof Error ? error.message : 'Failed to create scope';\n setCreateScopeError(message);\n return { scope_id: null, mcp_server_id: null, mcp_server_error: message };\n } finally {\n setCreateScopeLoading(false);\n }\n },\n [isProvider, ctx?.baseUrl, ctx?.token, loadScopes],\n );\n\n const updateScopeFn = useCallback(\n async (params: {\n scopeId: string;\n patch: {\n name?: string;\n description?: string | null;\n include_query?: string;\n exclude_query?: string | null;\n };\n }) => {\n setUpdateScopeLoading(true);\n setUpdateScopeError(null);\n try {\n if (!isProvider || !ctx?.token) {\n throw new Error('updateScope requires KronosProvider');\n }\n\n const res = await directFetch<UpdateScopeResponse>(\n ctx.baseUrl,\n ctx.token,\n `/v1/scopes/${encodeURIComponent(params.scopeId)}`,\n {\n method: 'PATCH',\n body: params.patch,\n },\n );\n\n void loadScopes();\n return res;\n } catch (error: unknown) {\n const message =\n error instanceof Error ? error.message : 'Failed to update scope';\n setUpdateScopeError(message);\n throw error;\n } finally {\n setUpdateScopeLoading(false);\n }\n },\n [isProvider, ctx?.baseUrl, ctx?.token, loadScopes],\n );\n\n const deleteScopeFn = useCallback(\n async (params: { scopeId: string }) => {\n setDeleteScopeLoading(true);\n setDeleteScopeError(null);\n try {\n if (!isProvider || !ctx?.token) {\n throw new Error('deleteScope requires KronosProvider');\n }\n\n const res = await directFetch<{ deleted: boolean }>(\n ctx.baseUrl,\n ctx.token,\n `/v1/scopes/${encodeURIComponent(params.scopeId)}`,\n { method: 'DELETE' },\n );\n\n void loadScopes();\n return res;\n } catch (error: unknown) {\n const message =\n error instanceof Error ? error.message : 'Failed to delete scope';\n setDeleteScopeError(message);\n throw error;\n } finally {\n setDeleteScopeLoading(false);\n }\n },\n [isProvider, ctx?.baseUrl, ctx?.token, loadScopes],\n );\n\n // =========================================================================\n // Skills\n // =========================================================================\n\n const refreshSkills = useCallback(async () => {\n setSkillsLoading(true);\n setSkillsError(null);\n try {\n if (!isProvider || !ctx?.token) {\n throw new Error('refreshSkills requires KronosProvider');\n }\n\n const res = await directFetch<SkillManageResponse>(\n ctx.baseUrl,\n ctx.token,\n '/v1/skills/manage',\n {\n method: 'POST',\n body: {\n operation: 'list',\n },\n },\n );\n\n setSkills(Array.isArray(res.skills) ? res.skills : []);\n } catch (error: unknown) {\n setSkillsError(\n error instanceof Error ? error.message : 'Failed to load skills',\n );\n setSkills([]);\n } finally {\n setSkillsLoading(false);\n }\n }, [isProvider, ctx?.baseUrl, ctx?.token]);\n\n const createSkill = useCallback(\n async (params: {\n name: string;\n description: string;\n instructions: string;\n files?: SkillFileInput[];\n metadata?: Record<string, unknown>;\n }) => {\n setCreateSkillLoading(true);\n setCreateSkillError(null);\n try {\n if (!isProvider || !ctx?.token) {\n throw new Error('createSkill requires KronosProvider');\n }\n\n const res = await directFetch<SkillManageResponse>(\n ctx.baseUrl,\n ctx.token,\n '/v1/skills/manage',\n {\n method: 'POST',\n body: {\n operation: 'create',\n name: params.name.trim(),\n description: params.description.trim(),\n instructions: params.instructions,\n files: params.files,\n metadata: params.metadata,\n },\n },\n );\n\n void refreshSkills();\n return { skillId: res.skill_id ?? null };\n } catch (error: unknown) {\n const message =\n error instanceof Error ? error.message : 'Failed to create skill';\n setCreateSkillError(message);\n return { skillId: null };\n } finally {\n setCreateSkillLoading(false);\n }\n },\n [isProvider, ctx?.baseUrl, ctx?.token, refreshSkills],\n );\n\n const readSkill = useCallback(\n async (params: {\n skillId: string;\n mode: SkillReadMode;\n files?: string[];\n fileContent?: SkillFileContentMode;\n }) => {\n if (!isProvider || !ctx?.token) {\n throw new Error('readSkill requires KronosProvider');\n }\n\n return directFetch<SkillManageResponse>(\n ctx.baseUrl,\n ctx.token,\n '/v1/skills/manage',\n {\n method: 'POST',\n body: {\n operation: 'read',\n skill_id: params.skillId,\n mode: params.mode,\n files: params.files,\n fileContent: params.fileContent,\n },\n },\n );\n },\n [isProvider, ctx?.baseUrl, ctx?.token],\n );\n\n const updateSkill = useCallback(\n async (params: {\n skillId: string;\n patch: {\n name?: string;\n description?: string;\n instructions?: string;\n files?: {\n upsert?: SkillFileInput[];\n removePaths?: string[];\n };\n metadata?: Record<string, unknown> | null;\n };\n }) => {\n setUpdateSkillLoading(true);\n setUpdateSkillError(null);\n try {\n if (!isProvider || !ctx?.token) {\n throw new Error('updateSkill requires KronosProvider');\n }\n\n const res = await directFetch<SkillManageResponse>(\n ctx.baseUrl,\n ctx.token,\n '/v1/skills/manage',\n {\n method: 'POST',\n body: {\n operation: 'update',\n skill_id: params.skillId,\n patch: params.patch,\n },\n },\n );\n\n void refreshSkills();\n return res;\n } catch (error: unknown) {\n const message =\n error instanceof Error ? error.message : 'Failed to update skill';\n setUpdateSkillError(message);\n throw error;\n } finally {\n setUpdateSkillLoading(false);\n }\n },\n [isProvider, ctx?.baseUrl, ctx?.token, refreshSkills],\n );\n\n const deleteSkill = useCallback(\n async (params: { skillId: string }) => {\n setDeleteSkillLoading(true);\n setDeleteSkillError(null);\n try {\n if (!isProvider || !ctx?.token) {\n throw new Error('deleteSkill requires KronosProvider');\n }\n\n const res = await directFetch<SkillManageResponse>(\n ctx.baseUrl,\n ctx.token,\n '/v1/skills/manage',\n {\n method: 'POST',\n body: {\n operation: 'delete',\n skill_id: params.skillId,\n },\n },\n );\n\n void refreshSkills();\n return res;\n } catch (error: unknown) {\n const message =\n error instanceof Error ? error.message : 'Failed to delete skill';\n setDeleteSkillError(message);\n throw error;\n } finally {\n setDeleteSkillLoading(false);\n }\n },\n [isProvider, ctx?.baseUrl, ctx?.token, refreshSkills],\n );\n\n const getContextGraph = useCallback(async () => {\n if (!isProvider || !ctx?.token) {\n throw new Error('getContextGraph requires KronosProvider');\n }\n\n const listed = await directFetch<SkillManageResponse>(\n ctx.baseUrl,\n ctx.token,\n '/v1/skills/manage',\n {\n method: 'POST',\n body: {\n operation: 'list',\n include_internal: true,\n },\n },\n );\n\n const match = (listed.skills ?? []).find(\n (skill) => skill.name === INTERNAL_CONTEXT_GRAPH_SKILL_NAME,\n );\n\n if (!match?.skill_id) {\n return {\n skill_id: null,\n procedures: [],\n } satisfies ContextGraphSummaryResponse;\n }\n\n const treeResult = await directFetch<SkillManageResponse>(\n ctx.baseUrl,\n ctx.token,\n '/v1/skills/manage',\n {\n method: 'POST',\n body: {\n operation: 'read',\n skill_id: match.skill_id,\n mode: 'tree',\n },\n },\n );\n\n const procedurePaths = (treeResult.tree ?? [])\n .filter(\n (node) =>\n node.kind === 'file' &&\n node.path.startsWith('procedures/') &&\n node.path.endsWith('.md'),\n )\n .map((node) => node.path);\n\n if (procedurePaths.length === 0) {\n return {\n skill_id: match.skill_id,\n procedures: [],\n } satisfies ContextGraphSummaryResponse;\n }\n\n const filesResult = await directFetch<SkillManageResponse>(\n ctx.baseUrl,\n ctx.token,\n '/v1/skills/manage',\n {\n method: 'POST',\n body: {\n operation: 'read',\n skill_id: match.skill_id,\n mode: 'files',\n files: procedurePaths,\n fileContent: 'full',\n },\n },\n );\n\n return {\n skill_id: match.skill_id,\n procedures: parseContextGraphProcedures(filesResult.files ?? []),\n } satisfies ContextGraphSummaryResponse;\n }, [isProvider, ctx?.baseUrl, ctx?.token]);\n\n const readContextGraph = useCallback(\n async (params?: { path?: string }) => {\n if (!isProvider || !ctx?.token) {\n throw new Error('readContextGraph requires KronosProvider');\n }\n\n const requestedPath = params?.path?.trim() || 'SKILL.md';\n assertReadableContextGraphPath(requestedPath);\n\n const listed = await directFetch<SkillManageResponse>(\n ctx.baseUrl,\n ctx.token,\n '/v1/skills/manage',\n {\n method: 'POST',\n body: {\n operation: 'list',\n include_internal: true,\n },\n },\n );\n\n const match = (listed.skills ?? []).find(\n (skill) => skill.name === INTERNAL_CONTEXT_GRAPH_SKILL_NAME,\n );\n\n if (!match?.skill_id) {\n return {\n skill_id: null,\n path: requestedPath,\n content: null,\n } satisfies ContextGraphReadResponse;\n }\n\n if (requestedPath === 'SKILL.md') {\n const result = await directFetch<SkillManageResponse>(\n ctx.baseUrl,\n ctx.token,\n '/v1/skills/manage',\n {\n method: 'POST',\n body: {\n operation: 'read',\n skill_id: match.skill_id,\n mode: 'instructions',\n },\n },\n );\n\n return {\n skill_id: match.skill_id,\n path: 'SKILL.md',\n content: result.instructions ?? null,\n } satisfies ContextGraphReadResponse;\n }\n\n const result = await directFetch<SkillManageResponse>(\n ctx.baseUrl,\n ctx.token,\n '/v1/skills/manage',\n {\n method: 'POST',\n body: {\n operation: 'read',\n skill_id: match.skill_id,\n mode: 'files',\n files: [requestedPath],\n fileContent: 'full',\n },\n },\n );\n\n const file = (result.files ?? []).find(\n (entry) => entry.path === requestedPath,\n );\n\n return {\n skill_id: match.skill_id,\n path: requestedPath,\n content: file?.content ?? null,\n } satisfies ContextGraphReadResponse;\n },\n [isProvider, ctx?.baseUrl, ctx?.token],\n );\n\n // =========================================================================\n // Return\n // =========================================================================\n\n return {\n triggers,\n triggersLoading,\n triggersError,\n refreshTriggers,\n\n createNlTrigger,\n createLoading,\n createError,\n\n updateTrigger,\n updateLoading,\n updateError,\n\n deleteTrigger: deleteTriggerFn,\n deleteLoading,\n deleteError,\n\n memoryStats,\n memoryStatsLoading,\n memoryStatsError,\n refreshMemoryStats,\n\n scopes,\n scopesLoading,\n scopesError,\n refreshScopes,\n\n getMCPServer,\n connectMCPServer,\n\n createScope,\n createScopeLoading,\n createScopeError,\n\n updateScope: updateScopeFn,\n updateScopeLoading,\n updateScopeError,\n\n deleteScope: deleteScopeFn,\n deleteScopeLoading,\n deleteScopeError,\n\n skills,\n skillsLoading,\n skillsError,\n refreshSkills,\n\n createSkill,\n createSkillLoading,\n createSkillError,\n\n readSkill,\n\n updateSkill,\n updateSkillLoading,\n updateSkillError,\n\n deleteSkill,\n deleteSkillLoading,\n deleteSkillError,\n\n getContextGraph,\n readContextGraph,\n };\n}\n","import React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n} from 'react';\n\nexport interface KronosProviderProps {\n /** Base URL of the Kronos worker (e.g. \"https://kronos-worker.example.com\") */\n baseUrl: string;\n /**\n * Async function that returns a fresh frontend token string.\n * Called on mount and whenever the current token is about to expire.\n */\n getToken: () => Promise<string>;\n children: React.ReactNode;\n}\n\nexport interface KronosContextValue {\n baseUrl: string;\n token: string | null;\n isReady: boolean;\n refreshToken: () => Promise<void>;\n}\n\nconst KronosContext = createContext<KronosContextValue | null>(null);\n\nconst REFRESH_BUFFER_MS = 5 * 60 * 1000; // refresh 5 min before expiry\n\nfunction parseTokenExpiry(token: string): number | null {\n try {\n const withoutPrefix = token.startsWith('kr_ft_') ? token.slice(6) : token;\n const payloadB64 = withoutPrefix.split('.')[0];\n if (!payloadB64) return null;\n const base64 = payloadB64.replace(/-/g, '+').replace(/_/g, '/');\n const padded = base64 + '='.repeat((4 - (base64.length % 4)) % 4);\n const json = atob(padded);\n const payload = JSON.parse(json) as { exp?: number };\n if (typeof payload.exp === 'number') {\n return payload.exp * 1000; // convert to ms\n }\n } catch {\n // ignore parse errors\n }\n return null;\n}\n\nexport function KronosProvider({ baseUrl, getToken, children }: KronosProviderProps) {\n const [token, setToken] = useState<string | null>(null);\n const [isReady, setIsReady] = useState(false);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const getTokenRef = useRef(getToken);\n getTokenRef.current = getToken;\n\n const fetchAndSchedule = useCallback(async () => {\n try {\n const newToken = await getTokenRef.current();\n setToken(newToken);\n setIsReady(true);\n\n // Schedule refresh before expiry\n if (timerRef.current) clearTimeout(timerRef.current);\n const expiryMs = parseTokenExpiry(newToken);\n if (expiryMs) {\n const delayMs = Math.max(expiryMs - Date.now() - REFRESH_BUFFER_MS, 10_000);\n timerRef.current = setTimeout(() => {\n void fetchAndSchedule();\n }, delayMs);\n }\n } catch (err) {\n console.error('[KronosProvider] Failed to fetch token:', err);\n setIsReady(true); // still mark ready so UI can show error state\n }\n }, []);\n\n useEffect(() => {\n void fetchAndSchedule();\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n };\n }, [fetchAndSchedule]);\n\n const refreshToken = useCallback(async () => {\n await fetchAndSchedule();\n }, [fetchAndSchedule]);\n\n const value: KronosContextValue = {\n baseUrl: baseUrl.replace(/\\/$/, ''),\n token,\n isReady,\n refreshToken,\n };\n\n return (\n <KronosContext.Provider value={value}>\n {children}\n </KronosContext.Provider>\n );\n}\n\nexport function useKronosContext(): KronosContextValue | null {\n return useContext(KronosContext);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAA,gBAAiD;;;ACAjD,mBAOO;AAyFH;AArEJ,IAAM,oBAAgB,4BAAyC,IAAI;AAEnE,IAAM,oBAAoB,IAAI,KAAK;AAEnC,SAAS,iBAAiB,OAA8B;AACtD,MAAI;AACF,UAAM,gBAAgB,MAAM,WAAW,QAAQ,IAAI,MAAM,MAAM,CAAC,IAAI;AACpE,UAAM,aAAa,cAAc,MAAM,GAAG,EAAE,CAAC;AAC7C,QAAI,CAAC,WAAY,QAAO;AACxB,UAAM,SAAS,WAAW,QAAQ,MAAM,GAAG,EAAE,QAAQ,MAAM,GAAG;AAC9D,UAAM,SAAS,SAAS,IAAI,QAAQ,IAAK,OAAO,SAAS,KAAM,CAAC;AAChE,UAAM,OAAO,KAAK,MAAM;AACxB,UAAM,UAAU,KAAK,MAAM,IAAI;AAC/B,QAAI,OAAO,QAAQ,QAAQ,UAAU;AACnC,aAAO,QAAQ,MAAM;AAAA,IACvB;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAEO,SAAS,eAAe,EAAE,SAAS,UAAU,SAAS,GAAwB;AACnF,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAwB,IAAI;AACtD,QAAM,CAAC,SAAS,UAAU,QAAI,uBAAS,KAAK;AAC5C,QAAM,eAAW,qBAA6C,IAAI;AAClE,QAAM,kBAAc,qBAAO,QAAQ;AACnC,cAAY,UAAU;AAEtB,QAAM,uBAAmB,0BAAY,YAAY;AAC/C,QAAI;AACF,YAAM,WAAW,MAAM,YAAY,QAAQ;AAC3C,eAAS,QAAQ;AACjB,iBAAW,IAAI;AAGf,UAAI,SAAS,QAAS,cAAa,SAAS,OAAO;AACnD,YAAM,WAAW,iBAAiB,QAAQ;AAC1C,UAAI,UAAU;AACZ,cAAM,UAAU,KAAK,IAAI,WAAW,KAAK,IAAI,IAAI,mBAAmB,GAAM;AAC1E,iBAAS,UAAU,WAAW,MAAM;AAClC,eAAK,iBAAiB;AAAA,QACxB,GAAG,OAAO;AAAA,MACZ;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ,MAAM,2CAA2C,GAAG;AAC5D,iBAAW,IAAI;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,8BAAU,MAAM;AACd,SAAK,iBAAiB;AACtB,WAAO,MAAM;AACX,UAAI,SAAS,QAAS,cAAa,SAAS,OAAO;AAAA,IACrD;AAAA,EACF,GAAG,CAAC,gBAAgB,CAAC;AAErB,QAAM,mBAAe,0BAAY,YAAY;AAC3C,UAAM,iBAAiB;AAAA,EACzB,GAAG,CAAC,gBAAgB,CAAC;AAErB,QAAM,QAA4B;AAAA,IAChC,SAAS,QAAQ,QAAQ,OAAO,EAAE;AAAA,IAClC;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SACE,4CAAC,cAAc,UAAd,EAAuB,OACrB,UACH;AAEJ;AAEO,SAAS,mBAA8C;AAC5D,aAAO,yBAAW,aAAa;AACjC;;;ADhFA,IAAM,oCAAoC;AA0J1C,eAAe,YACb,SACA,OACA,MACA,UAA+C,CAAC,GACpC;AACZ,QAAM,MAAM,MAAM,MAAM,GAAG,OAAO,GAAG,IAAI,IAAI;AAAA,IAC3C,QAAQ,QAAQ,UAAU;AAAA,IAC1B,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,eAAe,UAAU,KAAK;AAAA,IAChC;AAAA,IACA,MAAM,QAAQ,OAAO,KAAK,UAAU,QAAQ,IAAI,IAAI;AAAA,EACtD,CAAC;AAED,QAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,MAAI;AACJ,MAAI;AACF,WAAO,OAAO,KAAK,MAAM,IAAI,IAAI;AAAA,EACnC,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,MACH,QAAQ,OAAO,SAAS,YAAY,WAAW,QAAQ,OAAQ,KAAa,UAAU,WAClF,KAAa,QACd,8BAA8B,IAAI,MAAM;AAC9C,UAAM,IAAI,MAAM,GAAG;AAAA,EACrB;AAEA,SAAO;AACT;AAEA,SAAS,4BACP,OAC2C;AAC3C,SAAO,MACJ,OAAO,CAAC,SAAS,KAAK,KAAK,WAAW,aAAa,KAAK,KAAK,KAAK,SAAS,KAAK,CAAC,EACjF,IAAI,CAAC,SAAS;AACb,UAAM,UAAU,KAAK,WAAW;AAChC,UAAM,aAAa,QAAQ,QAAQ,SAAS,IAAI;AAEhD,QAAI,WAAW,WAAW,OAAO,GAAG;AAClC,YAAM,WAAW,WAAW,QAAQ,WAAW,CAAC;AAChD,UAAI,aAAa,IAAI;AACnB,cAAM,cAAc,WAAW,MAAM,GAAG,QAAQ;AAChD,cAAM,WAAmC,CAAC;AAC1C,mBAAW,QAAQ,YAAY,MAAM,IAAI,GAAG;AAC1C,gBAAM,iBAAiB,KAAK,QAAQ,GAAG;AACvC,cAAI,mBAAmB,GAAI;AAC3B,gBAAM,MAAM,KAAK,MAAM,GAAG,cAAc,EAAE,KAAK;AAC/C,gBAAM,QAAQ,KAAK,MAAM,iBAAiB,CAAC,EAAE,KAAK;AAClD,cAAI,OAAO,OAAO;AAChB,qBAAS,GAAG,IAAI;AAAA,UAClB;AAAA,QACF;AAEA,eAAO;AAAA,UACL,OAAO,SAAS,UAAU,KAAK,KAAK,MAAM,GAAG,EAAE,IAAI,KAAK,KAAK;AAAA,UAC7D,aAAa,SAAS,eAAe;AAAA,UACrC,MAAM,KAAK;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAEA,UAAM,QAAQ,QAAQ,MAAM,OAAO;AACnC,UAAM,YAAY,MAAM,KAAK,CAAC,SAAS,KAAK,WAAW,IAAI,CAAC;AAC5D,UAAM,QAAQ,YACV,UAAU,QAAQ,SAAS,EAAE,EAAE,KAAK,IACpC,KAAK,KAAK,MAAM,GAAG,EAAE,IAAI,KAAK,KAAK;AACvC,UAAM,cACJ,MACG,MAAM,CAAC,EACP,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,KAAK,CAAC,SAAS,KAAK,SAAS,KAAK,CAAC,KAAK,WAAW,GAAG,CAAC,KAAK;AAEjE,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,MAAM,KAAK;AAAA,IACb;AAAA,EACF,CAAC,EACA,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAChD;AAEA,SAAS,+BAA+B,MAAoB;AAC1D,MAAI,SAAS,WAAY;AACzB,MAAI,+BAA+B,KAAK,IAAI,EAAG;AAC/C,QAAM,IAAI,MAAM,oDAAoD;AACtE;AAMO,SAAS,UAAU,MAAuC;AAC/D,QAAM,MAAM,iBAAiB;AAE7B,QAAM,aAAa,CAAC,CAAC,OAAO,CAAC;AAC7B,QAAM,aAAa;AAGnB,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAiC,IAAI;AACrE,QAAM,CAAC,iBAAiB,kBAAkB,QAAI,wBAAS,IAAI;AAC3D,QAAM,CAAC,eAAe,gBAAgB,QAAI,wBAAwB,IAAI;AAEtE,QAAM,CAAC,eAAe,gBAAgB,QAAI,wBAAS,KAAK;AACxD,QAAM,CAAC,aAAa,cAAc,QAAI,wBAAwB,IAAI;AAElE,QAAM,CAAC,eAAe,gBAAgB,QAAI,wBAAS,KAAK;AACxD,QAAM,CAAC,aAAa,cAAc,QAAI,wBAAwB,IAAI;AAElE,QAAM,CAAC,eAAe,gBAAgB,QAAI,wBAAS,KAAK;AACxD,QAAM,CAAC,aAAa,cAAc,QAAI,wBAAwB,IAAI;AAGlE,QAAM,CAAC,aAAa,cAAc,QAAI,wBAAqC,IAAI;AAC/E,QAAM,CAAC,oBAAoB,qBAAqB,QAAI,wBAAS,KAAK;AAClE,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,wBAAwB,IAAI;AAG5E,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAA+B,IAAI;AAC/D,QAAM,CAAC,eAAe,gBAAgB,QAAI,wBAAS,KAAK;AACxD,QAAM,CAAC,aAAa,cAAc,QAAI,wBAAwB,IAAI;AAElE,QAAM,CAAC,oBAAoB,qBAAqB,QAAI,wBAAS,KAAK;AAClE,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,wBAAwB,IAAI;AAE5E,QAAM,CAAC,oBAAoB,qBAAqB,QAAI,wBAAS,KAAK;AAClE,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,wBAAwB,IAAI;AAE5E,QAAM,CAAC,oBAAoB,qBAAqB,QAAI,wBAAS,KAAK;AAClE,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,wBAAwB,IAAI;AAG5E,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAAsC,IAAI;AACtE,QAAM,CAAC,eAAe,gBAAgB,QAAI,wBAAS,KAAK;AACxD,QAAM,CAAC,aAAa,cAAc,QAAI,wBAAwB,IAAI;AAElE,QAAM,CAAC,oBAAoB,qBAAqB,QAAI,wBAAS,KAAK;AAClE,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,wBAAwB,IAAI;AAE5E,QAAM,CAAC,oBAAoB,qBAAqB,QAAI,wBAAS,KAAK;AAClE,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,wBAAwB,IAAI;AAE5E,QAAM,CAAC,oBAAoB,qBAAqB,QAAI,wBAAS,KAAK;AAClE,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,wBAAwB,IAAI;AAM5E,QAAM,mBAAe,2BAAY,YAAY;AAC3C,uBAAmB,IAAI;AACvB,qBAAiB,IAAI;AACrB,QAAI;AACF,UAAI;AAEJ,UAAI,cAAc,KAAK,OAAO;AAC5B,mBAAW,MAAM;AAAA,UACf,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ;AAAA,QACF;AAAA,MACF,WAAW,YAAY;AACrB,mBAAW,MAAM,WAAW,IAAI,aAAa;AAAA,UAC3C,cAAc,WAAW;AAAA,QAC3B,CAAC;AAAA,MACH,OAAO;AACL,cAAM,IAAI,MAAM,kDAAkD;AAAA,MACpE;AAEA,kBAAY,MAAM,QAAQ,SAAS,QAAQ,IAAI,SAAS,WAAW,CAAC,CAAC;AAAA,IACvE,SAAS,OAAgB;AACvB;AAAA,QACE,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAC3C;AACA,kBAAY,CAAC,CAAC;AAAA,IAChB,UAAE;AACA,yBAAmB,KAAK;AAAA,IAC1B;AAAA,EACF,GAAG,CAAC,YAAY,KAAK,SAAS,KAAK,OAAO,YAAY,KAAK,YAAY,YAAY,CAAC;AAEpF,+BAAU,MAAM;AACd,QAAI,cAAc,CAAC,KAAK,QAAS;AACjC,SAAK,aAAa;AAAA,EACpB,GAAG,CAAC,cAAc,YAAY,KAAK,OAAO,CAAC;AAE3C,QAAM,sBAAkB,2BAAY,YAAY;AAC9C,UAAM,aAAa;AAAA,EACrB,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,sBAAkB;AAAA,IACtB,OAAO,WAAqE;AAC1E,uBAAiB,IAAI;AACrB,qBAAe,IAAI;AACnB,UAAI;AACF,YAAI,YAA2B;AAE/B,YAAI,cAAc,KAAK,OAAO;AAC5B,gBAAM,MAAM,MAAM;AAAA,YAChB,IAAI;AAAA,YACJ,IAAI;AAAA,YACJ;AAAA,YACA;AAAA,cACE,QAAQ;AAAA,cACR,MAAM;AAAA,gBACJ,cAAc;AAAA,gBACd,cAAc,EAAE,IAAI,OAAO,GAAG;AAAA,gBAC9B,OAAO,OAAO,MAAM,KAAK;AAAA,gBACzB,oBAAoB,OAAO;AAAA,gBAC3B,aAAa,IAAI,UAAU;AAAA,gBAC3B,gBAAgB;AAAA,cAClB;AAAA,YACF;AAAA,UACF;AACA,sBAAY,IAAI,cAAc;AAAA,QAChC,WAAW,YAAY;AACrB,gBAAM,MAAM,MAAM,WAAW,IAAI,gBAAgB;AAAA,YAC/C,cAAc,WAAW;AAAA,YACzB,OAAO,OAAO;AAAA,YACd,IAAI,OAAO;AAAA,YACX,mBAAmB,OAAO;AAAA,UAC5B,CAAC;AACD,sBAAY,IAAI;AAAA,QAClB,OAAO;AACL,gBAAM,IAAI,MAAM,kDAAkD;AAAA,QACpE;AAEA,aAAK,aAAa;AAClB,eAAO,EAAE,UAAU;AAAA,MACrB,SAAS,OAAgB;AACvB,cAAM,UACJ,iBAAiB,QAAQ,MAAM,UAAU;AAC3C,uBAAe,OAAO;AACtB,eAAO,EAAE,WAAW,KAAK;AAAA,MAC3B,UAAE;AACA,yBAAiB,KAAK;AAAA,MACxB;AAAA,IACF;AAAA,IACA,CAAC,YAAY,KAAK,SAAS,KAAK,OAAO,YAAY,KAAK,YAAY,cAAc,YAAY;AAAA,EAChG;AAEA,QAAM,oBAAgB;AAAA,IACpB,OAAO,WAMD;AACJ,uBAAiB,IAAI;AACrB,qBAAe,IAAI;AACnB,UAAI;AACF,YAAI,CAAC,cAAc,CAAC,KAAK,OAAO;AAC9B,gBAAM,IAAI,MAAM,uCAAuC;AAAA,QACzD;AAEA,cAAM,OAAgC,CAAC;AACvC,YAAI,OAAO,UAAU,QAAW;AAC9B,eAAK,QAAQ,OAAO;AAAA,QACtB;AACA,YAAI,OAAO,sBAAsB,QAAW;AAC1C,eAAK,qBAAqB,OAAO;AAAA,QACnC;AACA,YAAI,OAAO,gBAAgB,QAAW;AACpC,eAAK,eAAe,OAAO;AAAA,QAC7B;AACA,YAAI,OAAO,WAAW,QAAW;AAC/B,eAAK,SAAS,OAAO;AAAA,QACvB;AAEA,cAAM,MAAM,MAAM;AAAA,UAChB,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,gBAAgB,mBAAmB,OAAO,SAAS,CAAC;AAAA,UACpD;AAAA,YACE,QAAQ;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAEA,aAAK,aAAa;AAClB,eAAO;AAAA,MACT,SAAS,OAAgB;AACvB,cAAM,UACJ,iBAAiB,QAAQ,MAAM,UAAU;AAC3C,uBAAe,OAAO;AACtB,cAAM;AAAA,MACR,UAAE;AACA,yBAAiB,KAAK;AAAA,MACxB;AAAA,IACF;AAAA,IACA,CAAC,YAAY,KAAK,SAAS,KAAK,OAAO,YAAY;AAAA,EACrD;AAEA,QAAM,sBAAkB;AAAA,IACtB,OAAO,WAAkC;AACvC,uBAAiB,IAAI;AACrB,qBAAe,IAAI;AACnB,UAAI;AACF,YAAI,CAAC,cAAc,CAAC,KAAK,OAAO;AAC9B,gBAAM,IAAI,MAAM,uCAAuC;AAAA,QACzD;AAEA,cAAM,MAAM,MAAM;AAAA,UAChB,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,gBAAgB,mBAAmB,OAAO,SAAS,CAAC;AAAA,UACpD,EAAE,QAAQ,SAAS;AAAA,QACrB;AAEA,aAAK,aAAa;AAClB,eAAO;AAAA,MACT,SAAS,OAAgB;AACvB,cAAM,UACJ,iBAAiB,QAAQ,MAAM,UAAU;AAC3C,uBAAe,OAAO;AACtB,cAAM;AAAA,MACR,UAAE;AACA,yBAAiB,KAAK;AAAA,MACxB;AAAA,IACF;AAAA,IACA,CAAC,YAAY,KAAK,SAAS,KAAK,OAAO,YAAY;AAAA,EACrD;AAMA,QAAM,sBAAkB,2BAAY,YAAY;AAC9C,QAAI,CAAC,cAAc,CAAC,KAAK,MAAO;AAChC,0BAAsB,IAAI;AAC1B,wBAAoB,IAAI;AACxB,QAAI;AACF,YAAM,MAAM,MAAM;AAAA,QAChB,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ;AAAA,MACF;AACA,qBAAe,GAAG;AAAA,IACpB,SAAS,OAAgB;AACvB;AAAA,QACE,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAC3C;AAAA,IACF,UAAE;AACA,4BAAsB,KAAK;AAAA,IAC7B;AAAA,EACF,GAAG,CAAC,YAAY,KAAK,SAAS,KAAK,KAAK,CAAC;AAEzC,QAAM,yBAAqB,2BAAY,YAAY;AACjD,UAAM,gBAAgB;AAAA,EACxB,GAAG,CAAC,eAAe,CAAC;AAMpB,QAAM,iBAAa,2BAAY,YAAY;AACzC,QAAI,CAAC,cAAc,CAAC,KAAK,MAAO;AAChC,qBAAiB,IAAI;AACrB,mBAAe,IAAI;AACnB,QAAI;AACF,YAAM,MAAM,MAAM;AAAA,QAChB,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ;AAAA,MACF;AACA,gBAAU,MAAM,QAAQ,IAAI,MAAM,IAAI,IAAI,SAAS,CAAC,CAAC;AAAA,IACvD,SAAS,OAAgB;AACvB;AAAA,QACE,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAC3C;AACA,gBAAU,CAAC,CAAC;AAAA,IACd,UAAE;AACA,uBAAiB,KAAK;AAAA,IACxB;AAAA,EACF,GAAG,CAAC,YAAY,KAAK,SAAS,KAAK,KAAK,CAAC;AAEzC,QAAM,oBAAgB,2BAAY,YAAY;AAC5C,UAAM,WAAW;AAAA,EACnB,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,mBAAe;AAAA,IACnB,OAAO,WAAiC;AACtC,UAAI,CAAC,cAAc,CAAC,KAAK,OAAO;AAC9B,cAAM,IAAI,MAAM,sCAAsC;AAAA,MACxD;AAEA,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,mBAAmB,mBAAmB,OAAO,QAAQ,CAAC;AAAA,MACxD;AAAA,IACF;AAAA,IACA,CAAC,YAAY,KAAK,SAAS,KAAK,KAAK;AAAA,EACvC;AAEA,QAAM,uBAAmB;AAAA,IACvB,OAAO,WAAiC;AACtC,UAAI,CAAC,cAAc,CAAC,KAAK,OAAO;AAC9B,cAAM,IAAI,MAAM,0CAA0C;AAAA,MAC5D;AAEA,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,mBAAmB,mBAAmB,OAAO,QAAQ,CAAC;AAAA,QACtD;AAAA,UACE,QAAQ;AAAA,UACR,MAAM,CAAC;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,YAAY,KAAK,SAAS,KAAK,KAAK;AAAA,EACvC;AAEA,QAAM,kBAAc;AAAA,IAClB,OAAO,WAA0E;AAC/E,4BAAsB,IAAI;AAC1B,0BAAoB,IAAI;AACxB,UAAI;AACF,YAAI,CAAC,cAAc,CAAC,KAAK,OAAO;AAC9B,gBAAM,IAAI,MAAM,qCAAqC;AAAA,QACvD;AAEA,cAAM,MAAM,MAAM;AAAA,UAChB,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,MAAM;AAAA,cACJ,MAAM,OAAO;AAAA,cACb,eAAe,OAAO;AAAA,cACtB,aAAa,OAAO;AAAA,YACtB;AAAA,UACF;AAAA,QACF;AAEA,aAAK,WAAW;AAChB,YAAI,IAAI,kBAAkB;AACxB,8BAAoB,IAAI,gBAAgB;AAAA,QAC1C;AACA,eAAO;AAAA,UACL,UAAU,IAAI,YAAY;AAAA,UAC1B,iBAAiB,IAAI;AAAA,UACrB,eAAe,IAAI,iBAAiB;AAAA,UACpC,kBAAkB,IAAI,oBAAoB;AAAA,QAC5C;AAAA,MACF,SAAS,OAAgB;AACvB,cAAM,UACJ,iBAAiB,QAAQ,MAAM,UAAU;AAC3C,4BAAoB,OAAO;AAC3B,eAAO,EAAE,UAAU,MAAM,eAAe,MAAM,kBAAkB,QAAQ;AAAA,MAC1E,UAAE;AACA,8BAAsB,KAAK;AAAA,MAC7B;AAAA,IACF;AAAA,IACA,CAAC,YAAY,KAAK,SAAS,KAAK,OAAO,UAAU;AAAA,EACnD;AAEA,QAAM,oBAAgB;AAAA,IACpB,OAAO,WAQD;AACJ,4BAAsB,IAAI;AAC1B,0BAAoB,IAAI;AACxB,UAAI;AACF,YAAI,CAAC,cAAc,CAAC,KAAK,OAAO;AAC9B,gBAAM,IAAI,MAAM,qCAAqC;AAAA,QACvD;AAEA,cAAM,MAAM,MAAM;AAAA,UAChB,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,cAAc,mBAAmB,OAAO,OAAO,CAAC;AAAA,UAChD;AAAA,YACE,QAAQ;AAAA,YACR,MAAM,OAAO;AAAA,UACf;AAAA,QACF;AAEA,aAAK,WAAW;AAChB,eAAO;AAAA,MACT,SAAS,OAAgB;AACvB,cAAM,UACJ,iBAAiB,QAAQ,MAAM,UAAU;AAC3C,4BAAoB,OAAO;AAC3B,cAAM;AAAA,MACR,UAAE;AACA,8BAAsB,KAAK;AAAA,MAC7B;AAAA,IACF;AAAA,IACA,CAAC,YAAY,KAAK,SAAS,KAAK,OAAO,UAAU;AAAA,EACnD;AAEA,QAAM,oBAAgB;AAAA,IACpB,OAAO,WAAgC;AACrC,4BAAsB,IAAI;AAC1B,0BAAoB,IAAI;AACxB,UAAI;AACF,YAAI,CAAC,cAAc,CAAC,KAAK,OAAO;AAC9B,gBAAM,IAAI,MAAM,qCAAqC;AAAA,QACvD;AAEA,cAAM,MAAM,MAAM;AAAA,UAChB,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,cAAc,mBAAmB,OAAO,OAAO,CAAC;AAAA,UAChD,EAAE,QAAQ,SAAS;AAAA,QACrB;AAEA,aAAK,WAAW;AAChB,eAAO;AAAA,MACT,SAAS,OAAgB;AACvB,cAAM,UACJ,iBAAiB,QAAQ,MAAM,UAAU;AAC3C,4BAAoB,OAAO;AAC3B,cAAM;AAAA,MACR,UAAE;AACA,8BAAsB,KAAK;AAAA,MAC7B;AAAA,IACF;AAAA,IACA,CAAC,YAAY,KAAK,SAAS,KAAK,OAAO,UAAU;AAAA,EACnD;AAMA,QAAM,oBAAgB,2BAAY,YAAY;AAC5C,qBAAiB,IAAI;AACrB,mBAAe,IAAI;AACnB,QAAI;AACF,UAAI,CAAC,cAAc,CAAC,KAAK,OAAO;AAC9B,cAAM,IAAI,MAAM,uCAAuC;AAAA,MACzD;AAEA,YAAM,MAAM,MAAM;AAAA,QAChB,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ;AAAA,QACA;AAAA,UACE,QAAQ;AAAA,UACR,MAAM;AAAA,YACJ,WAAW;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAEA,gBAAU,MAAM,QAAQ,IAAI,MAAM,IAAI,IAAI,SAAS,CAAC,CAAC;AAAA,IACvD,SAAS,OAAgB;AACvB;AAAA,QACE,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAC3C;AACA,gBAAU,CAAC,CAAC;AAAA,IACd,UAAE;AACA,uBAAiB,KAAK;AAAA,IACxB;AAAA,EACF,GAAG,CAAC,YAAY,KAAK,SAAS,KAAK,KAAK,CAAC;AAEzC,QAAM,kBAAc;AAAA,IAClB,OAAO,WAMD;AACJ,4BAAsB,IAAI;AAC1B,0BAAoB,IAAI;AACxB,UAAI;AACF,YAAI,CAAC,cAAc,CAAC,KAAK,OAAO;AAC9B,gBAAM,IAAI,MAAM,qCAAqC;AAAA,QACvD;AAEA,cAAM,MAAM,MAAM;AAAA,UAChB,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,MAAM;AAAA,cACJ,WAAW;AAAA,cACX,MAAM,OAAO,KAAK,KAAK;AAAA,cACvB,aAAa,OAAO,YAAY,KAAK;AAAA,cACrC,cAAc,OAAO;AAAA,cACrB,OAAO,OAAO;AAAA,cACd,UAAU,OAAO;AAAA,YACnB;AAAA,UACF;AAAA,QACF;AAEA,aAAK,cAAc;AACnB,eAAO,EAAE,SAAS,IAAI,YAAY,KAAK;AAAA,MACzC,SAAS,OAAgB;AACvB,cAAM,UACJ,iBAAiB,QAAQ,MAAM,UAAU;AAC3C,4BAAoB,OAAO;AAC3B,eAAO,EAAE,SAAS,KAAK;AAAA,MACzB,UAAE;AACA,8BAAsB,KAAK;AAAA,MAC7B;AAAA,IACF;AAAA,IACA,CAAC,YAAY,KAAK,SAAS,KAAK,OAAO,aAAa;AAAA,EACtD;AAEA,QAAM,gBAAY;AAAA,IAChB,OAAO,WAKD;AACJ,UAAI,CAAC,cAAc,CAAC,KAAK,OAAO;AAC9B,cAAM,IAAI,MAAM,mCAAmC;AAAA,MACrD;AAEA,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ;AAAA,QACA;AAAA,UACE,QAAQ;AAAA,UACR,MAAM;AAAA,YACJ,WAAW;AAAA,YACX,UAAU,OAAO;AAAA,YACjB,MAAM,OAAO;AAAA,YACb,OAAO,OAAO;AAAA,YACd,aAAa,OAAO;AAAA,UACtB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,YAAY,KAAK,SAAS,KAAK,KAAK;AAAA,EACvC;AAEA,QAAM,kBAAc;AAAA,IAClB,OAAO,WAYD;AACJ,4BAAsB,IAAI;AAC1B,0BAAoB,IAAI;AACxB,UAAI;AACF,YAAI,CAAC,cAAc,CAAC,KAAK,OAAO;AAC9B,gBAAM,IAAI,MAAM,qCAAqC;AAAA,QACvD;AAEA,cAAM,MAAM,MAAM;AAAA,UAChB,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,MAAM;AAAA,cACJ,WAAW;AAAA,cACX,UAAU,OAAO;AAAA,cACjB,OAAO,OAAO;AAAA,YAChB;AAAA,UACF;AAAA,QACF;AAEA,aAAK,cAAc;AACnB,eAAO;AAAA,MACT,SAAS,OAAgB;AACvB,cAAM,UACJ,iBAAiB,QAAQ,MAAM,UAAU;AAC3C,4BAAoB,OAAO;AAC3B,cAAM;AAAA,MACR,UAAE;AACA,8BAAsB,KAAK;AAAA,MAC7B;AAAA,IACF;AAAA,IACA,CAAC,YAAY,KAAK,SAAS,KAAK,OAAO,aAAa;AAAA,EACtD;AAEA,QAAM,kBAAc;AAAA,IAClB,OAAO,WAAgC;AACrC,4BAAsB,IAAI;AAC1B,0BAAoB,IAAI;AACxB,UAAI;AACF,YAAI,CAAC,cAAc,CAAC,KAAK,OAAO;AAC9B,gBAAM,IAAI,MAAM,qCAAqC;AAAA,QACvD;AAEA,cAAM,MAAM,MAAM;AAAA,UAChB,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,MAAM;AAAA,cACJ,WAAW;AAAA,cACX,UAAU,OAAO;AAAA,YACnB;AAAA,UACF;AAAA,QACF;AAEA,aAAK,cAAc;AACnB,eAAO;AAAA,MACT,SAAS,OAAgB;AACvB,cAAM,UACJ,iBAAiB,QAAQ,MAAM,UAAU;AAC3C,4BAAoB,OAAO;AAC3B,cAAM;AAAA,MACR,UAAE;AACA,8BAAsB,KAAK;AAAA,MAC7B;AAAA,IACF;AAAA,IACA,CAAC,YAAY,KAAK,SAAS,KAAK,OAAO,aAAa;AAAA,EACtD;AAEA,QAAM,sBAAkB,2BAAY,YAAY;AAC9C,QAAI,CAAC,cAAc,CAAC,KAAK,OAAO;AAC9B,YAAM,IAAI,MAAM,yCAAyC;AAAA,IAC3D;AAEA,UAAM,SAAS,MAAM;AAAA,MACnB,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,MAAM;AAAA,UACJ,WAAW;AAAA,UACX,kBAAkB;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,SAAS,OAAO,UAAU,CAAC,GAAG;AAAA,MAClC,CAAC,UAAU,MAAM,SAAS;AAAA,IAC5B;AAEA,QAAI,CAAC,OAAO,UAAU;AACpB,aAAO;AAAA,QACL,UAAU;AAAA,QACV,YAAY,CAAC;AAAA,MACf;AAAA,IACF;AAEA,UAAM,aAAa,MAAM;AAAA,MACvB,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,MAAM;AAAA,UACJ,WAAW;AAAA,UACX,UAAU,MAAM;AAAA,UAChB,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,UAAM,kBAAkB,WAAW,QAAQ,CAAC,GACzC;AAAA,MACC,CAAC,SACC,KAAK,SAAS,UACd,KAAK,KAAK,WAAW,aAAa,KAClC,KAAK,KAAK,SAAS,KAAK;AAAA,IAC5B,EACC,IAAI,CAAC,SAAS,KAAK,IAAI;AAE1B,QAAI,eAAe,WAAW,GAAG;AAC/B,aAAO;AAAA,QACL,UAAU,MAAM;AAAA,QAChB,YAAY,CAAC;AAAA,MACf;AAAA,IACF;AAEA,UAAM,cAAc,MAAM;AAAA,MACxB,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,MAAM;AAAA,UACJ,WAAW;AAAA,UACX,UAAU,MAAM;AAAA,UAChB,MAAM;AAAA,UACN,OAAO;AAAA,UACP,aAAa;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,UAAU,MAAM;AAAA,MAChB,YAAY,4BAA4B,YAAY,SAAS,CAAC,CAAC;AAAA,IACjE;AAAA,EACF,GAAG,CAAC,YAAY,KAAK,SAAS,KAAK,KAAK,CAAC;AAEzC,QAAM,uBAAmB;AAAA,IACvB,OAAO,WAA+B;AACpC,UAAI,CAAC,cAAc,CAAC,KAAK,OAAO;AAC9B,cAAM,IAAI,MAAM,0CAA0C;AAAA,MAC5D;AAEA,YAAM,gBAAgB,QAAQ,MAAM,KAAK,KAAK;AAC9C,qCAA+B,aAAa;AAE5C,YAAM,SAAS,MAAM;AAAA,QACnB,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ;AAAA,QACA;AAAA,UACE,QAAQ;AAAA,UACR,MAAM;AAAA,YACJ,WAAW;AAAA,YACX,kBAAkB;AAAA,UACpB;AAAA,QACF;AAAA,MACF;AAEA,YAAM,SAAS,OAAO,UAAU,CAAC,GAAG;AAAA,QAClC,CAAC,UAAU,MAAM,SAAS;AAAA,MAC5B;AAEA,UAAI,CAAC,OAAO,UAAU;AACpB,eAAO;AAAA,UACL,UAAU;AAAA,UACV,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,MACF;AAEA,UAAI,kBAAkB,YAAY;AAChC,cAAMC,UAAS,MAAM;AAAA,UACnB,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,MAAM;AAAA,cACJ,WAAW;AAAA,cACX,UAAU,MAAM;AAAA,cAChB,MAAM;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAEA,eAAO;AAAA,UACL,UAAU,MAAM;AAAA,UAChB,MAAM;AAAA,UACN,SAASA,QAAO,gBAAgB;AAAA,QAClC;AAAA,MACF;AAEA,YAAM,SAAS,MAAM;AAAA,QACnB,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ;AAAA,QACA;AAAA,UACE,QAAQ;AAAA,UACR,MAAM;AAAA,YACJ,WAAW;AAAA,YACX,UAAU,MAAM;AAAA,YAChB,MAAM;AAAA,YACN,OAAO,CAAC,aAAa;AAAA,YACrB,aAAa;AAAA,UACf;AAAA,QACF;AAAA,MACF;AAEA,YAAM,QAAQ,OAAO,SAAS,CAAC,GAAG;AAAA,QAChC,CAAC,UAAU,MAAM,SAAS;AAAA,MAC5B;AAEA,aAAO;AAAA,QACL,UAAU,MAAM;AAAA,QAChB,MAAM;AAAA,QACN,SAAS,MAAM,WAAW;AAAA,MAC5B;AAAA,IACF;AAAA,IACA,CAAC,YAAY,KAAK,SAAS,KAAK,KAAK;AAAA,EACvC;AAMA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IAEA,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IAEA;AAAA,IACA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IAEA,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IAEA,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IAEA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IAEA;AAAA,IACA;AAAA,EACF;AACF;","names":["import_react","result"]}
|
|
1
|
+
{"version":3,"sources":["../../src/react/index.ts","../../src/react/useKronos.ts","../../src/react/KronosProvider.tsx"],"sourcesContent":["export { useKronos } from './useKronos';\nexport type {\n KronosTriggerOps,\n UseKronosLegacyArgs,\n UseKronosArgs,\n UseKronosResult,\n} from './useKronos';\n\nexport { KronosProvider, useKronosContext } from './KronosProvider';\nexport type {\n KronosProviderProps,\n KronosContextValue,\n} from './KronosProvider';\n","import { useCallback, useEffect, useState } from 'react';\nimport type {\n TriggerRecord,\n ListTriggersResponse,\n UpdateTriggerResponse,\n DeleteTriggerResponse,\n MemoryStatsResponse,\n CostSummaryResponse,\n CostBreakdownResponse,\n GetMCPServerResponse,\n ConnectMCPServerResponse,\n ScopeDetail,\n ListScopesResponse,\n CreateScopeResponse,\n UpdateScopeResponse,\n SkillSummaryRecord,\n SkillManageResponse,\n SkillFileInput,\n SkillReadMode,\n SkillFileContentMode,\n ContextGraphSummaryResponse,\n ContextGraphReadResponse,\n SkillFileRecord,\n} from '../types';\nimport { useKronosContext } from './KronosProvider';\n\nconst INTERNAL_CONTEXT_GRAPH_SKILL_NAME = '__internal_context_graph__';\n\n// ---------------------------------------------------------------------------\n// Legacy ops interface (kept for backward compatibility)\n// ---------------------------------------------------------------------------\n\nexport interface KronosTriggerOps {\n listTriggers(params: {\n tenantUserId: string;\n }): Promise<ListTriggersResponse>;\n\n createNlTrigger(params: {\n tenantUserId: string;\n title: string;\n nl: string;\n actionDescription: string;\n }): Promise<{ triggerId: string | null }>;\n}\n\nexport interface UseKronosLegacyArgs {\n ops: KronosTriggerOps;\n tenantUserId: string;\n}\n\n// ---------------------------------------------------------------------------\n// Result type\n// ---------------------------------------------------------------------------\n\nexport interface UseKronosResult {\n // -- Triggers --\n triggers: TriggerRecord[] | null;\n triggersLoading: boolean;\n triggersError: string | null;\n refreshTriggers: () => Promise<void>;\n\n createNlTrigger: (params: {\n title: string;\n nl: string;\n actionDescription: string;\n }) => Promise<{ triggerId: string | null }>;\n createLoading: boolean;\n createError: string | null;\n\n updateTrigger: (params: {\n triggerId: string;\n title?: string | null;\n actionDescription?: string;\n triggerSpec?: Record<string, unknown>;\n status?: string;\n }) => Promise<UpdateTriggerResponse>;\n updateLoading: boolean;\n updateError: string | null;\n\n deleteTrigger: (params: { triggerId: string }) => Promise<DeleteTriggerResponse>;\n deleteLoading: boolean;\n deleteError: string | null;\n\n // -- Memory stats --\n memoryStats: MemoryStatsResponse | null;\n memoryStatsLoading: boolean;\n memoryStatsError: string | null;\n refreshMemoryStats: () => Promise<void>;\n\n costSummary: CostSummaryResponse | null;\n costSummaryLoading: boolean;\n costSummaryError: string | null;\n refreshCostSummary: () => Promise<void>;\n costBreakdown: CostBreakdownResponse | null;\n costBreakdownLoading: boolean;\n costBreakdownError: string | null;\n refreshCostBreakdown: (days?: number) => Promise<void>;\n\n // -- Scopes --\n scopes: ScopeDetail[] | null;\n scopesLoading: boolean;\n scopesError: string | null;\n refreshScopes: () => Promise<void>;\n\n getMCPServer: (params: { serverId: string }) => Promise<GetMCPServerResponse>;\n connectMCPServer: (params: { serverId: string }) => Promise<ConnectMCPServerResponse>;\n\n createScope: (params: {\n name: string;\n include_query: string;\n description?: string;\n }) => Promise<{\n scope_id: string | null;\n backfill_job_id?: string;\n mcp_server_id?: string | null;\n mcp_server_error?: string | null;\n }>;\n createScopeLoading: boolean;\n createScopeError: string | null;\n\n updateScope: (params: {\n scopeId: string;\n patch: {\n name?: string;\n description?: string | null;\n include_query?: string;\n exclude_query?: string | null;\n };\n }) => Promise<UpdateScopeResponse>;\n updateScopeLoading: boolean;\n updateScopeError: string | null;\n\n deleteScope: (params: { scopeId: string }) => Promise<{ deleted: boolean }>;\n deleteScopeLoading: boolean;\n deleteScopeError: string | null;\n\n // -- Skills --\n skills: SkillSummaryRecord[] | null;\n skillsLoading: boolean;\n skillsError: string | null;\n refreshSkills: () => Promise<void>;\n\n createSkill: (params: {\n name: string;\n description: string;\n instructions: string;\n files?: SkillFileInput[];\n metadata?: Record<string, unknown>;\n }) => Promise<{ skillId: string | null }>;\n createSkillLoading: boolean;\n createSkillError: string | null;\n\n readSkill: (params: {\n skillId: string;\n mode: SkillReadMode;\n files?: string[];\n fileContent?: SkillFileContentMode;\n }) => Promise<SkillManageResponse>;\n\n updateSkill: (params: {\n skillId: string;\n patch: {\n name?: string;\n description?: string;\n instructions?: string;\n files?: {\n upsert?: SkillFileInput[];\n removePaths?: string[];\n };\n metadata?: Record<string, unknown> | null;\n };\n }) => Promise<SkillManageResponse>;\n updateSkillLoading: boolean;\n updateSkillError: string | null;\n\n deleteSkill: (params: { skillId: string }) => Promise<SkillManageResponse>;\n deleteSkillLoading: boolean;\n deleteSkillError: string | null;\n\n getContextGraph: () => Promise<ContextGraphSummaryResponse>;\n readContextGraph: (params?: { path?: string }) => Promise<ContextGraphReadResponse>;\n}\n\nexport type UseKronosArgs = UseKronosLegacyArgs | undefined;\n\n// ---------------------------------------------------------------------------\n// Direct-fetch helper\n// ---------------------------------------------------------------------------\n\nasync function directFetch<T>(\n baseUrl: string,\n token: string,\n path: string,\n options: { method?: string; body?: unknown } = {},\n): Promise<T> {\n const res = await fetch(`${baseUrl}${path}`, {\n method: options.method ?? 'GET',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n },\n body: options.body ? JSON.stringify(options.body) : undefined,\n });\n\n const text = await res.text();\n let data: unknown;\n try {\n data = text ? JSON.parse(text) : null;\n } catch {\n data = text;\n }\n\n if (!res.ok) {\n const msg =\n (data && typeof data === 'object' && 'error' in data && typeof (data as any).error === 'string')\n ? (data as any).error\n : `Request failed with status ${res.status}`;\n throw new Error(msg);\n }\n\n return data as T;\n}\n\nfunction parseContextGraphProcedures(\n files: SkillFileRecord[],\n): ContextGraphSummaryResponse['procedures'] {\n return files\n .filter((file) => file.path.startsWith('procedures/') && file.path.endsWith('.md'))\n .map((file) => {\n const content = file.content ?? '';\n const normalized = content.replace(/\\r\\n/g, '\\n');\n\n if (normalized.startsWith('---\\n')) {\n const endIndex = normalized.indexOf('\\n---\\n', 4);\n if (endIndex !== -1) {\n const frontmatter = normalized.slice(4, endIndex);\n const metadata: Record<string, string> = {};\n for (const line of frontmatter.split('\\n')) {\n const separatorIndex = line.indexOf(':');\n if (separatorIndex === -1) continue;\n const key = line.slice(0, separatorIndex).trim();\n const value = line.slice(separatorIndex + 1).trim();\n if (key && value) {\n metadata[key] = value;\n }\n }\n\n return {\n title: metadata.title || (file.path.split('/').pop() ?? file.path),\n description: metadata.description || '',\n path: file.path,\n };\n }\n }\n\n const lines = content.split(/\\r?\\n/);\n const titleLine = lines.find((line) => line.startsWith('# '));\n const title = titleLine\n ? titleLine.replace(/^#\\s+/, '').trim()\n : file.path.split('/').pop() ?? file.path;\n const description =\n lines\n .slice(1)\n .map((line) => line.trim())\n .find((line) => line.length > 0 && !line.startsWith('#')) ?? '';\n\n return {\n title,\n description,\n path: file.path,\n };\n })\n .sort((a, b) => a.path.localeCompare(b.path));\n}\n\nfunction assertReadableContextGraphPath(path: string): void {\n if (path === 'SKILL.md') return;\n if (/^procedures\\/[a-z0-9-]+\\.md$/.test(path)) return;\n throw new Error('Only SKILL.md or procedures/*.md paths are allowed');\n}\n\n// ---------------------------------------------------------------------------\n// Hook implementation\n// ---------------------------------------------------------------------------\n\nexport function useKronos(args?: UseKronosArgs): UseKronosResult {\n const ctx = useKronosContext();\n\n const isProvider = !!ctx && !args;\n const legacyArgs = args as UseKronosLegacyArgs | undefined;\n\n // --- Trigger state ---\n const [triggers, setTriggers] = useState<TriggerRecord[] | null>(null);\n const [triggersLoading, setTriggersLoading] = useState(true);\n const [triggersError, setTriggersError] = useState<string | null>(null);\n\n const [createLoading, setCreateLoading] = useState(false);\n const [createError, setCreateError] = useState<string | null>(null);\n\n const [updateLoading, setUpdateLoading] = useState(false);\n const [updateError, setUpdateError] = useState<string | null>(null);\n\n const [deleteLoading, setDeleteLoading] = useState(false);\n const [deleteError, setDeleteError] = useState<string | null>(null);\n\n // --- Memory stats state ---\n const [memoryStats, setMemoryStats] = useState<MemoryStatsResponse | null>(null);\n const [memoryStatsLoading, setMemoryStatsLoading] = useState(false);\n const [memoryStatsError, setMemoryStatsError] = useState<string | null>(null);\n\n // --- Cost summary state ---\n const [costSummary, setCostSummary] = useState<CostSummaryResponse | null>(null);\n const [costSummaryLoading, setCostSummaryLoading] = useState(false);\n const [costSummaryError, setCostSummaryError] = useState<string | null>(null);\n const [costBreakdown, setCostBreakdown] = useState<CostBreakdownResponse | null>(null);\n const [costBreakdownLoading, setCostBreakdownLoading] = useState(false);\n const [costBreakdownError, setCostBreakdownError] = useState<string | null>(null);\n\n // --- Scopes state ---\n const [scopes, setScopes] = useState<ScopeDetail[] | null>(null);\n const [scopesLoading, setScopesLoading] = useState(false);\n const [scopesError, setScopesError] = useState<string | null>(null);\n\n const [createScopeLoading, setCreateScopeLoading] = useState(false);\n const [createScopeError, setCreateScopeError] = useState<string | null>(null);\n\n const [updateScopeLoading, setUpdateScopeLoading] = useState(false);\n const [updateScopeError, setUpdateScopeError] = useState<string | null>(null);\n\n const [deleteScopeLoading, setDeleteScopeLoading] = useState(false);\n const [deleteScopeError, setDeleteScopeError] = useState<string | null>(null);\n\n // --- Skills state ---\n const [skills, setSkills] = useState<SkillSummaryRecord[] | null>(null);\n const [skillsLoading, setSkillsLoading] = useState(false);\n const [skillsError, setSkillsError] = useState<string | null>(null);\n\n const [createSkillLoading, setCreateSkillLoading] = useState(false);\n const [createSkillError, setCreateSkillError] = useState<string | null>(null);\n\n const [updateSkillLoading, setUpdateSkillLoading] = useState(false);\n const [updateSkillError, setUpdateSkillError] = useState<string | null>(null);\n\n const [deleteSkillLoading, setDeleteSkillLoading] = useState(false);\n const [deleteSkillError, setDeleteSkillError] = useState<string | null>(null);\n\n // =========================================================================\n // Triggers\n // =========================================================================\n\n const loadTriggers = useCallback(async () => {\n setTriggersLoading(true);\n setTriggersError(null);\n try {\n let response: ListTriggersResponse;\n\n if (isProvider && ctx?.token) {\n response = await directFetch<ListTriggersResponse>(\n ctx.baseUrl,\n ctx.token,\n '/v1/triggers',\n );\n } else if (legacyArgs) {\n response = await legacyArgs.ops.listTriggers({\n tenantUserId: legacyArgs.tenantUserId,\n });\n } else {\n throw new Error('useKronos: no KronosProvider and no ops provided');\n }\n\n setTriggers(Array.isArray(response.triggers) ? response.triggers : []);\n } catch (error: unknown) {\n setTriggersError(\n error instanceof Error ? error.message : 'Failed to load Kronos triggers',\n );\n setTriggers([]);\n } finally {\n setTriggersLoading(false);\n }\n }, [isProvider, ctx?.baseUrl, ctx?.token, legacyArgs?.ops, legacyArgs?.tenantUserId]);\n\n useEffect(() => {\n if (isProvider && !ctx?.isReady) return;\n void loadTriggers();\n }, [loadTriggers, isProvider, ctx?.isReady]);\n\n const refreshTriggers = useCallback(async () => {\n await loadTriggers();\n }, [loadTriggers]);\n\n const createNlTrigger = useCallback(\n async (params: { title: string; nl: string; actionDescription: string }) => {\n setCreateLoading(true);\n setCreateError(null);\n try {\n let triggerId: string | null = null;\n\n if (isProvider && ctx?.token) {\n const res = await directFetch<{ trigger_id?: string }>(\n ctx.baseUrl,\n ctx.token,\n '/v1/triggers',\n {\n method: 'POST',\n body: {\n trigger_type: 'nl_webhook',\n trigger_spec: { nl: params.nl },\n title: params.title.trim(),\n action_description: params.actionDescription,\n webhook_url: ctx.baseUrl + '/v1/triggers/execute',\n webhook_secret: 'frontend-managed',\n },\n },\n );\n triggerId = res.trigger_id ?? null;\n } else if (legacyArgs) {\n const res = await legacyArgs.ops.createNlTrigger({\n tenantUserId: legacyArgs.tenantUserId,\n title: params.title,\n nl: params.nl,\n actionDescription: params.actionDescription,\n });\n triggerId = res.triggerId;\n } else {\n throw new Error('useKronos: no KronosProvider and no ops provided');\n }\n\n void loadTriggers();\n return { triggerId };\n } catch (error: unknown) {\n const message =\n error instanceof Error ? error.message : 'Failed to create Kronos trigger';\n setCreateError(message);\n return { triggerId: null };\n } finally {\n setCreateLoading(false);\n }\n },\n [isProvider, ctx?.baseUrl, ctx?.token, legacyArgs?.ops, legacyArgs?.tenantUserId, loadTriggers],\n );\n\n const updateTrigger = useCallback(\n async (params: {\n triggerId: string;\n title?: string | null;\n actionDescription?: string;\n triggerSpec?: Record<string, unknown>;\n status?: string;\n }) => {\n setUpdateLoading(true);\n setUpdateError(null);\n try {\n if (!isProvider || !ctx?.token) {\n throw new Error('updateTrigger requires KronosProvider');\n }\n\n const body: Record<string, unknown> = {};\n if (params.title !== undefined) {\n body.title = params.title;\n }\n if (params.actionDescription !== undefined) {\n body.action_description = params.actionDescription;\n }\n if (params.triggerSpec !== undefined) {\n body.trigger_spec = params.triggerSpec;\n }\n if (params.status !== undefined) {\n body.status = params.status;\n }\n\n const res = await directFetch<UpdateTriggerResponse>(\n ctx.baseUrl,\n ctx.token,\n `/v1/triggers/${encodeURIComponent(params.triggerId)}`,\n {\n method: 'PUT',\n body,\n },\n );\n\n void loadTriggers();\n return res;\n } catch (error: unknown) {\n const message =\n error instanceof Error ? error.message : 'Failed to update trigger';\n setUpdateError(message);\n throw error;\n } finally {\n setUpdateLoading(false);\n }\n },\n [isProvider, ctx?.baseUrl, ctx?.token, loadTriggers],\n );\n\n const deleteTriggerFn = useCallback(\n async (params: { triggerId: string }) => {\n setDeleteLoading(true);\n setDeleteError(null);\n try {\n if (!isProvider || !ctx?.token) {\n throw new Error('deleteTrigger requires KronosProvider');\n }\n\n const res = await directFetch<DeleteTriggerResponse>(\n ctx.baseUrl,\n ctx.token,\n `/v1/triggers/${encodeURIComponent(params.triggerId)}`,\n { method: 'DELETE' },\n );\n\n void loadTriggers();\n return res;\n } catch (error: unknown) {\n const message =\n error instanceof Error ? error.message : 'Failed to delete trigger';\n setDeleteError(message);\n throw error;\n } finally {\n setDeleteLoading(false);\n }\n },\n [isProvider, ctx?.baseUrl, ctx?.token, loadTriggers],\n );\n\n // =========================================================================\n // Memory stats\n // =========================================================================\n\n const loadMemoryStats = useCallback(async () => {\n if (!isProvider || !ctx?.token) return;\n setMemoryStatsLoading(true);\n setMemoryStatsError(null);\n try {\n const res = await directFetch<MemoryStatsResponse>(\n ctx.baseUrl,\n ctx.token,\n '/v1/memory-stats',\n );\n setMemoryStats(res);\n } catch (error: unknown) {\n setMemoryStatsError(\n error instanceof Error ? error.message : 'Failed to load memory stats',\n );\n } finally {\n setMemoryStatsLoading(false);\n }\n }, [isProvider, ctx?.baseUrl, ctx?.token]);\n\n const refreshMemoryStats = useCallback(async () => {\n await loadMemoryStats();\n }, [loadMemoryStats]);\n\n // =========================================================================\n // Cost summary\n // =========================================================================\n\n const loadCostSummary = useCallback(async () => {\n if (!isProvider || !ctx?.token) return;\n setCostSummaryLoading(true);\n setCostSummaryError(null);\n try {\n const res = await directFetch<CostSummaryResponse>(\n ctx.baseUrl,\n ctx.token,\n '/v1/costs/summary',\n );\n setCostSummary(res);\n } catch (error: unknown) {\n setCostSummaryError(\n error instanceof Error ? error.message : 'Failed to load cost summary',\n );\n } finally {\n setCostSummaryLoading(false);\n }\n }, [isProvider, ctx?.baseUrl, ctx?.token]);\n\n const refreshCostSummary = useCallback(async () => {\n await loadCostSummary();\n }, [loadCostSummary]);\n\n const loadCostBreakdown = useCallback(async (days = 7) => {\n if (!isProvider || !ctx?.token) return;\n setCostBreakdownLoading(true);\n setCostBreakdownError(null);\n try {\n const query = new URLSearchParams({ days: String(days) });\n const res = await directFetch<CostBreakdownResponse>(\n ctx.baseUrl,\n ctx.token,\n `/v1/costs/breakdown?${query.toString()}`,\n );\n setCostBreakdown(res);\n } catch (error: unknown) {\n setCostBreakdownError(\n error instanceof Error ? error.message : 'Failed to load cost breakdown',\n );\n } finally {\n setCostBreakdownLoading(false);\n }\n }, [isProvider, ctx?.baseUrl, ctx?.token]);\n\n const refreshCostBreakdown = useCallback(async (days = 7) => {\n await loadCostBreakdown(days);\n }, [loadCostBreakdown]);\n\n // =========================================================================\n // Scopes\n // =========================================================================\n\n const loadScopes = useCallback(async () => {\n if (!isProvider || !ctx?.token) return;\n setScopesLoading(true);\n setScopesError(null);\n try {\n const res = await directFetch<ListScopesResponse>(\n ctx.baseUrl,\n ctx.token,\n '/v1/scopes',\n );\n setScopes(Array.isArray(res.scopes) ? res.scopes : []);\n } catch (error: unknown) {\n setScopesError(\n error instanceof Error ? error.message : 'Failed to load scopes',\n );\n setScopes([]);\n } finally {\n setScopesLoading(false);\n }\n }, [isProvider, ctx?.baseUrl, ctx?.token]);\n\n const refreshScopes = useCallback(async () => {\n await loadScopes();\n }, [loadScopes]);\n\n const getMCPServer = useCallback(\n async (params: { serverId: string }) => {\n if (!isProvider || !ctx?.token) {\n throw new Error('getMCPServer requires KronosProvider');\n }\n\n return directFetch<GetMCPServerResponse>(\n ctx.baseUrl,\n ctx.token,\n `/v1/mcp-servers/${encodeURIComponent(params.serverId)}`,\n );\n },\n [isProvider, ctx?.baseUrl, ctx?.token],\n );\n\n const connectMCPServer = useCallback(\n async (params: { serverId: string }) => {\n if (!isProvider || !ctx?.token) {\n throw new Error('connectMCPServer requires KronosProvider');\n }\n\n return directFetch<ConnectMCPServerResponse>(\n ctx.baseUrl,\n ctx.token,\n `/v1/mcp-servers/${encodeURIComponent(params.serverId)}/connect`,\n {\n method: 'POST',\n body: {},\n },\n );\n },\n [isProvider, ctx?.baseUrl, ctx?.token],\n );\n\n const createScope = useCallback(\n async (params: { name: string; include_query: string; description?: string }) => {\n setCreateScopeLoading(true);\n setCreateScopeError(null);\n try {\n if (!isProvider || !ctx?.token) {\n throw new Error('createScope requires KronosProvider');\n }\n\n const res = await directFetch<CreateScopeResponse>(\n ctx.baseUrl,\n ctx.token,\n '/v1/scopes',\n {\n method: 'POST',\n body: {\n name: params.name,\n include_query: params.include_query,\n description: params.description,\n },\n },\n );\n\n void loadScopes();\n if (res.mcp_server_error) {\n setCreateScopeError(res.mcp_server_error);\n }\n return {\n scope_id: res.scope_id ?? null,\n backfill_job_id: res.backfill_job_id,\n mcp_server_id: res.mcp_server_id ?? null,\n mcp_server_error: res.mcp_server_error ?? null,\n };\n } catch (error: unknown) {\n const message =\n error instanceof Error ? error.message : 'Failed to create scope';\n setCreateScopeError(message);\n return { scope_id: null, mcp_server_id: null, mcp_server_error: message };\n } finally {\n setCreateScopeLoading(false);\n }\n },\n [isProvider, ctx?.baseUrl, ctx?.token, loadScopes],\n );\n\n const updateScopeFn = useCallback(\n async (params: {\n scopeId: string;\n patch: {\n name?: string;\n description?: string | null;\n include_query?: string;\n exclude_query?: string | null;\n };\n }) => {\n setUpdateScopeLoading(true);\n setUpdateScopeError(null);\n try {\n if (!isProvider || !ctx?.token) {\n throw new Error('updateScope requires KronosProvider');\n }\n\n const res = await directFetch<UpdateScopeResponse>(\n ctx.baseUrl,\n ctx.token,\n `/v1/scopes/${encodeURIComponent(params.scopeId)}`,\n {\n method: 'PATCH',\n body: params.patch,\n },\n );\n\n void loadScopes();\n return res;\n } catch (error: unknown) {\n const message =\n error instanceof Error ? error.message : 'Failed to update scope';\n setUpdateScopeError(message);\n throw error;\n } finally {\n setUpdateScopeLoading(false);\n }\n },\n [isProvider, ctx?.baseUrl, ctx?.token, loadScopes],\n );\n\n const deleteScopeFn = useCallback(\n async (params: { scopeId: string }) => {\n setDeleteScopeLoading(true);\n setDeleteScopeError(null);\n try {\n if (!isProvider || !ctx?.token) {\n throw new Error('deleteScope requires KronosProvider');\n }\n\n const res = await directFetch<{ deleted: boolean }>(\n ctx.baseUrl,\n ctx.token,\n `/v1/scopes/${encodeURIComponent(params.scopeId)}`,\n { method: 'DELETE' },\n );\n\n void loadScopes();\n return res;\n } catch (error: unknown) {\n const message =\n error instanceof Error ? error.message : 'Failed to delete scope';\n setDeleteScopeError(message);\n throw error;\n } finally {\n setDeleteScopeLoading(false);\n }\n },\n [isProvider, ctx?.baseUrl, ctx?.token, loadScopes],\n );\n\n // =========================================================================\n // Skills\n // =========================================================================\n\n const refreshSkills = useCallback(async () => {\n setSkillsLoading(true);\n setSkillsError(null);\n try {\n if (!isProvider || !ctx?.token) {\n throw new Error('refreshSkills requires KronosProvider');\n }\n\n const res = await directFetch<SkillManageResponse>(\n ctx.baseUrl,\n ctx.token,\n '/v1/skills/manage',\n {\n method: 'POST',\n body: {\n operation: 'list',\n },\n },\n );\n\n setSkills(Array.isArray(res.skills) ? res.skills : []);\n } catch (error: unknown) {\n setSkillsError(\n error instanceof Error ? error.message : 'Failed to load skills',\n );\n setSkills([]);\n } finally {\n setSkillsLoading(false);\n }\n }, [isProvider, ctx?.baseUrl, ctx?.token]);\n\n const createSkill = useCallback(\n async (params: {\n name: string;\n description: string;\n instructions: string;\n files?: SkillFileInput[];\n metadata?: Record<string, unknown>;\n }) => {\n setCreateSkillLoading(true);\n setCreateSkillError(null);\n try {\n if (!isProvider || !ctx?.token) {\n throw new Error('createSkill requires KronosProvider');\n }\n\n const res = await directFetch<SkillManageResponse>(\n ctx.baseUrl,\n ctx.token,\n '/v1/skills/manage',\n {\n method: 'POST',\n body: {\n operation: 'create',\n name: params.name.trim(),\n description: params.description.trim(),\n instructions: params.instructions,\n files: params.files,\n metadata: params.metadata,\n },\n },\n );\n\n void refreshSkills();\n return { skillId: res.skill_id ?? null };\n } catch (error: unknown) {\n const message =\n error instanceof Error ? error.message : 'Failed to create skill';\n setCreateSkillError(message);\n return { skillId: null };\n } finally {\n setCreateSkillLoading(false);\n }\n },\n [isProvider, ctx?.baseUrl, ctx?.token, refreshSkills],\n );\n\n const readSkill = useCallback(\n async (params: {\n skillId: string;\n mode: SkillReadMode;\n files?: string[];\n fileContent?: SkillFileContentMode;\n }) => {\n if (!isProvider || !ctx?.token) {\n throw new Error('readSkill requires KronosProvider');\n }\n\n return directFetch<SkillManageResponse>(\n ctx.baseUrl,\n ctx.token,\n '/v1/skills/manage',\n {\n method: 'POST',\n body: {\n operation: 'read',\n skill_id: params.skillId,\n mode: params.mode,\n files: params.files,\n fileContent: params.fileContent,\n },\n },\n );\n },\n [isProvider, ctx?.baseUrl, ctx?.token],\n );\n\n const updateSkill = useCallback(\n async (params: {\n skillId: string;\n patch: {\n name?: string;\n description?: string;\n instructions?: string;\n files?: {\n upsert?: SkillFileInput[];\n removePaths?: string[];\n };\n metadata?: Record<string, unknown> | null;\n };\n }) => {\n setUpdateSkillLoading(true);\n setUpdateSkillError(null);\n try {\n if (!isProvider || !ctx?.token) {\n throw new Error('updateSkill requires KronosProvider');\n }\n\n const res = await directFetch<SkillManageResponse>(\n ctx.baseUrl,\n ctx.token,\n '/v1/skills/manage',\n {\n method: 'POST',\n body: {\n operation: 'update',\n skill_id: params.skillId,\n patch: params.patch,\n },\n },\n );\n\n void refreshSkills();\n return res;\n } catch (error: unknown) {\n const message =\n error instanceof Error ? error.message : 'Failed to update skill';\n setUpdateSkillError(message);\n throw error;\n } finally {\n setUpdateSkillLoading(false);\n }\n },\n [isProvider, ctx?.baseUrl, ctx?.token, refreshSkills],\n );\n\n const deleteSkill = useCallback(\n async (params: { skillId: string }) => {\n setDeleteSkillLoading(true);\n setDeleteSkillError(null);\n try {\n if (!isProvider || !ctx?.token) {\n throw new Error('deleteSkill requires KronosProvider');\n }\n\n const res = await directFetch<SkillManageResponse>(\n ctx.baseUrl,\n ctx.token,\n '/v1/skills/manage',\n {\n method: 'POST',\n body: {\n operation: 'delete',\n skill_id: params.skillId,\n },\n },\n );\n\n void refreshSkills();\n return res;\n } catch (error: unknown) {\n const message =\n error instanceof Error ? error.message : 'Failed to delete skill';\n setDeleteSkillError(message);\n throw error;\n } finally {\n setDeleteSkillLoading(false);\n }\n },\n [isProvider, ctx?.baseUrl, ctx?.token, refreshSkills],\n );\n\n const getContextGraph = useCallback(async () => {\n if (!isProvider || !ctx?.token) {\n throw new Error('getContextGraph requires KronosProvider');\n }\n\n const listed = await directFetch<SkillManageResponse>(\n ctx.baseUrl,\n ctx.token,\n '/v1/skills/manage',\n {\n method: 'POST',\n body: {\n operation: 'list',\n include_internal: true,\n },\n },\n );\n\n const match = (listed.skills ?? []).find(\n (skill) => skill.name === INTERNAL_CONTEXT_GRAPH_SKILL_NAME,\n );\n\n if (!match?.skill_id) {\n return {\n skill_id: null,\n procedures: [],\n } satisfies ContextGraphSummaryResponse;\n }\n\n const treeResult = await directFetch<SkillManageResponse>(\n ctx.baseUrl,\n ctx.token,\n '/v1/skills/manage',\n {\n method: 'POST',\n body: {\n operation: 'read',\n skill_id: match.skill_id,\n mode: 'tree',\n },\n },\n );\n\n const procedurePaths = (treeResult.tree ?? [])\n .filter(\n (node) =>\n node.kind === 'file' &&\n node.path.startsWith('procedures/') &&\n node.path.endsWith('.md'),\n )\n .map((node) => node.path);\n\n if (procedurePaths.length === 0) {\n return {\n skill_id: match.skill_id,\n procedures: [],\n } satisfies ContextGraphSummaryResponse;\n }\n\n const filesResult = await directFetch<SkillManageResponse>(\n ctx.baseUrl,\n ctx.token,\n '/v1/skills/manage',\n {\n method: 'POST',\n body: {\n operation: 'read',\n skill_id: match.skill_id,\n mode: 'files',\n files: procedurePaths,\n fileContent: 'full',\n },\n },\n );\n\n return {\n skill_id: match.skill_id,\n procedures: parseContextGraphProcedures(filesResult.files ?? []),\n } satisfies ContextGraphSummaryResponse;\n }, [isProvider, ctx?.baseUrl, ctx?.token]);\n\n const readContextGraph = useCallback(\n async (params?: { path?: string }) => {\n if (!isProvider || !ctx?.token) {\n throw new Error('readContextGraph requires KronosProvider');\n }\n\n const requestedPath = params?.path?.trim() || 'SKILL.md';\n assertReadableContextGraphPath(requestedPath);\n\n const listed = await directFetch<SkillManageResponse>(\n ctx.baseUrl,\n ctx.token,\n '/v1/skills/manage',\n {\n method: 'POST',\n body: {\n operation: 'list',\n include_internal: true,\n },\n },\n );\n\n const match = (listed.skills ?? []).find(\n (skill) => skill.name === INTERNAL_CONTEXT_GRAPH_SKILL_NAME,\n );\n\n if (!match?.skill_id) {\n return {\n skill_id: null,\n path: requestedPath,\n content: null,\n } satisfies ContextGraphReadResponse;\n }\n\n if (requestedPath === 'SKILL.md') {\n const result = await directFetch<SkillManageResponse>(\n ctx.baseUrl,\n ctx.token,\n '/v1/skills/manage',\n {\n method: 'POST',\n body: {\n operation: 'read',\n skill_id: match.skill_id,\n mode: 'instructions',\n },\n },\n );\n\n return {\n skill_id: match.skill_id,\n path: 'SKILL.md',\n content: result.instructions ?? null,\n } satisfies ContextGraphReadResponse;\n }\n\n const result = await directFetch<SkillManageResponse>(\n ctx.baseUrl,\n ctx.token,\n '/v1/skills/manage',\n {\n method: 'POST',\n body: {\n operation: 'read',\n skill_id: match.skill_id,\n mode: 'files',\n files: [requestedPath],\n fileContent: 'full',\n },\n },\n );\n\n const file = (result.files ?? []).find(\n (entry) => entry.path === requestedPath,\n );\n\n return {\n skill_id: match.skill_id,\n path: requestedPath,\n content: file?.content ?? null,\n } satisfies ContextGraphReadResponse;\n },\n [isProvider, ctx?.baseUrl, ctx?.token],\n );\n\n // =========================================================================\n // Return\n // =========================================================================\n\n return {\n triggers,\n triggersLoading,\n triggersError,\n refreshTriggers,\n\n createNlTrigger,\n createLoading,\n createError,\n\n updateTrigger,\n updateLoading,\n updateError,\n\n deleteTrigger: deleteTriggerFn,\n deleteLoading,\n deleteError,\n\n memoryStats,\n memoryStatsLoading,\n memoryStatsError,\n refreshMemoryStats,\n\n costSummary,\n costSummaryLoading,\n costSummaryError,\n refreshCostSummary,\n costBreakdown,\n costBreakdownLoading,\n costBreakdownError,\n refreshCostBreakdown,\n\n scopes,\n scopesLoading,\n scopesError,\n refreshScopes,\n\n getMCPServer,\n connectMCPServer,\n\n createScope,\n createScopeLoading,\n createScopeError,\n\n updateScope: updateScopeFn,\n updateScopeLoading,\n updateScopeError,\n\n deleteScope: deleteScopeFn,\n deleteScopeLoading,\n deleteScopeError,\n\n skills,\n skillsLoading,\n skillsError,\n refreshSkills,\n\n createSkill,\n createSkillLoading,\n createSkillError,\n\n readSkill,\n\n updateSkill,\n updateSkillLoading,\n updateSkillError,\n\n deleteSkill,\n deleteSkillLoading,\n deleteSkillError,\n\n getContextGraph,\n readContextGraph,\n };\n}\n","import React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n} from 'react';\n\nexport interface KronosProviderProps {\n /** Base URL of the Kronos worker (e.g. \"https://kronos-worker.example.com\") */\n baseUrl: string;\n /**\n * Async function that returns a fresh frontend token string.\n * Called on mount and whenever the current token is about to expire.\n */\n getToken: () => Promise<string>;\n children: React.ReactNode;\n}\n\nexport interface KronosContextValue {\n baseUrl: string;\n token: string | null;\n isReady: boolean;\n refreshToken: () => Promise<void>;\n}\n\nconst KronosContext = createContext<KronosContextValue | null>(null);\n\nconst REFRESH_BUFFER_MS = 5 * 60 * 1000; // refresh 5 min before expiry\n\nfunction parseTokenExpiry(token: string): number | null {\n try {\n const withoutPrefix = token.startsWith('kr_ft_') ? token.slice(6) : token;\n const payloadB64 = withoutPrefix.split('.')[0];\n if (!payloadB64) return null;\n const base64 = payloadB64.replace(/-/g, '+').replace(/_/g, '/');\n const padded = base64 + '='.repeat((4 - (base64.length % 4)) % 4);\n const json = atob(padded);\n const payload = JSON.parse(json) as { exp?: number };\n if (typeof payload.exp === 'number') {\n return payload.exp * 1000; // convert to ms\n }\n } catch {\n // ignore parse errors\n }\n return null;\n}\n\nexport function KronosProvider({ baseUrl, getToken, children }: KronosProviderProps) {\n const [token, setToken] = useState<string | null>(null);\n const [isReady, setIsReady] = useState(false);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const getTokenRef = useRef(getToken);\n getTokenRef.current = getToken;\n\n const fetchAndSchedule = useCallback(async () => {\n try {\n const newToken = await getTokenRef.current();\n setToken(newToken);\n setIsReady(true);\n\n // Schedule refresh before expiry\n if (timerRef.current) clearTimeout(timerRef.current);\n const expiryMs = parseTokenExpiry(newToken);\n if (expiryMs) {\n const delayMs = Math.max(expiryMs - Date.now() - REFRESH_BUFFER_MS, 10_000);\n timerRef.current = setTimeout(() => {\n void fetchAndSchedule();\n }, delayMs);\n }\n } catch (err) {\n console.error('[KronosProvider] Failed to fetch token:', err);\n setIsReady(true); // still mark ready so UI can show error state\n }\n }, []);\n\n useEffect(() => {\n void fetchAndSchedule();\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n };\n }, [fetchAndSchedule]);\n\n const refreshToken = useCallback(async () => {\n await fetchAndSchedule();\n }, [fetchAndSchedule]);\n\n const value: KronosContextValue = {\n baseUrl: baseUrl.replace(/\\/$/, ''),\n token,\n isReady,\n refreshToken,\n };\n\n return (\n <KronosContext.Provider value={value}>\n {children}\n </KronosContext.Provider>\n );\n}\n\nexport function useKronosContext(): KronosContextValue | null {\n return useContext(KronosContext);\n}\n"],"mappings":"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","names":["import_react","result"]}
|
package/dist/react/index.mjs
CHANGED
|
@@ -155,6 +155,12 @@ function useKronos(args) {
|
|
|
155
155
|
const [memoryStats, setMemoryStats] = useState2(null);
|
|
156
156
|
const [memoryStatsLoading, setMemoryStatsLoading] = useState2(false);
|
|
157
157
|
const [memoryStatsError, setMemoryStatsError] = useState2(null);
|
|
158
|
+
const [costSummary, setCostSummary] = useState2(null);
|
|
159
|
+
const [costSummaryLoading, setCostSummaryLoading] = useState2(false);
|
|
160
|
+
const [costSummaryError, setCostSummaryError] = useState2(null);
|
|
161
|
+
const [costBreakdown, setCostBreakdown] = useState2(null);
|
|
162
|
+
const [costBreakdownLoading, setCostBreakdownLoading] = useState2(false);
|
|
163
|
+
const [costBreakdownError, setCostBreakdownError] = useState2(null);
|
|
158
164
|
const [scopes, setScopes] = useState2(null);
|
|
159
165
|
const [scopesLoading, setScopesLoading] = useState2(false);
|
|
160
166
|
const [scopesError, setScopesError] = useState2(null);
|
|
@@ -345,6 +351,51 @@ function useKronos(args) {
|
|
|
345
351
|
const refreshMemoryStats = useCallback2(async () => {
|
|
346
352
|
await loadMemoryStats();
|
|
347
353
|
}, [loadMemoryStats]);
|
|
354
|
+
const loadCostSummary = useCallback2(async () => {
|
|
355
|
+
if (!isProvider || !ctx?.token) return;
|
|
356
|
+
setCostSummaryLoading(true);
|
|
357
|
+
setCostSummaryError(null);
|
|
358
|
+
try {
|
|
359
|
+
const res = await directFetch(
|
|
360
|
+
ctx.baseUrl,
|
|
361
|
+
ctx.token,
|
|
362
|
+
"/v1/costs/summary"
|
|
363
|
+
);
|
|
364
|
+
setCostSummary(res);
|
|
365
|
+
} catch (error) {
|
|
366
|
+
setCostSummaryError(
|
|
367
|
+
error instanceof Error ? error.message : "Failed to load cost summary"
|
|
368
|
+
);
|
|
369
|
+
} finally {
|
|
370
|
+
setCostSummaryLoading(false);
|
|
371
|
+
}
|
|
372
|
+
}, [isProvider, ctx?.baseUrl, ctx?.token]);
|
|
373
|
+
const refreshCostSummary = useCallback2(async () => {
|
|
374
|
+
await loadCostSummary();
|
|
375
|
+
}, [loadCostSummary]);
|
|
376
|
+
const loadCostBreakdown = useCallback2(async (days = 7) => {
|
|
377
|
+
if (!isProvider || !ctx?.token) return;
|
|
378
|
+
setCostBreakdownLoading(true);
|
|
379
|
+
setCostBreakdownError(null);
|
|
380
|
+
try {
|
|
381
|
+
const query = new URLSearchParams({ days: String(days) });
|
|
382
|
+
const res = await directFetch(
|
|
383
|
+
ctx.baseUrl,
|
|
384
|
+
ctx.token,
|
|
385
|
+
`/v1/costs/breakdown?${query.toString()}`
|
|
386
|
+
);
|
|
387
|
+
setCostBreakdown(res);
|
|
388
|
+
} catch (error) {
|
|
389
|
+
setCostBreakdownError(
|
|
390
|
+
error instanceof Error ? error.message : "Failed to load cost breakdown"
|
|
391
|
+
);
|
|
392
|
+
} finally {
|
|
393
|
+
setCostBreakdownLoading(false);
|
|
394
|
+
}
|
|
395
|
+
}, [isProvider, ctx?.baseUrl, ctx?.token]);
|
|
396
|
+
const refreshCostBreakdown = useCallback2(async (days = 7) => {
|
|
397
|
+
await loadCostBreakdown(days);
|
|
398
|
+
}, [loadCostBreakdown]);
|
|
348
399
|
const loadScopes = useCallback2(async () => {
|
|
349
400
|
if (!isProvider || !ctx?.token) return;
|
|
350
401
|
setScopesLoading(true);
|
|
@@ -806,6 +857,14 @@ function useKronos(args) {
|
|
|
806
857
|
memoryStatsLoading,
|
|
807
858
|
memoryStatsError,
|
|
808
859
|
refreshMemoryStats,
|
|
860
|
+
costSummary,
|
|
861
|
+
costSummaryLoading,
|
|
862
|
+
costSummaryError,
|
|
863
|
+
refreshCostSummary,
|
|
864
|
+
costBreakdown,
|
|
865
|
+
costBreakdownLoading,
|
|
866
|
+
costBreakdownError,
|
|
867
|
+
refreshCostBreakdown,
|
|
809
868
|
scopes,
|
|
810
869
|
scopesLoading,
|
|
811
870
|
scopesError,
|