@tokscale/core 1.0.17 → 1.0.18

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/index.d.ts CHANGED
@@ -28,14 +28,13 @@ export interface DataSummary {
28
28
  models: Array<string>
29
29
  }
30
30
 
31
- /** Finalize graph with pricing */
32
- export declare function finalizeGraph(options: FinalizeGraphOptions): GraphResult
31
+ /** Finalize graph */
32
+ export declare function finalizeGraph(options: FinalizeGraphOptions): Promise<GraphResult>
33
33
 
34
34
  /** Options for finalizing graph */
35
35
  export interface FinalizeGraphOptions {
36
36
  homeDir?: string
37
37
  localMessages: ParsedMessages
38
- pricing: Array<PricingEntry>
39
38
  includeCursor: boolean
40
39
  since?: string
41
40
  until?: string
@@ -46,49 +45,42 @@ export interface FinalizeGraphOptions {
46
45
  export interface FinalizeMonthlyOptions {
47
46
  homeDir?: string
48
47
  localMessages: ParsedMessages
49
- pricing: Array<PricingEntry>
50
48
  includeCursor: boolean
51
49
  since?: string
52
50
  until?: string
53
51
  year?: string
54
52
  }
55
53
 
56
- /** Finalize monthly report with pricing */
57
- export declare function finalizeMonthlyReport(options: FinalizeMonthlyOptions): MonthlyReport
54
+ /** Finalize monthly report */
55
+ export declare function finalizeMonthlyReport(options: FinalizeMonthlyOptions): Promise<MonthlyReport>
58
56
 
59
57
  /** Finalize model report: apply pricing to local messages, add Cursor, aggregate */
60
- export declare function finalizeReport(options: FinalizeReportOptions): ModelReport
58
+ export declare function finalizeReport(options: FinalizeReportOptions): Promise<ModelReport>
61
59
 
62
- /** Options for finalizing report with pricing */
60
+ /**
61
+ * Finalize both report and graph in a single call with shared pricing
62
+ * This ensures consistent costs between report and graph data
63
+ */
64
+ export declare function finalizeReportAndGraph(options: FinalizeReportOptions): Promise<ReportAndGraph>
65
+
66
+ /** Options for finalizing report */
63
67
  export interface FinalizeReportOptions {
64
68
  homeDir?: string
65
69
  localMessages: ParsedMessages
66
- pricing: Array<PricingEntry>
67
70
  includeCursor: boolean
68
71
  since?: string
69
72
  until?: string
70
73
  year?: string
71
74
  }
72
75
 
73
- /**
74
- * Generate graph data from all session sources
75
- *
76
- * This is the main entry point that orchestrates:
77
- * 1. Parallel file scanning
78
- * 2. Parallel session parsing
79
- * 3. Date filtering
80
- * 4. Parallel aggregation
81
- */
82
- export declare function generateGraph(options: GraphOptions): GraphResult
83
-
84
76
  /** Generate graph data with pricing calculation */
85
- export declare function generateGraphWithPricing(options: ReportOptions): GraphResult
77
+ export declare function generateGraphWithPricing(options: ReportOptions): Promise<GraphResult>
86
78
 
87
79
  /** Get model usage report with pricing calculation */
88
- export declare function getModelReport(options: ReportOptions): ModelReport
80
+ export declare function getModelReport(options: ReportOptions): Promise<ModelReport>
89
81
 
90
82
  /** Get monthly usage report with pricing calculation */
91
- export declare function getMonthlyReport(options: ReportOptions): MonthlyReport
83
+ export declare function getMonthlyReport(options: ReportOptions): Promise<MonthlyReport>
92
84
 
93
85
  /** Metadata about the graph generation */
94
86
  export interface GraphMeta {
@@ -99,22 +91,6 @@ export interface GraphMeta {
99
91
  processingTimeMs: number
100
92
  }
101
93
 
102
- /** Configuration options for graph generation */
103
- export interface GraphOptions {
104
- /** Home directory path (defaults to user's home) */
105
- homeDir?: string
106
- /** Sources to include: "opencode", "claude", "codex", "gemini" */
107
- sources?: Array<string>
108
- /** Start date filter (YYYY-MM-DD) */
109
- since?: string
110
- /** End date filter (YYYY-MM-DD) */
111
- until?: string
112
- /** Filter to specific year */
113
- year?: string
114
- /** Number of parallel threads (defaults to CPU count) */
115
- threads?: number
116
- }
117
-
118
94
  /** Complete graph result */
119
95
  export interface GraphResult {
120
96
  meta: GraphMeta
@@ -135,13 +111,7 @@ export interface LocalParseOptions {
135
111
  year?: string
136
112
  }
137
113
 
138
- /** Pricing data for a single model (passed from TypeScript) */
139
- export interface ModelPricing {
140
- inputCostPerToken: number
141
- outputCostPerToken: number
142
- cacheReadInputTokenCost?: number
143
- cacheCreationInputTokenCost?: number
144
- }
114
+ export declare function lookupPricing(modelId: string, provider?: string | undefined | null): Promise<PricingLookupResult>
145
115
 
146
116
  /** Model report result */
147
117
  export interface ModelReport {
@@ -188,6 +158,13 @@ export interface MonthlyUsage {
188
158
  cost: number
189
159
  }
190
160
 
161
+ export interface NativePricing {
162
+ inputCostPerToken: number
163
+ outputCostPerToken: number
164
+ cacheReadInputTokenCost?: number
165
+ cacheCreationInputTokenCost?: number
166
+ }
167
+
191
168
  export interface ParsedMessage {
192
169
  source: string
193
170
  modelId: string
@@ -210,6 +187,8 @@ export interface ParsedMessages {
210
187
  claudeCount: number
211
188
  codexCount: number
212
189
  geminiCount: number
190
+ ampCount: number
191
+ droidCount: number
213
192
  processingTimeMs: number
214
193
  }
215
194
 
@@ -219,41 +198,28 @@ export interface ParsedMessages {
219
198
  */
220
199
  export declare function parseLocalSources(options: LocalParseOptions): ParsedMessages
221
200
 
222
- /** Entry in the pricing map */
223
- export interface PricingEntry {
201
+ export interface PricingLookupResult {
224
202
  modelId: string
225
- pricing: ModelPricing
203
+ matchedKey: string
204
+ source: string
205
+ pricing: NativePricing
226
206
  }
227
207
 
228
- /** Options for reports with pricing */
208
+ /** Combined result for report and graph (single pricing lookup) */
209
+ export interface ReportAndGraph {
210
+ report: ModelReport
211
+ graph: GraphResult
212
+ }
213
+
214
+ /** Options for reports */
229
215
  export interface ReportOptions {
230
- /** Home directory path (defaults to user's home) */
231
216
  homeDir?: string
232
- /** Sources to include: "opencode", "claude", "codex", "gemini" */
233
217
  sources?: Array<string>
234
- /** Pricing data for cost calculation */
235
- pricing: Array<PricingEntry>
236
- /** Start date filter (YYYY-MM-DD) */
237
218
  since?: string
238
- /** End date filter (YYYY-MM-DD) */
239
219
  until?: string
240
- /** Filter to specific year */
241
220
  year?: string
242
221
  }
243
222
 
244
- /** Scan for session files (for debugging/testing) */
245
- export declare function scanSessions(homeDir?: string | undefined | null, sources?: Array<string> | undefined | null): ScanStats
246
-
247
- /** Scan session files and return file counts per source */
248
- export interface ScanStats {
249
- opencodeFiles: number
250
- claudeFiles: number
251
- codexFiles: number
252
- geminiFiles: number
253
- cursorFiles: number
254
- totalFiles: number
255
- }
256
-
257
223
  /** Source contribution for a specific day */
258
224
  export interface SourceContribution {
259
225
  source: string
package/index.js CHANGED
@@ -1,336 +1,587 @@
1
+ // prettier-ignore
1
2
  /* eslint-disable */
3
+ // @ts-nocheck
2
4
  /* auto-generated by NAPI-RS */
3
5
 
4
- const { existsSync, readFileSync } = require('fs')
5
- const { join } = require('path')
6
+ const { readFileSync } = require('node:fs')
7
+ let nativeBinding = null
8
+ const loadErrors = []
6
9
 
7
- const { platform, arch } = process
10
+ const isMusl = () => {
11
+ let musl = false
12
+ if (process.platform === 'linux') {
13
+ musl = isMuslFromFilesystem()
14
+ if (musl === null) {
15
+ musl = isMuslFromReport()
16
+ }
17
+ if (musl === null) {
18
+ musl = isMuslFromChildProcess()
19
+ }
20
+ }
21
+ return musl
22
+ }
8
23
 
9
- let nativeBinding = null
10
- let localFileExisted = false
11
- let loadError = null
24
+ const isFileMusl = (f) => f.includes('libc.musl-') || f.includes('ld-musl-')
12
25
 
13
- function isMusl() {
14
- // For Node 10
15
- if (!process.report || typeof process.report.getReport !== 'function') {
16
- try {
17
- const lddPath = require('child_process').execSync('which ldd').toString().trim()
18
- return readFileSync(lddPath, 'utf8').includes('musl')
19
- } catch (e) {
26
+ const isMuslFromFilesystem = () => {
27
+ try {
28
+ return readFileSync('/usr/bin/ldd', 'utf-8').includes('musl')
29
+ } catch {
30
+ return null
31
+ }
32
+ }
33
+
34
+ const isMuslFromReport = () => {
35
+ let report = null
36
+ if (typeof process.report?.getReport === 'function') {
37
+ process.report.excludeNetwork = true
38
+ report = process.report.getReport()
39
+ }
40
+ if (!report) {
41
+ return null
42
+ }
43
+ if (report.header && report.header.glibcVersionRuntime) {
44
+ return false
45
+ }
46
+ if (Array.isArray(report.sharedObjects)) {
47
+ if (report.sharedObjects.some(isFileMusl)) {
20
48
  return true
21
49
  }
22
- } else {
23
- const { glibcVersionRuntime } = process.report.getReport().header
24
- return !glibcVersionRuntime
25
50
  }
51
+ return false
26
52
  }
27
53
 
28
- switch (platform) {
29
- case 'android':
30
- switch (arch) {
31
- case 'arm64':
32
- localFileExisted = existsSync(join(__dirname, 'tokscale-core.android-arm64.node'))
54
+ const isMuslFromChildProcess = () => {
55
+ try {
56
+ return require('child_process').execSync('ldd --version', { encoding: 'utf8' }).includes('musl')
57
+ } catch (e) {
58
+ // If we reach this case, we don't know if the system is musl or not, so is better to just fallback to false
59
+ return false
60
+ }
61
+ }
62
+
63
+ function requireNative() {
64
+ if (process.env.NAPI_RS_NATIVE_LIBRARY_PATH) {
65
+ try {
66
+ return require(process.env.NAPI_RS_NATIVE_LIBRARY_PATH);
67
+ } catch (err) {
68
+ loadErrors.push(err)
69
+ }
70
+ } else if (process.platform === 'android') {
71
+ if (process.arch === 'arm64') {
72
+ try {
73
+ return require('./tokscale-core.android-arm64.node')
74
+ } catch (e) {
75
+ loadErrors.push(e)
76
+ }
77
+ try {
78
+ const binding = require('@tokscale/core-android-arm64')
79
+ const bindingPackageVersion = require('@tokscale/core-android-arm64/package.json').version
80
+ if (bindingPackageVersion !== '1.0.17' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
81
+ throw new Error(`Native binding package version mismatch, expected 1.0.17 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
82
+ }
83
+ return binding
84
+ } catch (e) {
85
+ loadErrors.push(e)
86
+ }
87
+ } else if (process.arch === 'arm') {
88
+ try {
89
+ return require('./tokscale-core.android-arm-eabi.node')
90
+ } catch (e) {
91
+ loadErrors.push(e)
92
+ }
93
+ try {
94
+ const binding = require('@tokscale/core-android-arm-eabi')
95
+ const bindingPackageVersion = require('@tokscale/core-android-arm-eabi/package.json').version
96
+ if (bindingPackageVersion !== '1.0.17' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
97
+ throw new Error(`Native binding package version mismatch, expected 1.0.17 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
98
+ }
99
+ return binding
100
+ } catch (e) {
101
+ loadErrors.push(e)
102
+ }
103
+ } else {
104
+ loadErrors.push(new Error(`Unsupported architecture on Android ${process.arch}`))
105
+ }
106
+ } else if (process.platform === 'win32') {
107
+ if (process.arch === 'x64') {
108
+ if (process.config?.variables?.shlib_suffix === 'dll.a' || process.config?.variables?.node_target_type === 'shared_library') {
33
109
  try {
34
- if (localFileExisted) {
35
- nativeBinding = require('./tokscale-core.android-arm64.node')
36
- } else {
37
- nativeBinding = require('@tokscale/core-android-arm64')
38
- }
110
+ return require('./tokscale-core.win32-x64-gnu.node')
111
+ } catch (e) {
112
+ loadErrors.push(e)
113
+ }
114
+ try {
115
+ const binding = require('@tokscale/core-win32-x64-gnu')
116
+ const bindingPackageVersion = require('@tokscale/core-win32-x64-gnu/package.json').version
117
+ if (bindingPackageVersion !== '1.0.17' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
118
+ throw new Error(`Native binding package version mismatch, expected 1.0.17 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
119
+ }
120
+ return binding
121
+ } catch (e) {
122
+ loadErrors.push(e)
123
+ }
124
+ } else {
125
+ try {
126
+ return require('./tokscale-core.win32-x64-msvc.node')
127
+ } catch (e) {
128
+ loadErrors.push(e)
129
+ }
130
+ try {
131
+ const binding = require('@tokscale/core-win32-x64-msvc')
132
+ const bindingPackageVersion = require('@tokscale/core-win32-x64-msvc/package.json').version
133
+ if (bindingPackageVersion !== '1.0.17' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
134
+ throw new Error(`Native binding package version mismatch, expected 1.0.17 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
135
+ }
136
+ return binding
137
+ } catch (e) {
138
+ loadErrors.push(e)
139
+ }
140
+ }
141
+ } else if (process.arch === 'ia32') {
142
+ try {
143
+ return require('./tokscale-core.win32-ia32-msvc.node')
144
+ } catch (e) {
145
+ loadErrors.push(e)
146
+ }
147
+ try {
148
+ const binding = require('@tokscale/core-win32-ia32-msvc')
149
+ const bindingPackageVersion = require('@tokscale/core-win32-ia32-msvc/package.json').version
150
+ if (bindingPackageVersion !== '1.0.17' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
151
+ throw new Error(`Native binding package version mismatch, expected 1.0.17 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
152
+ }
153
+ return binding
154
+ } catch (e) {
155
+ loadErrors.push(e)
156
+ }
157
+ } else if (process.arch === 'arm64') {
158
+ try {
159
+ return require('./tokscale-core.win32-arm64-msvc.node')
160
+ } catch (e) {
161
+ loadErrors.push(e)
162
+ }
163
+ try {
164
+ const binding = require('@tokscale/core-win32-arm64-msvc')
165
+ const bindingPackageVersion = require('@tokscale/core-win32-arm64-msvc/package.json').version
166
+ if (bindingPackageVersion !== '1.0.17' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
167
+ throw new Error(`Native binding package version mismatch, expected 1.0.17 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
168
+ }
169
+ return binding
170
+ } catch (e) {
171
+ loadErrors.push(e)
172
+ }
173
+ } else {
174
+ loadErrors.push(new Error(`Unsupported architecture on Windows: ${process.arch}`))
175
+ }
176
+ } else if (process.platform === 'darwin') {
177
+ try {
178
+ return require('./tokscale-core.darwin-universal.node')
179
+ } catch (e) {
180
+ loadErrors.push(e)
181
+ }
182
+ try {
183
+ const binding = require('@tokscale/core-darwin-universal')
184
+ const bindingPackageVersion = require('@tokscale/core-darwin-universal/package.json').version
185
+ if (bindingPackageVersion !== '1.0.17' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
186
+ throw new Error(`Native binding package version mismatch, expected 1.0.17 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
187
+ }
188
+ return binding
189
+ } catch (e) {
190
+ loadErrors.push(e)
191
+ }
192
+ if (process.arch === 'x64') {
193
+ try {
194
+ return require('./tokscale-core.darwin-x64.node')
195
+ } catch (e) {
196
+ loadErrors.push(e)
197
+ }
198
+ try {
199
+ const binding = require('@tokscale/core-darwin-x64')
200
+ const bindingPackageVersion = require('@tokscale/core-darwin-x64/package.json').version
201
+ if (bindingPackageVersion !== '1.0.17' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
202
+ throw new Error(`Native binding package version mismatch, expected 1.0.17 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
203
+ }
204
+ return binding
205
+ } catch (e) {
206
+ loadErrors.push(e)
207
+ }
208
+ } else if (process.arch === 'arm64') {
209
+ try {
210
+ return require('./tokscale-core.darwin-arm64.node')
211
+ } catch (e) {
212
+ loadErrors.push(e)
213
+ }
214
+ try {
215
+ const binding = require('@tokscale/core-darwin-arm64')
216
+ const bindingPackageVersion = require('@tokscale/core-darwin-arm64/package.json').version
217
+ if (bindingPackageVersion !== '1.0.17' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
218
+ throw new Error(`Native binding package version mismatch, expected 1.0.17 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
219
+ }
220
+ return binding
221
+ } catch (e) {
222
+ loadErrors.push(e)
223
+ }
224
+ } else {
225
+ loadErrors.push(new Error(`Unsupported architecture on macOS: ${process.arch}`))
226
+ }
227
+ } else if (process.platform === 'freebsd') {
228
+ if (process.arch === 'x64') {
229
+ try {
230
+ return require('./tokscale-core.freebsd-x64.node')
231
+ } catch (e) {
232
+ loadErrors.push(e)
233
+ }
234
+ try {
235
+ const binding = require('@tokscale/core-freebsd-x64')
236
+ const bindingPackageVersion = require('@tokscale/core-freebsd-x64/package.json').version
237
+ if (bindingPackageVersion !== '1.0.17' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
238
+ throw new Error(`Native binding package version mismatch, expected 1.0.17 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
239
+ }
240
+ return binding
241
+ } catch (e) {
242
+ loadErrors.push(e)
243
+ }
244
+ } else if (process.arch === 'arm64') {
245
+ try {
246
+ return require('./tokscale-core.freebsd-arm64.node')
247
+ } catch (e) {
248
+ loadErrors.push(e)
249
+ }
250
+ try {
251
+ const binding = require('@tokscale/core-freebsd-arm64')
252
+ const bindingPackageVersion = require('@tokscale/core-freebsd-arm64/package.json').version
253
+ if (bindingPackageVersion !== '1.0.17' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
254
+ throw new Error(`Native binding package version mismatch, expected 1.0.17 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
255
+ }
256
+ return binding
257
+ } catch (e) {
258
+ loadErrors.push(e)
259
+ }
260
+ } else {
261
+ loadErrors.push(new Error(`Unsupported architecture on FreeBSD: ${process.arch}`))
262
+ }
263
+ } else if (process.platform === 'linux') {
264
+ if (process.arch === 'x64') {
265
+ if (isMusl()) {
266
+ try {
267
+ return require('./tokscale-core.linux-x64-musl.node')
39
268
  } catch (e) {
40
- loadError = e
269
+ loadErrors.push(e)
41
270
  }
42
- break
43
- case 'arm':
44
- localFileExisted = existsSync(join(__dirname, 'tokscale-core.android-arm-eabi.node'))
45
271
  try {
46
- if (localFileExisted) {
47
- nativeBinding = require('./tokscale-core.android-arm-eabi.node')
48
- } else {
49
- nativeBinding = require('@tokscale/core-android-arm-eabi')
272
+ const binding = require('@tokscale/core-linux-x64-musl')
273
+ const bindingPackageVersion = require('@tokscale/core-linux-x64-musl/package.json').version
274
+ if (bindingPackageVersion !== '1.0.17' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
275
+ throw new Error(`Native binding package version mismatch, expected 1.0.17 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
50
276
  }
277
+ return binding
51
278
  } catch (e) {
52
- loadError = e
279
+ loadErrors.push(e)
53
280
  }
54
- break
55
- default:
56
- throw new Error(`Unsupported architecture on Android ${arch}`)
57
- }
58
- break
59
- case 'win32':
60
- switch (arch) {
61
- case 'x64':
62
- localFileExisted = existsSync(
63
- join(__dirname, 'tokscale-core.win32-x64-msvc.node')
64
- )
281
+ } else {
65
282
  try {
66
- if (localFileExisted) {
67
- nativeBinding = require('./tokscale-core.win32-x64-msvc.node')
68
- } else {
69
- nativeBinding = require('@tokscale/core-win32-x64-msvc')
70
- }
283
+ return require('./tokscale-core.linux-x64-gnu.node')
71
284
  } catch (e) {
72
- loadError = e
285
+ loadErrors.push(e)
73
286
  }
74
- break
75
- case 'ia32':
76
- localFileExisted = existsSync(
77
- join(__dirname, 'tokscale-core.win32-ia32-msvc.node')
78
- )
79
287
  try {
80
- if (localFileExisted) {
81
- nativeBinding = require('./tokscale-core.win32-ia32-msvc.node')
82
- } else {
83
- nativeBinding = require('@tokscale/core-win32-ia32-msvc')
288
+ const binding = require('@tokscale/core-linux-x64-gnu')
289
+ const bindingPackageVersion = require('@tokscale/core-linux-x64-gnu/package.json').version
290
+ if (bindingPackageVersion !== '1.0.17' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
291
+ throw new Error(`Native binding package version mismatch, expected 1.0.17 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
84
292
  }
293
+ return binding
85
294
  } catch (e) {
86
- loadError = e
295
+ loadErrors.push(e)
87
296
  }
88
- break
89
- case 'arm64':
90
- localFileExisted = existsSync(
91
- join(__dirname, 'tokscale-core.win32-arm64-msvc.node')
92
- )
297
+ }
298
+ } else if (process.arch === 'arm64') {
299
+ if (isMusl()) {
93
300
  try {
94
- if (localFileExisted) {
95
- nativeBinding = require('./tokscale-core.win32-arm64-msvc.node')
96
- } else {
97
- nativeBinding = require('@tokscale/core-win32-arm64-msvc')
301
+ return require('./tokscale-core.linux-arm64-musl.node')
302
+ } catch (e) {
303
+ loadErrors.push(e)
304
+ }
305
+ try {
306
+ const binding = require('@tokscale/core-linux-arm64-musl')
307
+ const bindingPackageVersion = require('@tokscale/core-linux-arm64-musl/package.json').version
308
+ if (bindingPackageVersion !== '1.0.17' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
309
+ throw new Error(`Native binding package version mismatch, expected 1.0.17 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
98
310
  }
311
+ return binding
99
312
  } catch (e) {
100
- loadError = e
313
+ loadErrors.push(e)
101
314
  }
102
- break
103
- default:
104
- throw new Error(`Unsupported architecture on Windows: ${arch}`)
105
- }
106
- break
107
- case 'darwin':
108
- localFileExisted = existsSync(join(__dirname, 'tokscale-core.darwin-universal.node'))
109
- try {
110
- if (localFileExisted) {
111
- nativeBinding = require('./tokscale-core.darwin-universal.node')
112
315
  } else {
113
- nativeBinding = require('@tokscale/core-darwin-universal')
114
- }
115
- break
116
- } catch {}
117
- switch (arch) {
118
- case 'x64':
119
- localFileExisted = existsSync(join(__dirname, 'tokscale-core.darwin-x64.node'))
120
316
  try {
121
- if (localFileExisted) {
122
- nativeBinding = require('./tokscale-core.darwin-x64.node')
123
- } else {
124
- nativeBinding = require('@tokscale/core-darwin-x64')
125
- }
317
+ return require('./tokscale-core.linux-arm64-gnu.node')
126
318
  } catch (e) {
127
- loadError = e
319
+ loadErrors.push(e)
128
320
  }
129
- break
130
- case 'arm64':
131
- localFileExisted = existsSync(
132
- join(__dirname, 'tokscale-core.darwin-arm64.node')
133
- )
134
321
  try {
135
- if (localFileExisted) {
136
- nativeBinding = require('./tokscale-core.darwin-arm64.node')
137
- } else {
138
- nativeBinding = require('@tokscale/core-darwin-arm64')
322
+ const binding = require('@tokscale/core-linux-arm64-gnu')
323
+ const bindingPackageVersion = require('@tokscale/core-linux-arm64-gnu/package.json').version
324
+ if (bindingPackageVersion !== '1.0.17' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
325
+ throw new Error(`Native binding package version mismatch, expected 1.0.17 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
139
326
  }
327
+ return binding
140
328
  } catch (e) {
141
- loadError = e
329
+ loadErrors.push(e)
142
330
  }
143
- break
144
- default:
145
- throw new Error(`Unsupported architecture on macOS: ${arch}`)
146
- }
147
- break
148
- case 'freebsd':
149
- if (arch !== 'x64') {
150
- throw new Error(`Unsupported architecture on FreeBSD: ${arch}`)
151
- }
152
- localFileExisted = existsSync(join(__dirname, 'tokscale-core.freebsd-x64.node'))
153
- try {
154
- if (localFileExisted) {
155
- nativeBinding = require('./tokscale-core.freebsd-x64.node')
156
- } else {
157
- nativeBinding = require('@tokscale/core-freebsd-x64')
158
331
  }
159
- } catch (e) {
160
- loadError = e
161
- }
162
- break
163
- case 'linux':
164
- switch (arch) {
165
- case 'x64':
166
- if (isMusl()) {
167
- localFileExisted = existsSync(
168
- join(__dirname, 'tokscale-core.linux-x64-musl.node')
169
- )
170
- try {
171
- if (localFileExisted) {
172
- nativeBinding = require('./tokscale-core.linux-x64-musl.node')
173
- } else {
174
- nativeBinding = require('@tokscale/core-linux-x64-musl')
175
- }
176
- } catch (e) {
177
- loadError = e
178
- }
179
- } else {
180
- localFileExisted = existsSync(
181
- join(__dirname, 'tokscale-core.linux-x64-gnu.node')
182
- )
183
- try {
184
- if (localFileExisted) {
185
- nativeBinding = require('./tokscale-core.linux-x64-gnu.node')
186
- } else {
187
- nativeBinding = require('@tokscale/core-linux-x64-gnu')
188
- }
189
- } catch (e) {
190
- loadError = e
191
- }
332
+ } else if (process.arch === 'arm') {
333
+ if (isMusl()) {
334
+ try {
335
+ return require('./tokscale-core.linux-arm-musleabihf.node')
336
+ } catch (e) {
337
+ loadErrors.push(e)
192
338
  }
193
- break
194
- case 'arm64':
195
- if (isMusl()) {
196
- localFileExisted = existsSync(
197
- join(__dirname, 'tokscale-core.linux-arm64-musl.node')
198
- )
199
- try {
200
- if (localFileExisted) {
201
- nativeBinding = require('./tokscale-core.linux-arm64-musl.node')
202
- } else {
203
- nativeBinding = require('@tokscale/core-linux-arm64-musl')
204
- }
205
- } catch (e) {
206
- loadError = e
207
- }
208
- } else {
209
- localFileExisted = existsSync(
210
- join(__dirname, 'tokscale-core.linux-arm64-gnu.node')
211
- )
212
- try {
213
- if (localFileExisted) {
214
- nativeBinding = require('./tokscale-core.linux-arm64-gnu.node')
215
- } else {
216
- nativeBinding = require('@tokscale/core-linux-arm64-gnu')
217
- }
218
- } catch (e) {
219
- loadError = e
339
+ try {
340
+ const binding = require('@tokscale/core-linux-arm-musleabihf')
341
+ const bindingPackageVersion = require('@tokscale/core-linux-arm-musleabihf/package.json').version
342
+ if (bindingPackageVersion !== '1.0.17' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
343
+ throw new Error(`Native binding package version mismatch, expected 1.0.17 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
220
344
  }
345
+ return binding
346
+ } catch (e) {
347
+ loadErrors.push(e)
348
+ }
349
+ } else {
350
+ try {
351
+ return require('./tokscale-core.linux-arm-gnueabihf.node')
352
+ } catch (e) {
353
+ loadErrors.push(e)
221
354
  }
222
- break
223
- case 'arm':
224
- if (isMusl()) {
225
- localFileExisted = existsSync(
226
- join(__dirname, 'tokscale-core.linux-arm-musleabihf.node')
227
- )
228
- try {
229
- if (localFileExisted) {
230
- nativeBinding = require('./tokscale-core.linux-arm-musleabihf.node')
231
- } else {
232
- nativeBinding = require('@tokscale/core-linux-arm-musleabihf')
233
- }
234
- } catch (e) {
235
- loadError = e
355
+ try {
356
+ const binding = require('@tokscale/core-linux-arm-gnueabihf')
357
+ const bindingPackageVersion = require('@tokscale/core-linux-arm-gnueabihf/package.json').version
358
+ if (bindingPackageVersion !== '1.0.17' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
359
+ throw new Error(`Native binding package version mismatch, expected 1.0.17 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
236
360
  }
237
- } else {
238
- localFileExisted = existsSync(
239
- join(__dirname, 'tokscale-core.linux-arm-gnueabihf.node')
240
- )
241
- try {
242
- if (localFileExisted) {
243
- nativeBinding = require('./tokscale-core.linux-arm-gnueabihf.node')
244
- } else {
245
- nativeBinding = require('@tokscale/core-linux-arm-gnueabihf')
246
- }
247
- } catch (e) {
248
- loadError = e
361
+ return binding
362
+ } catch (e) {
363
+ loadErrors.push(e)
364
+ }
365
+ }
366
+ } else if (process.arch === 'loong64') {
367
+ if (isMusl()) {
368
+ try {
369
+ return require('./tokscale-core.linux-loong64-musl.node')
370
+ } catch (e) {
371
+ loadErrors.push(e)
372
+ }
373
+ try {
374
+ const binding = require('@tokscale/core-linux-loong64-musl')
375
+ const bindingPackageVersion = require('@tokscale/core-linux-loong64-musl/package.json').version
376
+ if (bindingPackageVersion !== '1.0.17' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
377
+ throw new Error(`Native binding package version mismatch, expected 1.0.17 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
249
378
  }
379
+ return binding
380
+ } catch (e) {
381
+ loadErrors.push(e)
250
382
  }
251
- break
252
- case 'riscv64':
253
- if (isMusl()) {
254
- localFileExisted = existsSync(
255
- join(__dirname, 'tokscale-core.linux-riscv64-musl.node')
256
- )
257
- try {
258
- if (localFileExisted) {
259
- nativeBinding = require('./tokscale-core.linux-riscv64-musl.node')
260
- } else {
261
- nativeBinding = require('@tokscale/core-linux-riscv64-musl')
262
- }
263
- } catch (e) {
264
- loadError = e
383
+ } else {
384
+ try {
385
+ return require('./tokscale-core.linux-loong64-gnu.node')
386
+ } catch (e) {
387
+ loadErrors.push(e)
388
+ }
389
+ try {
390
+ const binding = require('@tokscale/core-linux-loong64-gnu')
391
+ const bindingPackageVersion = require('@tokscale/core-linux-loong64-gnu/package.json').version
392
+ if (bindingPackageVersion !== '1.0.17' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
393
+ throw new Error(`Native binding package version mismatch, expected 1.0.17 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
265
394
  }
266
- } else {
267
- localFileExisted = existsSync(
268
- join(__dirname, 'tokscale-core.linux-riscv64-gnu.node')
269
- )
270
- try {
271
- if (localFileExisted) {
272
- nativeBinding = require('./tokscale-core.linux-riscv64-gnu.node')
273
- } else {
274
- nativeBinding = require('@tokscale/core-linux-riscv64-gnu')
275
- }
276
- } catch (e) {
277
- loadError = e
395
+ return binding
396
+ } catch (e) {
397
+ loadErrors.push(e)
398
+ }
399
+ }
400
+ } else if (process.arch === 'riscv64') {
401
+ if (isMusl()) {
402
+ try {
403
+ return require('./tokscale-core.linux-riscv64-musl.node')
404
+ } catch (e) {
405
+ loadErrors.push(e)
406
+ }
407
+ try {
408
+ const binding = require('@tokscale/core-linux-riscv64-musl')
409
+ const bindingPackageVersion = require('@tokscale/core-linux-riscv64-musl/package.json').version
410
+ if (bindingPackageVersion !== '1.0.17' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
411
+ throw new Error(`Native binding package version mismatch, expected 1.0.17 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
278
412
  }
413
+ return binding
414
+ } catch (e) {
415
+ loadErrors.push(e)
416
+ }
417
+ } else {
418
+ try {
419
+ return require('./tokscale-core.linux-riscv64-gnu.node')
420
+ } catch (e) {
421
+ loadErrors.push(e)
279
422
  }
280
- break
281
- case 's390x':
282
- localFileExisted = existsSync(
283
- join(__dirname, 'tokscale-core.linux-s390x-gnu.node')
284
- )
285
423
  try {
286
- if (localFileExisted) {
287
- nativeBinding = require('./tokscale-core.linux-s390x-gnu.node')
288
- } else {
289
- nativeBinding = require('@tokscale/core-linux-s390x-gnu')
424
+ const binding = require('@tokscale/core-linux-riscv64-gnu')
425
+ const bindingPackageVersion = require('@tokscale/core-linux-riscv64-gnu/package.json').version
426
+ if (bindingPackageVersion !== '1.0.17' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
427
+ throw new Error(`Native binding package version mismatch, expected 1.0.17 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
290
428
  }
429
+ return binding
291
430
  } catch (e) {
292
- loadError = e
431
+ loadErrors.push(e)
432
+ }
433
+ }
434
+ } else if (process.arch === 'ppc64') {
435
+ try {
436
+ return require('./tokscale-core.linux-ppc64-gnu.node')
437
+ } catch (e) {
438
+ loadErrors.push(e)
439
+ }
440
+ try {
441
+ const binding = require('@tokscale/core-linux-ppc64-gnu')
442
+ const bindingPackageVersion = require('@tokscale/core-linux-ppc64-gnu/package.json').version
443
+ if (bindingPackageVersion !== '1.0.17' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
444
+ throw new Error(`Native binding package version mismatch, expected 1.0.17 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
293
445
  }
294
- break
295
- default:
296
- throw new Error(`Unsupported architecture on Linux: ${arch}`)
446
+ return binding
447
+ } catch (e) {
448
+ loadErrors.push(e)
449
+ }
450
+ } else if (process.arch === 's390x') {
451
+ try {
452
+ return require('./tokscale-core.linux-s390x-gnu.node')
453
+ } catch (e) {
454
+ loadErrors.push(e)
455
+ }
456
+ try {
457
+ const binding = require('@tokscale/core-linux-s390x-gnu')
458
+ const bindingPackageVersion = require('@tokscale/core-linux-s390x-gnu/package.json').version
459
+ if (bindingPackageVersion !== '1.0.17' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
460
+ throw new Error(`Native binding package version mismatch, expected 1.0.17 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
461
+ }
462
+ return binding
463
+ } catch (e) {
464
+ loadErrors.push(e)
465
+ }
466
+ } else {
467
+ loadErrors.push(new Error(`Unsupported architecture on Linux: ${process.arch}`))
297
468
  }
298
- break
299
- default:
300
- throw new Error(`Unsupported OS: ${platform}, architecture: ${arch}`)
469
+ } else if (process.platform === 'openharmony') {
470
+ if (process.arch === 'arm64') {
471
+ try {
472
+ return require('./tokscale-core.openharmony-arm64.node')
473
+ } catch (e) {
474
+ loadErrors.push(e)
475
+ }
476
+ try {
477
+ const binding = require('@tokscale/core-openharmony-arm64')
478
+ const bindingPackageVersion = require('@tokscale/core-openharmony-arm64/package.json').version
479
+ if (bindingPackageVersion !== '1.0.17' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
480
+ throw new Error(`Native binding package version mismatch, expected 1.0.17 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
481
+ }
482
+ return binding
483
+ } catch (e) {
484
+ loadErrors.push(e)
485
+ }
486
+ } else if (process.arch === 'x64') {
487
+ try {
488
+ return require('./tokscale-core.openharmony-x64.node')
489
+ } catch (e) {
490
+ loadErrors.push(e)
491
+ }
492
+ try {
493
+ const binding = require('@tokscale/core-openharmony-x64')
494
+ const bindingPackageVersion = require('@tokscale/core-openharmony-x64/package.json').version
495
+ if (bindingPackageVersion !== '1.0.17' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
496
+ throw new Error(`Native binding package version mismatch, expected 1.0.17 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
497
+ }
498
+ return binding
499
+ } catch (e) {
500
+ loadErrors.push(e)
501
+ }
502
+ } else if (process.arch === 'arm') {
503
+ try {
504
+ return require('./tokscale-core.openharmony-arm.node')
505
+ } catch (e) {
506
+ loadErrors.push(e)
507
+ }
508
+ try {
509
+ const binding = require('@tokscale/core-openharmony-arm')
510
+ const bindingPackageVersion = require('@tokscale/core-openharmony-arm/package.json').version
511
+ if (bindingPackageVersion !== '1.0.17' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
512
+ throw new Error(`Native binding package version mismatch, expected 1.0.17 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
513
+ }
514
+ return binding
515
+ } catch (e) {
516
+ loadErrors.push(e)
517
+ }
518
+ } else {
519
+ loadErrors.push(new Error(`Unsupported architecture on OpenHarmony: ${process.arch}`))
520
+ }
521
+ } else {
522
+ loadErrors.push(new Error(`Unsupported OS: ${process.platform}, architecture: ${process.arch}`))
523
+ }
524
+ }
525
+
526
+ nativeBinding = requireNative()
527
+
528
+ if (!nativeBinding || process.env.NAPI_RS_FORCE_WASI) {
529
+ let wasiBinding = null
530
+ let wasiBindingError = null
531
+ try {
532
+ wasiBinding = require('./tokscale-core.wasi.cjs')
533
+ nativeBinding = wasiBinding
534
+ } catch (err) {
535
+ if (process.env.NAPI_RS_FORCE_WASI) {
536
+ wasiBindingError = err
537
+ }
538
+ }
539
+ if (!nativeBinding) {
540
+ try {
541
+ wasiBinding = require('@tokscale/core-wasm32-wasi')
542
+ nativeBinding = wasiBinding
543
+ } catch (err) {
544
+ if (process.env.NAPI_RS_FORCE_WASI) {
545
+ wasiBindingError.cause = err
546
+ loadErrors.push(err)
547
+ }
548
+ }
549
+ }
550
+ if (process.env.NAPI_RS_FORCE_WASI === 'error' && !wasiBinding) {
551
+ const error = new Error('WASI binding not found and NAPI_RS_FORCE_WASI is set to error')
552
+ error.cause = wasiBindingError
553
+ throw error
554
+ }
301
555
  }
302
556
 
303
557
  if (!nativeBinding) {
304
- if (loadError) {
305
- throw loadError
558
+ if (loadErrors.length > 0) {
559
+ throw new Error(
560
+ `Cannot find native binding. ` +
561
+ `npm has a bug related to optional dependencies (https://github.com/npm/cli/issues/4828). ` +
562
+ 'Please try `npm i` again after removing both package-lock.json and node_modules directory.',
563
+ {
564
+ cause: loadErrors.reduce((err, cur) => {
565
+ cur.cause = err
566
+ return cur
567
+ }),
568
+ },
569
+ )
306
570
  }
307
571
  throw new Error(`Failed to load native binding`)
308
572
  }
309
573
 
310
- const {
311
- version,
312
- healthCheck,
313
- generateGraph,
314
- scanSessions,
315
- getModelReport,
316
- getMonthlyReport,
317
- generateGraphWithPricing,
318
- // Two-phase processing functions (parallel optimization)
319
- parseLocalSources,
320
- finalizeReport,
321
- finalizeMonthlyReport,
322
- finalizeGraph,
323
- } = nativeBinding
324
-
325
- module.exports.version = version
326
- module.exports.healthCheck = healthCheck
327
- module.exports.generateGraph = generateGraph
328
- module.exports.scanSessions = scanSessions
329
- module.exports.getModelReport = getModelReport
330
- module.exports.getMonthlyReport = getMonthlyReport
331
- module.exports.generateGraphWithPricing = generateGraphWithPricing
332
- // Two-phase processing functions (parallel optimization)
333
- module.exports.parseLocalSources = parseLocalSources
334
- module.exports.finalizeReport = finalizeReport
335
- module.exports.finalizeMonthlyReport = finalizeMonthlyReport
336
- module.exports.finalizeGraph = finalizeGraph
574
+ module.exports = nativeBinding
575
+ module.exports.finalizeGraph = nativeBinding.finalizeGraph
576
+ module.exports.finalizeMonthlyReport = nativeBinding.finalizeMonthlyReport
577
+ module.exports.finalizeReport = nativeBinding.finalizeReport
578
+ module.exports.finalizeReportAndGraph = nativeBinding.finalizeReportAndGraph
579
+ module.exports.generateGraph = nativeBinding.generateGraph
580
+ module.exports.generateGraphWithPricing = nativeBinding.generateGraphWithPricing
581
+ module.exports.getModelReport = nativeBinding.getModelReport
582
+ module.exports.getMonthlyReport = nativeBinding.getMonthlyReport
583
+ module.exports.healthCheck = nativeBinding.healthCheck
584
+ module.exports.lookupPricing = nativeBinding.lookupPricing
585
+ module.exports.parseLocalSources = nativeBinding.parseLocalSources
586
+ module.exports.scanSessions = nativeBinding.scanSessions
587
+ module.exports.version = nativeBinding.version
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tokscale/core",
3
- "version": "1.0.17",
3
+ "version": "1.0.18",
4
4
  "description": "Native Rust core for tokscale CLI - high-performance session parsing",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
@@ -66,4 +66,4 @@
66
66
  "performance",
67
67
  "native"
68
68
  ]
69
- }
69
+ }
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file