@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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/react/useKronos.ts","../../src/react/KronosProvider.tsx"],"sourcesContent":["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":"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","names":["useCallback","useEffect","useState","useState","useCallback","useEffect","result"]}
1
+ {"version":3,"sources":["../../src/react/useKronos.ts","../../src/react/KronosProvider.tsx"],"sourcesContent":["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":["useCallback","useEffect","useState","useState","useCallback","useEffect","result"]}
@@ -104,6 +104,25 @@ interface MemoryStatsResponse {
104
104
  artifact_count: number;
105
105
  scope_count: number;
106
106
  }
107
+ interface CostSummaryResponse {
108
+ app_id: string;
109
+ tenant_user_id: string | null;
110
+ total_cost_usd: number;
111
+ total_run_count: number;
112
+ priced_run_count: number;
113
+ unpriced_run_count: number;
114
+ }
115
+ interface CostBreakdownPoint {
116
+ date: string;
117
+ total_cost_usd: number;
118
+ total_run_count: number;
119
+ }
120
+ interface CostBreakdownResponse {
121
+ app_id: string;
122
+ tenant_user_id: string | null;
123
+ days: number;
124
+ points: CostBreakdownPoint[];
125
+ }
107
126
  interface ScratchsheetResponse {
108
127
  scratchsheet: string | null;
109
128
  updated_at: string | null;
@@ -371,4 +390,4 @@ interface KronosClientConfig {
371
390
  mastraUrl?: string;
372
391
  }
373
392
 
374
- export type { ScopeDetail as A, CreateScopeRequest as B, CreateMCPServerResponse as C, DeleteTriggerResponse as D, TriggerType as E, CreateFrontendTokenRequest as F, GetMCPServerResponse as G, SkillFileType as H, IngestResponse as I, SkillReadMode as J, KronosClientConfig as K, ListMCPServersResponse as L, MemoryStatsResponse as M, SkillFileContentMode as N, OnTriggered as O, SkillFileInput as P, SkillFileRecord as Q, RotateMCPServerTokenResponse as R, ScratchsheetResponse as S, TriggerRecord as T, UpdateScopeResponse as U, SkillTreeNode as V, SkillMetadataRecord as W, SkillSummaryRecord as X, ContextGraphProcedureSummary as Y, IngestStatusResponse as a, ConnectMCPServerResponse as b, ListScopesResponse as c, GetScopeResponse as d, ScopeSpec as e, CreateScopeResponse as f, ListTriggersResponse as g, CreateTriggerRequest as h, CreateTriggerResponse as i, UpdateTriggerRequest as j, UpdateTriggerResponse as k, CreateFrontendTokenResponse as l, SkillManageParams as m, SkillManageResponse as n, ContextGraphSummaryResponse as o, ContextGraphReadResponse as p, IngestStatus as q, IngestMemoryDisposition as r, IngestRequest as s, CreateMCPServerRequest as t, MCPServerStatus as u, MCPServerToolCapabilities as v, MCPServerDetails as w, ConnectMCPServerRequest as x, RotateMCPServerTokenRequest as y, ScopeSummary as z };
393
+ export type { ContextGraphProcedureSummary as $, RotateMCPServerTokenRequest as A, CostBreakdownPoint as B, CreateMCPServerResponse as C, DeleteTriggerResponse as D, ScopeSummary as E, ScopeDetail as F, GetMCPServerResponse as G, CreateScopeRequest as H, IngestResponse as I, TriggerType as J, KronosClientConfig as K, ListMCPServersResponse as L, MemoryStatsResponse as M, CreateFrontendTokenRequest as N, OnTriggered as O, SkillFileType as P, SkillReadMode as Q, RotateMCPServerTokenResponse as R, ScratchsheetResponse as S, TriggerRecord as T, UpdateScopeResponse as U, SkillFileContentMode as V, SkillFileInput as W, SkillFileRecord as X, SkillTreeNode as Y, SkillMetadataRecord as Z, SkillSummaryRecord as _, IngestStatusResponse as a, ConnectMCPServerResponse as b, CostSummaryResponse as c, CostBreakdownResponse as d, ListScopesResponse as e, GetScopeResponse as f, ScopeSpec as g, CreateScopeResponse as h, ListTriggersResponse as i, CreateTriggerRequest as j, CreateTriggerResponse as k, UpdateTriggerRequest as l, UpdateTriggerResponse as m, CreateFrontendTokenResponse as n, SkillManageParams as o, SkillManageResponse as p, ContextGraphSummaryResponse as q, ContextGraphReadResponse as r, IngestStatus as s, IngestMemoryDisposition as t, IngestRequest as u, CreateMCPServerRequest as v, MCPServerStatus as w, MCPServerToolCapabilities as x, MCPServerDetails as y, ConnectMCPServerRequest as z };
@@ -104,6 +104,25 @@ interface MemoryStatsResponse {
104
104
  artifact_count: number;
105
105
  scope_count: number;
106
106
  }
107
+ interface CostSummaryResponse {
108
+ app_id: string;
109
+ tenant_user_id: string | null;
110
+ total_cost_usd: number;
111
+ total_run_count: number;
112
+ priced_run_count: number;
113
+ unpriced_run_count: number;
114
+ }
115
+ interface CostBreakdownPoint {
116
+ date: string;
117
+ total_cost_usd: number;
118
+ total_run_count: number;
119
+ }
120
+ interface CostBreakdownResponse {
121
+ app_id: string;
122
+ tenant_user_id: string | null;
123
+ days: number;
124
+ points: CostBreakdownPoint[];
125
+ }
107
126
  interface ScratchsheetResponse {
108
127
  scratchsheet: string | null;
109
128
  updated_at: string | null;
@@ -371,4 +390,4 @@ interface KronosClientConfig {
371
390
  mastraUrl?: string;
372
391
  }
373
392
 
374
- export type { ScopeDetail as A, CreateScopeRequest as B, CreateMCPServerResponse as C, DeleteTriggerResponse as D, TriggerType as E, CreateFrontendTokenRequest as F, GetMCPServerResponse as G, SkillFileType as H, IngestResponse as I, SkillReadMode as J, KronosClientConfig as K, ListMCPServersResponse as L, MemoryStatsResponse as M, SkillFileContentMode as N, OnTriggered as O, SkillFileInput as P, SkillFileRecord as Q, RotateMCPServerTokenResponse as R, ScratchsheetResponse as S, TriggerRecord as T, UpdateScopeResponse as U, SkillTreeNode as V, SkillMetadataRecord as W, SkillSummaryRecord as X, ContextGraphProcedureSummary as Y, IngestStatusResponse as a, ConnectMCPServerResponse as b, ListScopesResponse as c, GetScopeResponse as d, ScopeSpec as e, CreateScopeResponse as f, ListTriggersResponse as g, CreateTriggerRequest as h, CreateTriggerResponse as i, UpdateTriggerRequest as j, UpdateTriggerResponse as k, CreateFrontendTokenResponse as l, SkillManageParams as m, SkillManageResponse as n, ContextGraphSummaryResponse as o, ContextGraphReadResponse as p, IngestStatus as q, IngestMemoryDisposition as r, IngestRequest as s, CreateMCPServerRequest as t, MCPServerStatus as u, MCPServerToolCapabilities as v, MCPServerDetails as w, ConnectMCPServerRequest as x, RotateMCPServerTokenRequest as y, ScopeSummary as z };
393
+ export type { ContextGraphProcedureSummary as $, RotateMCPServerTokenRequest as A, CostBreakdownPoint as B, CreateMCPServerResponse as C, DeleteTriggerResponse as D, ScopeSummary as E, ScopeDetail as F, GetMCPServerResponse as G, CreateScopeRequest as H, IngestResponse as I, TriggerType as J, KronosClientConfig as K, ListMCPServersResponse as L, MemoryStatsResponse as M, CreateFrontendTokenRequest as N, OnTriggered as O, SkillFileType as P, SkillReadMode as Q, RotateMCPServerTokenResponse as R, ScratchsheetResponse as S, TriggerRecord as T, UpdateScopeResponse as U, SkillFileContentMode as V, SkillFileInput as W, SkillFileRecord as X, SkillTreeNode as Y, SkillMetadataRecord as Z, SkillSummaryRecord as _, IngestStatusResponse as a, ConnectMCPServerResponse as b, CostSummaryResponse as c, CostBreakdownResponse as d, ListScopesResponse as e, GetScopeResponse as f, ScopeSpec as g, CreateScopeResponse as h, ListTriggersResponse as i, CreateTriggerRequest as j, CreateTriggerResponse as k, UpdateTriggerRequest as l, UpdateTriggerResponse as m, CreateFrontendTokenResponse as n, SkillManageParams as o, SkillManageResponse as p, ContextGraphSummaryResponse as q, ContextGraphReadResponse as r, IngestStatus as s, IngestMemoryDisposition as t, IngestRequest as u, CreateMCPServerRequest as v, MCPServerStatus as w, MCPServerToolCapabilities as x, MCPServerDetails as y, ConnectMCPServerRequest as z };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gdrl/kronos-lib",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "Lightweight TypeScript SDK for the Kronos Knowledge Graph API",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",