careerclaw-js 1.10.1 → 1.11.1
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/CHANGELOG.md +33 -0
- package/SKILL.md +1 -1
- package/dist/briefing.d.ts.map +1 -1
- package/dist/briefing.js +13 -5
- package/dist/briefing.js.map +1 -1
- package/dist/config.d.ts +32 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +36 -1
- package/dist/config.js.map +1 -1
- package/dist/embedding/cosine.d.ts +13 -0
- package/dist/embedding/cosine.d.ts.map +1 -0
- package/dist/embedding/cosine.js +19 -0
- package/dist/embedding/cosine.js.map +1 -0
- package/dist/embedding/index.d.ts +10 -0
- package/dist/embedding/index.d.ts.map +1 -0
- package/dist/embedding/index.js +9 -0
- package/dist/embedding/index.js.map +1 -0
- package/dist/embedding/local-provider.d.ts +57 -0
- package/dist/embedding/local-provider.d.ts.map +1 -0
- package/dist/embedding/local-provider.js +94 -0
- package/dist/embedding/local-provider.js.map +1 -0
- package/dist/embedding/provider.d.ts +22 -0
- package/dist/embedding/provider.d.ts.map +1 -0
- package/dist/embedding/provider.js +9 -0
- package/dist/embedding/provider.js.map +1 -0
- package/dist/embedding/singleton.d.ts +36 -0
- package/dist/embedding/singleton.d.ts.map +1 -0
- package/dist/embedding/singleton.js +70 -0
- package/dist/embedding/singleton.js.map +1 -0
- package/dist/embedding/text-builder.d.ts +21 -0
- package/dist/embedding/text-builder.d.ts.map +1 -0
- package/dist/embedding/text-builder.js +42 -0
- package/dist/embedding/text-builder.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/matching/engine.d.ts +17 -0
- package/dist/matching/engine.d.ts.map +1 -1
- package/dist/matching/engine.js +30 -1
- package/dist/matching/engine.js.map +1 -1
- package/dist/matching/index.d.ts +3 -2
- package/dist/matching/index.d.ts.map +1 -1
- package/dist/matching/index.js +2 -2
- package/dist/matching/index.js.map +1 -1
- package/dist/matching/scoring.d.ts +24 -0
- package/dist/matching/scoring.d.ts.map +1 -1
- package/dist/matching/scoring.js +37 -1
- package/dist/matching/scoring.js.map +1 -1
- package/dist/scripts/download-model.d.ts +23 -0
- package/dist/scripts/download-model.d.ts.map +1 -0
- package/dist/scripts/download-model.js +51 -0
- package/dist/scripts/download-model.js.map +1 -0
- package/package.json +7 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,38 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [1.11.1](https://github.com/orestes-garcia-martinez/careerclaw-js/compare/careerclaw-js-v1.11.0...careerclaw-js-v1.11.1) (2026-04-08)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* **embedding:** chunk ONNX inference to prevent OOM on large job lists ([#84](https://github.com/orestes-garcia-martinez/careerclaw-js/issues/84)) ([f6f1b15](https://github.com/orestes-garcia-martinez/careerclaw-js/commit/f6f1b15f4ca5a5217382b20f76f03c539abd02ac))
|
|
9
|
+
|
|
10
|
+
## [1.11.1] (2026-04-08)
|
|
11
|
+
|
|
12
|
+
### Bug Fixes
|
|
13
|
+
|
|
14
|
+
- **embedding:** chunk ONNX inference into batches of 8 to prevent OOM on constrained instances — a single forward pass over 50+ jobs caused activation tensors to exceed available memory on 2 GB hosts; sequential 8-text chunks cap per-pass memory to ~18 MB regardless of job count
|
|
15
|
+
|
|
16
|
+
## [1.11.0](https://github.com/orestes-garcia-martinez/careerclaw-js/compare/careerclaw-js-v1.10.1...careerclaw-js-v1.11.0) (2026-04-08)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
### Features
|
|
20
|
+
|
|
21
|
+
* **embedding:** add optional local ONNX embedding provider (v1.11.0) ([#77](https://github.com/orestes-garcia-martinez/careerclaw-js/issues/77)) ([26fb049](https://github.com/orestes-garcia-martinez/careerclaw-js/commit/26fb049f7e789964bfb4f79d6d8701cbd74f0c28))
|
|
22
|
+
|
|
23
|
+
## [1.11.0] (2026-04-07)
|
|
24
|
+
|
|
25
|
+
### Features
|
|
26
|
+
|
|
27
|
+
- **embedding:** add optional local ONNX embedding provider (`CAREERCLAW_EMBEDDING_PROVIDER=local`) — loads `Xenova/all-MiniLM-L6-v2` from a pre-downloaded model directory at worker startup; model stays in memory across all requests
|
|
28
|
+
- **embedding:** `warmEmbeddingProvider()` exported for host process startup; falls back to hybrid-only scoring with a logged warning when the model directory is missing
|
|
29
|
+
- **embedding:** `rankJobsWithEmbeddings()` — single ONNX forward pass embeds all N jobs in one batch call; cosine similarity (70%) blended with lexical overlap (30%) replaces taxonomy-based semantic scoring when provider is active
|
|
30
|
+
- **embedding:** `compositeScoreWithEmbedding()` — new scoring path; `breakdown` includes `embedding` field alongside existing `keyword`, `experience`, `salary`, `work_mode`
|
|
31
|
+
- **embedding:** `buildProfileEmbeddingText()` / `buildJobEmbeddingText()` — deterministic text representations for embedding (target_roles + skills + summary + resumeText[:500] | title + description[:1000])
|
|
32
|
+
- **scripts:** `dist/scripts/download-model.js` (bin: `careerclaw-download-model`) — one-time model download script; reads `CAREERCLAW_EMBEDDING_MODEL_DIR` and `CAREERCLAW_EMBEDDING_MODEL` from env; sets `allowRemoteModels=false` after download so runtime never fetches from network
|
|
33
|
+
- **config:** three new env vars — `CAREERCLAW_EMBEDDING_PROVIDER` (`local`|`none`, default `none`), `CAREERCLAW_EMBEDDING_MODEL_DIR`, `CAREERCLAW_EMBEDDING_MODEL`
|
|
34
|
+
- **briefing:** three-way ranking dispatch: embedding path → hybrid path → legacy lexical-only; existing `SEMANTIC_MATCHING.ENABLED` flag controls the hybrid fallback
|
|
35
|
+
|
|
3
36
|
All notable changes to careerclaw-js are documented here.
|
|
4
37
|
Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
5
38
|
Versioning follows [Semantic Versioning](https://semver.org/).
|
package/SKILL.md
CHANGED
package/dist/briefing.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"briefing.d.ts","sourceRoot":"","sources":["../src/briefing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EAET,WAAW,EACX,iBAAiB,EAEjB,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAgB,KAAK,WAAW,EAAoB,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"briefing.d.ts","sourceRoot":"","sources":["../src/briefing.ts"],"names":[],"mappings":"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"}
|
package/dist/briefing.js
CHANGED
|
@@ -13,7 +13,8 @@
|
|
|
13
13
|
import { randomUUID } from "crypto";
|
|
14
14
|
import { createRequire } from "module";
|
|
15
15
|
import { fetchAllJobs } from "./sources.js";
|
|
16
|
-
import { rankJobs, rankJobsHybrid } from "./matching/index.js";
|
|
16
|
+
import { rankJobs, rankJobsHybrid, rankJobsWithEmbeddings } from "./matching/index.js";
|
|
17
|
+
import { getActiveEmbeddingProvider } from "./embedding/index.js";
|
|
17
18
|
import { draftOutreach, buildTemplateCoverLetter } from "./drafting.js";
|
|
18
19
|
import { enhanceDraft, generateCoverLetter, enhanceGapAnalysis, } from "./llm-enhance.js";
|
|
19
20
|
import { checkLicense } from "./license.js";
|
|
@@ -64,15 +65,22 @@ async function runBriefingInternal(profile, options, executionMode) {
|
|
|
64
65
|
const fetchMs = Date.now() - fetchStart;
|
|
65
66
|
const { jobs, counts: sourceCounts } = fetchResult;
|
|
66
67
|
const rankStart = Date.now();
|
|
68
|
+
const embeddingProvider = getActiveEmbeddingProvider();
|
|
67
69
|
const matches = jobs.length === 0
|
|
68
70
|
? []
|
|
69
|
-
:
|
|
70
|
-
? await
|
|
71
|
+
: embeddingProvider
|
|
72
|
+
? await rankJobsWithEmbeddings(jobs, profile, {
|
|
73
|
+
embeddingProvider,
|
|
71
74
|
limit: clampedTopK,
|
|
72
75
|
...(resumeText !== undefined ? { resumeText } : {}),
|
|
73
|
-
...(resumeIntel !== undefined ? { resumeIntel } : {}),
|
|
74
76
|
})
|
|
75
|
-
:
|
|
77
|
+
: SEMANTIC_MATCHING.ENABLED
|
|
78
|
+
? await rankJobsHybrid(jobs, profile, {
|
|
79
|
+
limit: clampedTopK,
|
|
80
|
+
...(resumeText !== undefined ? { resumeText } : {}),
|
|
81
|
+
...(resumeIntel !== undefined ? { resumeIntel } : {}),
|
|
82
|
+
})
|
|
83
|
+
: rankJobs(jobs, profile, clampedTopK);
|
|
76
84
|
const rankMs = Date.now() - rankStart;
|
|
77
85
|
const draftStart = Date.now();
|
|
78
86
|
const drafts = await Promise.all(matches.map(async (scored) => {
|
package/dist/briefing.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"briefing.js","sourceRoot":"","sources":["../src/briefing.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"briefing.js","sourceRoot":"","sources":["../src/briefing.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -19,7 +19,7 @@ export declare const HTTP_TIMEOUT_MS = 15000;
|
|
|
19
19
|
* User-Agent sent with all outbound requests.
|
|
20
20
|
* Identifies the tool and provides a contact point per robots.txt convention.
|
|
21
21
|
*/
|
|
22
|
-
export declare const USER_AGENT = "careerclaw-js/1.
|
|
22
|
+
export declare const USER_AGENT = "careerclaw-js/1.11.1 (https://github.com/orestes-garcia-martinez/careerclaw-js)";
|
|
23
23
|
/** RemoteOK RSS feed — public, no auth required. */
|
|
24
24
|
export declare const REMOTEOK_RSS_URL = "https://remoteok.com/remote-jobs.rss";
|
|
25
25
|
/**
|
|
@@ -77,6 +77,37 @@ export declare const DEFAULT_TOP_K = 3;
|
|
|
77
77
|
export declare const FREE_TOP_K = 3;
|
|
78
78
|
/** Maximum topK for Pro tier users. */
|
|
79
79
|
export declare const PRO_TOP_K = 10;
|
|
80
|
+
/**
|
|
81
|
+
* Which embedding backend to activate.
|
|
82
|
+
*
|
|
83
|
+
* "local" → LocalEmbeddingProvider (@xenova/transformers, ONNX).
|
|
84
|
+
* Requires the model to be pre-downloaded to EMBEDDING_MODEL_DIR.
|
|
85
|
+
* "none" → Embedding disabled; briefing uses rankJobsHybrid (default).
|
|
86
|
+
*/
|
|
87
|
+
export declare const EMBEDDING_PROVIDER: "local" | "none";
|
|
88
|
+
/**
|
|
89
|
+
* Filesystem path where the ONNX model files are stored.
|
|
90
|
+
* Must be pre-populated via `scripts/download-model.ts`.
|
|
91
|
+
* Survives npm installs — lives outside node_modules.
|
|
92
|
+
*/
|
|
93
|
+
export declare const EMBEDDING_MODEL_DIR: string;
|
|
94
|
+
/** Hugging Face model identifier used by the local provider. */
|
|
95
|
+
export declare const EMBEDDING_MODEL_NAME: string;
|
|
96
|
+
/**
|
|
97
|
+
* Signal blend weights for the embedding scoring path.
|
|
98
|
+
*
|
|
99
|
+
* signalInput = lexical × LEXICAL + embedding × SEMANTIC
|
|
100
|
+
*
|
|
101
|
+
* Lexical overlap (0.3) still anchors exact technology term matches
|
|
102
|
+
* (e.g., "figma", "postgres"). Embedding cosine similarity (0.7)
|
|
103
|
+
* dominates the semantic signal — no taxonomy required.
|
|
104
|
+
*/
|
|
105
|
+
export declare const EMBEDDING_MATCHING: {
|
|
106
|
+
readonly WEIGHTS: {
|
|
107
|
+
readonly LEXICAL: 0.3;
|
|
108
|
+
readonly SEMANTIC: 0.7;
|
|
109
|
+
};
|
|
110
|
+
};
|
|
80
111
|
export declare const SEMANTIC_MATCHING: {
|
|
81
112
|
readonly ENABLED: boolean;
|
|
82
113
|
/**
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/config.js
CHANGED
|
@@ -34,7 +34,7 @@ export const HTTP_TIMEOUT_MS = 15_000;
|
|
|
34
34
|
* User-Agent sent with all outbound requests.
|
|
35
35
|
* Identifies the tool and provides a contact point per robots.txt convention.
|
|
36
36
|
*/
|
|
37
|
-
export const USER_AGENT = "careerclaw-js/1.
|
|
37
|
+
export const USER_AGENT = "careerclaw-js/1.11.1 (https://github.com/orestes-garcia-martinez/careerclaw-js)";
|
|
38
38
|
// ---------------------------------------------------------------------------
|
|
39
39
|
// Job sources
|
|
40
40
|
// ---------------------------------------------------------------------------
|
|
@@ -100,6 +100,41 @@ export const FREE_TOP_K = 3;
|
|
|
100
100
|
/** Maximum topK for Pro tier users. */
|
|
101
101
|
export const PRO_TOP_K = 10;
|
|
102
102
|
// ---------------------------------------------------------------------------
|
|
103
|
+
// Embedding provider (optional local ONNX model)
|
|
104
|
+
// ---------------------------------------------------------------------------
|
|
105
|
+
/**
|
|
106
|
+
* Which embedding backend to activate.
|
|
107
|
+
*
|
|
108
|
+
* "local" → LocalEmbeddingProvider (@xenova/transformers, ONNX).
|
|
109
|
+
* Requires the model to be pre-downloaded to EMBEDDING_MODEL_DIR.
|
|
110
|
+
* "none" → Embedding disabled; briefing uses rankJobsHybrid (default).
|
|
111
|
+
*/
|
|
112
|
+
export const EMBEDDING_PROVIDER = process.env["CAREERCLAW_EMBEDDING_PROVIDER"] === "local" ? "local" : "none";
|
|
113
|
+
/**
|
|
114
|
+
* Filesystem path where the ONNX model files are stored.
|
|
115
|
+
* Must be pre-populated via `scripts/download-model.ts`.
|
|
116
|
+
* Survives npm installs — lives outside node_modules.
|
|
117
|
+
*/
|
|
118
|
+
export const EMBEDDING_MODEL_DIR = process.env["CAREERCLAW_EMBEDDING_MODEL_DIR"] ??
|
|
119
|
+
join(process.env["HOME"] ?? process.cwd(), "careerclaw-workspace", "models");
|
|
120
|
+
/** Hugging Face model identifier used by the local provider. */
|
|
121
|
+
export const EMBEDDING_MODEL_NAME = process.env["CAREERCLAW_EMBEDDING_MODEL"] ?? "Xenova/all-MiniLM-L6-v2";
|
|
122
|
+
/**
|
|
123
|
+
* Signal blend weights for the embedding scoring path.
|
|
124
|
+
*
|
|
125
|
+
* signalInput = lexical × LEXICAL + embedding × SEMANTIC
|
|
126
|
+
*
|
|
127
|
+
* Lexical overlap (0.3) still anchors exact technology term matches
|
|
128
|
+
* (e.g., "figma", "postgres"). Embedding cosine similarity (0.7)
|
|
129
|
+
* dominates the semantic signal — no taxonomy required.
|
|
130
|
+
*/
|
|
131
|
+
export const EMBEDDING_MATCHING = {
|
|
132
|
+
WEIGHTS: {
|
|
133
|
+
LEXICAL: 0.3,
|
|
134
|
+
SEMANTIC: 0.7,
|
|
135
|
+
},
|
|
136
|
+
};
|
|
137
|
+
// ---------------------------------------------------------------------------
|
|
103
138
|
// Semantic matching
|
|
104
139
|
// ---------------------------------------------------------------------------
|
|
105
140
|
export const SEMANTIC_MATCHING = {
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,CAAC;AAE/D,MAAM,CAAC,MAAM,cAAc,GAC1B,gBAAgB,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC;IAC9C,CAAC,CAAC,gBAAgB;IAClB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,CAAC,CAAC;AAEvC,MAAM,CAAC,MAAM,YAAY,GAAW,IAAI,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;AACzE,MAAM,CAAC,MAAM,aAAa,GAAW,IAAI,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;AAC3E,MAAM,CAAC,MAAM,SAAS,GAAW,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;AACpE,MAAM,CAAC,MAAM,eAAe,GAAW,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;AAC1E,MAAM,CAAC,MAAM,eAAe,GAAW,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;AAC1E,MAAM,CAAC,MAAM,kBAAkB,GAAW,IAAI,CAC7C,cAAc,EACd,gBAAgB,CAChB,CAAC;AAEF,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E,+DAA+D;AAC/D,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC;AAEtC;;;GAGG;AACH,MAAM,CAAC,MAAM,UAAU,GACtB,iFAAiF,CAAC;AAEnF,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E,oDAAoD;AACpD,MAAM,CAAC,MAAM,gBAAgB,GAAG,sCAAsC,CAAC;AAEvE;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAW,QAAQ,CAClD,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,UAAU,EAChD,EAAE,CACF,CAAC;AAEF,2DAA2D;AAC3D,MAAM,CAAC,MAAM,WAAW,GAAG,uCAAuC,CAAC;AAEnE,kEAAkE;AAClE,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,CAAC;AAEnC,mCAAmC;AACnC,MAAM,CAAC,MAAM,gBAAgB,GAAG,iCAAiC,CAAC;AAElE,0DAA0D;AAC1D,MAAM,CAAC,MAAM,eAAe,GAC3B,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,EAAE,IAAI,EAAE,CAAC;AAEnD;;;;GAIG;AACH,MAAM,CAAC,MAAM,2BAA2B,GACvC,CAAC,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC;IACrD,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,OAAO,CAAC;AAEpD,6EAA6E;AAC7E,MAAM,CAAC,MAAM,6BAA6B,GAAW,QAAQ,CAC5D,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,IAAI,GAAG,EAC9D,EAAE,CACF,CAAC;AAEF,4EAA4E;AAC5E,MAAM,CAAC,MAAM,4BAA4B,GACxC,CAAC,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,IAAI,OAAO,CAAC,KAAK,MAAM,CAAC;AAEhF,8DAA8D;AAC9D,MAAM,CAAC,MAAM,sBAAsB,GAClC,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,IAAI,IAAI,CAAC;AAE1D,MAAM,CAAC,MAAM,sBAAsB,GAClC,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,IAAI,IAAI,CAAC;AAE1D;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAW,QAAQ,CAC5D,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,IAAI,KAAK,EAChE,EAAE,CACF,CAAC;AAEF,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E,uEAAuE;AACvE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC;AAE/B,wCAAwC;AACxC,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC;AAE5B,uCAAuC;AACvC,MAAM,CAAC,MAAM,SAAS,GAAG,EAAE,CAAC;AAE5B,8EAA8E;AAC9E,iDAAiD;AACjD,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAC7B,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;AAE9E;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAC9B,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC;IAC7C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,sBAAsB,EAAE,QAAQ,CAAC,CAAC;AAE/E,gEAAgE;AAChE,MAAM,CAAC,MAAM,oBAAoB,GAC/B,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,IAAI,yBAAyB,CAAC;AAEzE;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,OAAO,EAAE;QACP,OAAO,EAAE,GAAG;QACZ,QAAQ,EAAE,GAAG;KACd;CACO,CAAC;AAEX,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAChC,OAAO,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,IAAI,MAAM,CAAC,KAAK,OAAO;IAE5E;;;;;;;;;OASG;IACH,OAAO,EAAE;QACR,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,IAAI;KACd;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,sBAAsB,EAAE;QACvB,OAAO,EAAE,GAAG;QACZ,MAAM,EAAE,GAAG;KACX;CACQ,CAAC;AAEX,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAC7B,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;AAEzC,MAAM,CAAC,MAAM,cAAc,GAC1B,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;AAEtC;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAuB,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;AAEjF,qEAAqE;AACrE,MAAM,CAAC,MAAM,YAAY,GACxB,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,IAAI,WAAW,CAAC;AAEvD,yEAAyE;AACzE,MAAM,CAAC,MAAM,SAAS,GACrB,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,2BAA2B,CAAC;AAEpE;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GACrB,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;IACnC,wDAAwD,CAAC;AAE1D,8DAA8D;AAC9D,MAAM,CAAC,MAAM,eAAe,GAAW,QAAQ,CAC9C,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,IAAI,GAAG,EAChD,EAAE,CACF,CAAC;AAEF,6DAA6D;AAC7D,MAAM,CAAC,MAAM,yBAAyB,GAAW,QAAQ,CACxD,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,IAAI,GAAG,EAC1D,EAAE,CACF,CAAC;AAEF,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E,6FAA6F;AAC7F,MAAM,CAAC,MAAM,OAAO,GAAuB,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;AAE7E,8EAA8E;AAC9E,wDAAwD;AACxD,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,0BAA0B,CAAC;AAE7D,iDAAiD;AACjD,MAAM,CAAC,MAAM,gBAAgB,GAAG,yBAAyB,CAAC;AAE1D;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,SAAS;AAEtE,8EAA8E;AAC9E,+CAA+C;AAC/C,6EAA6E;AAC7E,8EAA8E;AAE9E,kFAAkF;AAClF,MAAM,CAAC,MAAM,kBAAkB,GAC9B,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,IAAI,gBAAgB,CAAC;AAE1D,+EAA+E;AAC/E,MAAM,CAAC,MAAM,cAAc,GAAG,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* embedding/cosine.ts — Cosine similarity for pre-normalized vectors.
|
|
3
|
+
*
|
|
4
|
+
* Because the LocalEmbeddingProvider requests `normalize: true` from the
|
|
5
|
+
* ONNX pipeline, every output vector already has unit L2 norm.
|
|
6
|
+
* For unit vectors: cosine_similarity(a, b) = dot_product(a, b).
|
|
7
|
+
*
|
|
8
|
+
* Result is clamped to [0, 1]. Sentence embeddings never produce negative
|
|
9
|
+
* similarity in practice, but floating-point drift can push a value
|
|
10
|
+
* infinitesimally below 0.
|
|
11
|
+
*/
|
|
12
|
+
export declare function cosineSimilarity(a: Float32Array, b: Float32Array): number;
|
|
13
|
+
//# sourceMappingURL=cosine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cosine.d.ts","sourceRoot":"","sources":["../../src/embedding/cosine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM,CAMzE"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* embedding/cosine.ts — Cosine similarity for pre-normalized vectors.
|
|
3
|
+
*
|
|
4
|
+
* Because the LocalEmbeddingProvider requests `normalize: true` from the
|
|
5
|
+
* ONNX pipeline, every output vector already has unit L2 norm.
|
|
6
|
+
* For unit vectors: cosine_similarity(a, b) = dot_product(a, b).
|
|
7
|
+
*
|
|
8
|
+
* Result is clamped to [0, 1]. Sentence embeddings never produce negative
|
|
9
|
+
* similarity in practice, but floating-point drift can push a value
|
|
10
|
+
* infinitesimally below 0.
|
|
11
|
+
*/
|
|
12
|
+
export function cosineSimilarity(a, b) {
|
|
13
|
+
let dot = 0.0;
|
|
14
|
+
for (let i = 0; i < a.length; i++) {
|
|
15
|
+
dot += (a[i] ?? 0) * (b[i] ?? 0);
|
|
16
|
+
}
|
|
17
|
+
return Math.max(0, Math.min(1, dot));
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=cosine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cosine.js","sourceRoot":"","sources":["../../src/embedding/cosine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,UAAU,gBAAgB,CAAC,CAAe,EAAE,CAAe;IAC/D,IAAI,GAAG,GAAG,GAAG,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* embedding/index.ts — Public embedding API.
|
|
3
|
+
*
|
|
4
|
+
* Import from here rather than individual files.
|
|
5
|
+
*/
|
|
6
|
+
export type { EmbeddingProvider } from "./provider.js";
|
|
7
|
+
export { cosineSimilarity } from "./cosine.js";
|
|
8
|
+
export { buildProfileEmbeddingText, buildJobEmbeddingText } from "./text-builder.js";
|
|
9
|
+
export { warmEmbeddingProvider, getActiveEmbeddingProvider } from "./singleton.js";
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/embedding/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AACrF,OAAO,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* embedding/index.ts — Public embedding API.
|
|
3
|
+
*
|
|
4
|
+
* Import from here rather than individual files.
|
|
5
|
+
*/
|
|
6
|
+
export { cosineSimilarity } from "./cosine.js";
|
|
7
|
+
export { buildProfileEmbeddingText, buildJobEmbeddingText } from "./text-builder.js";
|
|
8
|
+
export { warmEmbeddingProvider, getActiveEmbeddingProvider } from "./singleton.js";
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/embedding/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AACrF,OAAO,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* embedding/local-provider.ts — Local ONNX embedding provider.
|
|
3
|
+
*
|
|
4
|
+
* Uses @xenova/transformers (ONNX Runtime) to run sentence embedding
|
|
5
|
+
* models entirely on-device. No network calls during inference.
|
|
6
|
+
*
|
|
7
|
+
* Intended use:
|
|
8
|
+
* 1. Download the model once via `scripts/download-model.ts`.
|
|
9
|
+
* 2. Point CAREERCLAW_EMBEDDING_MODEL_DIR at the download directory.
|
|
10
|
+
* 3. The worker calls initialize() at startup — model stays in memory.
|
|
11
|
+
*
|
|
12
|
+
* Runtime safety:
|
|
13
|
+
* - `allowRemoteModels = false` guarantees no network downloads at runtime.
|
|
14
|
+
* - If the model directory is missing or corrupted, initialize() throws
|
|
15
|
+
* and the singleton falls back to hybrid-only scoring.
|
|
16
|
+
*
|
|
17
|
+
* Dimension safety:
|
|
18
|
+
* - `dimensions` is derived from the model's actual output during
|
|
19
|
+
* initialize() rather than hardcoded. A probe embed is run immediately
|
|
20
|
+
* after the pipeline loads so that any model — regardless of its output
|
|
21
|
+
* size — slices tensors at the correct stride in embed().
|
|
22
|
+
*/
|
|
23
|
+
import type { EmbeddingProvider } from "./provider.js";
|
|
24
|
+
export declare class LocalEmbeddingProvider implements EmbeddingProvider {
|
|
25
|
+
dimensions: number;
|
|
26
|
+
readonly modelName: string;
|
|
27
|
+
private pipe;
|
|
28
|
+
private static readonly BATCH_SIZE;
|
|
29
|
+
constructor(modelName?: string);
|
|
30
|
+
/**
|
|
31
|
+
* Load the model from `modelDir` and detect its output dimensionality.
|
|
32
|
+
* Must be called once before `embed()`. Reads model files from disk —
|
|
33
|
+
* no network access.
|
|
34
|
+
*
|
|
35
|
+
* A single probe embed ("probe") is run immediately after the pipeline
|
|
36
|
+
* loads so that `output.dims[1]` is available to set `this.dimensions`
|
|
37
|
+
* before any real batch is processed. This guarantees correct tensor
|
|
38
|
+
* slicing for every model regardless of its output size.
|
|
39
|
+
*
|
|
40
|
+
* @throws If the model is not found in `modelDir`.
|
|
41
|
+
*/
|
|
42
|
+
initialize(modelDir: string): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* Embed a list of texts and return one L2-normalized Float32Array per input.
|
|
45
|
+
*
|
|
46
|
+
* Inputs are processed in sequential chunks of BATCH_SIZE to keep ONNX
|
|
47
|
+
* activation tensors small. A single pass over all N texts would produce
|
|
48
|
+
* a tensor of shape [N, seqLen, hiddenDim] that can OOM on constrained
|
|
49
|
+
* instances (e.g. 2 GB Lightsail) when N is large. Chunking caps the
|
|
50
|
+
* per-pass memory budget regardless of how many jobs are in the briefing.
|
|
51
|
+
*
|
|
52
|
+
* Tensor stride is read from output.dims[1] on every chunk — consistent
|
|
53
|
+
* with the dimensions derived during initialize().
|
|
54
|
+
*/
|
|
55
|
+
embed(texts: string[]): Promise<Float32Array[]>;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=local-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-provider.d.ts","sourceRoot":"","sources":["../../src/embedding/local-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAOvD,qBAAa,sBAAuB,YAAW,iBAAiB;IAG9D,UAAU,EAAE,MAAM,CAAK;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,OAAO,CAAC,IAAI,CAAyB;IAKrC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAK;gBAE3B,SAAS,GAAE,MAAkC;IAIzD;;;;;;;;;;;OAWG;IACG,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBjD;;;;;;;;;;;OAWG;IACG,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CAwBtD"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* embedding/local-provider.ts — Local ONNX embedding provider.
|
|
3
|
+
*
|
|
4
|
+
* Uses @xenova/transformers (ONNX Runtime) to run sentence embedding
|
|
5
|
+
* models entirely on-device. No network calls during inference.
|
|
6
|
+
*
|
|
7
|
+
* Intended use:
|
|
8
|
+
* 1. Download the model once via `scripts/download-model.ts`.
|
|
9
|
+
* 2. Point CAREERCLAW_EMBEDDING_MODEL_DIR at the download directory.
|
|
10
|
+
* 3. The worker calls initialize() at startup — model stays in memory.
|
|
11
|
+
*
|
|
12
|
+
* Runtime safety:
|
|
13
|
+
* - `allowRemoteModels = false` guarantees no network downloads at runtime.
|
|
14
|
+
* - If the model directory is missing or corrupted, initialize() throws
|
|
15
|
+
* and the singleton falls back to hybrid-only scoring.
|
|
16
|
+
*
|
|
17
|
+
* Dimension safety:
|
|
18
|
+
* - `dimensions` is derived from the model's actual output during
|
|
19
|
+
* initialize() rather than hardcoded. A probe embed is run immediately
|
|
20
|
+
* after the pipeline loads so that any model — regardless of its output
|
|
21
|
+
* size — slices tensors at the correct stride in embed().
|
|
22
|
+
*/
|
|
23
|
+
export class LocalEmbeddingProvider {
|
|
24
|
+
// Set to the real value after initialize() completes.
|
|
25
|
+
// Reading this before initialize() will throw (pipe guard fires first).
|
|
26
|
+
dimensions = 0;
|
|
27
|
+
modelName;
|
|
28
|
+
pipe = null;
|
|
29
|
+
// Maximum number of texts per ONNX forward pass. Keeping batches small
|
|
30
|
+
// bounds the activation tensor size during inference (~18 MB at 8 texts ×
|
|
31
|
+
// 256 tokens × 384 dims) and prevents OOM on constrained instances.
|
|
32
|
+
static BATCH_SIZE = 8;
|
|
33
|
+
constructor(modelName = "Xenova/all-MiniLM-L6-v2") {
|
|
34
|
+
this.modelName = modelName;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Load the model from `modelDir` and detect its output dimensionality.
|
|
38
|
+
* Must be called once before `embed()`. Reads model files from disk —
|
|
39
|
+
* no network access.
|
|
40
|
+
*
|
|
41
|
+
* A single probe embed ("probe") is run immediately after the pipeline
|
|
42
|
+
* loads so that `output.dims[1]` is available to set `this.dimensions`
|
|
43
|
+
* before any real batch is processed. This guarantees correct tensor
|
|
44
|
+
* slicing for every model regardless of its output size.
|
|
45
|
+
*
|
|
46
|
+
* @throws If the model is not found in `modelDir`.
|
|
47
|
+
*/
|
|
48
|
+
async initialize(modelDir) {
|
|
49
|
+
const { env, pipeline } = await import("@xenova/transformers");
|
|
50
|
+
env.cacheDir = modelDir;
|
|
51
|
+
env.allowRemoteModels = false; // never download at runtime
|
|
52
|
+
env.allowLocalModels = true;
|
|
53
|
+
this.pipe = await pipeline("feature-extraction", this.modelName, {
|
|
54
|
+
quantized: true, // use model_quantized.onnx (~22 MB for MiniLM)
|
|
55
|
+
});
|
|
56
|
+
// Derive real output dimensions from the model rather than assuming 384.
|
|
57
|
+
// Any model — MiniLM (384), mpnet-base (768), etc. — will be handled
|
|
58
|
+
// correctly without touching config or constructor arguments.
|
|
59
|
+
const probe = await this.pipe(["probe"], { pooling: "mean", normalize: true });
|
|
60
|
+
this.dimensions = probe.dims[1];
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Embed a list of texts and return one L2-normalized Float32Array per input.
|
|
64
|
+
*
|
|
65
|
+
* Inputs are processed in sequential chunks of BATCH_SIZE to keep ONNX
|
|
66
|
+
* activation tensors small. A single pass over all N texts would produce
|
|
67
|
+
* a tensor of shape [N, seqLen, hiddenDim] that can OOM on constrained
|
|
68
|
+
* instances (e.g. 2 GB Lightsail) when N is large. Chunking caps the
|
|
69
|
+
* per-pass memory budget regardless of how many jobs are in the briefing.
|
|
70
|
+
*
|
|
71
|
+
* Tensor stride is read from output.dims[1] on every chunk — consistent
|
|
72
|
+
* with the dimensions derived during initialize().
|
|
73
|
+
*/
|
|
74
|
+
async embed(texts) {
|
|
75
|
+
if (!this.pipe) {
|
|
76
|
+
throw new Error("LocalEmbeddingProvider.embed() called before initialize(). " +
|
|
77
|
+
"Call warmEmbeddingProvider() at worker startup.");
|
|
78
|
+
}
|
|
79
|
+
if (texts.length === 0)
|
|
80
|
+
return [];
|
|
81
|
+
const vectors = [];
|
|
82
|
+
for (let i = 0; i < texts.length; i += LocalEmbeddingProvider.BATCH_SIZE) {
|
|
83
|
+
const chunk = texts.slice(i, i + LocalEmbeddingProvider.BATCH_SIZE);
|
|
84
|
+
const output = await this.pipe(chunk, { pooling: "mean", normalize: true });
|
|
85
|
+
// Use output.dims[1] as the authoritative stride for this chunk.
|
|
86
|
+
const dims = output.dims[1];
|
|
87
|
+
for (let j = 0; j < chunk.length; j++) {
|
|
88
|
+
vectors.push(output.data.slice(j * dims, (j + 1) * dims));
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return vectors;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=local-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-provider.js","sourceRoot":"","sources":["../../src/embedding/local-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AASH,MAAM,OAAO,sBAAsB;IACjC,sDAAsD;IACtD,wEAAwE;IACxE,UAAU,GAAW,CAAC,CAAC;IACd,SAAS,CAAS;IAEnB,IAAI,GAAoB,IAAI,CAAC;IAErC,uEAAuE;IACvE,0EAA0E;IAC1E,oEAAoE;IAC5D,MAAM,CAAU,UAAU,GAAG,CAAC,CAAC;IAEvC,YAAY,YAAoB,yBAAyB;QACvD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,UAAU,CAAC,QAAgB;QAC/B,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAE/D,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACxB,GAAG,CAAC,iBAAiB,GAAG,KAAK,CAAC,CAAC,4BAA4B;QAC3D,GAAG,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAE5B,IAAI,CAAC,IAAI,GAAG,MAAM,QAAQ,CAAC,oBAAoB,EAAE,IAAI,CAAC,SAAS,EAAE;YAC/D,SAAS,EAAE,IAAI,EAAE,+CAA+C;SACjE,CAAa,CAAC;QAEf,yEAAyE;QACzE,qEAAqE;QACrE,8DAA8D;QAC9D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/E,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAW,CAAC;IAC5C,CAAC;IAED;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,KAAK,CAAC,KAAe;QACzB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,6DAA6D;gBAC7D,iDAAiD,CAClD,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAElC,MAAM,OAAO,GAAmB,EAAE,CAAC;QAEnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,sBAAsB,CAAC,UAAU,EAAE,CAAC;YACzE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,sBAAsB,CAAC,UAAU,CAAC,CAAC;YACpE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAE5E,iEAAiE;YACjE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAW,CAAC;YACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAiB,CAAC,CAAC;YAC5E,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* embedding/provider.ts — EmbeddingProvider interface.
|
|
3
|
+
*
|
|
4
|
+
* Defines the contract that all embedding backends must satisfy.
|
|
5
|
+
* Implementations: LocalEmbeddingProvider (@xenova/transformers, ONNX).
|
|
6
|
+
* Future: RemoteEmbeddingProvider (OpenAI, Cohere, etc.).
|
|
7
|
+
*/
|
|
8
|
+
export interface EmbeddingProvider {
|
|
9
|
+
/**
|
|
10
|
+
* Embed a batch of texts into L2-normalized vectors.
|
|
11
|
+
*
|
|
12
|
+
* All texts in the batch are embedded in a single forward pass.
|
|
13
|
+
* Returns one Float32Array per input text, each of length `dimensions`.
|
|
14
|
+
* Vectors are L2-normalized — cosine similarity equals the dot product.
|
|
15
|
+
*/
|
|
16
|
+
embed(texts: string[]): Promise<Float32Array[]>;
|
|
17
|
+
/** Dimensionality of the output vectors (model-specific). */
|
|
18
|
+
readonly dimensions: number;
|
|
19
|
+
/** Hugging Face model identifier (e.g. "Xenova/all-MiniLM-L6-v2"). */
|
|
20
|
+
readonly modelName: string;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/embedding/provider.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,iBAAiB;IAChC;;;;;;OAMG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAEhD,6DAA6D;IAC7D,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B,sEAAsE;IACtE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* embedding/provider.ts — EmbeddingProvider interface.
|
|
3
|
+
*
|
|
4
|
+
* Defines the contract that all embedding backends must satisfy.
|
|
5
|
+
* Implementations: LocalEmbeddingProvider (@xenova/transformers, ONNX).
|
|
6
|
+
* Future: RemoteEmbeddingProvider (OpenAI, Cohere, etc.).
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/embedding/provider.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* embedding/singleton.ts — Module-level embedding provider singleton.
|
|
3
|
+
*
|
|
4
|
+
* `warmEmbeddingProvider()` is called once at worker startup to load the
|
|
5
|
+
* model from disk into memory. All subsequent briefing calls find the
|
|
6
|
+
* already-initialized provider here via `getActiveEmbeddingProvider()`.
|
|
7
|
+
*
|
|
8
|
+
* Lifecycle:
|
|
9
|
+
* startup → warmEmbeddingProvider() → model loads from disk (~2–3 s)
|
|
10
|
+
* requests → getActiveEmbeddingProvider() → instant, returns cached instance
|
|
11
|
+
* fallback → if provider is null, briefing falls back to rankJobsHybrid
|
|
12
|
+
*
|
|
13
|
+
* The @xenova/transformers module is imported dynamically only when
|
|
14
|
+
* CAREERCLAW_EMBEDDING_PROVIDER=local. When set to "none" the heavy
|
|
15
|
+
* ONNX runtime is never loaded, keeping cold-start overhead minimal.
|
|
16
|
+
*/
|
|
17
|
+
import type { EmbeddingProvider } from "./provider.js";
|
|
18
|
+
/**
|
|
19
|
+
* Pre-warm the embedding provider at worker startup.
|
|
20
|
+
*
|
|
21
|
+
* Safe to call multiple times — the initialization runs only once.
|
|
22
|
+
* If CAREERCLAW_EMBEDDING_PROVIDER=none, returns immediately.
|
|
23
|
+
* If the model directory is missing, logs a warning and falls back.
|
|
24
|
+
*/
|
|
25
|
+
export declare function warmEmbeddingProvider(): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Returns the active embedding provider, or null if not available.
|
|
28
|
+
* Null causes the briefing pipeline to fall back to rankJobsHybrid.
|
|
29
|
+
*/
|
|
30
|
+
export declare function getActiveEmbeddingProvider(): EmbeddingProvider | null;
|
|
31
|
+
/**
|
|
32
|
+
* Reset singleton state — for testing only.
|
|
33
|
+
* @internal
|
|
34
|
+
*/
|
|
35
|
+
export declare function _resetEmbeddingProvider(): void;
|
|
36
|
+
//# sourceMappingURL=singleton.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"singleton.d.ts","sourceRoot":"","sources":["../../src/embedding/singleton.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAOH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAKvD;;;;;;GAMG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAgC3D;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,IAAI,iBAAiB,GAAG,IAAI,CAErE;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,IAAI,CAG9C"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* embedding/singleton.ts — Module-level embedding provider singleton.
|
|
3
|
+
*
|
|
4
|
+
* `warmEmbeddingProvider()` is called once at worker startup to load the
|
|
5
|
+
* model from disk into memory. All subsequent briefing calls find the
|
|
6
|
+
* already-initialized provider here via `getActiveEmbeddingProvider()`.
|
|
7
|
+
*
|
|
8
|
+
* Lifecycle:
|
|
9
|
+
* startup → warmEmbeddingProvider() → model loads from disk (~2–3 s)
|
|
10
|
+
* requests → getActiveEmbeddingProvider() → instant, returns cached instance
|
|
11
|
+
* fallback → if provider is null, briefing falls back to rankJobsHybrid
|
|
12
|
+
*
|
|
13
|
+
* The @xenova/transformers module is imported dynamically only when
|
|
14
|
+
* CAREERCLAW_EMBEDDING_PROVIDER=local. When set to "none" the heavy
|
|
15
|
+
* ONNX runtime is never loaded, keeping cold-start overhead minimal.
|
|
16
|
+
*/
|
|
17
|
+
import { EMBEDDING_MODEL_DIR, EMBEDDING_MODEL_NAME, EMBEDDING_PROVIDER, } from "../config.js";
|
|
18
|
+
let _provider = null;
|
|
19
|
+
let _initPromise = null;
|
|
20
|
+
/**
|
|
21
|
+
* Pre-warm the embedding provider at worker startup.
|
|
22
|
+
*
|
|
23
|
+
* Safe to call multiple times — the initialization runs only once.
|
|
24
|
+
* If CAREERCLAW_EMBEDDING_PROVIDER=none, returns immediately.
|
|
25
|
+
* If the model directory is missing, logs a warning and falls back.
|
|
26
|
+
*/
|
|
27
|
+
export async function warmEmbeddingProvider() {
|
|
28
|
+
if (EMBEDDING_PROVIDER === "none")
|
|
29
|
+
return;
|
|
30
|
+
// Deduplicate concurrent calls (e.g., tests that call warm twice)
|
|
31
|
+
if (_initPromise) {
|
|
32
|
+
await _initPromise;
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
_initPromise = (async () => {
|
|
36
|
+
try {
|
|
37
|
+
const { LocalEmbeddingProvider } = await import("./local-provider.js");
|
|
38
|
+
const provider = new LocalEmbeddingProvider(EMBEDDING_MODEL_NAME);
|
|
39
|
+
await provider.initialize(EMBEDDING_MODEL_DIR);
|
|
40
|
+
_provider = provider;
|
|
41
|
+
console.log(`[careerclaw] Embedding provider ready: ${EMBEDDING_MODEL_NAME} ` +
|
|
42
|
+
`(${provider.dimensions} dims) from ${EMBEDDING_MODEL_DIR}`);
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
46
|
+
console.warn(`[careerclaw] Embedding provider failed to load: ${message}\n` +
|
|
47
|
+
`[careerclaw] Run 'node node_modules/careerclaw-js/dist/scripts/download-model.js' ` +
|
|
48
|
+
`to download the model, then restart the worker.\n` +
|
|
49
|
+
`[careerclaw] Falling back to hybrid-only scoring.`);
|
|
50
|
+
_provider = null;
|
|
51
|
+
}
|
|
52
|
+
})();
|
|
53
|
+
await _initPromise;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Returns the active embedding provider, or null if not available.
|
|
57
|
+
* Null causes the briefing pipeline to fall back to rankJobsHybrid.
|
|
58
|
+
*/
|
|
59
|
+
export function getActiveEmbeddingProvider() {
|
|
60
|
+
return _provider;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Reset singleton state — for testing only.
|
|
64
|
+
* @internal
|
|
65
|
+
*/
|
|
66
|
+
export function _resetEmbeddingProvider() {
|
|
67
|
+
_provider = null;
|
|
68
|
+
_initPromise = null;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=singleton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"singleton.js","sourceRoot":"","sources":["../../src/embedding/singleton.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,cAAc,CAAC;AAGtB,IAAI,SAAS,GAA6B,IAAI,CAAC;AAC/C,IAAI,YAAY,GAAyB,IAAI,CAAC;AAE9C;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,IAAI,kBAAkB,KAAK,MAAM;QAAE,OAAO;IAE1C,kEAAkE;IAClE,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,YAAY,CAAC;QACnB,OAAO;IACT,CAAC;IAED,YAAY,GAAG,CAAC,KAAK,IAAI,EAAE;QACzB,IAAI,CAAC;YACH,MAAM,EAAE,sBAAsB,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;YACvE,MAAM,QAAQ,GAAG,IAAI,sBAAsB,CAAC,oBAAoB,CAAC,CAAC;YAClE,MAAM,QAAQ,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC;YAC/C,SAAS,GAAG,QAAQ,CAAC;YACrB,OAAO,CAAC,GAAG,CACT,0CAA0C,oBAAoB,GAAG;gBACjE,IAAI,QAAQ,CAAC,UAAU,eAAe,mBAAmB,EAAE,CAC5D,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO,CAAC,IAAI,CACV,mDAAmD,OAAO,IAAI;gBAC9D,oFAAoF;gBACpF,mDAAmD;gBACnD,mDAAmD,CACpD,CAAC;YACF,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IAEL,MAAM,YAAY,CAAC;AACrB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B;IACxC,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB;IACrC,SAAS,GAAG,IAAI,CAAC;IACjB,YAAY,GAAG,IAAI,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* embedding/text-builder.ts — Text representations for embedding.
|
|
3
|
+
*
|
|
4
|
+
* Converts structured profile and job objects into single strings
|
|
5
|
+
* that the embedding model can process. The goal is to capture the
|
|
6
|
+
* most semantically dense signal in a compact representation.
|
|
7
|
+
*
|
|
8
|
+
* Profile text order (highest signal first):
|
|
9
|
+
* target_roles | skills | resume_summary | resumeText[:500]
|
|
10
|
+
*
|
|
11
|
+
* Job text order:
|
|
12
|
+
* title | description[:1000]
|
|
13
|
+
*
|
|
14
|
+
* The "|" separator gives the model a soft boundary between fields.
|
|
15
|
+
* Description truncation avoids diluting the signal with boilerplate
|
|
16
|
+
* that appears at the end of long job posts.
|
|
17
|
+
*/
|
|
18
|
+
import type { NormalizedJob, UserProfile } from "../models.js";
|
|
19
|
+
export declare function buildProfileEmbeddingText(profile: UserProfile, resumeText?: string): string;
|
|
20
|
+
export declare function buildJobEmbeddingText(job: NormalizedJob): string;
|
|
21
|
+
//# sourceMappingURL=text-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-builder.d.ts","sourceRoot":"","sources":["../../src/embedding/text-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE/D,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,WAAW,EACpB,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,CAmBR;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAKhE"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* embedding/text-builder.ts — Text representations for embedding.
|
|
3
|
+
*
|
|
4
|
+
* Converts structured profile and job objects into single strings
|
|
5
|
+
* that the embedding model can process. The goal is to capture the
|
|
6
|
+
* most semantically dense signal in a compact representation.
|
|
7
|
+
*
|
|
8
|
+
* Profile text order (highest signal first):
|
|
9
|
+
* target_roles | skills | resume_summary | resumeText[:500]
|
|
10
|
+
*
|
|
11
|
+
* Job text order:
|
|
12
|
+
* title | description[:1000]
|
|
13
|
+
*
|
|
14
|
+
* The "|" separator gives the model a soft boundary between fields.
|
|
15
|
+
* Description truncation avoids diluting the signal with boilerplate
|
|
16
|
+
* that appears at the end of long job posts.
|
|
17
|
+
*/
|
|
18
|
+
export function buildProfileEmbeddingText(profile, resumeText) {
|
|
19
|
+
const parts = [];
|
|
20
|
+
if (profile.target_roles.length > 0) {
|
|
21
|
+
parts.push(profile.target_roles.join(", "));
|
|
22
|
+
}
|
|
23
|
+
if (profile.skills.length > 0) {
|
|
24
|
+
parts.push(profile.skills.join(", "));
|
|
25
|
+
}
|
|
26
|
+
if (profile.resume_summary?.trim()) {
|
|
27
|
+
parts.push(profile.resume_summary.trim());
|
|
28
|
+
}
|
|
29
|
+
if (resumeText?.trim()) {
|
|
30
|
+
// First 500 characters capture the professional summary and most recent
|
|
31
|
+
// experience — the highest-signal portion of a resume.
|
|
32
|
+
parts.push(resumeText.trim().slice(0, 500));
|
|
33
|
+
}
|
|
34
|
+
return parts.join(" | ");
|
|
35
|
+
}
|
|
36
|
+
export function buildJobEmbeddingText(job) {
|
|
37
|
+
// Truncate description to 1000 chars — enough to cover requirements and
|
|
38
|
+
// responsibilities without including boilerplate benefits/EEO text.
|
|
39
|
+
const description = job.description.slice(0, 1_000);
|
|
40
|
+
return `${job.title} | ${description}`;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=text-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-builder.js","sourceRoot":"","sources":["../../src/embedding/text-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,MAAM,UAAU,yBAAyB,CACvC,OAAoB,EACpB,UAAmB;IAEnB,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9C,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACxC,CAAC;IACD,IAAI,OAAO,CAAC,cAAc,EAAE,IAAI,EAAE,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;IACD,IAAI,UAAU,EAAE,IAAI,EAAE,EAAE,CAAC;QACvB,wEAAwE;QACxE,uDAAuD;QACvD,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAAkB;IACtD,wEAAwE;IACxE,oEAAoE;IACpE,MAAM,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACpD,OAAO,GAAG,GAAG,CAAC,KAAK,MAAM,WAAW,EAAE,CAAC;AACzC,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -8,4 +8,6 @@ export * from "./tracking.js";
|
|
|
8
8
|
export * from "./sources.js";
|
|
9
9
|
export * from "./gap.js";
|
|
10
10
|
export * from "./llm-enhance.js";
|
|
11
|
+
export { warmEmbeddingProvider, getActiveEmbeddingProvider } from "./embedding/index.js";
|
|
12
|
+
export type { EmbeddingProvider } from "./embedding/index.js";
|
|
11
13
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AACzF,YAAY,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
* `ScoredJob[]` — they are score-agnostic.
|
|
19
19
|
*/
|
|
20
20
|
import type { NormalizedJob, ResumeIntelligence, UserProfile, ScoredJob } from "../models.js";
|
|
21
|
+
import type { EmbeddingProvider } from "../embedding/provider.js";
|
|
21
22
|
/**
|
|
22
23
|
* Score, filter, and rank jobs against a user profile.
|
|
23
24
|
*
|
|
@@ -43,4 +44,20 @@ export declare function rankJobsHybrid(jobs: NormalizedJob[], profile: UserProfi
|
|
|
43
44
|
limit?: number;
|
|
44
45
|
minKeywordScore?: number;
|
|
45
46
|
}): Promise<ScoredJob[]>;
|
|
47
|
+
/**
|
|
48
|
+
* Embedding variant of rankJobs.
|
|
49
|
+
*
|
|
50
|
+
* Scores every job against the user profile using a blend of lexical
|
|
51
|
+
* overlap (30%) and embedding cosine similarity (70%). The embedding
|
|
52
|
+
* provider must already be initialized (via warmEmbeddingProvider).
|
|
53
|
+
*
|
|
54
|
+
* All job texts are embedded in a single batch call before scoring —
|
|
55
|
+
* one ONNX forward pass for all N jobs, not N sequential calls.
|
|
56
|
+
*/
|
|
57
|
+
export declare function rankJobsWithEmbeddings(jobs: NormalizedJob[], profile: UserProfile, options: {
|
|
58
|
+
embeddingProvider: EmbeddingProvider;
|
|
59
|
+
resumeText?: string;
|
|
60
|
+
limit?: number;
|
|
61
|
+
minKeywordScore?: number;
|
|
62
|
+
}): Promise<ScoredJob[]>;
|
|
46
63
|
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/matching/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,kBAAkB,EAClB,WAAW,EACX,SAAS,EACV,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/matching/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,kBAAkB,EAClB,WAAW,EACX,SAAS,EACV,MAAM,cAAc,CAAC;AAGtB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAOlE;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,aAAa,EAAE,EACrB,OAAO,EAAE,WAAW,EACpB,KAAK,GAAE,MAAsB,EAC7B,eAAe,GAAE,MAAa,GAC7B,SAAS,EAAE,CAgBb;AAED;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,aAAa,EAAE,EACrB,OAAO,EAAE,WAAW,EACpB,OAAO,GAAE;IACP,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;CACrB,GACL,OAAO,CAAC,SAAS,EAAE,CAAC,CAyBtB;AAED;;;;;;;;;GASG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,aAAa,EAAE,EACrB,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE;IACP,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GACA,OAAO,CAAC,SAAS,EAAE,CAAC,CA+BtB"}
|
package/dist/matching/engine.js
CHANGED
|
@@ -18,7 +18,8 @@
|
|
|
18
18
|
* `ScoredJob[]` — they are score-agnostic.
|
|
19
19
|
*/
|
|
20
20
|
import { DEFAULT_TOP_K } from "../config.js";
|
|
21
|
-
import { compositeScore, compositeScoreHybrid } from "./scoring.js";
|
|
21
|
+
import { compositeScore, compositeScoreHybrid, compositeScoreWithEmbedding } from "./scoring.js";
|
|
22
|
+
import { buildProfileEmbeddingText, buildJobEmbeddingText } from "../embedding/text-builder.js";
|
|
22
23
|
// ---------------------------------------------------------------------------
|
|
23
24
|
// Public API
|
|
24
25
|
// ---------------------------------------------------------------------------
|
|
@@ -77,4 +78,32 @@ export async function rankJobsHybrid(jobs, profile, options = {}) {
|
|
|
77
78
|
.sort((a, b) => b.score - a.score)
|
|
78
79
|
.slice(0, limit);
|
|
79
80
|
}
|
|
81
|
+
/**
|
|
82
|
+
* Embedding variant of rankJobs.
|
|
83
|
+
*
|
|
84
|
+
* Scores every job against the user profile using a blend of lexical
|
|
85
|
+
* overlap (30%) and embedding cosine similarity (70%). The embedding
|
|
86
|
+
* provider must already be initialized (via warmEmbeddingProvider).
|
|
87
|
+
*
|
|
88
|
+
* All job texts are embedded in a single batch call before scoring —
|
|
89
|
+
* one ONNX forward pass for all N jobs, not N sequential calls.
|
|
90
|
+
*/
|
|
91
|
+
export async function rankJobsWithEmbeddings(jobs, profile, options) {
|
|
92
|
+
const { embeddingProvider, resumeText, limit = DEFAULT_TOP_K, minKeywordScore = 0.01, } = options;
|
|
93
|
+
const profileText = buildProfileEmbeddingText(profile, resumeText);
|
|
94
|
+
const jobTexts = jobs.map(buildJobEmbeddingText);
|
|
95
|
+
// Single ONNX forward pass: profile + all N jobs in one call
|
|
96
|
+
const allVectors = await embeddingProvider.embed([profileText, ...jobTexts]);
|
|
97
|
+
const profileVec = allVectors[0];
|
|
98
|
+
const jobVecs = allVectors.slice(1);
|
|
99
|
+
return jobs
|
|
100
|
+
.map((job, i) => {
|
|
101
|
+
const jobVec = jobVecs[i];
|
|
102
|
+
const { total, breakdown, matched, gaps } = compositeScoreWithEmbedding(profile, job, profileVec, jobVec);
|
|
103
|
+
return { job, score: total, breakdown, matched_keywords: matched, gap_keywords: gaps };
|
|
104
|
+
})
|
|
105
|
+
.filter((scored) => scored.breakdown.keyword >= minKeywordScore)
|
|
106
|
+
.sort((a, b) => b.score - a.score)
|
|
107
|
+
.slice(0, limit);
|
|
108
|
+
}
|
|
80
109
|
//# sourceMappingURL=engine.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/matching/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAQH,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/matching/engine.ts"],"names":[],"mappings":"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"}
|
package/dist/matching/index.d.ts
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Import from here rather than individual files.
|
|
5
5
|
*/
|
|
6
|
-
export { rankJobs, rankJobsHybrid } from "./engine.js";
|
|
7
|
-
export { scoreKeyword, scoreExperience, scoreSalary, scoreWorkMode, compositeScore, scoreKeywordEnhanced, compositeScoreHybrid, } from "./scoring.js";
|
|
6
|
+
export { rankJobs, rankJobsHybrid, rankJobsWithEmbeddings } from "./engine.js";
|
|
7
|
+
export { scoreKeyword, scoreExperience, scoreSalary, scoreWorkMode, compositeScore, scoreKeywordEnhanced, compositeScoreHybrid, compositeScoreWithEmbedding, } from "./scoring.js";
|
|
8
|
+
export type { EmbeddingMatchBreakdown } from "./scoring.js";
|
|
8
9
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/matching/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/matching/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EACL,YAAY,EACZ,eAAe,EACf,WAAW,EACX,aAAa,EACb,cAAc,EACd,oBAAoB,EACpB,oBAAoB,EACpB,2BAA2B,GAC5B,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/matching/index.js
CHANGED
|
@@ -3,6 +3,6 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Import from here rather than individual files.
|
|
5
5
|
*/
|
|
6
|
-
export { rankJobs, rankJobsHybrid } from "./engine.js";
|
|
7
|
-
export { scoreKeyword, scoreExperience, scoreSalary, scoreWorkMode, compositeScore, scoreKeywordEnhanced, compositeScoreHybrid, } from "./scoring.js";
|
|
6
|
+
export { rankJobs, rankJobsHybrid, rankJobsWithEmbeddings } from "./engine.js";
|
|
7
|
+
export { scoreKeyword, scoreExperience, scoreSalary, scoreWorkMode, compositeScore, scoreKeywordEnhanced, compositeScoreHybrid, compositeScoreWithEmbedding, } from "./scoring.js";
|
|
8
8
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/matching/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/matching/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EACL,YAAY,EACZ,eAAe,EACf,WAAW,EACX,aAAa,EACb,cAAc,EACd,oBAAoB,EACpB,oBAAoB,EACpB,2BAA2B,GAC5B,MAAM,cAAc,CAAC"}
|
|
@@ -17,6 +17,9 @@ export interface HybridMatchBreakdown extends MatchBreakdown {
|
|
|
17
17
|
lexical_keyword: number;
|
|
18
18
|
semantic: number;
|
|
19
19
|
}
|
|
20
|
+
export interface EmbeddingMatchBreakdown extends MatchBreakdown {
|
|
21
|
+
embedding: number;
|
|
22
|
+
}
|
|
20
23
|
/**
|
|
21
24
|
* Score keyword overlap between the user profile and a job posting.
|
|
22
25
|
*
|
|
@@ -90,4 +93,25 @@ export declare function compositeScoreHybrid(profile: UserProfile, job: Normaliz
|
|
|
90
93
|
matched: string[];
|
|
91
94
|
gaps: string[];
|
|
92
95
|
};
|
|
96
|
+
/**
|
|
97
|
+
* Compute composite score using pre-computed embedding vectors.
|
|
98
|
+
*
|
|
99
|
+
* Formula:
|
|
100
|
+
* signalInput = lexical × 0.3 + embedding_cosine × 0.7
|
|
101
|
+
* total = sqrt(signalInput) × qualityBase
|
|
102
|
+
*
|
|
103
|
+
* The lexical score (Jaccard) still serves as the keyword gate signal
|
|
104
|
+
* (`breakdown.keyword`) and anchors exact technology term matches.
|
|
105
|
+
* The embedding cosine similarity provides the dominant semantic signal
|
|
106
|
+
* without requiring a hand-curated taxonomy.
|
|
107
|
+
*
|
|
108
|
+
* Vectors must be L2-normalized (produced by LocalEmbeddingProvider
|
|
109
|
+
* with `normalize: true`), so cosine similarity equals the dot product.
|
|
110
|
+
*/
|
|
111
|
+
export declare function compositeScoreWithEmbedding(profile: UserProfile, job: NormalizedJob, profileVec: Float32Array, jobVec: Float32Array): {
|
|
112
|
+
total: number;
|
|
113
|
+
breakdown: EmbeddingMatchBreakdown;
|
|
114
|
+
matched: string[];
|
|
115
|
+
gaps: string[];
|
|
116
|
+
};
|
|
93
117
|
//# sourceMappingURL=scoring.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scoring.d.ts","sourceRoot":"","sources":["../../src/matching/scoring.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,kBAAkB,EAClB,WAAW,EACZ,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"scoring.d.ts","sourceRoot":"","sources":["../../src/matching/scoring.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,kBAAkB,EAClB,WAAW,EACZ,MAAM,cAAc,CAAC;AAqCtB,MAAM,WAAW,oBAAqB,SAAQ,cAAc;IAC1D,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,uBAAwB,SAAQ,cAAc;IAC7D,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,aAAa,GACjB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAmBtD;AAED,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,aAAa,EAClB,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAA;CAAO,GAC7E;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAItD;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,aAAa,GACjB,MAAM,CASR;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,aAAa,GACjB,MAAM,CAUR;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,aAAa,GACjB,MAAM,CAWR;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,aAAa,GACjB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAoBjF;AAED,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,aAAa,EAClB,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAA;CAAO,GAC7E;IACD,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,oBAAoB,CAAC;IAChC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB,CAyCA;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,aAAa,EAClB,UAAU,EAAE,YAAY,EACxB,MAAM,EAAE,YAAY,GACnB;IACD,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,uBAAuB,CAAC;IACnC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB,CA0BA"}
|
package/dist/matching/scoring.js
CHANGED
|
@@ -14,7 +14,8 @@
|
|
|
14
14
|
*/
|
|
15
15
|
import { tokenizeUnique, tokenOverlap, matchedTokens, gapTokens, } from "../core/text-processing.js";
|
|
16
16
|
import { buildJobSemanticView, buildProfileSemanticView, computeSemanticScore, weightedOverlapScore, } from "./semantic-scoring.js";
|
|
17
|
-
import {
|
|
17
|
+
import { cosineSimilarity } from "../embedding/cosine.js";
|
|
18
|
+
import { EMBEDDING_MATCHING, SEMANTIC_MATCHING } from "../config.js";
|
|
18
19
|
/**
|
|
19
20
|
* Quality dimension weights — applied AFTER the keyword signal multiplier.
|
|
20
21
|
* Normalised to sum to 1.0 so the quality base stays in [0, 1].
|
|
@@ -189,6 +190,41 @@ export function compositeScoreHybrid(profile, job, options = {}) {
|
|
|
189
190
|
gaps: [...new Set([...lexicalEnhanced.gaps, ...semantic.gaps])],
|
|
190
191
|
};
|
|
191
192
|
}
|
|
193
|
+
/**
|
|
194
|
+
* Compute composite score using pre-computed embedding vectors.
|
|
195
|
+
*
|
|
196
|
+
* Formula:
|
|
197
|
+
* signalInput = lexical × 0.3 + embedding_cosine × 0.7
|
|
198
|
+
* total = sqrt(signalInput) × qualityBase
|
|
199
|
+
*
|
|
200
|
+
* The lexical score (Jaccard) still serves as the keyword gate signal
|
|
201
|
+
* (`breakdown.keyword`) and anchors exact technology term matches.
|
|
202
|
+
* The embedding cosine similarity provides the dominant semantic signal
|
|
203
|
+
* without requiring a hand-curated taxonomy.
|
|
204
|
+
*
|
|
205
|
+
* Vectors must be L2-normalized (produced by LocalEmbeddingProvider
|
|
206
|
+
* with `normalize: true`), so cosine similarity equals the dot product.
|
|
207
|
+
*/
|
|
208
|
+
export function compositeScoreWithEmbedding(profile, job, profileVec, jobVec) {
|
|
209
|
+
const kw = scoreKeyword(profile, job);
|
|
210
|
+
const embed = cosineSimilarity(profileVec, jobVec);
|
|
211
|
+
const experience = scoreExperience(profile, job);
|
|
212
|
+
const salary = scoreSalary(profile, job);
|
|
213
|
+
const work_mode = scoreWorkMode(profile, job);
|
|
214
|
+
const qualityBase = experience * QUALITY_WEIGHTS.experience +
|
|
215
|
+
salary * QUALITY_WEIGHTS.salary +
|
|
216
|
+
work_mode * QUALITY_WEIGHTS.work_mode;
|
|
217
|
+
const signalInput = kw.score * EMBEDDING_MATCHING.WEIGHTS.LEXICAL +
|
|
218
|
+
embed * EMBEDDING_MATCHING.WEIGHTS.SEMANTIC;
|
|
219
|
+
const signal = Math.sqrt(signalInput);
|
|
220
|
+
const total = roundScore(signal * qualityBase);
|
|
221
|
+
return {
|
|
222
|
+
total,
|
|
223
|
+
breakdown: { keyword: kw.score, embedding: embed, experience, salary, work_mode },
|
|
224
|
+
matched: kw.matched,
|
|
225
|
+
gaps: kw.gaps,
|
|
226
|
+
};
|
|
227
|
+
}
|
|
192
228
|
function roundScore(n) {
|
|
193
229
|
return Math.round(n * 10_000) / 10_000;
|
|
194
230
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scoring.js","sourceRoot":"","sources":["../../src/matching/scoring.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAQH,OAAO,EACL,cAAc,EACd,YAAY,EACZ,aAAa,EACb,SAAS,GACV,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"scoring.js","sourceRoot":"","sources":["../../src/matching/scoring.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scripts/download-model.ts — One-time embedding model download.
|
|
3
|
+
*
|
|
4
|
+
* Run once on the target server after deploying careerclaw-js:
|
|
5
|
+
*
|
|
6
|
+
* node --env-file=.env node_modules/careerclaw-js/dist/scripts/download-model.js
|
|
7
|
+
*
|
|
8
|
+
* Configuration is read from the same env vars and defaults as the runtime
|
|
9
|
+
* (CAREERCLAW_EMBEDDING_MODEL_DIR, CAREERCLAW_EMBEDDING_MODEL), so the
|
|
10
|
+
* downloaded model is always in the location the worker expects.
|
|
11
|
+
*
|
|
12
|
+
* The model files are written to:
|
|
13
|
+
* <CAREERCLAW_EMBEDDING_MODEL_DIR>/<org>/<model-name>/
|
|
14
|
+
*
|
|
15
|
+
* This directory persists across npm installs — it is entirely independent
|
|
16
|
+
* of the careerclaw-js package lifecycle.
|
|
17
|
+
*
|
|
18
|
+
* After download, ensure your worker .env contains:
|
|
19
|
+
* CAREERCLAW_EMBEDDING_PROVIDER=local
|
|
20
|
+
* CAREERCLAW_EMBEDDING_MODEL_DIR=<same value used here>
|
|
21
|
+
*/
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=download-model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"download-model.d.ts","sourceRoot":"","sources":["../../src/scripts/download-model.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scripts/download-model.ts — One-time embedding model download.
|
|
3
|
+
*
|
|
4
|
+
* Run once on the target server after deploying careerclaw-js:
|
|
5
|
+
*
|
|
6
|
+
* node --env-file=.env node_modules/careerclaw-js/dist/scripts/download-model.js
|
|
7
|
+
*
|
|
8
|
+
* Configuration is read from the same env vars and defaults as the runtime
|
|
9
|
+
* (CAREERCLAW_EMBEDDING_MODEL_DIR, CAREERCLAW_EMBEDDING_MODEL), so the
|
|
10
|
+
* downloaded model is always in the location the worker expects.
|
|
11
|
+
*
|
|
12
|
+
* The model files are written to:
|
|
13
|
+
* <CAREERCLAW_EMBEDDING_MODEL_DIR>/<org>/<model-name>/
|
|
14
|
+
*
|
|
15
|
+
* This directory persists across npm installs — it is entirely independent
|
|
16
|
+
* of the careerclaw-js package lifecycle.
|
|
17
|
+
*
|
|
18
|
+
* After download, ensure your worker .env contains:
|
|
19
|
+
* CAREERCLAW_EMBEDDING_PROVIDER=local
|
|
20
|
+
* CAREERCLAW_EMBEDDING_MODEL_DIR=<same value used here>
|
|
21
|
+
*/
|
|
22
|
+
import { existsSync, mkdirSync } from "node:fs";
|
|
23
|
+
import { EMBEDDING_MODEL_DIR, EMBEDDING_MODEL_NAME } from "../config.js";
|
|
24
|
+
// Re-use the exact same defaults as the runtime so the paths always match.
|
|
25
|
+
// If CAREERCLAW_EMBEDDING_MODEL_DIR is unset, both this script and
|
|
26
|
+
// warmEmbeddingProvider() resolve to the same HOME-relative path.
|
|
27
|
+
const modelDir = EMBEDDING_MODEL_DIR;
|
|
28
|
+
const modelName = EMBEDDING_MODEL_NAME;
|
|
29
|
+
async function main() {
|
|
30
|
+
console.log(`[careerclaw] Downloading model: ${modelName}`);
|
|
31
|
+
console.log(`[careerclaw] Target directory: ${modelDir}`);
|
|
32
|
+
if (!existsSync(modelDir)) {
|
|
33
|
+
mkdirSync(modelDir, { recursive: true });
|
|
34
|
+
console.log(`[careerclaw] Created directory: ${modelDir}`);
|
|
35
|
+
}
|
|
36
|
+
const { env, pipeline } = await import("@xenova/transformers");
|
|
37
|
+
env.cacheDir = modelDir;
|
|
38
|
+
env.allowRemoteModels = true; // allow download — this is the setup script
|
|
39
|
+
env.allowLocalModels = true;
|
|
40
|
+
console.log("[careerclaw] Fetching model files from Hugging Face Hub...");
|
|
41
|
+
await pipeline("feature-extraction", modelName, { quantized: true });
|
|
42
|
+
console.log("[careerclaw] Model downloaded successfully.");
|
|
43
|
+
console.log("[careerclaw] Add to your worker .env:");
|
|
44
|
+
console.log(` CAREERCLAW_EMBEDDING_PROVIDER=local`);
|
|
45
|
+
console.log(` CAREERCLAW_EMBEDDING_MODEL_DIR=${modelDir}`);
|
|
46
|
+
}
|
|
47
|
+
main().catch((err) => {
|
|
48
|
+
console.error("[careerclaw] Download failed:", err instanceof Error ? err.message : String(err));
|
|
49
|
+
process.exit(1);
|
|
50
|
+
});
|
|
51
|
+
//# sourceMappingURL=download-model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"download-model.js","sourceRoot":"","sources":["../../src/scripts/download-model.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEzE,2EAA2E;AAC3E,mEAAmE;AACnE,kEAAkE;AAClE,MAAM,QAAQ,GAAG,mBAAmB,CAAC;AACrC,MAAM,SAAS,GAAG,oBAAoB,CAAC;AAEvC,KAAK,UAAU,IAAI;IACjB,OAAO,CAAC,GAAG,CAAC,mCAAmC,SAAS,EAAE,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,mCAAmC,QAAQ,EAAE,CAAC,CAAC;IAE3D,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,mCAAmC,QAAQ,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;IAE/D,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACxB,GAAG,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC,4CAA4C;IAC1E,GAAG,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAE5B,OAAO,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC;IAE1E,MAAM,QAAQ,CAAC,oBAAoB,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAErE,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,oCAAoC,QAAQ,EAAE,CAAC,CAAC;AAC9D,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACjG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "careerclaw-js",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.11.1",
|
|
4
4
|
"description": "AI-powered job search automation for ClawOS, with a standalone Node.js runtime for local/manual workflows",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
8
8
|
"bin": {
|
|
9
|
-
"careerclaw-js": "dist/cli.js"
|
|
9
|
+
"careerclaw-js": "dist/cli.js",
|
|
10
|
+
"careerclaw-download-model": "dist/scripts/download-model.js"
|
|
10
11
|
},
|
|
11
12
|
"scripts": {
|
|
12
13
|
"build": "tsc",
|
|
@@ -59,6 +60,7 @@
|
|
|
59
60
|
"vitest": "^2.0.0"
|
|
60
61
|
},
|
|
61
62
|
"dependencies": {
|
|
63
|
+
"@xenova/transformers": "^2.17.0",
|
|
62
64
|
"fast-xml-parser": "^5.5.7"
|
|
63
65
|
},
|
|
64
66
|
"exports": {
|
|
@@ -70,6 +72,9 @@
|
|
|
70
72
|
"types": "./dist/cli.d.ts",
|
|
71
73
|
"import": "./dist/cli.js"
|
|
72
74
|
},
|
|
75
|
+
"./scripts/download-model": {
|
|
76
|
+
"import": "./dist/scripts/download-model.js"
|
|
77
|
+
},
|
|
73
78
|
"./package.json": "./package.json"
|
|
74
79
|
}
|
|
75
80
|
}
|