@hongmaple0820/scale-engine 0.50.1 → 0.50.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.
Files changed (50) hide show
  1. package/README.en.md +2 -2
  2. package/README.md +2 -2
  3. package/dist/api/http.js +3 -1
  4. package/dist/api/http.js.map +1 -1
  5. package/dist/cli/cortexCommands.d.ts +16 -0
  6. package/dist/cli/cortexCommands.js +47 -4
  7. package/dist/cli/cortexCommands.js.map +1 -1
  8. package/dist/cortex/InstinctStore.d.ts +13 -1
  9. package/dist/cortex/InstinctStore.js +90 -11
  10. package/dist/cortex/InstinctStore.js.map +1 -1
  11. package/dist/cortex/SessionInjector.js +39 -2
  12. package/dist/cortex/SessionInjector.js.map +1 -1
  13. package/dist/dashboard/DashboardServer.d.ts +158 -0
  14. package/dist/dashboard/DashboardServer.js +753 -13
  15. package/dist/dashboard/DashboardServer.js.map +1 -1
  16. package/dist/dashboard/spa/assets/index-VYBCLBje.js +11 -0
  17. package/dist/dashboard/spa/assets/index-VhwY_ac1.css +1 -0
  18. package/dist/dashboard/spa/assets/naive-ui-BQy2AJkt.js +3340 -0
  19. package/dist/dashboard/spa/assets/vendor-BPU6aOYA.js +3 -0
  20. package/dist/dashboard/spa/assets/vue-CQQMb5Wi.js +17 -0
  21. package/dist/dashboard/spa/index.html +15 -462
  22. package/dist/memory/MemoryFabric.d.ts +13 -1
  23. package/dist/memory/MemoryFabric.js +60 -0
  24. package/dist/memory/MemoryFabric.js.map +1 -1
  25. package/dist/version.d.ts +1 -1
  26. package/dist/version.js +1 -1
  27. package/docs/workflow/ASSESSMENT_INDEX.md +326 -0
  28. package/docs/workflow/COMPARATIVE_ANALYSIS.md +422 -0
  29. package/docs/workflow/EXECUTIVE_SUMMARY.md +310 -0
  30. package/docs/workflow/IMPROVEMENT_CHECKLIST.md +518 -0
  31. package/docs/workflow/IMPROVEMENT_ROADMAP.md +707 -0
  32. package/docs/workflow/README.md +8 -0
  33. package/package.json +6 -2
  34. package/dist/dashboard/spa/app.js +0 -515
  35. package/dist/dashboard/spa/components/DataTable.js +0 -53
  36. package/dist/dashboard/spa/components/EventStream.js +0 -66
  37. package/dist/dashboard/spa/components/LoadingState.js +0 -39
  38. package/dist/dashboard/spa/components/MetricCard.js +0 -30
  39. package/dist/dashboard/spa/components/Panel.js +0 -27
  40. package/dist/dashboard/spa/components/StatusBadge.js +0 -51
  41. package/dist/dashboard/spa/i18n.js +0 -767
  42. package/dist/dashboard/spa/pages/costs.js +0 -522
  43. package/dist/dashboard/spa/pages/documents.js +0 -540
  44. package/dist/dashboard/spa/pages/knowledge.js +0 -457
  45. package/dist/dashboard/spa/pages/monitoring.js +0 -361
  46. package/dist/dashboard/spa/pages/overview.js +0 -301
  47. package/dist/dashboard/spa/pages/topology-renderers.js +0 -251
  48. package/dist/dashboard/spa/pages/topology.js +0 -370
  49. package/dist/dashboard/spa/pages/workflow-renderers.js +0 -239
  50. package/dist/dashboard/spa/pages/workflow.js +0 -217
@@ -1,767 +0,0 @@
1
- /**
2
- * SCALE Engine Dashboard — i18n Module
3
- * Supports Chinese (zh) and English (en)
4
- */
5
- ;(() => {
6
- 'use strict'
7
-
8
- const STORAGE_KEY = 'scale-lang'
9
-
10
- const translations = {
11
- en: {
12
- // Sidebar
13
- 'nav.dashboard': 'Dashboard',
14
- 'nav.overview': 'Overview',
15
- 'nav.workflow': 'Workflow',
16
- 'nav.topology': 'Topology',
17
- 'nav.operations': 'Operations',
18
- 'nav.monitoring': 'Monitoring',
19
- 'nav.costs': 'Costs',
20
- 'nav.content': 'Content',
21
- 'nav.documents': 'Documents',
22
- 'nav.knowledge': 'Knowledge',
23
-
24
- // Header
25
- 'header.search': 'Search...',
26
-
27
- // SSE
28
- 'sse.live': 'Live',
29
- 'sse.disconnected': 'Disconnected',
30
- 'sse.reconnecting': 'Reconnecting...',
31
-
32
- // Common
33
- 'common.loading': 'Loading...',
34
- 'common.noData': 'No data',
35
- 'common.refresh': 'Refresh',
36
- 'common.export': 'Export',
37
- 'common.copy': 'Copy',
38
- 'common.copied': 'Copied!',
39
- 'common.download': 'Download',
40
- 'common.newTab': 'New Tab',
41
- 'common.all': 'All',
42
- 'common.none': 'None',
43
- 'common.filter': 'Filter',
44
- 'common.search': 'Search',
45
- 'common.close': 'Close',
46
- 'common.yes': 'Yes',
47
- 'common.no': 'No',
48
- 'common.failed': 'Failed',
49
- 'common.failedCount': '{count} failed',
50
- 'common.score': 'score',
51
- 'common.confidence': 'confidence',
52
- 'common.copyJson': 'Copy JSON',
53
- 'common.exportJson': 'Export JSON',
54
- 'common.lastLoaded': 'Last loaded',
55
- 'common.snapshot': 'Snapshot',
56
- 'common.realtime': 'Realtime',
57
- 'common.mixedRefresh': 'Mixed refresh',
58
- 'common.manualRefreshHint': 'This data is loaded on page open or Refresh.',
59
- 'common.liveStreamHint': 'Live events update through the dashboard stream.',
60
- 'common.autoRefresh': 'Auto refresh',
61
- 'common.autoRefreshHint': 'Poll this page every 30 seconds while it is open.',
62
- 'common.autoRefreshOn': 'on, every 30s',
63
- 'common.autoRefreshOff': 'off',
64
- 'common.refreshing': 'Refreshing...',
65
- 'common.lastAutoRefresh': 'Auto refreshed',
66
-
67
- // Overview
68
- 'overview.title': 'Overview',
69
- 'overview.totalArtifacts': 'Total Artifacts',
70
- 'overview.pendingReviews': 'Pending Reviews',
71
- 'overview.activeGates': 'Active Gates',
72
- 'overview.defects': 'Defects',
73
- 'overview.artifactDistribution': 'Artifact Distribution',
74
- 'overview.gateStatus': 'Gate Status',
75
- 'overview.recentEvents': 'Recent Events',
76
- 'overview.pendingActions': 'Pending Actions',
77
- 'overview.projects': 'Projects',
78
- 'overview.noEvents': 'No recent events',
79
- 'overview.noActions': 'No pending actions',
80
- 'overview.noArtifacts': 'No artifacts',
81
- 'overview.noGateData': 'No gate data',
82
- 'overview.colArtifact': 'Artifact',
83
- 'overview.colProject': 'Project',
84
- 'overview.colHealth': 'Health',
85
- 'overview.colDocuments': 'Documents',
86
- 'overview.colMemory': 'Memory',
87
- 'overview.colCommands': 'Commands',
88
- 'overview.colGateFailures': 'Gate Failures',
89
- 'overview.colTime': 'Time',
90
- 'overview.currentProject': 'current',
91
- 'overview.refreshSnapshot': 'Refresh snapshot',
92
- 'overview.dataHint': 'Cards, charts, and project rows are snapshots; recent events can also arrive through the live stream.',
93
-
94
- // Runtime labels
95
- 'runtime.health.ready': 'Ready',
96
- 'runtime.health.warning': 'Warning',
97
- 'runtime.health.missing': 'Missing',
98
- 'runtime.health.ok': 'OK',
99
- 'runtime.health.critical': 'Critical',
100
- 'runtime.status.draft': 'Draft',
101
- 'runtime.status.reviewing': 'Reviewing',
102
- 'runtime.status.frozen': 'Frozen',
103
- 'runtime.status.completed': 'Completed',
104
- 'runtime.status.blocked': 'Blocked',
105
- 'runtime.status.in-progress': 'In Progress',
106
- 'runtime.status.done': 'Done',
107
- 'runtime.status.proposed': 'Proposed',
108
- 'runtime.status.approved': 'Approved',
109
- 'runtime.status.rejected': 'Rejected',
110
- 'runtime.status.active': 'Active',
111
- 'runtime.status.archived': 'Archived',
112
- 'runtime.status.passed': 'Passed',
113
- 'runtime.status.failed': 'Failed',
114
- 'runtime.status.pending': 'Pending',
115
- 'runtime.status.skipped': 'Skipped',
116
- 'runtime.severity.low': 'Low',
117
- 'runtime.severity.medium': 'Medium',
118
- 'runtime.severity.high': 'High',
119
- 'runtime.severity.critical': 'Critical',
120
- 'runtime.action.submit-for-review': 'Submit',
121
- 'runtime.action.approve': 'Approve',
122
- 'runtime.action.reject': 'Reject',
123
- 'runtime.action.complete': 'Complete',
124
- 'runtime.action.freeze': 'Freeze',
125
- 'runtime.action.unfreeze': 'Unfreeze',
126
- 'runtime.action.reopen': 'Reopen',
127
- 'runtime.action.archive': 'Archive',
128
-
129
- // Workflow
130
- 'workflow.title': 'Workflow',
131
- 'workflow.filters': 'Filters',
132
- 'workflow.status': 'Status',
133
- 'workflow.type': 'Type',
134
- 'workflow.table': 'Table',
135
- 'workflow.cards': 'Cards',
136
- 'workflow.dependencyGraph': 'Dependency Graph',
137
- 'workflow.gateAnalysis': 'Gate Analysis',
138
- 'workflow.artifacts': 'Artifacts',
139
- 'workflow.gates': 'Gates',
140
- 'workflow.noArtifacts': 'No artifacts found',
141
- 'workflow.noArtifactMatch': 'No artifacts match filters',
142
- 'workflow.artifactCount': '{count} artifact(s)',
143
- 'workflow.childArtifacts': '{count} child artifact(s)',
144
- 'workflow.artifactDependencyGraph': 'Artifact Dependency Graph',
145
- 'workflow.colTitle': 'Title',
146
- 'workflow.colType': 'Type',
147
- 'workflow.colStatus': 'Status',
148
- 'workflow.colVersion': 'Version',
149
- 'workflow.colGates': 'Gates',
150
- 'workflow.colCreated': 'Created',
151
- 'workflow.colActions': 'Actions',
152
- 'workflow.gatePassRate': 'Gate Pass Rate',
153
- 'workflow.typeDistribution': 'Type Distribution',
154
- 'workflow.statusDistribution': 'Status Distribution',
155
- 'workflow.gateFailuresByName': 'Gate Failures by Name',
156
- 'workflow.transitionFailed': 'Transition failed: {error}',
157
- 'workflow.error': 'Error: {message}',
158
- 'workflow.confirmTransition': 'Confirm {action}?',
159
-
160
- // Topology
161
- 'topology.title': 'Topology',
162
- 'topology.layers': 'Layers',
163
- 'topology.kinds': 'Kinds',
164
- 'topology.domains': 'Domains',
165
- 'topology.exportPNG': 'Export PNG',
166
- 'topology.exportJSON': 'Export JSON',
167
- 'topology.fitView': 'Fit View',
168
- 'topology.dagLayout': 'DAG Layout',
169
- 'topology.noData': 'No topology data available',
170
- 'topology.nodes': 'Nodes',
171
- 'topology.edges': 'Edges',
172
- 'topology.searchNodes': 'Search nodes...',
173
- 'topology.degree': 'Degree',
174
- 'topology.force': 'Force',
175
- 'topology.tree': 'Tree',
176
- 'topology.circle': 'Circle',
177
- 'topology.concentric': 'Concentric',
178
- 'topology.dag': 'DAG',
179
- 'topology.layerNodeStats': '({layers} layers, {nodes} nodes)',
180
- 'topology.noDomains': 'No domains detected',
181
- 'topology.detectedFlows': 'DETECTED FLOWS',
182
- 'topology.moreNodes': '... +{count} more',
183
- 'topology.nodeDetails': 'Node Details',
184
- 'topology.clickNodeHint': 'Click a node to inspect',
185
- 'topology.layer': 'Layer:',
186
- 'topology.file': 'File:',
187
- 'topology.line': 'Line:',
188
- 'topology.signature': 'Signature:',
189
- 'topology.domain': 'Domain:',
190
- 'topology.calledBy': 'Called by ({count}):',
191
- 'topology.calls': 'Calls ({count}):',
192
- 'topology.tour': 'Tour',
193
-
194
- // Monitoring
195
- 'monitoring.title': 'Monitoring',
196
- 'monitoring.activeDetectors': 'Active Detectors',
197
- 'monitoring.autoDefects': 'Auto-Defects',
198
- 'monitoring.commandRuns': 'Command Runs (7d)',
199
- 'monitoring.commandPassRate': 'Command Pass Rate',
200
- 'monitoring.recentEvents': 'Recent Events',
201
- 'monitoring.overview': 'Overview',
202
- 'monitoring.detectors': 'Detectors',
203
- 'monitoring.defects': 'Defects',
204
- 'monitoring.commands': 'Commands',
205
- 'monitoring.defectsByRootCause': 'Defects by Root Cause',
206
- 'monitoring.defectsBySeverity': 'Defects by Severity',
207
- 'monitoring.commandStatus': 'Command Status',
208
- 'monitoring.detectorPerformance': 'Detector Performance',
209
- 'monitoring.triggerDistribution': 'Trigger Distribution',
210
- 'monitoring.recentAutoDefects': 'Recent Auto-Defects',
211
- 'monitoring.totalRuns': 'Total Runs',
212
- 'monitoring.passed': 'Passed',
213
- 'monitoring.failed': 'Failed',
214
- 'monitoring.tokenSavings': 'Token Savings',
215
- 'monitoring.tokenBreakdown': 'Token Breakdown',
216
- 'monitoring.passFailRatio': 'Pass/Fail Ratio',
217
- 'monitoring.noDetectorData': 'No detector data available',
218
- 'monitoring.noDefectData': 'No defect data',
219
- 'monitoring.noCommandData': 'No command data',
220
- 'monitoring.noAutoDefects': 'No auto-defects recorded',
221
- 'monitoring.health': 'Health',
222
- 'monitoring.compressed': 'Compressed',
223
- 'monitoring.saved': 'Saved',
224
- 'monitoring.artifactPrefix': 'artifact: {id}',
225
-
226
- // Costs
227
- 'costs.title': 'Costs',
228
- 'costs.totalTokens': 'Total Tokens',
229
- 'costs.rawEstTokens': 'Raw Est. Tokens',
230
- 'costs.tokensSaved': 'Tokens Saved',
231
- 'costs.compressionRate': 'Compression Rate',
232
- 'costs.estCost': 'Est. Cost (USD)',
233
- 'costs.overview': 'Overview',
234
- 'costs.modelComparison': 'Model Comparison',
235
- 'costs.optimization': 'Optimization',
236
- 'costs.tokenUsage': 'Token Usage',
237
- 'costs.compressionEfficiency': 'Compression Efficiency',
238
- 'costs.tokenWaterfall': 'Token Waterfall',
239
- 'costs.costBreakdownByModel': 'Cost Breakdown by Model',
240
- 'costs.modelUsageRadar': 'Model Usage Radar',
241
- 'costs.tokenDistByModel': 'Token Distribution by Model',
242
- 'costs.costPerRequest': 'Cost per Request',
243
- 'costs.optimizationScore': 'Optimization Score',
244
- 'costs.recommendations': 'Recommendations',
245
- 'costs.noModelData': 'No model data',
246
- 'costs.noTokenData': 'No token data',
247
- 'costs.noModelUsage': 'No model usage data',
248
- 'costs.noOptTips': 'No optimization tips available',
249
- 'costs.rawEst': 'Raw Estimate',
250
- 'costs.afterCompression': 'After Compression',
251
- 'costs.saved': 'Saved',
252
- 'costs.tokens': 'Tokens',
253
- 'costs.input': 'Input',
254
- 'costs.output': 'Output',
255
- 'costs.total': 'Total',
256
- 'costs.compressed': 'Compressed',
257
- 'costs.model': 'Model',
258
- 'costs.inputTokens': 'Input Tokens',
259
- 'costs.outputTokens': 'Output Tokens',
260
- 'costs.requests': 'Requests',
261
- 'costs.potentialSavings': 'Potential savings: {impact}',
262
- 'costs.tipLowCompression': 'Low Compression Rate',
263
- 'costs.tipLowCompressionDesc': 'Your token compression is below 30%. Consider enabling more aggressive context pruning or using shorter prompts.',
264
- 'costs.tipLowCompressionImpact': 'Up to 40% token reduction',
265
- 'costs.tipDowngrade': 'Consider downgrading {model}',
266
- 'costs.tipDowngradeDesc': '{count} requests to Opus-level model. For routine tasks, Sonnet or Haiku may suffice at 5-20x lower cost.',
267
- 'costs.tipDowngradeImpact': '~${cost}/period',
268
- 'costs.tipHighFailRate': 'High Command Failure Rate',
269
- 'costs.tipHighFailRateDesc': '{rate}% of commands failed. Failed commands still consume tokens. Investigate common failure patterns.',
270
- 'costs.tipHighFailRateImpact': '{count} tokens potentially recoverable',
271
- 'costs.tipHighOutputRatio': 'High Output-to-Input Ratio',
272
- 'costs.tipHighOutputRatioDesc': 'Output tokens are 2x+ input tokens. Consider asking for more concise responses or using structured output formats.',
273
- 'costs.tipHighOutputRatioImpact': '20-30% output token reduction',
274
- 'costs.tipLookingGood': 'Looking Good',
275
- 'costs.tipLookingGoodDesc': 'Your token usage is well-optimized. Continue monitoring for regressions.',
276
- 'costs.scoreExcellent': 'Excellent -- well optimized',
277
- 'costs.scoreGood': 'Good -- room for improvement',
278
- 'costs.scoreFair': 'Fair -- several optimizations available',
279
- 'costs.scoreNeedsAttention': 'Needs attention -- significant savings possible',
280
-
281
- // Documents
282
- 'documents.title': 'Documents',
283
- 'documents.searchPlaceholder': 'Search documents...',
284
- 'documents.selectHint': 'Select a document from the tree',
285
- 'documents.supportedTypes': 'Supports HTML, Markdown, and JSON',
286
- 'documents.noDocuments': 'No documents found',
287
- 'documents.favorites': 'Favorites',
288
- 'documents.addToFavorites': 'Add to favorites',
289
- 'documents.removeFromFavorites': 'Remove from favorites',
290
- 'documents.failedToLoad': 'Failed to load',
291
- 'documents.keys': 'keys',
292
- 'documents.docCount': '{count} document(s)',
293
- 'documents.copyIndex': 'Copy index',
294
- 'documents.downloadIndex': 'Download index',
295
- 'documents.previewable': '{count} previewable HTML document(s)',
296
- 'documents.dataHint': 'The document index is a snapshot. Refresh reloads files from the current project.',
297
- 'documents.prototypeHint': 'HTML documents can be previewed here and opened in a new tab, which covers UI prototype artifacts produced by product design work.',
298
- 'documents.prototypeGallery': 'Prototype Gallery',
299
- 'documents.noPrototypes': 'No HTML prototypes found',
300
- 'documents.noPrototypesHint': 'Generated UI prototypes appear here when they are emitted as HTML documents.',
301
- 'documents.preview': 'Preview',
302
- 'documents.copyLink': 'Copy link',
303
-
304
- // Knowledge
305
- 'knowledge.title': 'Knowledge',
306
- 'knowledge.searchPlaceholder': 'Search memory and providers...',
307
- 'knowledge.recall': 'Recall',
308
- 'knowledge.providers': 'Providers',
309
- 'knowledge.recallResults': 'Recall Results',
310
- 'knowledge.localMemory': 'Local Memory Brain',
311
- 'knowledge.warnings': 'Warnings',
312
- 'knowledge.localNodes': 'Local Nodes',
313
- 'knowledge.activeNodes': 'Active Nodes',
314
- 'knowledge.providersReady': 'Providers Ready',
315
- 'knowledge.recalledItems': 'Recalled Items',
316
- 'knowledge.noProviders': 'No provider status available',
317
- 'knowledge.available': 'available',
318
- 'knowledge.unavailable': 'unavailable',
319
- 'knowledge.noRecall': 'Run a recall query to show provider-backed memory',
320
- 'knowledge.noRecallHint': 'Provider recall is explicit: enter a query and click Recall. Empty results mean the provider is reachable but did not return matching items.',
321
- 'knowledge.noLocalBrain': 'No local Memory Brain found',
322
- 'knowledge.noLocalBrainHint': 'Local memory appears after reviewed lessons are written into .scale/memory/brain.sqlite.',
323
- 'knowledge.noLocalNodes': 'No local memory nodes',
324
- 'knowledge.noLocalNodesHint': 'The memory database exists, but no nodes have been recorded yet.',
325
- 'knowledge.noWarnings': 'No warnings',
326
- 'knowledge.noEvidence': 'No evidence path',
327
- 'knowledge.evidence': 'Evidence',
328
- 'knowledge.failedToLoad': 'Failed to load knowledge',
329
- 'knowledge.operations': 'Knowledge Operations',
330
- 'knowledge.copyAll': 'Copy all',
331
- 'knowledge.exportAll': 'Export all',
332
- 'knowledge.copyLocal': 'Copy local',
333
- 'knowledge.exportLocal': 'Export local',
334
- 'knowledge.copyRecall': 'Copy recall',
335
- 'knowledge.exportRecall': 'Export recall',
336
- 'knowledge.localFilter': 'Local filter',
337
- 'knowledge.allStatuses': 'All statuses',
338
- 'knowledge.source': 'Source',
339
- 'knowledge.count': 'Count',
340
- 'knowledge.exportable': 'Exportable',
341
- 'knowledge.localBrainSource': 'Local brain',
342
- 'knowledge.providerSource': 'Provider status',
343
- 'knowledge.recallSource': 'Recall result',
344
- 'knowledge.managementScope': 'Management scope',
345
- 'knowledge.managementScopeHint': 'This dashboard can inspect, filter, copy, and export memory/knowledge evidence. Destructive editing is intentionally not enabled here.',
346
- 'knowledge.dataHint': 'Provider status loads on page open. Provider recall only runs after a query. Local memory is read from .scale/memory/brain.sqlite.',
347
- 'knowledge.fullProviderExportHint': 'Full external provider database export must be implemented through the provider API; this page exports the visible report.',
348
- 'knowledge.reviewQueue': 'Memory Review Queue',
349
- 'knowledge.copyReviewPacket': 'Copy review packet',
350
- 'knowledge.exportReviewPacket': 'Export review packet',
351
- 'knowledge.reviewQueueHint': 'Use this queue to inspect candidate, stale, rejected, and missing-evidence memory before writing changes through a governed command.',
352
- 'knowledge.noReviewItems': 'No review items',
353
- 'knowledge.noReviewItemsHint': 'Candidate, stale, rejected, or missing-evidence memory nodes will appear here.',
354
- 'knowledge.candidates': 'Candidates',
355
- 'knowledge.stale': 'Stale',
356
- 'knowledge.rejected': 'Rejected',
357
- 'knowledge.missingEvidence': 'Missing evidence',
358
- 'knowledge.approveMemory': 'Approve',
359
- 'knowledge.rejectMemory': 'Reject',
360
- 'knowledge.markStale': 'Mark stale',
361
- 'knowledge.restoreMemory': 'Restore',
362
- 'knowledge.reviewSucceeded': 'Memory updated. Evidence: {id}',
363
- 'knowledge.reviewFailed': 'Memory update failed: {error}',
364
- 'knowledge.reviewReason': 'Dashboard governed memory review',
365
-
366
- // Relative time
367
- 'time.justNow': 'just now',
368
- 'time.minutesAgo': 'm ago',
369
- 'time.hoursAgo': 'h ago',
370
- 'time.daysAgo': 'd ago',
371
- },
372
-
373
- zh: {
374
- // 侧边栏
375
- 'nav.dashboard': '仪表盘',
376
- 'nav.overview': '总览',
377
- 'nav.workflow': '工作流',
378
- 'nav.topology': '拓扑图',
379
- 'nav.operations': '运维',
380
- 'nav.monitoring': '监控',
381
- 'nav.costs': '成本',
382
- 'nav.content': '内容',
383
- 'nav.documents': '文档',
384
- 'nav.knowledge': '知识库',
385
-
386
- // 头部
387
- 'header.search': '搜索...',
388
-
389
- // SSE
390
- 'sse.live': '实时',
391
- 'sse.disconnected': '未连接',
392
- 'sse.reconnecting': '重连中...',
393
-
394
- // 通用
395
- 'common.loading': '加载中...',
396
- 'common.noData': '暂无数据',
397
- 'common.refresh': '刷新',
398
- 'common.export': '导出',
399
- 'common.copy': '复制',
400
- 'common.copied': '已复制!',
401
- 'common.download': '下载',
402
- 'common.newTab': '新标签页',
403
- 'common.all': '全部',
404
- 'common.none': '无',
405
- 'common.filter': '筛选',
406
- 'common.search': '搜索',
407
- 'common.close': '关闭',
408
- 'common.yes': '是',
409
- 'common.no': '否',
410
- 'common.failed': '失败',
411
- 'common.failedCount': '{count} 个失败',
412
- 'common.score': '分数',
413
- 'common.confidence': '置信度',
414
- 'common.copyJson': '复制 JSON',
415
- 'common.exportJson': '导出 JSON',
416
- 'common.lastLoaded': '最后加载',
417
- 'common.snapshot': '快照',
418
- 'common.realtime': '实时',
419
- 'common.mixedRefresh': '混合刷新',
420
- 'common.manualRefreshHint': '这些数据在打开页面或点击刷新时加载。',
421
- 'common.liveStreamHint': '实时事件通过面板事件流更新。',
422
- 'common.autoRefresh': '自动刷新',
423
- 'common.autoRefreshHint': '页面打开期间每 30 秒轮询刷新一次。',
424
- 'common.autoRefreshOn': '已开启,每 30 秒',
425
- 'common.autoRefreshOff': '已关闭',
426
- 'common.refreshing': '刷新中...',
427
- 'common.lastAutoRefresh': '自动刷新',
428
-
429
- // 总览
430
- 'overview.title': '总览',
431
- 'overview.totalArtifacts': '制品总数',
432
- 'overview.pendingReviews': '待审核',
433
- 'overview.activeGates': '活跃门控',
434
- 'overview.defects': '缺陷',
435
- 'overview.artifactDistribution': '制品分布',
436
- 'overview.gateStatus': '门控状态',
437
- 'overview.recentEvents': '最近事件',
438
- 'overview.pendingActions': '待处理操作',
439
- 'overview.projects': '项目',
440
- 'overview.noEvents': '暂无最近事件',
441
- 'overview.noActions': '暂无待处理操作',
442
- 'overview.noArtifacts': '暂无制品',
443
- 'overview.noGateData': '暂无门控数据',
444
- 'overview.colArtifact': '制品',
445
- 'overview.colProject': '项目',
446
- 'overview.colHealth': '健康状态',
447
- 'overview.colDocuments': '文档',
448
- 'overview.colMemory': '记忆',
449
- 'overview.colCommands': '命令',
450
- 'overview.colGateFailures': '门控失败',
451
- 'overview.colTime': '时间',
452
- 'overview.currentProject': '当前',
453
- 'overview.refreshSnapshot': '刷新快照',
454
- 'overview.dataHint': '卡片、图表、项目行是快照;最近事件也可以通过实时流进入面板。',
455
-
456
- // 运行时标签
457
- 'runtime.health.ready': '就绪',
458
- 'runtime.health.warning': '告警',
459
- 'runtime.health.missing': '缺失',
460
- 'runtime.health.ok': '正常',
461
- 'runtime.health.critical': '严重',
462
- 'runtime.status.draft': '草稿',
463
- 'runtime.status.reviewing': '审核中',
464
- 'runtime.status.frozen': '冻结',
465
- 'runtime.status.completed': '已完成',
466
- 'runtime.status.blocked': '阻塞',
467
- 'runtime.status.in-progress': '进行中',
468
- 'runtime.status.done': '完成',
469
- 'runtime.status.proposed': '已提出',
470
- 'runtime.status.approved': '已批准',
471
- 'runtime.status.rejected': '已拒绝',
472
- 'runtime.status.active': '活跃',
473
- 'runtime.status.archived': '已归档',
474
- 'runtime.status.passed': '通过',
475
- 'runtime.status.failed': '失败',
476
- 'runtime.status.pending': '待处理',
477
- 'runtime.status.skipped': '跳过',
478
- 'runtime.severity.low': '低',
479
- 'runtime.severity.medium': '中',
480
- 'runtime.severity.high': '高',
481
- 'runtime.severity.critical': '严重',
482
- 'runtime.action.submit-for-review': '提交审核',
483
- 'runtime.action.approve': '批准',
484
- 'runtime.action.reject': '拒绝',
485
- 'runtime.action.complete': '完成',
486
- 'runtime.action.freeze': '冻结',
487
- 'runtime.action.unfreeze': '解冻',
488
- 'runtime.action.reopen': '重开',
489
- 'runtime.action.archive': '归档',
490
-
491
- // 工作流
492
- 'workflow.title': '工作流',
493
- 'workflow.filters': '筛选条件',
494
- 'workflow.status': '状态',
495
- 'workflow.type': '类型',
496
- 'workflow.table': '表格',
497
- 'workflow.cards': '卡片',
498
- 'workflow.dependencyGraph': '依赖关系图',
499
- 'workflow.gateAnalysis': '门控分析',
500
- 'workflow.artifacts': '制品',
501
- 'workflow.gates': '门控',
502
- 'workflow.noArtifacts': '未找到制品',
503
- 'workflow.noArtifactMatch': '没有匹配筛选条件的制品',
504
- 'workflow.artifactCount': '{count} 个制品',
505
- 'workflow.childArtifacts': '{count} 个子制品',
506
- 'workflow.artifactDependencyGraph': '制品依赖关系图',
507
- 'workflow.colTitle': '标题',
508
- 'workflow.colType': '类型',
509
- 'workflow.colStatus': '状态',
510
- 'workflow.colVersion': '版本',
511
- 'workflow.colGates': '门控',
512
- 'workflow.colCreated': '创建时间',
513
- 'workflow.colActions': '操作',
514
- 'workflow.gatePassRate': '门控通过率',
515
- 'workflow.typeDistribution': '类型分布',
516
- 'workflow.statusDistribution': '状态分布',
517
- 'workflow.gateFailuresByName': '按名称统计门控失败',
518
- 'workflow.transitionFailed': '状态转换失败:{error}',
519
- 'workflow.error': '错误:{message}',
520
- 'workflow.confirmTransition': '确认执行 {action}?',
521
-
522
- // 拓扑图
523
- 'topology.title': '拓扑图',
524
- 'topology.layers': '层级',
525
- 'topology.kinds': '类型',
526
- 'topology.domains': '领域',
527
- 'topology.exportPNG': '导出 PNG',
528
- 'topology.exportJSON': '导出 JSON',
529
- 'topology.fitView': '适应视图',
530
- 'topology.dagLayout': 'DAG 布局',
531
- 'topology.noData': '暂无拓扑数据',
532
- 'topology.nodes': '节点',
533
- 'topology.edges': '边',
534
- 'topology.searchNodes': '搜索节点...',
535
- 'topology.degree': '度',
536
- 'topology.force': '力导向',
537
- 'topology.tree': '树形',
538
- 'topology.circle': '圆形',
539
- 'topology.concentric': '同心圆',
540
- 'topology.dag': 'DAG',
541
- 'topology.layerNodeStats': '({layers} 层, {nodes} 节点)',
542
- 'topology.noDomains': '未检测到域',
543
- 'topology.detectedFlows': '检测到的流',
544
- 'topology.moreNodes': '... +{count} 更多',
545
- 'topology.nodeDetails': '节点详情',
546
- 'topology.clickNodeHint': '点击节点查看详情',
547
- 'topology.layer': '层级:',
548
- 'topology.file': '文件:',
549
- 'topology.line': '行号:',
550
- 'topology.signature': '签名:',
551
- 'topology.domain': '域:',
552
- 'topology.calledBy': '被调用 ({count}):',
553
- 'topology.calls': '调用 ({count}):',
554
- 'topology.tour': '导览',
555
-
556
- // 监控
557
- 'monitoring.title': '监控',
558
- 'monitoring.activeDetectors': '活跃检测器',
559
- 'monitoring.autoDefects': '自动缺陷',
560
- 'monitoring.commandRuns': '命令执行 (7天)',
561
- 'monitoring.commandPassRate': '命令通过率',
562
- 'monitoring.recentEvents': '最近事件',
563
- 'monitoring.overview': '概览',
564
- 'monitoring.detectors': '检测器',
565
- 'monitoring.defects': '缺陷',
566
- 'monitoring.commands': '命令',
567
- 'monitoring.defectsByRootCause': '按根因分类缺陷',
568
- 'monitoring.defectsBySeverity': '按严重程度分类缺陷',
569
- 'monitoring.commandStatus': '命令状态',
570
- 'monitoring.detectorPerformance': '检测器性能',
571
- 'monitoring.triggerDistribution': '触发分布',
572
- 'monitoring.recentAutoDefects': '最近自动缺陷',
573
- 'monitoring.totalRuns': '总运行次数',
574
- 'monitoring.passed': '通过',
575
- 'monitoring.failed': '失败',
576
- 'monitoring.tokenSavings': 'Token 节省',
577
- 'monitoring.tokenBreakdown': 'Token 分解',
578
- 'monitoring.passFailRatio': '通过/失败比率',
579
- 'monitoring.noDetectorData': '暂无检测器数据',
580
- 'monitoring.noDefectData': '暂无缺陷数据',
581
- 'monitoring.noCommandData': '暂无命令数据',
582
- 'monitoring.noAutoDefects': '暂无自动缺陷记录',
583
- 'monitoring.health': '健康状态',
584
- 'monitoring.compressed': '压缩后',
585
- 'monitoring.saved': '节省',
586
- 'monitoring.artifactPrefix': '制品:{id}',
587
-
588
- // 成本
589
- 'costs.title': '成本',
590
- 'costs.totalTokens': 'Token 总量',
591
- 'costs.rawEstTokens': '原始估算 Token',
592
- 'costs.tokensSaved': 'Token 节省',
593
- 'costs.compressionRate': '压缩率',
594
- 'costs.estCost': '估算成本 (USD)',
595
- 'costs.overview': '概览',
596
- 'costs.modelComparison': '模型对比',
597
- 'costs.optimization': '优化建议',
598
- 'costs.tokenUsage': 'Token 使用',
599
- 'costs.compressionEfficiency': '压缩效率',
600
- 'costs.tokenWaterfall': 'Token 瀑布图',
601
- 'costs.costBreakdownByModel': '按模型成本分解',
602
- 'costs.modelUsageRadar': '模型使用雷达图',
603
- 'costs.tokenDistByModel': '按模型 Token 分布',
604
- 'costs.costPerRequest': '每次请求成本',
605
- 'costs.optimizationScore': '优化评分',
606
- 'costs.recommendations': '优化建议',
607
- 'costs.noModelData': '暂无模型数据',
608
- 'costs.noTokenData': '暂无 Token 数据',
609
- 'costs.noModelUsage': '暂无模型使用数据',
610
- 'costs.noOptTips': '暂无优化建议',
611
- 'costs.rawEst': '原始估算',
612
- 'costs.afterCompression': '压缩后',
613
- 'costs.saved': '节省',
614
- 'costs.tokens': 'Token',
615
- 'costs.input': '输入',
616
- 'costs.output': '输出',
617
- 'costs.total': '总计',
618
- 'costs.compressed': '压缩后',
619
- 'costs.model': '模型',
620
- 'costs.inputTokens': '输入 Token',
621
- 'costs.outputTokens': '输出 Token',
622
- 'costs.requests': '请求数',
623
- 'costs.potentialSavings': '潜在节省:{impact}',
624
- 'costs.tipLowCompression': '压缩率偏低',
625
- 'costs.tipLowCompressionDesc': 'Token 压缩率低于 30%。建议启用更积极的上下文裁剪或使用更简短的提示。',
626
- 'costs.tipLowCompressionImpact': '最多可减少 40% Token',
627
- 'costs.tipDowngrade': '考虑降级 {model}',
628
- 'costs.tipDowngradeDesc': '{count} 次请求使用了 Opus 级模型。日常任务使用 Sonnet 或 Haiku 即可,成本降低 5-20 倍。',
629
- 'costs.tipDowngradeImpact': '约 ${cost}/周期',
630
- 'costs.tipHighFailRate': '命令失败率偏高',
631
- 'costs.tipHighFailRateDesc': '{rate}% 的命令失败。失败的命令仍会消耗 Token。建议排查常见失败模式。',
632
- 'costs.tipHighFailRateImpact': '{count} Token 可回收',
633
- 'costs.tipHighOutputRatio': '输出/输入比偏高',
634
- 'costs.tipHighOutputRatioDesc': '输出 Token 是输入的 2 倍以上。建议要求更简洁的回复或使用结构化输出格式。',
635
- 'costs.tipHighOutputRatioImpact': '可减少 20-30% 输出 Token',
636
- 'costs.tipLookingGood': '状态良好',
637
- 'costs.tipLookingGoodDesc': 'Token 使用已优化。请持续监控。',
638
- 'costs.scoreExcellent': '优秀 — 优化良好',
639
- 'costs.scoreGood': '良好 — 仍有改进空间',
640
- 'costs.scoreFair': '一般 — 有多项可优化',
641
- 'costs.scoreNeedsAttention': '需关注 — 可显著节省',
642
-
643
- // 文档
644
- 'documents.title': '文档',
645
- 'documents.searchPlaceholder': '搜索文档...',
646
- 'documents.selectHint': '从左侧选择文档',
647
- 'documents.supportedTypes': '支持 HTML、Markdown 和 JSON',
648
- 'documents.noDocuments': '未找到文档',
649
- 'documents.favorites': '收藏夹',
650
- 'documents.addToFavorites': '添加收藏',
651
- 'documents.removeFromFavorites': '取消收藏',
652
- 'documents.failedToLoad': '加载失败',
653
- 'documents.keys': '个键',
654
- 'documents.docCount': '{count} 个文档',
655
- 'documents.copyIndex': '复制索引',
656
- 'documents.downloadIndex': '下载索引',
657
- 'documents.previewable': '{count} 个可预览 HTML 文档',
658
- 'documents.dataHint': '文档索引是快照。点击刷新会从当前项目重新读取文件。',
659
- 'documents.prototypeHint': 'HTML 文档可在这里预览并用新标签页打开,可承接产品设计产出的 UI 原型制品。',
660
- 'documents.prototypeGallery': '原型展示',
661
- 'documents.noPrototypes': '暂无 HTML 原型',
662
- 'documents.noPrototypesHint': '产品设计生成的 UI 原型以 HTML 文档产出后,会显示在这里。',
663
- 'documents.preview': '预览',
664
- 'documents.copyLink': '复制链接',
665
-
666
- // 知识库
667
- 'knowledge.title': '知识库',
668
- 'knowledge.searchPlaceholder': '搜索记忆和供应商...',
669
- 'knowledge.recall': '召回',
670
- 'knowledge.providers': '供应商',
671
- 'knowledge.recallResults': '召回结果',
672
- 'knowledge.localMemory': '本地记忆库',
673
- 'knowledge.warnings': '告警',
674
- 'knowledge.localNodes': '本地节点',
675
- 'knowledge.activeNodes': '活跃节点',
676
- 'knowledge.providersReady': '可用供应商',
677
- 'knowledge.recalledItems': '召回条目',
678
- 'knowledge.noProviders': '暂无供应商状态',
679
- 'knowledge.available': '可用',
680
- 'knowledge.unavailable': '不可用',
681
- 'knowledge.noRecall': '执行召回查询后显示供应商记忆',
682
- 'knowledge.noRecallHint': '供应商召回是显式动作:输入查询并点击召回。结果为空表示供应商可达,但没有返回匹配条目。',
683
- 'knowledge.noLocalBrain': '未找到本地 Memory Brain',
684
- 'knowledge.noLocalBrainHint': '本地记忆会在已评审经验写入 .scale/memory/brain.sqlite 后出现。',
685
- 'knowledge.noLocalNodes': '暂无本地记忆节点',
686
- 'knowledge.noLocalNodesHint': '记忆数据库已存在,但还没有记录任何节点。',
687
- 'knowledge.noWarnings': '暂无告警',
688
- 'knowledge.noEvidence': '无证据路径',
689
- 'knowledge.evidence': '证据',
690
- 'knowledge.failedToLoad': '知识库加载失败',
691
- 'knowledge.operations': '知识操作',
692
- 'knowledge.copyAll': '复制全部',
693
- 'knowledge.exportAll': '导出全部',
694
- 'knowledge.copyLocal': '复制本地',
695
- 'knowledge.exportLocal': '导出本地',
696
- 'knowledge.copyRecall': '复制召回',
697
- 'knowledge.exportRecall': '导出召回',
698
- 'knowledge.localFilter': '本地筛选',
699
- 'knowledge.allStatuses': '全部状态',
700
- 'knowledge.source': '来源',
701
- 'knowledge.count': '数量',
702
- 'knowledge.exportable': '可导出',
703
- 'knowledge.localBrainSource': '本地记忆库',
704
- 'knowledge.providerSource': '供应商状态',
705
- 'knowledge.recallSource': '召回结果',
706
- 'knowledge.managementScope': '管理范围',
707
- 'knowledge.managementScopeHint': '当前面板支持查看、筛选、复制、导出记忆/知识证据;破坏性编辑暂不在这里开放。',
708
- 'knowledge.dataHint': '供应商状态在打开页面时加载。供应商召回只有输入 query 后才执行。本地记忆读取 .scale/memory/brain.sqlite。',
709
- 'knowledge.fullProviderExportHint': '外部供应商全量库导出需要走供应商 API;本页导出的是当前可见报告。',
710
- 'knowledge.reviewQueue': '记忆审核队列',
711
- 'knowledge.copyReviewPacket': '复制审核包',
712
- 'knowledge.exportReviewPacket': '导出审核包',
713
- 'knowledge.reviewQueueHint': '在通过治理命令写入变更前,先在这里检查候选、过期、已拒绝和缺少证据的记忆。',
714
- 'knowledge.noReviewItems': '暂无审核项',
715
- 'knowledge.noReviewItemsHint': '候选、过期、已拒绝或缺少证据的记忆节点会显示在这里。',
716
- 'knowledge.candidates': '候选',
717
- 'knowledge.stale': '过期',
718
- 'knowledge.rejected': '已拒绝',
719
- 'knowledge.missingEvidence': '缺少证据',
720
- 'knowledge.approveMemory': '批准',
721
- 'knowledge.rejectMemory': '拒绝',
722
- 'knowledge.markStale': '标记过期',
723
- 'knowledge.restoreMemory': '恢复',
724
- 'knowledge.reviewSucceeded': '记忆已更新。证据:{id}',
725
- 'knowledge.reviewFailed': '记忆更新失败:{error}',
726
- 'knowledge.reviewReason': 'Dashboard 受治理记忆审核',
727
-
728
- // 相对时间
729
- 'time.justNow': '刚刚',
730
- 'time.minutesAgo': '分钟前',
731
- 'time.hoursAgo': '小时前',
732
- 'time.daysAgo': '天前',
733
- },
734
- }
735
-
736
- function getLang() {
737
- return localStorage.getItem(STORAGE_KEY) || 'en'
738
- }
739
-
740
- function setLang(lang) {
741
- localStorage.setItem(STORAGE_KEY, lang)
742
- window.dispatchEvent(new CustomEvent('langchange', { detail: lang }))
743
- }
744
-
745
- function t(key, params) {
746
- const lang = getLang()
747
- let str = translations[lang]?.[key] || translations.en[key] || key
748
- if (params) {
749
- for (const [k, v] of Object.entries(params)) {
750
- str = str.replace(new RegExp(`\\{${k}\\}`, 'g'), v)
751
- }
752
- }
753
- return str
754
- }
755
-
756
- function relativeTime(ts) {
757
- if (!ts) return '-'
758
- const diff = Date.now() - ts
759
- if (diff < 60000) return t('time.justNow')
760
- if (diff < 3600000) return Math.floor(diff / 60000) + t('time.minutesAgo')
761
- if (diff < 86400000) return Math.floor(diff / 3600000) + t('time.hoursAgo')
762
- return Math.floor(diff / 86400000) + t('time.daysAgo')
763
- }
764
-
765
- // Expose globally
766
- window.I18n = { t, getLang, setLang, relativeTime }
767
- })()