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.
Files changed (54) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/SKILL.md +1 -1
  3. package/dist/briefing.d.ts.map +1 -1
  4. package/dist/briefing.js +13 -5
  5. package/dist/briefing.js.map +1 -1
  6. package/dist/config.d.ts +32 -1
  7. package/dist/config.d.ts.map +1 -1
  8. package/dist/config.js +36 -1
  9. package/dist/config.js.map +1 -1
  10. package/dist/embedding/cosine.d.ts +13 -0
  11. package/dist/embedding/cosine.d.ts.map +1 -0
  12. package/dist/embedding/cosine.js +19 -0
  13. package/dist/embedding/cosine.js.map +1 -0
  14. package/dist/embedding/index.d.ts +10 -0
  15. package/dist/embedding/index.d.ts.map +1 -0
  16. package/dist/embedding/index.js +9 -0
  17. package/dist/embedding/index.js.map +1 -0
  18. package/dist/embedding/local-provider.d.ts +57 -0
  19. package/dist/embedding/local-provider.d.ts.map +1 -0
  20. package/dist/embedding/local-provider.js +94 -0
  21. package/dist/embedding/local-provider.js.map +1 -0
  22. package/dist/embedding/provider.d.ts +22 -0
  23. package/dist/embedding/provider.d.ts.map +1 -0
  24. package/dist/embedding/provider.js +9 -0
  25. package/dist/embedding/provider.js.map +1 -0
  26. package/dist/embedding/singleton.d.ts +36 -0
  27. package/dist/embedding/singleton.d.ts.map +1 -0
  28. package/dist/embedding/singleton.js +70 -0
  29. package/dist/embedding/singleton.js.map +1 -0
  30. package/dist/embedding/text-builder.d.ts +21 -0
  31. package/dist/embedding/text-builder.d.ts.map +1 -0
  32. package/dist/embedding/text-builder.js +42 -0
  33. package/dist/embedding/text-builder.js.map +1 -0
  34. package/dist/index.d.ts +2 -0
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +1 -0
  37. package/dist/index.js.map +1 -1
  38. package/dist/matching/engine.d.ts +17 -0
  39. package/dist/matching/engine.d.ts.map +1 -1
  40. package/dist/matching/engine.js +30 -1
  41. package/dist/matching/engine.js.map +1 -1
  42. package/dist/matching/index.d.ts +3 -2
  43. package/dist/matching/index.d.ts.map +1 -1
  44. package/dist/matching/index.js +2 -2
  45. package/dist/matching/index.js.map +1 -1
  46. package/dist/matching/scoring.d.ts +24 -0
  47. package/dist/matching/scoring.d.ts.map +1 -1
  48. package/dist/matching/scoring.js +37 -1
  49. package/dist/matching/scoring.js.map +1 -1
  50. package/dist/scripts/download-model.d.ts +23 -0
  51. package/dist/scripts/download-model.d.ts.map +1 -0
  52. package/dist/scripts/download-model.js +51 -0
  53. package/dist/scripts/download-model.js.map +1 -0
  54. 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
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: CareerClaw
3
- version: 1.10.1
3
+ version: 1.11.1
4
4
  description: >
5
5
  Run a job search briefing, find job matches, draft outreach emails,
6
6
  or track job applications. Triggers on: daily briefing, job search,
@@ -1 +1 @@
1
- {"version":3,"file":"briefing.d.ts","sourceRoot":"","sources":["../src/briefing.ts"],"names":[],"mappings":"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"}
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
- : SEMANTIC_MATCHING.ENABLED
70
- ? await rankJobsHybrid(jobs, profile, {
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
- : rankJobs(jobs, profile, clampedTopK);
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) => {
@@ -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.10.1 (https://github.com/orestes-garcia-martinez/careerclaw-js)";
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
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAeH,eAAO,MAAM,cAAc,EAAE,MAGS,CAAC;AAEvC,eAAO,MAAM,YAAY,EAAE,MAA6C,CAAC;AACzE,eAAO,MAAM,aAAa,EAAE,MAA8C,CAAC;AAC3E,eAAO,MAAM,SAAS,EAAE,MAA2C,CAAC;AACpE,eAAO,MAAM,eAAe,EAAE,MAA2C,CAAC;AAC1E,eAAO,MAAM,eAAe,EAAE,MAA2C,CAAC;AAC1E,eAAO,MAAM,kBAAkB,EAAE,MAGhC,CAAC;AAMF,+DAA+D;AAC/D,eAAO,MAAM,eAAe,QAAS,CAAC;AAEtC;;;GAGG;AACH,eAAO,MAAM,UAAU,oFAC2D,CAAC;AAMnF,oDAAoD;AACpD,eAAO,MAAM,gBAAgB,yCAAyC,CAAC;AAEvE;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAGjC,CAAC;AAEF,2DAA2D;AAC3D,eAAO,MAAM,WAAW,0CAA0C,CAAC;AAEnE,kEAAkE;AAClE,eAAO,MAAM,eAAe,MAAM,CAAC;AAEnC,mCAAmC;AACnC,eAAO,MAAM,gBAAgB,oCAAoC,CAAC;AAElE,0DAA0D;AAC1D,eAAO,MAAM,eAAe,EAAE,MAAM,GAAG,SACW,CAAC;AAEnD;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,EAAE,OAES,CAAC;AAEpD,6EAA6E;AAC7E,eAAO,MAAM,6BAA6B,EAAE,MAG3C,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,4BAA4B,EAAE,OACoC,CAAC;AAEhF,8DAA8D;AAC9D,eAAO,MAAM,sBAAsB,EAAE,MACoB,CAAC;AAE1D,eAAO,MAAM,sBAAsB,EAAE,MACoB,CAAC;AAE1D;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,6BAA6B,EAAE,MAG3C,CAAC;AAMF,uEAAuE;AACvE,eAAO,MAAM,aAAa,IAAI,CAAC;AAE/B,wCAAwC;AACxC,eAAO,MAAM,UAAU,IAAI,CAAC;AAE5B,uCAAuC;AACvC,eAAO,MAAM,SAAS,KAAK,CAAC;AAM5B,eAAO,MAAM,iBAAiB;;IAG7B;;;;;;;;;OASG;;;;;IAMH;;;;;;;;;;;;;;;;OAgBG;;;;;CAKM,CAAC;AAMX;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,GAAG,SACD,CAAC;AAEzC,eAAO,MAAM,cAAc,EAAE,MAAM,GAAG,SACD,CAAC;AAEtC;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,MAAM,GAAG,SAA6C,CAAC;AAEjF,qEAAqE;AACrE,eAAO,MAAM,YAAY,EAAE,MAC2B,CAAC;AAEvD,yEAAyE;AACzE,eAAO,MAAM,SAAS,EAAE,MAC2C,CAAC;AAEpE;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,MAEiC,CAAC;AAE1D,8DAA8D;AAC9D,eAAO,MAAM,eAAe,EAAE,MAG7B,CAAC;AAEF,6DAA6D;AAC7D,eAAO,MAAM,yBAAyB,EAAE,MAGvC,CAAC;AAMF,6FAA6F;AAC7F,eAAO,MAAM,OAAO,EAAE,MAAM,GAAG,SAA6C,CAAC;AAM7E;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,6BAA6B,CAAC;AAE7D,iDAAiD;AACjD,eAAO,MAAM,gBAAgB,4BAA4B,CAAC;AAE1D;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,QAA0B,CAAC;AAO5D,kFAAkF;AAClF,eAAO,MAAM,kBAAkB,QAC0B,CAAC;AAE1D,+EAA+E;AAC/E,eAAO,MAAM,cAAc,yBAAyB,CAAC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAgBH,eAAO,MAAM,cAAc,EAAE,MAGS,CAAC;AAEvC,eAAO,MAAM,YAAY,EAAE,MAA6C,CAAC;AACzE,eAAO,MAAM,aAAa,EAAE,MAA8C,CAAC;AAC3E,eAAO,MAAM,SAAS,EAAE,MAA2C,CAAC;AACpE,eAAO,MAAM,eAAe,EAAE,MAA2C,CAAC;AAC1E,eAAO,MAAM,eAAe,EAAE,MAA2C,CAAC;AAC1E,eAAO,MAAM,kBAAkB,EAAE,MAGhC,CAAC;AAMF,+DAA+D;AAC/D,eAAO,MAAM,eAAe,QAAS,CAAC;AAEtC;;;GAGG;AACH,eAAO,MAAM,UAAU,oFAC2D,CAAC;AAMnF,oDAAoD;AACpD,eAAO,MAAM,gBAAgB,yCAAyC,CAAC;AAEvE;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAGjC,CAAC;AAEF,2DAA2D;AAC3D,eAAO,MAAM,WAAW,0CAA0C,CAAC;AAEnE,kEAAkE;AAClE,eAAO,MAAM,eAAe,MAAM,CAAC;AAEnC,mCAAmC;AACnC,eAAO,MAAM,gBAAgB,oCAAoC,CAAC;AAElE,0DAA0D;AAC1D,eAAO,MAAM,eAAe,EAAE,MAAM,GAAG,SACW,CAAC;AAEnD;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,EAAE,OAES,CAAC;AAEpD,6EAA6E;AAC7E,eAAO,MAAM,6BAA6B,EAAE,MAG3C,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,4BAA4B,EAAE,OACoC,CAAC;AAEhF,8DAA8D;AAC9D,eAAO,MAAM,sBAAsB,EAAE,MACoB,CAAC;AAE1D,eAAO,MAAM,sBAAsB,EAAE,MACoB,CAAC;AAE1D;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,6BAA6B,EAAE,MAG3C,CAAC;AAMF,uEAAuE;AACvE,eAAO,MAAM,aAAa,IAAI,CAAC;AAE/B,wCAAwC;AACxC,eAAO,MAAM,UAAU,IAAI,CAAC;AAE5B,uCAAuC;AACvC,eAAO,MAAM,SAAS,KAAK,CAAC;AAM5B;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,EAAE,OAAO,GAAG,MACkC,CAAC;AAE9E;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAE4C,CAAC;AAE/E,gEAAgE;AAChE,eAAO,MAAM,oBAAoB,EAAE,MACqC,CAAC;AAEzE;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB;;;;;CAKrB,CAAC;AAMX,eAAO,MAAM,iBAAiB;;IAG7B;;;;;;;;;OASG;;;;;IAMH;;;;;;;;;;;;;;;;OAgBG;;;;;CAKM,CAAC;AAMX;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,GAAG,SACD,CAAC;AAEzC,eAAO,MAAM,cAAc,EAAE,MAAM,GAAG,SACD,CAAC;AAEtC;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,MAAM,GAAG,SAA6C,CAAC;AAEjF,qEAAqE;AACrE,eAAO,MAAM,YAAY,EAAE,MAC2B,CAAC;AAEvD,yEAAyE;AACzE,eAAO,MAAM,SAAS,EAAE,MAC2C,CAAC;AAEpE;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,MAEiC,CAAC;AAE1D,8DAA8D;AAC9D,eAAO,MAAM,eAAe,EAAE,MAG7B,CAAC;AAEF,6DAA6D;AAC7D,eAAO,MAAM,yBAAyB,EAAE,MAGvC,CAAC;AAMF,6FAA6F;AAC7F,eAAO,MAAM,OAAO,EAAE,MAAM,GAAG,SAA6C,CAAC;AAM7E;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,6BAA6B,CAAC;AAE7D,iDAAiD;AACjD,eAAO,MAAM,gBAAgB,4BAA4B,CAAC;AAE1D;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,QAA0B,CAAC;AAO5D,kFAAkF;AAClF,eAAO,MAAM,kBAAkB,QAC0B,CAAC;AAE1D,+EAA+E;AAC/E,eAAO,MAAM,cAAc,yBAAyB,CAAC"}
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.10.1 (https://github.com/orestes-garcia-martinez/careerclaw-js)";
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 = {
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -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
@@ -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
@@ -8,4 +8,5 @@ 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";
11
12
  //# sourceMappingURL=index.js.map
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;AAQtB;;;;;;;;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;AAGD;;;;;;;;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"}
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"}
@@ -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;AAEpE,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;;;;;;GAQG;AACH,MAAM,UAAU,QAAQ,CACtB,IAAqB,EACrB,OAAoB,EACpB,QAAgB,aAAa,EAC7B,kBAA0B,IAAI;IAE9B,OAAO,IAAI;SACR,GAAG,CAAC,CAAC,GAAG,EAAa,EAAE;QACtB,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACzE,OAAO;YACL,GAAG;YACH,KAAK,EAAE,KAAK;YACZ,SAAS;YACT,gBAAgB,EAAE,OAAO;YACzB,YAAY,EAAE,IAAI;SACnB,CAAC;IACJ,CAAC,CAAC;QACF,4DAA4D;SAC3D,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,IAAI,eAAe,CAAC;SAC/D,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;SACjC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AACrB,CAAC;AAGD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAqB,EACrB,OAAoB,EACpB,UAKI,EAAE;IAEN,MAAM,EACJ,UAAU,EACV,WAAW,EACX,KAAK,GAAG,aAAa,EACrB,eAAe,GAAG,IAAI,GACvB,GAAG,OAAO,CAAC;IAEZ,OAAO,IAAI;SACR,GAAG,CAAC,CAAC,GAAG,EAAa,EAAE;QACtB,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,oBAAoB,CAAC,OAAO,EAAE,GAAG,EAAE;YAC7E,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnD,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtD,CAAC,CAAC;QACH,OAAO;YACL,GAAG;YACH,KAAK,EAAE,KAAK;YACZ,SAAS;YACT,gBAAgB,EAAE,OAAO;YACzB,YAAY,EAAE,IAAI;SACnB,CAAC;IACJ,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,IAAI,eAAe,CAAC;SAC/D,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;SACjC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AACrB,CAAC"}
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/matching/engine.ts"],"names":[],"mappings":"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"}
@@ -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;AACvD,OAAO,EACL,YAAY,EACZ,eAAe,EACf,WAAW,EACX,aAAa,EACb,cAAc,EACd,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,cAAc,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"}
@@ -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;AACvD,OAAO,EACL,YAAY,EACZ,eAAe,EACf,WAAW,EACX,aAAa,EACb,cAAc,EACd,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,cAAc,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;AAoCtB,MAAM,WAAW,oBAAqB,SAAQ,cAAc;IAC1D,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;CAClB;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"}
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"}
@@ -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 { SEMANTIC_MATCHING } from "../config.js";
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":"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"}
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.10.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
  }