@agent-receipts/dashboard 0.3.0 → 0.3.2
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/package.json +5 -6
- package/standalone/apps/web/.next/BUILD_ID +1 -1
- package/standalone/apps/web/.next/app-build-manifest.json +55 -55
- package/standalone/apps/web/.next/app-path-routes-manifest.json +13 -13
- package/standalone/apps/web/.next/build-manifest.json +2 -2
- package/standalone/apps/web/.next/prerender-manifest.json +34 -34
- package/standalone/apps/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/standalone/apps/web/.next/server/app/_not-found.html +2 -2
- package/standalone/apps/web/.next/server/app/_not-found.rsc +2 -2
- package/standalone/apps/web/.next/server/app/agents/[id]/page_client-reference-manifest.js +1 -1
- package/standalone/apps/web/.next/server/app/agents/page_client-reference-manifest.js +1 -1
- package/standalone/apps/web/.next/server/app/agents.html +2 -2
- package/standalone/apps/web/.next/server/app/agents.rsc +2 -2
- package/standalone/apps/web/.next/server/app/api/agents/route.js +1 -1
- package/standalone/apps/web/.next/server/app/api/agents/route.js.nft.json +1 -1
- package/standalone/apps/web/.next/server/app/api/agents/route_client-reference-manifest.js +1 -1
- package/standalone/apps/web/.next/server/app/api/chains/[id]/route.js +1 -1
- package/standalone/apps/web/.next/server/app/api/chains/[id]/route.js.nft.json +1 -1
- package/standalone/apps/web/.next/server/app/api/chains/[id]/route_client-reference-manifest.js +1 -1
- package/standalone/apps/web/.next/server/app/api/cleanup/route.js +1 -1
- package/standalone/apps/web/.next/server/app/api/cleanup/route.js.nft.json +1 -1
- package/standalone/apps/web/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
- package/standalone/apps/web/.next/server/app/api/config/route.js +1 -1
- package/standalone/apps/web/.next/server/app/api/config/route.js.nft.json +1 -1
- package/standalone/apps/web/.next/server/app/api/config/route_client-reference-manifest.js +1 -1
- package/standalone/apps/web/.next/server/app/api/invoices/route.js +1 -1
- package/standalone/apps/web/.next/server/app/api/invoices/route.js.nft.json +1 -1
- package/standalone/apps/web/.next/server/app/api/invoices/route_client-reference-manifest.js +1 -1
- package/standalone/apps/web/.next/server/app/api/judgments/route.js +1 -1
- package/standalone/apps/web/.next/server/app/api/judgments/route.js.nft.json +1 -1
- package/standalone/apps/web/.next/server/app/api/judgments/route_client-reference-manifest.js +1 -1
- package/standalone/apps/web/.next/server/app/api/memory/audit/route.js +1 -1
- package/standalone/apps/web/.next/server/app/api/memory/audit/route.js.nft.json +1 -1
- package/standalone/apps/web/.next/server/app/api/memory/audit/route_client-reference-manifest.js +1 -1
- package/standalone/apps/web/.next/server/app/api/memory/entities/[id]/route.js +1 -1
- package/standalone/apps/web/.next/server/app/api/memory/entities/[id]/route.js.nft.json +1 -1
- package/standalone/apps/web/.next/server/app/api/memory/entities/[id]/route_client-reference-manifest.js +1 -1
- package/standalone/apps/web/.next/server/app/api/memory/entities/route.js +1 -1
- package/standalone/apps/web/.next/server/app/api/memory/entities/route.js.nft.json +1 -1
- package/standalone/apps/web/.next/server/app/api/memory/entities/route_client-reference-manifest.js +1 -1
- package/standalone/apps/web/.next/server/app/api/memory/forget/route.js +1 -1
- package/standalone/apps/web/.next/server/app/api/memory/forget/route.js.nft.json +1 -1
- package/standalone/apps/web/.next/server/app/api/memory/forget/route_client-reference-manifest.js +1 -1
- package/standalone/apps/web/.next/server/app/api/memory/observe/route.js +1 -1
- package/standalone/apps/web/.next/server/app/api/memory/observe/route.js.nft.json +1 -1
- package/standalone/apps/web/.next/server/app/api/memory/observe/route_client-reference-manifest.js +1 -1
- package/standalone/apps/web/.next/server/app/api/memory/provenance/[obsId]/route.js +1 -1
- package/standalone/apps/web/.next/server/app/api/memory/provenance/[obsId]/route.js.nft.json +1 -1
- package/standalone/apps/web/.next/server/app/api/memory/provenance/[obsId]/route_client-reference-manifest.js +1 -1
- package/standalone/apps/web/.next/server/app/api/memory/recall/route.js +1 -1
- package/standalone/apps/web/.next/server/app/api/memory/recall/route.js.nft.json +1 -1
- package/standalone/apps/web/.next/server/app/api/memory/recall/route_client-reference-manifest.js +1 -1
- package/standalone/apps/web/.next/server/app/api/receipts/[id]/route.js +1 -1
- package/standalone/apps/web/.next/server/app/api/receipts/[id]/route.js.nft.json +1 -1
- package/standalone/apps/web/.next/server/app/api/receipts/[id]/route_client-reference-manifest.js +1 -1
- package/standalone/apps/web/.next/server/app/api/receipts/route.js +1 -1
- package/standalone/apps/web/.next/server/app/api/receipts/route.js.nft.json +1 -1
- package/standalone/apps/web/.next/server/app/api/receipts/route_client-reference-manifest.js +1 -1
- package/standalone/apps/web/.next/server/app/api/search/route.js +1 -1
- package/standalone/apps/web/.next/server/app/api/search/route.js.nft.json +1 -1
- package/standalone/apps/web/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
- package/standalone/apps/web/.next/server/app/api/stats/route.js +1 -1
- package/standalone/apps/web/.next/server/app/api/stats/route.js.nft.json +1 -1
- package/standalone/apps/web/.next/server/app/api/stats/route_client-reference-manifest.js +1 -1
- package/standalone/apps/web/.next/server/app/api/verify/route.js +1 -1
- package/standalone/apps/web/.next/server/app/api/verify/route.js.nft.json +1 -1
- package/standalone/apps/web/.next/server/app/api/verify/route_client-reference-manifest.js +1 -1
- package/standalone/apps/web/.next/server/app/chains/[id]/page_client-reference-manifest.js +1 -1
- package/standalone/apps/web/.next/server/app/chains/page_client-reference-manifest.js +1 -1
- package/standalone/apps/web/.next/server/app/chains.html +2 -2
- package/standalone/apps/web/.next/server/app/chains.rsc +2 -2
- package/standalone/apps/web/.next/server/app/constraints/page_client-reference-manifest.js +1 -1
- package/standalone/apps/web/.next/server/app/constraints.html +2 -2
- package/standalone/apps/web/.next/server/app/constraints.rsc +2 -2
- package/standalone/apps/web/.next/server/app/get-started/page_client-reference-manifest.js +1 -1
- package/standalone/apps/web/.next/server/app/get-started.html +2 -2
- package/standalone/apps/web/.next/server/app/get-started.rsc +2 -2
- package/standalone/apps/web/.next/server/app/how-it-works/page_client-reference-manifest.js +1 -1
- package/standalone/apps/web/.next/server/app/how-it-works.html +2 -2
- package/standalone/apps/web/.next/server/app/how-it-works.rsc +2 -2
- package/standalone/apps/web/.next/server/app/index.html +2 -2
- package/standalone/apps/web/.next/server/app/index.rsc +2 -2
- package/standalone/apps/web/.next/server/app/invoices/page_client-reference-manifest.js +1 -1
- package/standalone/apps/web/.next/server/app/invoices.html +2 -2
- package/standalone/apps/web/.next/server/app/invoices.rsc +2 -2
- package/standalone/apps/web/.next/server/app/judgments/page_client-reference-manifest.js +1 -1
- package/standalone/apps/web/.next/server/app/judgments.html +2 -2
- package/standalone/apps/web/.next/server/app/judgments.rsc +2 -2
- package/standalone/apps/web/.next/server/app/memory/[entityId]/page_client-reference-manifest.js +1 -1
- package/standalone/apps/web/.next/server/app/memory/audit/page_client-reference-manifest.js +1 -1
- package/standalone/apps/web/.next/server/app/memory/audit.html +2 -2
- package/standalone/apps/web/.next/server/app/memory/audit.rsc +2 -2
- package/standalone/apps/web/.next/server/app/memory/page_client-reference-manifest.js +1 -1
- package/standalone/apps/web/.next/server/app/memory.html +2 -2
- package/standalone/apps/web/.next/server/app/memory.rsc +2 -2
- package/standalone/apps/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/standalone/apps/web/.next/server/app/receipts/[id]/page.js +1 -1
- package/standalone/apps/web/.next/server/app/receipts/[id]/page_client-reference-manifest.js +1 -1
- package/standalone/apps/web/.next/server/app/receipts/page.js +1 -1
- package/standalone/apps/web/.next/server/app/receipts/page_client-reference-manifest.js +1 -1
- package/standalone/apps/web/.next/server/app/receipts.html +2 -2
- package/standalone/apps/web/.next/server/app/receipts.rsc +3 -3
- package/standalone/apps/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/standalone/apps/web/.next/server/app/settings.html +2 -2
- package/standalone/apps/web/.next/server/app/settings.rsc +2 -2
- package/standalone/apps/web/.next/server/app/verify/page_client-reference-manifest.js +1 -1
- package/standalone/apps/web/.next/server/app/verify.html +2 -2
- package/standalone/apps/web/.next/server/app/verify.rsc +2 -2
- package/standalone/apps/web/.next/server/app-paths-manifest.json +13 -13
- package/standalone/apps/web/.next/server/chunks/1725.js +1 -0
- package/standalone/apps/web/.next/server/chunks/4099.js +1 -1
- package/standalone/apps/web/.next/server/chunks/4886.js +1 -0
- package/standalone/apps/web/.next/server/chunks/6803.js +44 -6
- package/standalone/apps/web/.next/server/pages/404.html +2 -2
- package/standalone/apps/web/.next/server/pages/500.html +1 -1
- package/standalone/apps/web/.next/server/pages/_error.js +2 -2
- package/standalone/apps/web/.next/server/pages-manifest.json +1 -1
- package/standalone/apps/web/.next/static/chunks/app/receipts/[id]/page-3b95a98a03395684.js +1 -0
- package/standalone/apps/web/.next/static/chunks/app/receipts/page-665b6e374ca41d0c.js +1 -0
- package/standalone/apps/web/.next/static/css/90a952694ea5745a.css +5 -0
- package/standalone/apps/web/src/lib/demo-memory-store.ts +238 -0
- package/standalone/node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/package.json +0 -0
- package/standalone/packages/crypto/package.json +1 -1
- package/standalone/packages/mcp-server/dist/index.js +135 -3
- package/standalone/packages/mcp-server/package.json +1 -1
- package/standalone/apps/web/.next/static/chunks/app/receipts/[id]/page-779f2c6fdc359351.js +0 -1
- package/standalone/apps/web/.next/static/chunks/app/receipts/page-f3df6ceecaff7cce.js +0 -1
- package/standalone/apps/web/.next/static/css/415fd9a8d5823143.css +0 -5
- /package/standalone/apps/web/.next/static/{BZdBWaTjiqh8Heg1_5h6o → 4imcQFGwcLOgYedAyPG7i}/_buildManifest.js +0 -0
- /package/standalone/apps/web/.next/static/{BZdBWaTjiqh8Heg1_5h6o → 4imcQFGwcLOgYedAyPG7i}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import type { Entity, Observation, Relationship, EntityType, MemoryScope } from '@agent-receipts/schema'
|
|
2
|
+
import { DEMO_ENTITIES, DEMO_OBSERVATIONS, DEMO_RELATIONSHIPS } from './demo-memory-data'
|
|
3
|
+
|
|
4
|
+
export interface FindEntitiesQuery {
|
|
5
|
+
entity_type?: EntityType
|
|
6
|
+
scope?: MemoryScope
|
|
7
|
+
query?: string
|
|
8
|
+
include_forgotten?: boolean
|
|
9
|
+
limit?: number
|
|
10
|
+
page?: number
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface Pagination {
|
|
14
|
+
page: number
|
|
15
|
+
limit: number
|
|
16
|
+
total: number
|
|
17
|
+
total_pages: number
|
|
18
|
+
has_next: boolean
|
|
19
|
+
has_prev: boolean
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface PaginatedEntities {
|
|
23
|
+
data: Entity[]
|
|
24
|
+
pagination: Pagination
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface MemoryStats {
|
|
28
|
+
total_entities: number
|
|
29
|
+
total_observations: number
|
|
30
|
+
total_relationships: number
|
|
31
|
+
forgotten_observations: number
|
|
32
|
+
forgotten_entities: number
|
|
33
|
+
by_entity_type: Record<string, number>
|
|
34
|
+
by_operation: Record<string, number>
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface SearchResult {
|
|
38
|
+
entity: Entity
|
|
39
|
+
observation: Observation
|
|
40
|
+
rank: number
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export interface RecallResult {
|
|
44
|
+
entities: Entity[]
|
|
45
|
+
observations: Observation[]
|
|
46
|
+
total: number
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export interface ProvenanceResult {
|
|
50
|
+
observation: Observation
|
|
51
|
+
entity: Entity
|
|
52
|
+
receipt_id: string
|
|
53
|
+
chain: Array<{ receipt_id: string; action: string; timestamp: string }>
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export class DemoMemoryStore {
|
|
57
|
+
private entities: Entity[]
|
|
58
|
+
private observations: Observation[]
|
|
59
|
+
private relationships: Relationship[]
|
|
60
|
+
|
|
61
|
+
constructor() {
|
|
62
|
+
this.entities = DEMO_ENTITIES
|
|
63
|
+
this.observations = DEMO_OBSERVATIONS
|
|
64
|
+
this.relationships = DEMO_RELATIONSHIPS
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
findEntities(query: FindEntitiesQuery): PaginatedEntities {
|
|
68
|
+
const includeForgotten = query.include_forgotten ?? false
|
|
69
|
+
const limit = query.limit ?? 20
|
|
70
|
+
const page = query.page ?? 1
|
|
71
|
+
|
|
72
|
+
let filtered = this.entities.filter(e => {
|
|
73
|
+
if (!includeForgotten && e.forgotten_at !== null) return false
|
|
74
|
+
if (!includeForgotten && e.merged_into !== null) return false
|
|
75
|
+
if (query.entity_type && e.entity_type !== query.entity_type) return false
|
|
76
|
+
if (query.scope && e.scope !== query.scope) return false
|
|
77
|
+
if (query.query) {
|
|
78
|
+
const q = query.query.toLowerCase()
|
|
79
|
+
const nameMatch = e.name.toLowerCase().includes(q)
|
|
80
|
+
const aliasMatch = e.aliases.some(a => a.toLowerCase().includes(q))
|
|
81
|
+
if (!nameMatch && !aliasMatch) return false
|
|
82
|
+
}
|
|
83
|
+
return true
|
|
84
|
+
})
|
|
85
|
+
|
|
86
|
+
const total = filtered.length
|
|
87
|
+
const totalPages = Math.max(1, Math.ceil(total / limit))
|
|
88
|
+
const offset = (page - 1) * limit
|
|
89
|
+
filtered = filtered.slice(offset, offset + limit)
|
|
90
|
+
|
|
91
|
+
return {
|
|
92
|
+
data: filtered,
|
|
93
|
+
pagination: {
|
|
94
|
+
page,
|
|
95
|
+
limit,
|
|
96
|
+
total,
|
|
97
|
+
total_pages: totalPages,
|
|
98
|
+
has_next: page < totalPages,
|
|
99
|
+
has_prev: page > 1,
|
|
100
|
+
},
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
getEntity(id: string): Entity | null {
|
|
105
|
+
return this.entities.find(e => e.entity_id === id) ?? null
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
getObservations(entityId: string, includeForgotten: boolean): Observation[] {
|
|
109
|
+
const now = new Date().toISOString()
|
|
110
|
+
return this.observations.filter(o => {
|
|
111
|
+
if (o.entity_id !== entityId) return false
|
|
112
|
+
if (!includeForgotten && o.forgotten_at !== null) return false
|
|
113
|
+
if (!includeForgotten && o.expires_at && o.expires_at < now) return false
|
|
114
|
+
return true
|
|
115
|
+
}).sort((a, b) => b.observed_at.localeCompare(a.observed_at))
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
getRelationships(entityId: string): Relationship[] {
|
|
119
|
+
return this.relationships.filter(
|
|
120
|
+
r => r.from_entity_id === entityId || r.to_entity_id === entityId
|
|
121
|
+
)
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
getMemoryStats(): MemoryStats {
|
|
125
|
+
const forgottenObs = this.observations.filter(o => o.forgotten_at !== null).length
|
|
126
|
+
const forgottenEnts = this.entities.filter(e => e.forgotten_at !== null).length
|
|
127
|
+
|
|
128
|
+
const byEntityType: Record<string, number> = {}
|
|
129
|
+
for (const e of this.entities) {
|
|
130
|
+
byEntityType[e.entity_type] = (byEntityType[e.entity_type] ?? 0) + 1
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const byOperation: Record<string, number> = {
|
|
134
|
+
observe: 9,
|
|
135
|
+
recall: 3,
|
|
136
|
+
forget: 2,
|
|
137
|
+
context: 1,
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
return {
|
|
141
|
+
total_entities: this.entities.length,
|
|
142
|
+
total_observations: this.observations.length,
|
|
143
|
+
total_relationships: this.relationships.length,
|
|
144
|
+
forgotten_observations: forgottenObs,
|
|
145
|
+
forgotten_entities: forgottenEnts,
|
|
146
|
+
by_entity_type: byEntityType,
|
|
147
|
+
by_operation: byOperation,
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
search(query: string, filters?: { entity_type?: EntityType; scope?: MemoryScope }): SearchResult[] {
|
|
152
|
+
const q = query.toLowerCase()
|
|
153
|
+
const now = new Date().toISOString()
|
|
154
|
+
|
|
155
|
+
const results: SearchResult[] = []
|
|
156
|
+
let rank = 0
|
|
157
|
+
|
|
158
|
+
for (const obs of this.observations) {
|
|
159
|
+
if (obs.forgotten_at !== null) continue
|
|
160
|
+
if (obs.expires_at && obs.expires_at < now) continue
|
|
161
|
+
if (!obs.content.toLowerCase().includes(q)) continue
|
|
162
|
+
|
|
163
|
+
const entity = this.getEntity(obs.entity_id)
|
|
164
|
+
if (!entity || entity.forgotten_at !== null) continue
|
|
165
|
+
|
|
166
|
+
if (filters?.entity_type && entity.entity_type !== filters.entity_type) continue
|
|
167
|
+
if (filters?.scope && entity.scope !== filters.scope) continue
|
|
168
|
+
|
|
169
|
+
results.push({ entity, observation: obs, rank: rank++ })
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
return results
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
recall(query: FindEntitiesQuery): RecallResult {
|
|
176
|
+
if (query.query) {
|
|
177
|
+
const results = this.search(query.query, {
|
|
178
|
+
entity_type: query.entity_type as EntityType | undefined,
|
|
179
|
+
scope: query.scope as MemoryScope | undefined,
|
|
180
|
+
})
|
|
181
|
+
const entityMap = new Map<string, Entity>()
|
|
182
|
+
const observations: Observation[] = []
|
|
183
|
+
for (const r of results) {
|
|
184
|
+
entityMap.set(r.entity.entity_id, r.entity)
|
|
185
|
+
observations.push(r.observation)
|
|
186
|
+
}
|
|
187
|
+
return {
|
|
188
|
+
entities: Array.from(entityMap.values()),
|
|
189
|
+
observations,
|
|
190
|
+
total: observations.length,
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
const entityResult = this.findEntities(query)
|
|
195
|
+
const observations: Observation[] = []
|
|
196
|
+
for (const entity of entityResult.data) {
|
|
197
|
+
const obs = this.getObservations(entity.entity_id, query.include_forgotten ?? false)
|
|
198
|
+
observations.push(...obs)
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
return {
|
|
202
|
+
entities: entityResult.data,
|
|
203
|
+
observations,
|
|
204
|
+
total: observations.length,
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
getProvenance(obsId: string): ProvenanceResult | null {
|
|
209
|
+
const observation = this.observations.find(o => o.observation_id === obsId)
|
|
210
|
+
if (!observation) return null
|
|
211
|
+
|
|
212
|
+
const entity = this.getEntity(observation.entity_id)
|
|
213
|
+
if (!entity) return null
|
|
214
|
+
|
|
215
|
+
return {
|
|
216
|
+
observation,
|
|
217
|
+
entity,
|
|
218
|
+
receipt_id: observation.source_receipt_id,
|
|
219
|
+
chain: [
|
|
220
|
+
{
|
|
221
|
+
receipt_id: observation.source_receipt_id,
|
|
222
|
+
action: 'memory.observe',
|
|
223
|
+
timestamp: observation.observed_at,
|
|
224
|
+
},
|
|
225
|
+
],
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// Singleton instance
|
|
231
|
+
let instance: DemoMemoryStore | null = null
|
|
232
|
+
|
|
233
|
+
export function getDemoMemoryStore(): DemoMemoryStore {
|
|
234
|
+
if (!instance) {
|
|
235
|
+
instance = new DemoMemoryStore()
|
|
236
|
+
}
|
|
237
|
+
return instance
|
|
238
|
+
}
|
|
File without changes
|
|
@@ -524,6 +524,7 @@ var MemoryStore = class {
|
|
|
524
524
|
forgotten_at TEXT,
|
|
525
525
|
forgotten_by TEXT,
|
|
526
526
|
superseded_by TEXT,
|
|
527
|
+
expires_at TEXT,
|
|
527
528
|
tags TEXT NOT NULL DEFAULT '[]',
|
|
528
529
|
metadata TEXT NOT NULL DEFAULT '{}',
|
|
529
530
|
FOREIGN KEY (entity_id) REFERENCES entities(entity_id)
|
|
@@ -534,6 +535,7 @@ var MemoryStore = class {
|
|
|
534
535
|
CREATE INDEX IF NOT EXISTS idx_obs_confidence ON observations(confidence);
|
|
535
536
|
CREATE INDEX IF NOT EXISTS idx_obs_forgotten ON observations(forgotten_at);
|
|
536
537
|
CREATE INDEX IF NOT EXISTS idx_obs_receipt ON observations(source_receipt_id);
|
|
538
|
+
CREATE INDEX IF NOT EXISTS idx_obs_expires ON observations(expires_at);
|
|
537
539
|
|
|
538
540
|
CREATE TABLE IF NOT EXISTS relationships (
|
|
539
541
|
relationship_id TEXT PRIMARY KEY,
|
|
@@ -553,6 +555,10 @@ var MemoryStore = class {
|
|
|
553
555
|
CREATE INDEX IF NOT EXISTS idx_rel_to ON relationships(to_entity_id);
|
|
554
556
|
CREATE INDEX IF NOT EXISTS idx_rel_type ON relationships(relationship_type);
|
|
555
557
|
`);
|
|
558
|
+
try {
|
|
559
|
+
this.db.exec("ALTER TABLE observations ADD COLUMN expires_at TEXT");
|
|
560
|
+
} catch {
|
|
561
|
+
}
|
|
556
562
|
try {
|
|
557
563
|
this.db.exec(`
|
|
558
564
|
CREATE VIRTUAL TABLE IF NOT EXISTS observations_fts USING fts5(
|
|
@@ -705,10 +711,10 @@ var MemoryStore = class {
|
|
|
705
711
|
this.db.prepare(`
|
|
706
712
|
INSERT INTO observations (observation_id, entity_id, content, confidence,
|
|
707
713
|
source_receipt_id, source_agent_id, source_context, observed_at,
|
|
708
|
-
forgotten_at, forgotten_by, superseded_by, tags, metadata)
|
|
714
|
+
forgotten_at, forgotten_by, superseded_by, expires_at, tags, metadata)
|
|
709
715
|
VALUES (@observation_id, @entity_id, @content, @confidence,
|
|
710
716
|
@source_receipt_id, @source_agent_id, @source_context, @observed_at,
|
|
711
|
-
@forgotten_at, @forgotten_by, @superseded_by, @tags, @metadata)
|
|
717
|
+
@forgotten_at, @forgotten_by, @superseded_by, @expires_at, @tags, @metadata)
|
|
712
718
|
`).run({
|
|
713
719
|
observation_id: obs.observation_id,
|
|
714
720
|
entity_id: obs.entity_id,
|
|
@@ -721,6 +727,7 @@ var MemoryStore = class {
|
|
|
721
727
|
forgotten_at: obs.forgotten_at,
|
|
722
728
|
forgotten_by: obs.forgotten_by,
|
|
723
729
|
superseded_by: obs.superseded_by,
|
|
730
|
+
expires_at: obs.expires_at ?? null,
|
|
724
731
|
tags: JSON.stringify(obs.tags),
|
|
725
732
|
metadata: JSON.stringify(obs.metadata)
|
|
726
733
|
});
|
|
@@ -732,7 +739,7 @@ var MemoryStore = class {
|
|
|
732
739
|
return this.rowToObservation(row);
|
|
733
740
|
}
|
|
734
741
|
getObservations(entityId, includeForgotten = false) {
|
|
735
|
-
const where = includeForgotten ? "WHERE entity_id = ?" : "WHERE entity_id = ? AND forgotten_at IS NULL";
|
|
742
|
+
const where = includeForgotten ? "WHERE entity_id = ?" : "WHERE entity_id = ? AND forgotten_at IS NULL AND (expires_at IS NULL OR expires_at > datetime('now'))";
|
|
736
743
|
const rows = this.db.prepare(
|
|
737
744
|
`SELECT * FROM observations ${where} ORDER BY observed_at DESC`
|
|
738
745
|
).all(entityId);
|
|
@@ -787,6 +794,7 @@ var MemoryStore = class {
|
|
|
787
794
|
JOIN observations o ON o.rowid = observations_fts.rowid
|
|
788
795
|
WHERE observations_fts MATCH ?
|
|
789
796
|
AND o.forgotten_at IS NULL
|
|
797
|
+
AND (o.expires_at IS NULL OR o.expires_at > datetime('now'))
|
|
790
798
|
ORDER BY rank
|
|
791
799
|
LIMIT ?
|
|
792
800
|
`).all(query, limit);
|
|
@@ -803,6 +811,7 @@ var MemoryStore = class {
|
|
|
803
811
|
const likeRows = this.db.prepare(`
|
|
804
812
|
SELECT * FROM observations
|
|
805
813
|
WHERE content LIKE ? AND forgotten_at IS NULL
|
|
814
|
+
AND (expires_at IS NULL OR expires_at > datetime('now'))
|
|
806
815
|
ORDER BY observed_at DESC
|
|
807
816
|
LIMIT ?
|
|
808
817
|
`).all(`%${query}%`, limit);
|
|
@@ -903,6 +912,98 @@ var MemoryStore = class {
|
|
|
903
912
|
by_operation: {}
|
|
904
913
|
};
|
|
905
914
|
}
|
|
915
|
+
// --- Duplicate detection ---
|
|
916
|
+
findPossibleDuplicates(entityId) {
|
|
917
|
+
const entity = this.getEntity(entityId);
|
|
918
|
+
if (!entity) return [];
|
|
919
|
+
const nameTokens = entity.name.toLowerCase().split(/\s+/).filter((t) => t.length >= 2);
|
|
920
|
+
if (nameTokens.length === 0) return [];
|
|
921
|
+
const conditions = nameTokens.map(() => "(LOWER(name) LIKE ? OR LOWER(aliases) LIKE ?)").join(" OR ");
|
|
922
|
+
const params = [];
|
|
923
|
+
for (const token of nameTokens) {
|
|
924
|
+
params.push(`%${token}%`, `%${token}%`);
|
|
925
|
+
}
|
|
926
|
+
const rows = this.db.prepare(`
|
|
927
|
+
SELECT * FROM entities
|
|
928
|
+
WHERE entity_type = ?
|
|
929
|
+
AND entity_id != ?
|
|
930
|
+
AND forgotten_at IS NULL
|
|
931
|
+
AND merged_into IS NULL
|
|
932
|
+
AND (${conditions})
|
|
933
|
+
`).all(entity.entity_type, entityId, ...params);
|
|
934
|
+
return rows.map((r) => this.rowToEntity(r));
|
|
935
|
+
}
|
|
936
|
+
// --- Context helpers ---
|
|
937
|
+
getTopEntities(limit, scope) {
|
|
938
|
+
const scopeFilter = scope ? "AND e.scope = ?" : "";
|
|
939
|
+
const params = scope ? [scope, limit] : [limit];
|
|
940
|
+
const rows = this.db.prepare(`
|
|
941
|
+
SELECT e.*, COUNT(o.observation_id) as obs_count, MAX(o.observed_at) as latest
|
|
942
|
+
FROM entities e
|
|
943
|
+
LEFT JOIN observations o ON o.entity_id = e.entity_id AND o.forgotten_at IS NULL
|
|
944
|
+
AND (o.expires_at IS NULL OR o.expires_at > datetime('now'))
|
|
945
|
+
WHERE e.forgotten_at IS NULL AND e.merged_into IS NULL ${scopeFilter}
|
|
946
|
+
GROUP BY e.entity_id
|
|
947
|
+
ORDER BY obs_count DESC
|
|
948
|
+
LIMIT ?
|
|
949
|
+
`).all(...params);
|
|
950
|
+
return rows.map((r) => ({
|
|
951
|
+
...this.rowToEntity(r),
|
|
952
|
+
observation_count: r.obs_count,
|
|
953
|
+
latest_observation: r.latest ?? ""
|
|
954
|
+
}));
|
|
955
|
+
}
|
|
956
|
+
getRecentObservations(limit, agentId) {
|
|
957
|
+
const agentFilter = agentId ? "AND source_agent_id = ?" : "";
|
|
958
|
+
const params = agentId ? [agentId, limit] : [limit];
|
|
959
|
+
const rows = this.db.prepare(`
|
|
960
|
+
SELECT * FROM observations
|
|
961
|
+
WHERE forgotten_at IS NULL
|
|
962
|
+
AND (expires_at IS NULL OR expires_at > datetime('now'))
|
|
963
|
+
${agentFilter}
|
|
964
|
+
ORDER BY observed_at DESC
|
|
965
|
+
LIMIT ?
|
|
966
|
+
`).all(...params);
|
|
967
|
+
return rows.map((r) => this.rowToObservation(r));
|
|
968
|
+
}
|
|
969
|
+
getActiveRelationships(limit) {
|
|
970
|
+
const rows = this.db.prepare(
|
|
971
|
+
"SELECT * FROM relationships WHERE forgotten_at IS NULL ORDER BY created_at DESC LIMIT ?"
|
|
972
|
+
).all(limit);
|
|
973
|
+
return rows.map((r) => this.rowToRelationship(r));
|
|
974
|
+
}
|
|
975
|
+
getPreferenceObservations(limit) {
|
|
976
|
+
const rows = this.db.prepare(`
|
|
977
|
+
SELECT o.* FROM observations o
|
|
978
|
+
JOIN entities e ON e.entity_id = o.entity_id
|
|
979
|
+
WHERE e.entity_type = 'preference'
|
|
980
|
+
AND o.forgotten_at IS NULL
|
|
981
|
+
AND (o.expires_at IS NULL OR o.expires_at > datetime('now'))
|
|
982
|
+
ORDER BY o.observed_at DESC
|
|
983
|
+
LIMIT ?
|
|
984
|
+
`).all(limit);
|
|
985
|
+
return rows.map((r) => this.rowToObservation(r));
|
|
986
|
+
}
|
|
987
|
+
getContextStats() {
|
|
988
|
+
const entities = this.db.prepare("SELECT COUNT(*) as cnt FROM entities WHERE forgotten_at IS NULL").get().cnt;
|
|
989
|
+
const observations = this.db.prepare("SELECT COUNT(*) as cnt FROM observations WHERE forgotten_at IS NULL AND (expires_at IS NULL OR expires_at > datetime('now'))").get().cnt;
|
|
990
|
+
const relationships = this.db.prepare("SELECT COUNT(*) as cnt FROM relationships WHERE forgotten_at IS NULL").get().cnt;
|
|
991
|
+
const agentRows = this.db.prepare("SELECT DISTINCT source_agent_id FROM observations WHERE forgotten_at IS NULL").all();
|
|
992
|
+
return {
|
|
993
|
+
total_entities: entities,
|
|
994
|
+
total_observations: observations,
|
|
995
|
+
total_relationships: relationships,
|
|
996
|
+
agents_contributing: agentRows.map((r) => r.source_agent_id)
|
|
997
|
+
};
|
|
998
|
+
}
|
|
999
|
+
// --- Cleanup ---
|
|
1000
|
+
cleanupExpiredObservations() {
|
|
1001
|
+
const result = this.db.prepare(`
|
|
1002
|
+
UPDATE observations SET forgotten_at = datetime('now'), forgotten_by = 'system:cleanup'
|
|
1003
|
+
WHERE expires_at IS NOT NULL AND expires_at <= datetime('now') AND forgotten_at IS NULL
|
|
1004
|
+
`).run();
|
|
1005
|
+
return result.changes;
|
|
1006
|
+
}
|
|
906
1007
|
// --- Row converters ---
|
|
907
1008
|
rowToEntity(row) {
|
|
908
1009
|
return {
|
|
@@ -933,6 +1034,7 @@ var MemoryStore = class {
|
|
|
933
1034
|
forgotten_at: row.forgotten_at || null,
|
|
934
1035
|
forgotten_by: row.forgotten_by || null,
|
|
935
1036
|
superseded_by: row.superseded_by || null,
|
|
1037
|
+
expires_at: row.expires_at || null,
|
|
936
1038
|
tags: JSON.parse(row.tags || "[]"),
|
|
937
1039
|
metadata: JSON.parse(row.metadata || "{}")
|
|
938
1040
|
};
|
|
@@ -1665,6 +1767,7 @@ var MemoryEngine = class {
|
|
|
1665
1767
|
forgotten_at: null,
|
|
1666
1768
|
forgotten_by: null,
|
|
1667
1769
|
superseded_by: null,
|
|
1770
|
+
expires_at: params.ttlSeconds ? new Date(Date.now() + params.ttlSeconds * 1e3).toISOString() : null,
|
|
1668
1771
|
tags: params.tags ?? [],
|
|
1669
1772
|
metadata: {}
|
|
1670
1773
|
});
|
|
@@ -1818,6 +1921,35 @@ var MemoryEngine = class {
|
|
|
1818
1921
|
memoryAudit(params) {
|
|
1819
1922
|
return this.memoryStore.getMemoryStats(params.agentId, params.from, params.to);
|
|
1820
1923
|
}
|
|
1924
|
+
async getContext(params) {
|
|
1925
|
+
const maxEntities = Math.min(params.maxEntities ?? 10, 50);
|
|
1926
|
+
const maxObservations = Math.min(params.maxObservations ?? 20, 100);
|
|
1927
|
+
const entities = this.memoryStore.getTopEntities(maxEntities, params.scope);
|
|
1928
|
+
const recent_observations = this.memoryStore.getRecentObservations(maxObservations, params.agentId);
|
|
1929
|
+
const relationships = this.memoryStore.getActiveRelationships(50);
|
|
1930
|
+
const preferences = this.memoryStore.getPreferenceObservations(20);
|
|
1931
|
+
const stats = this.memoryStore.getContextStats();
|
|
1932
|
+
const receipt = await this.receiptEngine.create({
|
|
1933
|
+
action: "memory.context",
|
|
1934
|
+
receipt_type: "memory",
|
|
1935
|
+
input_hash: hashData({ scope: params.scope, maxEntities, maxObservations }),
|
|
1936
|
+
output_hash: hashData({ entities: entities.length, observations: recent_observations.length }),
|
|
1937
|
+
status: "completed",
|
|
1938
|
+
metadata: {
|
|
1939
|
+
memory: {
|
|
1940
|
+
memory_operation: "recall",
|
|
1941
|
+
entity_id: null,
|
|
1942
|
+
observation_id: null,
|
|
1943
|
+
relationship_id: null,
|
|
1944
|
+
scope: params.scope ?? "agent",
|
|
1945
|
+
query: null,
|
|
1946
|
+
results_count: entities.length + recent_observations.length,
|
|
1947
|
+
confidence: null
|
|
1948
|
+
}
|
|
1949
|
+
}
|
|
1950
|
+
});
|
|
1951
|
+
return { entities, recent_observations, relationships, preferences, stats, receipt };
|
|
1952
|
+
}
|
|
1821
1953
|
};
|
|
1822
1954
|
|
|
1823
1955
|
// src/engine/invoice-formatters.ts
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8996],{14246:(e,t,s)=>{"use strict";s.d(t,{A:()=>n});let n=(0,s(11063).A)("ShieldX",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"m14.5 9.5-5 5",key:"17q4r4"}],["path",{d:"m9.5 9.5 5 5",key:"18nt4w"}]])},14874:(e,t,s)=>{"use strict";s.d(t,{A:()=>n});let n=(0,s(11063).A)("Check",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]])},15088:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>S});var n=s(88111),a=s(55271),r=s(95388),l=s(55935),i=s.n(l),c=s(23176),d=s(85605),o=s(96450),x=s(77311),u=s(62455),m=s(96741);function h(e){let{hash:t,length:s=16,className:a}=e;return(0,n.jsxs)("span",{className:(0,m.cn)("inline-flex items-center gap-1",a),children:[(0,n.jsx)("code",{className:"font-mono text-xs text-text-secondary",children:(0,u.lV)(t,s)}),(0,n.jsx)(x.i,{value:t})]})}var p=s(47126);let g=(0,s(11063).A)("ChevronDown",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]]);var f=s(28826);function j(e){let{data:t,label:s,defaultExpanded:r=!1,className:l}=e,[i,c]=(0,a.useState)(r),d=JSON.stringify(t,null,2);return(0,n.jsxs)("div",{className:(0,m.cn)("card overflow-hidden",l),children:[(0,n.jsxs)("button",{onClick:()=>c(e=>!e),className:"flex items-center gap-2 w-full px-4 py-3 text-sm text-text-secondary hover:bg-bg-secondary transition-colors",children:[i?(0,n.jsx)(g,{className:"w-4 h-4"}):(0,n.jsx)(f.A,{className:"w-4 h-4"}),(0,n.jsx)("span",{className:"font-medium",children:null!=s?s:"View JSON"}),(0,n.jsx)(x.i,{value:d,className:"ml-auto"})]}),i&&(0,n.jsx)("pre",{className:"px-4 py-3 border-t border-border overflow-x-auto text-xs font-mono text-text-secondary bg-bg-secondary max-h-96",children:d})]})}var y=s(46233),b=s(66187),N=s(84109),v=s(37659),w=s(67998),_=(s(81174),s(14246),s(14874)),k=s(68498);function A(e){let{label:t,children:s,mono:a}=e;return(0,n.jsxs)("div",{className:"flex items-start gap-4 py-2",children:[(0,n.jsx)("span",{className:"text-xs text-text-muted w-28 shrink-0 pt-0.5",children:t}),(0,n.jsx)("div",{className:(0,m.cn)("text-sm text-text-primary min-w-0 flex-1",a&&"font-mono text-xs"),children:s})]})}function C(e){let{title:t,badge:s,children:a}=e;return(0,n.jsxs)("div",{className:"card",children:[(0,n.jsxs)("div",{className:"px-4 py-3 border-b border-border flex items-center justify-between",children:[(0,n.jsx)("h3",{className:"text-sm font-medium text-text-primary",children:t}),s]}),(0,n.jsx)("div",{className:"px-4 py-2",children:a})]})}function S(e){var t,s,l;let{params:g}=e,{id:f}=(0,a.use)(g),{data:S,error:M,mutate:O}=(0,r.Ay)("receipt-".concat(f),()=>(0,c.Lx)(f),{revalidateOnFocus:!0});if(M)return(0,n.jsx)(y.W,{message:M.message,onRetry:()=>O()});if(!S)return(0,n.jsx)(b.AV,{});let T=S.receipt,D=T.constraint_result;T.constraints;let q=T.metadata,E=null==q?void 0:q.expires_at;return(0,n.jsxs)("div",{className:"space-y-4 max-w-4xl",children:[(0,n.jsxs)(i(),{href:"/receipts",className:"inline-flex items-center gap-1 text-sm text-text-muted hover:text-text-secondary",children:[(0,n.jsx)(v.A,{className:"w-4 h-4"})," Back to Receipts"]}),(0,n.jsxs)("div",{className:"flex flex-col sm:flex-row sm:items-center gap-4",children:[(0,n.jsx)("div",{className:"min-w-0 flex-1",children:(0,n.jsxs)("div",{className:"flex items-center gap-2",children:[(0,n.jsx)("code",{className:"font-mono text-lg font-semibold text-text-primary",children:T.receipt_id}),(0,n.jsx)(x.i,{value:T.receipt_id})]})}),(0,n.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,n.jsx)(d.W,{status:T.status}),D&&Array.isArray(D.results)&&(0,n.jsx)(o.L,{passed:D.results.filter(e=>e.passed).length,total:D.results.length}),(0,n.jsxs)("span",{className:"inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs font-medium bg-blue-50 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300 border border-blue-200 dark:border-blue-700",children:[(0,n.jsx)(w.A,{className:"w-3 h-3"}),"Demo Signature"]})]})]}),(0,n.jsxs)(C,{title:"Identity",children:[(0,n.jsx)(A,{label:"Receipt ID",mono:!0,children:(0,n.jsxs)("span",{className:"inline-flex items-center gap-1",children:[T.receipt_id," ",(0,n.jsx)(x.i,{value:T.receipt_id})]})}),(0,n.jsx)(A,{label:"Chain ID",mono:!0,children:T.chain_id?(0,n.jsxs)(i(),{href:"/chains/".concat(T.chain_id),className:"text-primary hover:underline inline-flex items-center gap-1",children:[T.chain_id," ",(0,n.jsx)(x.i,{value:T.chain_id})]}):"—"}),(0,n.jsx)(A,{label:"Parent",mono:!0,children:T.parent_receipt_id?(0,n.jsxs)(i(),{href:"/receipts/".concat(T.parent_receipt_id),className:"text-primary hover:underline inline-flex items-center gap-1",children:[T.parent_receipt_id," ",(0,n.jsx)(x.i,{value:T.parent_receipt_id})]}):"—"}),(0,n.jsx)(A,{label:"Type",children:T.receipt_type}),(0,n.jsx)(A,{label:"Agent",children:(0,n.jsx)(i(),{href:"/agents/".concat(T.agent_id),className:"text-primary hover:underline",children:T.agent_id})}),(0,n.jsx)(A,{label:"Org",children:T.org_id}),(0,n.jsx)(A,{label:"Environment",children:T.environment})]}),(0,n.jsxs)(C,{title:"Timestamps",children:[(0,n.jsx)(A,{label:"Created",children:(0,n.jsxs)("span",{className:"inline-flex items-center gap-2",children:[(0,u.Yq)(T.timestamp),(0,n.jsx)(p.f,{date:T.timestamp,className:"text-xs"})]})}),(0,n.jsx)(A,{label:"Completed",children:T.completed_at?(0,u.Yq)(T.completed_at):"—"}),(0,n.jsx)(A,{label:"Duration",children:(0,u.a3)(T.latency_ms)}),E&&(0,n.jsx)(A,{label:"Expires",children:(0,n.jsxs)("span",{className:(0,m.cn)(new Date(E)<new Date&&"text-danger"),children:[(0,u.Yq)(E)," ",new Date(E)<new Date?"(Expired)":(0,n.jsx)(p.f,{date:E,className:"text-xs"})]})})]}),(0,n.jsxs)(C,{title:"Action",children:[(0,n.jsx)(A,{label:"Action",children:T.action}),(0,n.jsx)(A,{label:"Input Hash",mono:!0,children:T.input_hash?(0,n.jsx)(h,{hash:T.input_hash,length:32}):"—"}),(0,n.jsx)(A,{label:"Output Hash",mono:!0,children:T.output_hash?(0,n.jsx)(h,{hash:T.output_hash,length:32}):"—"}),"string"==typeof T.output_summary&&T.output_summary&&(0,n.jsx)(A,{label:"Output Summary",children:T.output_summary})]}),(0,n.jsxs)(C,{title:"Performance",children:[(0,n.jsx)(A,{label:"Latency",children:null!==T.latency_ms?(0,n.jsxs)("div",{className:"flex items-center gap-2",children:[(0,n.jsx)("span",{children:(0,u.a3)(T.latency_ms)}),(0,n.jsx)("div",{className:"flex-1 max-w-32 h-2 bg-bg-tertiary rounded-full overflow-hidden",children:(0,n.jsx)("div",{className:(0,m.cn)("h-full rounded-full",T.latency_ms<1e3?"bg-success":T.latency_ms<5e3?"bg-warning":"bg-danger"),style:{width:"".concat(Math.min(100,T.latency_ms/1e4*100),"%")}})})]}):"—"}),(0,n.jsx)(A,{label:"Cost",children:(0,u.vv)(T.cost_usd)}),(0,n.jsx)(A,{label:"Tokens",children:null!==T.tokens_in||null!==T.tokens_out?"".concat((0,u.ZV)(null!=(t=T.tokens_in)?t:0)," in / ").concat((0,u.ZV)(null!=(s=T.tokens_out)?s:0)," out"):"—"}),(0,n.jsx)(A,{label:"Model",children:null!=(l=T.model)?l:"—"}),(0,n.jsx)(A,{label:"Confidence",children:null!==T.confidence?(0,n.jsxs)("div",{className:"flex items-center gap-2",children:[(0,n.jsxs)("span",{children:[(100*T.confidence).toFixed(0),"%"]}),(0,n.jsx)("div",{className:"flex-1 max-w-32 h-2 bg-bg-tertiary rounded-full overflow-hidden",children:(0,n.jsx)("div",{className:"h-full rounded-full bg-primary",style:{width:"".concat(100*T.confidence,"%")}})})]}):"—"}),Array.isArray(T.tool_calls)&&T.tool_calls.length>0&&(0,n.jsx)(A,{label:"Tool Calls",children:(0,n.jsx)("div",{className:"flex flex-wrap gap-1",children:T.tool_calls.map(e=>(0,n.jsx)("code",{className:"px-1.5 py-0.5 text-xs bg-bg-tertiary rounded",children:e},e))})})]}),D&&Array.isArray(D.results)&&D.results.length>0&&(0,n.jsx)(C,{title:"Constraints",badge:(0,n.jsx)(o.L,{passed:D.results.filter(e=>e.passed).length,total:D.results.length}),children:(0,n.jsx)("div",{className:"divide-y divide-border-subtle",children:D.results.map((e,t)=>(0,n.jsxs)("div",{className:"flex items-center gap-3 py-2",children:[e.passed?(0,n.jsx)(_.A,{className:"w-4 h-4 text-success shrink-0"}):(0,n.jsx)(k.A,{className:"w-4 h-4 text-danger shrink-0"}),(0,n.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,n.jsxs)("div",{className:"flex items-center gap-2",children:[(0,n.jsx)("code",{className:"text-xs font-medium",children:e.type}),!e.passed&&(0,n.jsx)("span",{className:"text-xs text-danger font-medium",children:"FAILED"})]}),(0,n.jsxs)("div",{className:"text-xs text-text-muted mt-0.5",children:["expected: ",JSON.stringify(e.expected)," — actual: ",JSON.stringify(e.actual),e.message&&(0,n.jsxs)("span",{className:"ml-2",children:["(",e.message,")"]})]})]})]},t))})}),S.judgments&&S.judgments.length>0&&(0,n.jsx)(C,{title:"Judgments",badge:(0,n.jsxs)("span",{className:"text-xs text-text-muted",children:[S.judgments.length," judgment",S.judgments.length>1?"s":""]}),children:(0,n.jsx)("div",{className:"space-y-3 py-2",children:S.judgments.map(e=>{var t,s;let a=e.metadata,r=null==a?void 0:a.verdict,l=null==a?void 0:a.score,c=null==a?void 0:a.reasoning,d=null==a?void 0:a.criteria,o=null!=(t=N.ZT[null!=r?r:""])?t:{bg:"bg-bg-tertiary",text:"text-text-secondary"};return(0,n.jsxs)("div",{className:"border border-border rounded-lg p-3",children:[(0,n.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,n.jsx)(i(),{href:"/receipts/".concat(e.receipt_id),className:"font-mono text-xs text-primary hover:underline",children:(0,u.Ct)(e.receipt_id)}),(0,n.jsx)("div",{className:"flex items-center gap-2",children:r&&(0,n.jsxs)("span",{className:(0,m.cn)("px-2 py-0.5 rounded-full text-xs font-medium uppercase",o.bg,o.text),children:[r," ",void 0!==l&&"(".concat(l.toFixed(2),")")]})})]}),Array.isArray(d)&&d.length>0&&(0,n.jsx)("div",{className:"space-y-1 mb-2",children:d.map((e,t)=>(0,n.jsxs)("div",{className:"flex items-center gap-2 text-xs",children:[e.score>=.7?(0,n.jsx)(_.A,{className:"w-3 h-3 text-success"}):(0,n.jsx)(k.A,{className:"w-3 h-3 text-danger"}),(0,n.jsx)("span",{className:"font-medium w-24",children:e.criterion}),(0,n.jsx)("span",{className:"text-text-muted",children:e.score.toFixed(2)}),(0,n.jsx)("span",{className:"text-text-muted truncate",children:e.reasoning})]},t))}),c&&(0,n.jsx)("p",{className:"text-xs text-text-secondary",children:c}),(0,n.jsxs)("div",{className:"flex items-center gap-3 mt-2 text-xs text-text-muted",children:[(0,n.jsxs)("span",{children:["Judge: ",null!=(s=e.model)?s:"unknown"]}),(0,n.jsx)(p.f,{date:e.timestamp})]})]},e.receipt_id)})})}),S.chain&&S.chain.length>1&&(0,n.jsx)(C,{title:"Chain",badge:(0,n.jsxs)("span",{className:"text-xs text-text-muted",children:[S.chain.length," receipts"]}),children:(0,n.jsx)("div",{className:"py-2 space-y-1",children:S.chain.map(e=>{let t=e.receipt_id===T.receipt_id;return(0,n.jsxs)("div",{className:(0,m.cn)("flex items-center gap-3 py-1.5 px-2 rounded",t&&"bg-primary-subtle"),children:[(0,n.jsx)("div",{className:(0,m.cn)("w-2 h-2 rounded-full shrink-0",t?"bg-primary":"bg-text-muted")}),(0,n.jsx)(i(),{href:"/receipts/".concat(e.receipt_id),className:(0,m.cn)("font-mono text-xs",t?"text-primary font-medium":"text-text-secondary hover:text-primary"),children:(0,u.Ct)(e.receipt_id)}),(0,n.jsx)("span",{className:"text-xs text-text-secondary",children:e.action}),(0,n.jsx)(d.W,{status:e.status}),t&&(0,n.jsx)("span",{className:"text-xs text-primary font-medium ml-auto",children:"current"})]},e.receipt_id)})})}),(0,n.jsxs)(C,{title:"Cryptographic Proof",children:[(0,n.jsx)(A,{label:"Signature",mono:!0,children:(0,n.jsx)(h,{hash:T.signature,length:32})}),(0,n.jsx)(A,{label:"Status",children:(0,n.jsxs)("span",{className:"inline-flex items-center gap-1 text-blue-600 dark:text-blue-400",children:[(0,n.jsx)(w.A,{className:"w-4 h-4"}),"Demo signature (placeholder)"]})}),(0,n.jsx)("div",{className:"mt-3 p-3 bg-blue-50 dark:bg-blue-900/20 rounded-lg border border-blue-200 dark:border-blue-700",children:(0,n.jsxs)("p",{className:"text-xs text-blue-700 dark:text-blue-300",children:[(0,n.jsx)("strong",{children:"Demo mode:"})," Signatures in this demo are placeholders. In production, every receipt is signed with Ed25519 cryptography using your private key. Anyone with your public key can verify authenticity — no central authority required."," ",(0,n.jsx)("a",{href:"/how-it-works#cryptographic-proof",className:"underline font-medium",children:"Learn how it works →"})]})})]}),(0,n.jsx)(j,{data:T,label:"View Raw JSON"})]})}},23176:(e,t,s)=>{"use strict";async function n(e,t){let s=await fetch(e,t);if(!s.ok){let e=await s.text().catch(()=>"Unknown error");throw Error("API error ".concat(s.status,": ").concat(e))}return s.json()}function a(e){let t=new URLSearchParams;for(let[s,n]of Object.entries(e))void 0!==n&&""!==n&&t.set(s,String(n));let s=t.toString();return s?"?".concat(s):""}async function r(){return n("/api/stats")}async function l(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return n("/api/receipts".concat(a(e)))}async function i(e){return n("/api/receipts/".concat(e))}async function c(e){return n("/api/chains/".concat(e))}async function d(){return n("/api/agents")}async function o(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return n("/api/judgments".concat(a(e)))}async function x(e,t){return n("/api/verify",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({receipt:e,public_key:t})})}async function u(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return n("/api/cleanup",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dry_run:e})})}async function m(){return n("/api/config")}async function h(e){return n("/api/config",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)})}async function p(e){return n("/api/search".concat(a({q:e})))}async function g(e){return n("/api/invoices",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)})}s.d(t,{$Q:()=>p,Dz:()=>m,Go:()=>a,Jq:()=>g,Kt:()=>u,Lx:()=>i,MJ:()=>o,YK:()=>r,_R:()=>h,o3:()=>x,oN:()=>c,pQ:()=>d,qb:()=>l})},28826:(e,t,s)=>{"use strict";s.d(t,{A:()=>n});let n=(0,s(11063).A)("ChevronRight",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]])},37659:(e,t,s)=>{"use strict";s.d(t,{A:()=>n});let n=(0,s(11063).A)("ArrowLeft",[["path",{d:"m12 19-7-7 7-7",key:"1l729n"}],["path",{d:"M19 12H5",key:"x3x0zl"}]])},46233:(e,t,s)=>{"use strict";s.d(t,{W:()=>l});var n=s(88111),a=s(94745),r=s(96741);function l(e){let{message:t="Something went wrong",onRetry:s,className:l}=e;return(0,n.jsxs)("div",{className:(0,r.cn)("flex flex-col items-center justify-center py-16 text-center",l),children:[(0,n.jsx)(a.A,{className:"w-12 h-12 text-danger mb-4"}),(0,n.jsx)("h3",{className:"text-sm font-medium text-text-primary mb-1",children:"Error"}),(0,n.jsx)("p",{className:"text-sm text-text-muted max-w-sm mb-4",children:t}),s&&(0,n.jsx)("button",{onClick:s,className:"px-4 py-2 text-sm font-medium bg-primary text-white rounded-md hover:bg-primary-hover transition-colors",children:"Retry"})]})}},47126:(e,t,s)=>{"use strict";s.d(t,{f:()=>l});var n=s(88111),a=s(62455),r=s(96741);function l(e){let{date:t,className:s}=e;return(0,n.jsx)("time",{dateTime:t,title:(0,a.Yq)(t),className:(0,r.cn)("text-text-secondary",s),children:(0,a.fF)(t)})}},62455:(e,t,s)=>{"use strict";function n(e){let t="string"==typeof e?new Date(e):e,s=new Date().getTime()-t.getTime();if(s<0)return"just now";let n=Math.floor(s/1e3);if(n<60)return"".concat(n,"s ago");let a=Math.floor(n/60);if(a<60)return"".concat(a," min ago");let r=Math.floor(a/60);if(r<24)return"".concat(r," hr ago");let l=Math.floor(r/24);if(l<30)return"".concat(l,"d ago");let i=Math.floor(l/30);return"".concat(i,"mo ago")}function a(e){if(null==e)return"—";if(e<1e3)return"".concat(e,"ms");let t=e/1e3;if(t<60)return"".concat(t.toFixed(1),"s");if(t<3600)return"".concat(Math.floor(t/60),"m ").concat(Math.round(t%60),"s");if(t<86400){let e=Math.floor(t/3600),s=Math.floor(t%3600/60);return"".concat(e,"h ").concat(s,"m")}let s=Math.floor(t/86400),n=Math.floor(t%86400/3600);return"".concat(s,"d ").concat(n,"h")}function r(e){return null==e?"—":0===e?"$0.00":e<.01?"$".concat(e.toFixed(4)):"$".concat(e.toFixed(2))}function l(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:12;return e.length<=t?e:"".concat(e.slice(0,t),"...")}function i(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:16;return e.length<=t?e:"".concat(e.slice(0,t),"...")}function c(e){return e.toLocaleString("en-US")}function d(e){return"".concat((100*e).toFixed(1),"%")}function o(e){return("string"==typeof e?new Date(e):e).toLocaleString("en-US",{month:"short",day:"numeric",year:"numeric",hour:"2-digit",minute:"2-digit",second:"2-digit"})}s.d(t,{Ct:()=>l,Yq:()=>o,ZV:()=>c,a3:()=>a,fF:()=>n,l9:()=>d,lV:()=>i,vv:()=>r})},66187:(e,t,s)=>{"use strict";s.d(t,{AV:()=>c,Eg:()=>l,F6:()=>i,O0:()=>r});var n=s(88111),a=s(96741);function r(e){let{className:t}=e;return(0,n.jsx)("div",{className:(0,a.cn)("animate-pulse bg-bg-tertiary rounded",t)})}function l(e){let{count:t=6}=e;return(0,n.jsx)("div",{className:"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-4",children:Array.from({length:t}).map((e,t)=>(0,n.jsxs)("div",{className:"card p-4",children:[(0,n.jsx)(r,{className:"h-3 w-16 mb-3"}),(0,n.jsx)(r,{className:"h-7 w-20"})]},t))})}function i(e){let{rows:t=5}=e;return(0,n.jsxs)("div",{className:"card overflow-hidden",children:[(0,n.jsx)("div",{className:"border-b border-border p-3",children:(0,n.jsx)(r,{className:"h-4 w-48"})}),Array.from({length:t}).map((e,t)=>(0,n.jsxs)("div",{className:"flex items-center gap-4 p-3 border-b border-border-subtle last:border-0",children:[(0,n.jsx)(r,{className:"h-4 w-24"}),(0,n.jsx)(r,{className:"h-4 w-32"}),(0,n.jsx)(r,{className:"h-4 w-20"}),(0,n.jsx)(r,{className:"h-4 w-16 ml-auto"})]},t))]})}function c(){return(0,n.jsxs)("div",{className:"space-y-6",children:[(0,n.jsx)(r,{className:"h-8 w-48"}),(0,n.jsx)(l,{}),(0,n.jsxs)("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-4",children:[(0,n.jsx)(i,{}),(0,n.jsx)(i,{})]})]})}},67998:(e,t,s)=>{"use strict";s.d(t,{A:()=>n});let n=(0,s(11063).A)("Info",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]])},68498:(e,t,s)=>{"use strict";s.d(t,{A:()=>n});let n=(0,s(11063).A)("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]])},74674:(e,t,s)=>{Promise.resolve().then(s.bind(s,15088))},77311:(e,t,s)=>{"use strict";s.d(t,{i:()=>c});var n=s(88111),a=s(55271),r=s(14874),l=s(82539),i=s(96741);function c(e){let{value:t,className:s}=e,[c,d]=(0,a.useState)(!1),o=(0,a.useCallback)(async()=>{try{await navigator.clipboard.writeText(t),d(!0),setTimeout(()=>d(!1),2e3)}catch(e){}},[t]);return(0,n.jsx)("button",{onClick:o,className:(0,i.cn)("p-1 rounded hover:bg-bg-tertiary text-text-muted hover:text-text-secondary transition-colors",s),title:c?"Copied!":"Copy",children:c?(0,n.jsx)(r.A,{className:"w-3.5 h-3.5 text-success"}):(0,n.jsx)(l.A,{className:"w-3.5 h-3.5"})})}},81174:(e,t,s)=>{"use strict";s.d(t,{A:()=>n});let n=(0,s(11063).A)("ShieldCheck",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]])},82539:(e,t,s)=>{"use strict";s.d(t,{A:()=>n});let n=(0,s(11063).A)("Copy",[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]])},84109:(e,t,s)=>{"use strict";s.d(t,{Ez:()=>n,ZT:()=>r,av:()=>l,cZ:()=>a});let n={completed:{bg:"bg-success-subtle",text:"text-success",dot:"bg-success"},failed:{bg:"bg-danger-subtle",text:"text-danger",dot:"bg-danger"},pending:{bg:"bg-warning-subtle",text:"text-warning",dot:"bg-warning"},timeout:{bg:"bg-danger-subtle",text:"text-danger",dot:"bg-danger"}},a={max_latency_ms:"Max Latency",max_cost_usd:"Max Cost",min_confidence:"Min Confidence",required_fields:"Required Fields",status_must_be:"Status Must Be",output_schema:"Output Schema"},r={pass:{bg:"bg-success-subtle",text:"text-success"},fail:{bg:"bg-danger-subtle",text:"text-danger"},partial:{bg:"bg-warning-subtle",text:"text-warning"}},l=1e4},85605:(e,t,s)=>{"use strict";s.d(t,{W:()=>l});var n=s(88111),a=s(96741),r=s(84109);function l(e){var t;let{status:s,className:l}=e,i=null!=(t=r.Ez[s])?t:{bg:"bg-warning-subtle",text:"text-warning",dot:"bg-warning"};return(0,n.jsxs)("span",{className:(0,a.cn)("inline-flex items-center gap-1.5 px-2 py-0.5 rounded-full text-xs font-medium",i.bg,i.text,l),children:[(0,n.jsx)("span",{className:(0,a.cn)("w-1.5 h-1.5 rounded-full",i.dot)}),s]})}},94745:(e,t,s)=>{"use strict";s.d(t,{A:()=>n});let n=(0,s(11063).A)("TriangleAlert",[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]])},96450:(e,t,s)=>{"use strict";s.d(t,{L:()=>r});var n=s(88111),a=s(96741);function r(e){let{passed:t,total:s,className:r}=e;if(0===s)return(0,n.jsx)("span",{className:"text-text-muted text-xs",children:"—"});let l=t===s;return(0,n.jsxs)("span",{className:(0,a.cn)("inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs font-medium",l?"bg-success-subtle text-success":"bg-danger-subtle text-danger",r),children:[t,"/",s," ",l?"✓":"✗"]})}},96741:(e,t,s)=>{"use strict";s.d(t,{cn:()=>r});var n=s(55242),a=s(13065);function r(){for(var e=arguments.length,t=Array(e),s=0;s<e;s++)t[s]=arguments[s];return(0,a.QP)((0,n.$)(t))}}},e=>{e.O(0,[2702,5388,5935,814,9743,7358],()=>e(e.s=74674)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[5886],{734:(e,t,s)=>{"use strict";s.d(t,{A:()=>a});let a=(0,s(11063).A)("Receipt",[["path",{d:"M4 2v20l2-1 2 1 2-1 2 1 2-1 2 1 2-1 2 1V2l-2 1-2-1-2 1-2-1-2 1-2-1-2 1Z",key:"q3az6g"}],["path",{d:"M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8",key:"1h4pet"}],["path",{d:"M12 17.5v-11",key:"1jc1ny"}]])},1082:(e,t,s)=>{"use strict";s.d(t,{A:()=>a});let a=(0,s(11063).A)("Inbox",[["polyline",{points:"22 12 16 12 14 15 10 15 8 12 2 12",key:"o97t9d"}],["path",{d:"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z",key:"oot6mr"}]])},4627:(e,t,s)=>{"use strict";s.d(t,{b:()=>o});var a=s(88111),n=s(96741),r=s(11063);let i=(0,r.A)("ArrowUp",[["path",{d:"m5 12 7-7 7 7",key:"hav0vg"}],["path",{d:"M12 19V5",key:"x0mq9r"}]]),l=(0,r.A)("ArrowDown",[["path",{d:"M12 5v14",key:"s699le"}],["path",{d:"m19 12-7 7-7-7",key:"1idqje"}]]),c=(0,r.A)("ArrowUpDown",[["path",{d:"m21 16-4 4-4-4",key:"f6ql7i"}],["path",{d:"M17 20V4",key:"1ejh1v"}],["path",{d:"m3 8 4-4 4 4",key:"11wl7u"}],["path",{d:"M7 4v16",key:"1glfcx"}]]);function o(e){let{columns:t,data:s,sortField:r,sortDir:o,onSort:d,onRowClick:u,rowKey:x,className:p}=e;return(0,a.jsx)("div",{className:(0,n.cn)("card overflow-hidden",p),children:(0,a.jsx)("div",{className:"overflow-x-auto",children:(0,a.jsxs)("table",{className:"w-full text-sm",children:[(0,a.jsx)("thead",{children:(0,a.jsx)("tr",{className:"border-b border-border bg-bg-secondary",children:t.map(e=>(0,a.jsx)("th",{className:(0,n.cn)("px-4 py-3 text-left text-xs font-medium text-text-muted uppercase tracking-wider whitespace-nowrap",e.sortable&&"cursor-pointer select-none hover:text-text-secondary",e.className),onClick:e.sortable&&d?()=>d(e.key):void 0,children:(0,a.jsxs)("span",{className:"inline-flex items-center gap-1",children:[e.label,e.sortable&&(r===e.key?"asc"===o?(0,a.jsx)(i,{className:"w-3 h-3"}):(0,a.jsx)(l,{className:"w-3 h-3"}):(0,a.jsx)(c,{className:"w-3 h-3 opacity-30"}))]})},e.key))})}),(0,a.jsx)("tbody",{className:"divide-y divide-border-subtle",children:s.map(e=>(0,a.jsx)("tr",{className:(0,n.cn)("transition-colors",u&&"cursor-pointer hover:bg-bg-secondary"),onClick:u?()=>u(e):void 0,children:t.map(t=>(0,a.jsx)("td",{className:(0,n.cn)("px-4 py-3 whitespace-nowrap",t.className),children:t.render(e)},t.key))},x(e)))})]})})})}},4736:(e,t,s)=>{"use strict";var a=s(11504);s.o(a,"usePathname")&&s.d(t,{usePathname:function(){return a.usePathname}}),s.o(a,"useRouter")&&s.d(t,{useRouter:function(){return a.useRouter}}),s.o(a,"useSearchParams")&&s.d(t,{useSearchParams:function(){return a.useSearchParams}})},6678:(e,t,s)=>{"use strict";s.d(t,{p:()=>i});var a=s(95388),n=s(23176),r=s(89654);function i(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{refreshInterval:t}=(0,r.c)(),s="receipts".concat((0,n.Go)(e));return(0,a.Ay)(s,()=>(0,n.qb)(e),{refreshInterval:t,revalidateOnFocus:!0})}},19593:(e,t,s)=>{"use strict";s.d(t,{d:()=>l});var a=s(88111),n=s(30417),r=s(28826),i=s(96741);function l(e){let{page:t,totalPages:s,onPageChange:l,className:c}=e;if(s<=1)return null;let o=[];if(s<=7)for(let e=1;e<=s;e++)o.push(e);else{o.push(1),t>3&&o.push("ellipsis");for(let e=Math.max(2,t-1);e<=Math.min(s-1,t+1);e++)o.push(e);t<s-2&&o.push("ellipsis"),o.push(s)}return(0,a.jsxs)("div",{className:(0,i.cn)("flex items-center justify-center gap-1",c),children:[(0,a.jsx)("button",{onClick:()=>l(t-1),disabled:t<=1,className:"p-2 rounded-md text-text-muted hover:bg-bg-tertiary disabled:opacity-30 disabled:cursor-not-allowed transition-colors",children:(0,a.jsx)(n.A,{className:"w-4 h-4"})}),o.map((e,s)=>"ellipsis"===e?(0,a.jsx)("span",{className:"px-2 text-text-muted",children:"..."},"e".concat(s)):(0,a.jsx)("button",{onClick:()=>l(e),className:(0,i.cn)("px-3 py-1 rounded-md text-sm transition-colors",e===t?"bg-primary text-white font-medium":"text-text-secondary hover:bg-bg-tertiary"),children:e},e)),(0,a.jsx)("button",{onClick:()=>l(t+1),disabled:t>=s,className:"p-2 rounded-md text-text-muted hover:bg-bg-tertiary disabled:opacity-30 disabled:cursor-not-allowed transition-colors",children:(0,a.jsx)(r.A,{className:"w-4 h-4"})})]})}},23176:(e,t,s)=>{"use strict";async function a(e,t){let s=await fetch(e,t);if(!s.ok){let e=await s.text().catch(()=>"Unknown error");throw Error("API error ".concat(s.status,": ").concat(e))}return s.json()}function n(e){let t=new URLSearchParams;for(let[s,a]of Object.entries(e))void 0!==a&&""!==a&&t.set(s,String(a));let s=t.toString();return s?"?".concat(s):""}async function r(){return a("/api/stats")}async function i(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return a("/api/receipts".concat(n(e)))}async function l(e){return a("/api/receipts/".concat(e))}async function c(e){return a("/api/chains/".concat(e))}async function o(){return a("/api/agents")}async function d(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return a("/api/judgments".concat(n(e)))}async function u(e,t){return a("/api/verify",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({receipt:e,public_key:t})})}async function x(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return a("/api/cleanup",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dry_run:e})})}async function p(){return a("/api/config")}async function m(e){return a("/api/config",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)})}async function h(e){return a("/api/search".concat(n({q:e})))}async function g(e){return a("/api/invoices",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)})}s.d(t,{$Q:()=>h,Dz:()=>p,Go:()=>n,Jq:()=>g,Kt:()=>x,Lx:()=>l,MJ:()=>d,YK:()=>r,_R:()=>m,o3:()=>u,oN:()=>c,pQ:()=>o,qb:()=>i})},28826:(e,t,s)=>{"use strict";s.d(t,{A:()=>a});let a=(0,s(11063).A)("ChevronRight",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]])},30417:(e,t,s)=>{"use strict";s.d(t,{A:()=>a});let a=(0,s(11063).A)("ChevronLeft",[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]])},37326:(e,t,s)=>{"use strict";s.d(t,{A:()=>a});let a=(0,s(11063).A)("RefreshCw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]])},44632:(e,t,s)=>{"use strict";s.d(t,{p:()=>i});var a=s(88111),n=s(96741),r=s(1082);function i(e){let{icon:t=r.A,title:s,description:i,action:l,className:c}=e;return(0,a.jsxs)("div",{className:(0,n.cn)("flex flex-col items-center justify-center py-16 text-center",c),children:[(0,a.jsx)(t,{className:"w-12 h-12 text-text-muted mb-4"}),(0,a.jsx)("h3",{className:"text-sm font-medium text-text-primary mb-1",children:s}),i&&(0,a.jsx)("p",{className:"text-sm text-text-muted max-w-sm",children:i}),l&&(0,a.jsx)("div",{className:"mt-4",children:l})]})}},46233:(e,t,s)=>{"use strict";s.d(t,{W:()=>i});var a=s(88111),n=s(94745),r=s(96741);function i(e){let{message:t="Something went wrong",onRetry:s,className:i}=e;return(0,a.jsxs)("div",{className:(0,r.cn)("flex flex-col items-center justify-center py-16 text-center",i),children:[(0,a.jsx)(n.A,{className:"w-12 h-12 text-danger mb-4"}),(0,a.jsx)("h3",{className:"text-sm font-medium text-text-primary mb-1",children:"Error"}),(0,a.jsx)("p",{className:"text-sm text-text-muted max-w-sm mb-4",children:t}),s&&(0,a.jsx)("button",{onClick:s,className:"px-4 py-2 text-sm font-medium bg-primary text-white rounded-md hover:bg-primary-hover transition-colors",children:"Retry"})]})}},47126:(e,t,s)=>{"use strict";s.d(t,{f:()=>i});var a=s(88111),n=s(62455),r=s(96741);function i(e){let{date:t,className:s}=e;return(0,a.jsx)("time",{dateTime:t,title:(0,n.Yq)(t),className:(0,r.cn)("text-text-secondary",s),children:(0,n.fF)(t)})}},58904:(e,t,s)=>{Promise.resolve().then(s.bind(s,98177))},59434:(e,t,s)=>{"use strict";s.d(t,{A:()=>a});let a=(0,s(11063).A)("Download",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"7 10 12 15 17 10",key:"2ggqvy"}],["line",{x1:"12",x2:"12",y1:"15",y2:"3",key:"1vk2je"}]])},62455:(e,t,s)=>{"use strict";function a(e){let t="string"==typeof e?new Date(e):e,s=new Date().getTime()-t.getTime();if(s<0)return"just now";let a=Math.floor(s/1e3);if(a<60)return"".concat(a,"s ago");let n=Math.floor(a/60);if(n<60)return"".concat(n," min ago");let r=Math.floor(n/60);if(r<24)return"".concat(r," hr ago");let i=Math.floor(r/24);if(i<30)return"".concat(i,"d ago");let l=Math.floor(i/30);return"".concat(l,"mo ago")}function n(e){if(null==e)return"—";if(e<1e3)return"".concat(e,"ms");let t=e/1e3;if(t<60)return"".concat(t.toFixed(1),"s");if(t<3600)return"".concat(Math.floor(t/60),"m ").concat(Math.round(t%60),"s");if(t<86400){let e=Math.floor(t/3600),s=Math.floor(t%3600/60);return"".concat(e,"h ").concat(s,"m")}let s=Math.floor(t/86400),a=Math.floor(t%86400/3600);return"".concat(s,"d ").concat(a,"h")}function r(e){return null==e?"—":0===e?"$0.00":e<.01?"$".concat(e.toFixed(4)):"$".concat(e.toFixed(2))}function i(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:12;return e.length<=t?e:"".concat(e.slice(0,t),"...")}function l(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:16;return e.length<=t?e:"".concat(e.slice(0,t),"...")}function c(e){return e.toLocaleString("en-US")}function o(e){return"".concat((100*e).toFixed(1),"%")}function d(e){return("string"==typeof e?new Date(e):e).toLocaleString("en-US",{month:"short",day:"numeric",year:"numeric",hour:"2-digit",minute:"2-digit",second:"2-digit"})}s.d(t,{Ct:()=>i,Yq:()=>d,ZV:()=>c,a3:()=>n,fF:()=>a,l9:()=>o,lV:()=>l,vv:()=>r})},66187:(e,t,s)=>{"use strict";s.d(t,{AV:()=>c,Eg:()=>i,F6:()=>l,O0:()=>r});var a=s(88111),n=s(96741);function r(e){let{className:t}=e;return(0,a.jsx)("div",{className:(0,n.cn)("animate-pulse bg-bg-tertiary rounded",t)})}function i(e){let{count:t=6}=e;return(0,a.jsx)("div",{className:"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-4",children:Array.from({length:t}).map((e,t)=>(0,a.jsxs)("div",{className:"card p-4",children:[(0,a.jsx)(r,{className:"h-3 w-16 mb-3"}),(0,a.jsx)(r,{className:"h-7 w-20"})]},t))})}function l(e){let{rows:t=5}=e;return(0,a.jsxs)("div",{className:"card overflow-hidden",children:[(0,a.jsx)("div",{className:"border-b border-border p-3",children:(0,a.jsx)(r,{className:"h-4 w-48"})}),Array.from({length:t}).map((e,t)=>(0,a.jsxs)("div",{className:"flex items-center gap-4 p-3 border-b border-border-subtle last:border-0",children:[(0,a.jsx)(r,{className:"h-4 w-24"}),(0,a.jsx)(r,{className:"h-4 w-32"}),(0,a.jsx)(r,{className:"h-4 w-20"}),(0,a.jsx)(r,{className:"h-4 w-16 ml-auto"})]},t))]})}function c(){return(0,a.jsxs)("div",{className:"space-y-6",children:[(0,a.jsx)(r,{className:"h-8 w-48"}),(0,a.jsx)(i,{}),(0,a.jsxs)("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-4",children:[(0,a.jsx)(l,{}),(0,a.jsx)(l,{})]})]})}},68498:(e,t,s)=>{"use strict";s.d(t,{A:()=>a});let a=(0,s(11063).A)("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]])},84109:(e,t,s)=>{"use strict";s.d(t,{Ez:()=>a,ZT:()=>r,av:()=>i,cZ:()=>n});let a={completed:{bg:"bg-success-subtle",text:"text-success",dot:"bg-success"},failed:{bg:"bg-danger-subtle",text:"text-danger",dot:"bg-danger"},pending:{bg:"bg-warning-subtle",text:"text-warning",dot:"bg-warning"},timeout:{bg:"bg-danger-subtle",text:"text-danger",dot:"bg-danger"}},n={max_latency_ms:"Max Latency",max_cost_usd:"Max Cost",min_confidence:"Min Confidence",required_fields:"Required Fields",status_must_be:"Status Must Be",output_schema:"Output Schema"},r={pass:{bg:"bg-success-subtle",text:"text-success"},fail:{bg:"bg-danger-subtle",text:"text-danger"},partial:{bg:"bg-warning-subtle",text:"text-warning"}},i=1e4},85605:(e,t,s)=>{"use strict";s.d(t,{W:()=>i});var a=s(88111),n=s(96741),r=s(84109);function i(e){var t;let{status:s,className:i}=e,l=null!=(t=r.Ez[s])?t:{bg:"bg-warning-subtle",text:"text-warning",dot:"bg-warning"};return(0,a.jsxs)("span",{className:(0,n.cn)("inline-flex items-center gap-1.5 px-2 py-0.5 rounded-full text-xs font-medium",l.bg,l.text,i),children:[(0,a.jsx)("span",{className:(0,n.cn)("w-1.5 h-1.5 rounded-full",l.dot)}),s]})}},89654:(e,t,s)=>{"use strict";s.d(t,{c:()=>l});var a=s(55271),n=s(84109);let r="agent-receipts-auto-refresh",i="agent-receipts-refresh-interval";function l(){let[e,t]=(0,a.useState)(!0),[s,l]=(0,a.useState)(n.av);return(0,a.useEffect)(()=>{let e=function(){try{var e;let t="false"!==localStorage.getItem(r),s=parseInt(null!=(e=localStorage.getItem(i))?e:"",10);return{enabled:t,interval:isNaN(s)?n.av:s}}catch(e){return{enabled:!0,interval:n.av}}}();t(e.enabled),l(e.interval)},[]),{enabled:e,interval:s,toggle:(0,a.useCallback)(()=>{t(e=>{let t=!e;try{localStorage.setItem(r,String(t))}catch(e){}return t})},[]),setInterval:(0,a.useCallback)(e=>{l(e);try{localStorage.setItem(i,String(e))}catch(e){}},[]),refreshInterval:e?s:0}}},94745:(e,t,s)=>{"use strict";s.d(t,{A:()=>a});let a=(0,s(11063).A)("TriangleAlert",[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]])},96450:(e,t,s)=>{"use strict";s.d(t,{L:()=>r});var a=s(88111),n=s(96741);function r(e){let{passed:t,total:s,className:r}=e;if(0===s)return(0,a.jsx)("span",{className:"text-text-muted text-xs",children:"—"});let i=t===s;return(0,a.jsxs)("span",{className:(0,n.cn)("inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs font-medium",i?"bg-success-subtle text-success":"bg-danger-subtle text-danger",r),children:[t,"/",s," ",i?"✓":"✗"]})}},96741:(e,t,s)=>{"use strict";s.d(t,{cn:()=>r});var a=s(55242),n=s(13065);function r(){for(var e=arguments.length,t=Array(e),s=0;s<e;s++)t[s]=arguments[s];return(0,n.QP)((0,a.$)(t))}},98177:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>w});var a=s(88111),n=s(4736),r=s(55271),i=s(6678),l=s(4627),c=s(19593),o=s(85605),d=s(96450),u=s(47126),x=s(44632),p=s(46233),m=s(66187),h=s(62455),g=s(68498),b=s(59434),y=s(37326),f=s(734),v=s(55935),j=s.n(v);function N(){var e,t,s,v,N,w,k,A,C,_,S,M,P,R,O,T;let L=(0,n.useSearchParams)(),q=(0,n.useRouter)(),[F,I]=(0,r.useState)(null!=(e=L.get("search"))?e:""),D={page:parseInt(null!=(t=L.get("page"))?t:"1",10),limit:parseInt(null!=(s=L.get("limit"))?s:"50",10),sort:null!=(v=L.get("sort"))?v:"timestamp:desc",agent_id:null!=(N=L.get("agent_id"))?N:void 0,action:null!=(w=L.get("action"))?w:void 0,status:null!=(k=L.get("status"))?k:void 0,constraint_passed:null!=(A=L.get("constraint_passed"))?A:void 0,receipt_type:null!=(C=L.get("receipt_type"))?C:void 0,environment:null!=(_=L.get("environment"))?_:void 0,search:null!=(S=L.get("search"))?S:void 0},{data:E,error:U,isLoading:J,mutate:z}=(0,i.p)(D),V=(0,r.useCallback)(e=>{let t=new URLSearchParams(L.toString());for(let[s,a]of Object.entries(e))a?t.set(s,a):t.delete(s);e.page||t.set("page","1"),q.push("/receipts?".concat(t.toString()))},[L,q]),K=(0,r.useCallback)(()=>{V({search:F||void 0})},[F,V]),$=(0,r.useCallback)(e=>{var t;let[s,a]=(null!=(t=L.get("sort"))?t:"timestamp:desc").split(":");V({sort:"".concat(e,":").concat(s===e&&"desc"===a?"asc":"desc")})},[L,V]),H=(0,r.useCallback)(()=>{q.push("/receipts"),I("")},[q]),W=L.get("agent_id")||L.get("action")||L.get("status")||L.get("constraint_passed")||L.get("receipt_type")||L.get("environment")||L.get("search"),[Z,Q]=(null!=(M=L.get("sort"))?M:"timestamp:desc").split(":"),Y=[{key:"timestamp",label:"Time",sortable:!0,render:e=>(0,a.jsx)(u.f,{date:e.timestamp,className:"text-xs"})},{key:"receipt_id",label:"Receipt ID",render:e=>(0,a.jsx)("code",{className:"font-mono text-xs text-primary",children:(0,h.Ct)(e.receipt_id)})},{key:"agent_id",label:"Agent",sortable:!0,render:e=>(0,a.jsx)(j(),{href:"/agents/".concat(e.agent_id),className:"text-xs text-text-secondary hover:text-primary",onClick:e=>e.stopPropagation(),children:e.agent_id})},{key:"action",label:"Action",sortable:!0,render:e=>(0,a.jsx)("span",{className:"text-sm",children:e.action})},{key:"status",label:"Status",sortable:!0,render:e=>(0,a.jsx)(o.W,{status:e.status})},{key:"constraints",label:"Constraints",render:e=>{let t=e.constraint_result;if(!t||!Array.isArray(t.results))return(0,a.jsx)("span",{className:"text-text-muted text-xs",children:"—"});let s=t.results.filter(e=>e.passed).length;return(0,a.jsx)(d.L,{passed:s,total:t.results.length})}},{key:"latency_ms",label:"Latency",sortable:!0,render:e=>(0,a.jsx)("span",{className:"text-xs text-text-secondary",children:(0,h.a3)(e.latency_ms)})},{key:"cost_usd",label:"Cost",sortable:!0,render:e=>(0,a.jsx)("span",{className:"text-xs text-text-secondary",children:(0,h.vv)(e.cost_usd)})},{key:"chain_id",label:"Chain",render:e=>e.chain_id?(0,a.jsx)(j(),{href:"/chains/".concat(e.chain_id),className:"font-mono text-xs text-primary hover:underline",onClick:e=>e.stopPropagation(),children:(0,h.Ct)(e.chain_id,10)}):(0,a.jsx)("span",{className:"text-text-muted text-xs",children:"—"})}],B=(0,r.useCallback)(()=>{if(!E)return;let e=new Blob([JSON.stringify(E.data,null,2)],{type:"application/json"}),t=URL.createObjectURL(e),s=document.createElement("a");s.href=t,s.download="receipts-".concat(new Date().toISOString().slice(0,10),".json"),s.click(),URL.revokeObjectURL(t)},[E]);return(0,a.jsxs)("div",{className:"space-y-4",children:[(0,a.jsx)("div",{className:"flex items-center justify-between",children:(0,a.jsx)("h1",{className:"text-lg font-semibold text-text-primary",children:"Receipts"})}),(0,a.jsx)("div",{className:"card p-4 space-y-3",children:(0,a.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,a.jsxs)("select",{value:null!=(P=L.get("status"))?P:"",onChange:e=>V({status:e.target.value||void 0}),className:"px-3 py-1.5 text-sm border border-border rounded-md bg-bg-primary text-text-primary",children:[(0,a.jsx)("option",{value:"",children:"All Status"}),(0,a.jsx)("option",{value:"completed",children:"Completed"}),(0,a.jsx)("option",{value:"failed",children:"Failed"}),(0,a.jsx)("option",{value:"pending",children:"Pending"}),(0,a.jsx)("option",{value:"timeout",children:"Timeout"})]}),(0,a.jsxs)("select",{value:null!=(R=L.get("constraint_passed"))?R:"",onChange:e=>V({constraint_passed:e.target.value||void 0}),className:"px-3 py-1.5 text-sm border border-border rounded-md bg-bg-primary text-text-primary",children:[(0,a.jsx)("option",{value:"",children:"All Constraints"}),(0,a.jsx)("option",{value:"true",children:"Passed"}),(0,a.jsx)("option",{value:"false",children:"Failed"})]}),(0,a.jsxs)("select",{value:null!=(O=L.get("receipt_type"))?O:"",onChange:e=>V({receipt_type:e.target.value||void 0}),className:"px-3 py-1.5 text-sm border border-border rounded-md bg-bg-primary text-text-primary",children:[(0,a.jsx)("option",{value:"",children:"All Types"}),(0,a.jsx)("option",{value:"action",children:"Action"}),(0,a.jsx)("option",{value:"judgment",children:"Judgment"}),(0,a.jsx)("option",{value:"arbitration",children:"Arbitration"})]}),(0,a.jsxs)("select",{value:null!=(T=L.get("environment"))?T:"",onChange:e=>V({environment:e.target.value||void 0}),className:"px-3 py-1.5 text-sm border border-border rounded-md bg-bg-primary text-text-primary",children:[(0,a.jsx)("option",{value:"",children:"All Environments"}),(0,a.jsx)("option",{value:"development",children:"Development"}),(0,a.jsx)("option",{value:"production",children:"Production"}),(0,a.jsx)("option",{value:"staging",children:"Staging"}),(0,a.jsx)("option",{value:"test",children:"Test"})]}),(0,a.jsx)("div",{className:"flex-1 flex items-center gap-2 min-w-[200px]",children:(0,a.jsx)("input",{type:"text",placeholder:"Search...",value:F,onChange:e=>I(e.target.value),onKeyDown:e=>"Enter"===e.key&&K(),className:"flex-1 px-3 py-1.5 text-sm border border-border rounded-md bg-bg-primary text-text-primary placeholder:text-text-muted"})}),W&&(0,a.jsxs)("button",{onClick:H,className:"flex items-center gap-1 px-3 py-1.5 text-xs text-text-muted hover:text-text-secondary transition-colors",children:[(0,a.jsx)(g.A,{className:"w-3 h-3"})," Clear"]})]})}),E&&(0,a.jsxs)("div",{className:"flex items-center justify-between text-sm",children:[(0,a.jsxs)("span",{className:"text-text-muted",children:["Showing ",(E.pagination.page-1)*E.pagination.limit+1,"–",Math.min(E.pagination.page*E.pagination.limit,E.pagination.total)," of ",E.pagination.total," receipts"]}),(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsxs)("button",{onClick:B,className:"flex items-center gap-1 px-3 py-1.5 text-xs border border-border rounded-md text-text-secondary hover:bg-bg-secondary transition-colors",children:[(0,a.jsx)(b.A,{className:"w-3 h-3"})," Export"]}),(0,a.jsxs)("button",{onClick:()=>z(),className:"flex items-center gap-1 px-3 py-1.5 text-xs border border-border rounded-md text-text-secondary hover:bg-bg-secondary transition-colors",children:[(0,a.jsx)(y.A,{className:"w-3 h-3"})," Refresh"]})]})]}),U?(0,a.jsx)(p.W,{message:U.message,onRetry:()=>z()}):J?(0,a.jsx)(m.F6,{rows:10}):E&&0!==E.data.length?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(l.b,{columns:Y,data:E.data,sortField:Z,sortDir:Q,onSort:$,onRowClick:e=>q.push("/receipts/".concat(e.receipt_id)),rowKey:e=>e.receipt_id}),(0,a.jsx)(c.d,{page:E.pagination.page,totalPages:E.pagination.total_pages,onPageChange:e=>V({page:String(e)})})]}):(0,a.jsx)(x.p,{icon:f.A,title:"No receipts found",description:W?"Try adjusting your filters":"Create receipts using the MCP server, SDK, or CLI"})]})}function w(){return(0,a.jsx)(r.Suspense,{fallback:(0,a.jsx)(m.F6,{rows:10}),children:(0,a.jsx)(N,{})})}}},e=>{e.O(0,[2702,5388,5935,814,9743,7358],()=>e(e.s=58904)),_N_E=e.O()}]);
|