@cleocode/core 2026.9.13 → 2026.9.15

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 (47) hide show
  1. package/dist/docs/export-document.js +112 -8
  2. package/dist/docs/export-document.js.map +2 -2
  3. package/dist/lifecycle/kind-requirements.d.ts +35 -0
  4. package/dist/lifecycle/kind-requirements.d.ts.map +1 -0
  5. package/dist/lifecycle/kind-requirements.js +43 -0
  6. package/dist/lifecycle/kind-requirements.js.map +1 -0
  7. package/dist/llm/api-mode.d.ts +40 -0
  8. package/dist/llm/api-mode.d.ts.map +1 -1
  9. package/dist/llm/api-mode.js +57 -1
  10. package/dist/llm/api-mode.js.map +1 -1
  11. package/dist/llm/cli-ops.d.ts.map +1 -1
  12. package/dist/llm/cli-ops.js +9 -11
  13. package/dist/llm/cli-ops.js.map +1 -1
  14. package/dist/llm/plugin-facade.js +59 -1
  15. package/dist/llm/plugin-facade.js.map +2 -2
  16. package/dist/memory/brain-embedding.d.ts +47 -2
  17. package/dist/memory/brain-embedding.d.ts.map +1 -1
  18. package/dist/memory/brain-embedding.js +61 -2
  19. package/dist/memory/brain-embedding.js.map +1 -1
  20. package/dist/memory/embedding-local.d.ts +45 -1
  21. package/dist/memory/embedding-local.d.ts.map +1 -1
  22. package/dist/memory/embedding-local.js +81 -6
  23. package/dist/memory/embedding-local.js.map +1 -1
  24. package/dist/memory/retrieval/observe.d.ts +14 -0
  25. package/dist/memory/retrieval/observe.d.ts.map +1 -1
  26. package/dist/memory/retrieval/observe.js +50 -14
  27. package/dist/memory/retrieval/observe.js.map +1 -1
  28. package/dist/memory/transcript-extractor.d.ts +13 -0
  29. package/dist/memory/transcript-extractor.d.ts.map +1 -1
  30. package/dist/memory/transcript-extractor.js +28 -3
  31. package/dist/memory/transcript-extractor.js.map +1 -1
  32. package/dist/memory/transcript-scanner.d.ts +12 -1
  33. package/dist/memory/transcript-scanner.d.ts.map +1 -1
  34. package/dist/memory/transcript-scanner.js +9 -3
  35. package/dist/memory/transcript-scanner.js.map +1 -1
  36. package/dist/reconciliation/reconciliation-engine.d.ts.map +1 -1
  37. package/dist/reconciliation/reconciliation-engine.js +8 -0
  38. package/dist/reconciliation/reconciliation-engine.js.map +1 -1
  39. package/dist/resources/spawn-wrapper.d.ts.map +1 -1
  40. package/dist/resources/spawn-wrapper.js +6 -3
  41. package/dist/resources/spawn-wrapper.js.map +1 -1
  42. package/dist/selfimprove/fix-gen.js +57 -1
  43. package/dist/selfimprove/fix-gen.js.map +2 -2
  44. package/dist/tasks/complete.d.ts.map +1 -1
  45. package/dist/tasks/complete.js +8 -1
  46. package/dist/tasks/complete.js.map +1 -1
  47. package/package.json +23 -13
@@ -613,6 +613,13 @@ var init_cli_category = __esm({
613
613
  }
614
614
  });
615
615
 
616
+ // packages/contracts/src/code-symbol.ts
617
+ var init_code_symbol = __esm({
618
+ "packages/contracts/src/code-symbol.ts"() {
619
+ "use strict";
620
+ }
621
+ });
622
+
616
623
  // packages/contracts/src/config/manifest.ts
617
624
  import { z as z4 } from "zod";
618
625
  var PROJECT_INFO_MANIFEST, PROJECT_CONTEXT_MANIFEST, CLEO_CONFIG_MANIFEST, GLOBAL_CLEO_CONFIG_MANIFEST, CONFIG_MANIFEST_ENTRIES, configManifestEntrySchema;
@@ -13526,6 +13533,40 @@ var init_invariants = __esm({
13526
13533
  }
13527
13534
  });
13528
13535
 
13536
+ // packages/contracts/src/kind-lifecycle.ts
13537
+ var KIND_LIFECYCLE_REQUIREMENTS;
13538
+ var init_kind_lifecycle = __esm({
13539
+ "packages/contracts/src/kind-lifecycle.ts"() {
13540
+ "use strict";
13541
+ KIND_LIFECYCLE_REQUIREMENTS = Object.freeze({
13542
+ work: {
13543
+ requiresStagedPipeline: true,
13544
+ rationale: "Default delivery work. The staged pipeline exists for exactly this: decide the design before completing the code that implements it."
13545
+ },
13546
+ bug: {
13547
+ requiresStagedPipeline: false,
13548
+ rationale: "A fix operates inside an existing design. Demanding consensus and architecture_decision before a fix can complete describes work that is not happening."
13549
+ },
13550
+ research: {
13551
+ requiresStagedPipeline: false,
13552
+ rationale: "The research IS the work. Requiring the epic to pass the research stage before its own research children can complete is circular."
13553
+ },
13554
+ spike: {
13555
+ requiresStagedPipeline: false,
13556
+ rationale: "A time-boxed exploration whose purpose is to produce the information the design stages would consume. It cannot be gated on having already done so."
13557
+ },
13558
+ experiment: {
13559
+ requiresStagedPipeline: false,
13560
+ rationale: "An experiment is run to learn whether an approach holds. Specifying and decomposing it first presumes the answer."
13561
+ },
13562
+ release: {
13563
+ requiresStagedPipeline: false,
13564
+ rationale: "Release epics are procedural \u2014 the design work they ship was decided in the epics being released."
13565
+ }
13566
+ });
13567
+ }
13568
+ });
13569
+
13529
13570
  // packages/contracts/src/lafs.ts
13530
13571
  var init_lafs = __esm({
13531
13572
  "packages/contracts/src/lafs.ts"() {
@@ -16813,6 +16854,7 @@ var init_src = __esm({
16813
16854
  init_branch_lock();
16814
16855
  init_changesets();
16815
16856
  init_cli_category();
16857
+ init_code_symbol();
16816
16858
  init_manifest();
16817
16859
  init_credentials();
16818
16860
  init_daemon();
@@ -16833,6 +16875,7 @@ var init_src = __esm({
16833
16875
  init_goal();
16834
16876
  init_graph();
16835
16877
  init_invariants();
16878
+ init_kind_lifecycle();
16836
16879
  init_lafs();
16837
16880
  init_lease_ipc();
16838
16881
  init_catalog_schema();
@@ -34914,13 +34957,33 @@ var init_config = __esm({
34914
34957
  var embedding_local_exports = {};
34915
34958
  __export(embedding_local_exports, {
34916
34959
  LocalEmbeddingProvider: () => LocalEmbeddingProvider,
34917
- getLocalEmbeddingProvider: () => getLocalEmbeddingProvider
34960
+ __resetLocalEmbeddingStateForTests: () => __resetLocalEmbeddingStateForTests,
34961
+ getLocalEmbeddingProvider: () => getLocalEmbeddingProvider,
34962
+ isEmbeddingPipelineLoaded: () => isEmbeddingPipelineLoaded
34918
34963
  });
34919
34964
  async function loadPipeline() {
34920
34965
  if (_ready) return;
34921
- const { pipeline } = await import("@huggingface/transformers");
34922
- _pipeline = await pipeline("feature-extraction", MODEL_NAME);
34923
- _ready = true;
34966
+ if (_loadFailed) {
34967
+ throw new Error(`Local embedding pipeline is unavailable in this process: ${_loadError}`);
34968
+ }
34969
+ try {
34970
+ const { pipeline } = await import("@huggingface/transformers");
34971
+ _pipeline = await pipeline("feature-extraction", MODEL_NAME);
34972
+ _ready = true;
34973
+ } catch (err) {
34974
+ _loadFailed = true;
34975
+ _loadError = err instanceof Error ? err.message : String(err);
34976
+ throw err;
34977
+ }
34978
+ }
34979
+ function isEmbeddingPipelineLoaded() {
34980
+ return _ready;
34981
+ }
34982
+ function __resetLocalEmbeddingStateForTests() {
34983
+ _pipeline = null;
34984
+ _ready = false;
34985
+ _loadFailed = false;
34986
+ _loadError = null;
34924
34987
  }
34925
34988
  function getLocalEmbeddingProvider() {
34926
34989
  if (!_instance) {
@@ -34928,7 +34991,7 @@ function getLocalEmbeddingProvider() {
34928
34991
  }
34929
34992
  return _instance;
34930
34993
  }
34931
- var MODEL_NAME, _pipeline, _ready, LocalEmbeddingProvider, _instance;
34994
+ var MODEL_NAME, _pipeline, _ready, _loadFailed, _loadError, LocalEmbeddingProvider, _instance;
34932
34995
  var init_embedding_local = __esm({
34933
34996
  "packages/core/src/memory/embedding-local.ts"() {
34934
34997
  "use strict";
@@ -34936,14 +34999,41 @@ var init_embedding_local = __esm({
34936
34999
  MODEL_NAME = "Xenova/all-MiniLM-L6-v2";
34937
35000
  _pipeline = null;
34938
35001
  _ready = false;
35002
+ _loadFailed = false;
35003
+ _loadError = null;
34939
35004
  LocalEmbeddingProvider = class {
34940
35005
  /** Number of dimensions produced — must match brain_embeddings vec0 table. */
34941
35006
  dimensions = EMBEDDING_DIMENSIONS;
34942
35007
  /**
34943
- * Whether the pipeline has been successfully initialized and is ready to produce embeddings.
35008
+ * Whether this provider CAN produce embeddings — not whether it already has.
35009
+ *
35010
+ * ## The deadlock this fixes (gh#1217)
35011
+ *
35012
+ * This previously returned `_ready`, the "pipeline has loaded" flag. But
35013
+ * `_ready` is set only by `loadPipeline()`, which runs only inside
35014
+ * {@link embed} — and every caller of `embed` first checks `isAvailable()`.
35015
+ * In any fresh CLI process `_ready` is false, so nothing ever called
35016
+ * `embed`, so `_ready` never became true. **The readiness check could only
35017
+ * be satisfied by the call it guarded.**
35018
+ *
35019
+ * The observable result was total, silent inertness: `cleo brain
35020
+ * maintenance` reported `{processed: 0, skipped: 0, errors: 0}` forever,
35021
+ * `brain_embeddings` stayed empty after dozens of observations, new writes
35022
+ * were never embedded, and every hybrid search quietly degraded to FTS5 —
35023
+ * while `brain.embedding.enabled` was true and the provider itself was
35024
+ * perfectly healthy when called directly.
35025
+ *
35026
+ * Availability is therefore capability: this provider can load its pipeline
35027
+ * on demand, and says so until a load actually fails. The ~22 MB first-call
35028
+ * download is the expected cost of the lazy design, not a reason to refuse
35029
+ * to begin.
35030
+ *
35031
+ * @returns `true` unless loading the pipeline has already failed here.
35032
+ *
35033
+ * @task T12129 (gh#1217)
34944
35034
  */
34945
35035
  isAvailable() {
34946
- return _ready;
35036
+ return !_loadFailed;
34947
35037
  }
34948
35038
  /**
34949
35039
  * Convert a single text string into a 384-dimension float vector.
@@ -34983,6 +35073,7 @@ __export(brain_embedding_exports, {
34983
35073
  EMBEDDING_DIMENSIONS: () => EMBEDDING_DIMENSIONS,
34984
35074
  clearEmbeddingProvider: () => clearEmbeddingProvider,
34985
35075
  embedText: () => embedText,
35076
+ ensureEmbeddingProvider: () => ensureEmbeddingProvider,
34986
35077
  getEmbeddingProvider: () => getEmbeddingProvider,
34987
35078
  initDefaultProvider: () => initDefaultProvider,
34988
35079
  isEmbeddingAvailable: () => isEmbeddingAvailable,
@@ -35004,7 +35095,11 @@ function clearEmbeddingProvider() {
35004
35095
  }
35005
35096
  async function embedText(text2) {
35006
35097
  if (!currentProvider?.isAvailable()) return null;
35007
- return currentProvider.embed(text2);
35098
+ try {
35099
+ return await currentProvider.embed(text2);
35100
+ } catch {
35101
+ return null;
35102
+ }
35008
35103
  }
35009
35104
  function isEmbeddingAvailable() {
35010
35105
  return currentProvider?.isAvailable() ?? false;
@@ -35014,6 +35109,15 @@ async function initDefaultProvider() {
35014
35109
  const provider = new LocalEmbeddingProvider2();
35015
35110
  setEmbeddingProvider(provider);
35016
35111
  }
35112
+ async function ensureEmbeddingProvider() {
35113
+ if (currentProvider !== null) return true;
35114
+ try {
35115
+ await initDefaultProvider();
35116
+ } catch {
35117
+ return false;
35118
+ }
35119
+ return currentProvider !== null;
35120
+ }
35017
35121
  var EMBEDDING_DIMENSIONS, currentProvider;
35018
35122
  var init_brain_embedding = __esm({
35019
35123
  "packages/core/src/memory/brain-embedding.ts"() {