leerness 1.9.196 β 1.9.198
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 +104 -0
- package/README.md +3 -3
- package/bin/harness.js +104 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,109 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.9.198 β 2026-05-21
|
|
4
|
+
|
|
5
|
+
**π€ BμΆ 9/10 β 9.5/10 β handoff multi-agent consensus μ΄λ ₯ κΈ°λ° best agent μλ μΆμ².**
|
|
6
|
+
|
|
7
|
+
μμ¨ λͺ¨λ 128 λΌμ΄λ. 1.9.193 consensus μλ lessons.md μ μ₯ (BμΆ) νμ β μ μ₯ν λ°μ΄ν°λ₯Ό **handoff μμ μ¦μ μ¬νμ©**.
|
|
8
|
+
|
|
9
|
+
### μ¬μ©μ μλ μ λ ¬ (1.9.191 verbatim)
|
|
10
|
+
> *"λ©ν° μλΈ μμ΄μ νΈ μ€μΌμ€νΈλΌ ... μ΅κ³ μ λꡬ"*
|
|
11
|
+
|
|
12
|
+
### 1. handoff μ κ· μΉμ
(BμΆ ν΅μ¬)
|
|
13
|
+
```
|
|
14
|
+
## π€ task λ§€μΉ best agent (1.9.198 BμΆ) β ν€μλ "authentication"
|
|
15
|
+
κ³Όκ±° multi-agent consensus 2건 β μΆμ² agent: claude (1ν best)
|
|
16
|
+
μ΅κ·Ό hit: 2026-05-20 agent=claude score=0.873
|
|
17
|
+
β μ¬μ€ν: leerness agents multi "<task>" --execute
|
|
18
|
+
```
|
|
19
|
+
- lessons.md μ 1.9.193 `multi-agent consensus β best=X (1.9.193)` ν¨ν΄ μλ μΆμΆ
|
|
20
|
+
- keyword fuzzy λ§€μΉμΌλ‘ κ΄λ ¨ hits μ λ³
|
|
21
|
+
- agent λ³ λΉλ μΉ΄μ΄νΈ β μ΅λ€ best agent μλ λ
ΈμΆ
|
|
22
|
+
- λκΈ°: `--no-multiagent-hint` λλ `LEERNESS_NO_MULTIAGENT_HINT=1`
|
|
23
|
+
|
|
24
|
+
### 2. μ κ· ν¨μ
|
|
25
|
+
- `_loadMultiAgentConsensusHistory(root, keyword)` β lessons.md 1.9.193 ν¨ν΄ μΆμΆ + fuzzy λ§€μΉ
|
|
26
|
+
|
|
27
|
+
### 3. λμ νκ· (1.9.192~197) β λͺ¨λ μ μ§
|
|
28
|
+
- [1.9.197] _readyBackendCountFromCache (60λΆ μΊμ + ν€λλΌμΈ)
|
|
29
|
+
- [1.9.196] DμΆ 7μΌ+/30μΌ+ recall + ScheduleWakeup miss detector
|
|
30
|
+
- [1.9.195] _probeProviderEndpoints (provider universal probe)
|
|
31
|
+
- [1.9.194] _suggestNextActions (handoff next-actions)
|
|
32
|
+
- [1.9.193] agents multi consensus β lessons.md
|
|
33
|
+
- [1.9.192] _loadOfficialSkillCache + 24h μΊμ
|
|
34
|
+
|
|
35
|
+
### 4. stress-v143 β 14/14 PASS
|
|
36
|
+
- BμΆ λ³΄κ° (5: ν¨μ + μΉμ
+ μμ μν¬μ€νμ΄μ€ ν΅ν© κ²μ¦ + λΉλ μΉ΄μ΄νΈ)
|
|
37
|
+
- μ±λ₯: --version cold start avg **500 ms** Β· MCP 54 λꡬ **494 ms**
|
|
38
|
+
|
|
39
|
+
### 5. 5μΆ λ§€νΈλ¦μ€ λ³λ
|
|
40
|
+
| μΆ | 1.9.197 | 1.9.198 | Ξ |
|
|
41
|
+
|---|---|---|---|
|
|
42
|
+
| B. λ©ν° Sub-Agent μ€μΌμ€νΈλΌ | 9/10 | **9.5/10** | +0.5 (consensus μ΄λ ₯ μλ νμ) |
|
|
43
|
+
| μ’
ν© | 47.5/50 (95%) | **48/50 (96%)** | +1% |
|
|
44
|
+
|
|
45
|
+
### 6. μ¬μ©μ λͺ
μ μ‘°μΉ
|
|
46
|
+
- Cron `10dcaa07` (hourly :17 backup) μ¬μ©μ μμ²μΌλ‘ μμ
|
|
47
|
+
- μλ 루νλ **ScheduleWakeup 1500s (25λΆ, R-0001 μꡬ λ£°)** λ¨λ
μ΄μ
|
|
48
|
+
|
|
49
|
+
### 7. μλ release νλ¦
|
|
50
|
+
- main μλ push **60 λΌμ΄λ μ°μ** (1.9.140~198)
|
|
51
|
+
- npm publish μλ (1.9.178~)
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## 1.9.197 β 2026-05-21
|
|
56
|
+
|
|
57
|
+
**π AμΆ 9.5/10 β 10/10 β provider probe handoff μλ ν΅ν© + 60λΆ μΊμ. 5μΆ λ§€νΈλ¦μ€ 47.5/50 (95%).**
|
|
58
|
+
|
|
59
|
+
μμ¨ λͺ¨λ 127 λΌμ΄λ. 1.9.196 DμΆ μμ±μ μ΄μ΄ **AμΆ 9.5 β 10/10** λ§μ§λ§ 보κ°.
|
|
60
|
+
|
|
61
|
+
### μ¬μ©μ μλ μ λ ¬ (1.9.191 verbatim)
|
|
62
|
+
> *"λ²μ© AI νλ€μ€ ... μ΅κ³ μ λꡬ"*
|
|
63
|
+
|
|
64
|
+
### 1. handoff ν€λλΌμΈ 11λ²μ§Έ μμ (1.9.197 μ κ·)
|
|
65
|
+
```
|
|
66
|
+
π ν€λλΌμΈ (1.9.81/93/113/152/162/192/197): ... Β· π backend 3/13 (0hβ)
|
|
67
|
+
```
|
|
68
|
+
- `π backend {ready}/{total} ({age}{status})`
|
|
69
|
+
- 13 ν보 = CLI 5 + Local endpoint 3 + Cloud API key 5
|
|
70
|
+
- 60λΆ μΊμ hit μ μ¦μ νμ (network λΆν X)
|
|
71
|
+
- μΊμ λ§λ£ μ `β ` νμ β μ¬μ©μ/AI κ° `provider probe` μ¬μ€ν μΈμ§
|
|
72
|
+
|
|
73
|
+
### 2. 60λΆ TTL μΊμ (1.9.197 μ κ·)
|
|
74
|
+
- νμΌ: `.harness/provider-probe-cache.json` (λΉμν¬λ¦Ώ, 체ν¬μΈ κ°λ₯)
|
|
75
|
+
- `_PROVIDER_PROBE_CACHE_TTL_MS = 60 * 60 * 1000`
|
|
76
|
+
- `provider probe` μ€ν μ μλ μ μ₯ (`--no-cache` λ‘ λκΈ°)
|
|
77
|
+
- ν¨μ: `_loadProviderProbeCache` / `_writeProviderProbeCache` / `_readyBackendCountFromCache`
|
|
78
|
+
|
|
79
|
+
### 3. λμ νκ· (1.9.191~196) β λͺ¨λ μ μ§
|
|
80
|
+
- [1.9.196] DμΆ 7μΌ+/30μΌ+ recall + ScheduleWakeup miss detector
|
|
81
|
+
- [1.9.195] _probeProviderEndpoints (provider universal probe)
|
|
82
|
+
- [1.9.194] _suggestNextActions (handoff next-actions)
|
|
83
|
+
- [1.9.193] agents multi consensus β lessons.md
|
|
84
|
+
- [1.9.192] _loadOfficialSkillCache + 24h μΊμ
|
|
85
|
+
- [1.9.191] ꡬ쑰 μ΅μ ν λ³΄κ³ μ 88/100
|
|
86
|
+
|
|
87
|
+
### 4. stress-v142 β 15/15 PASS
|
|
88
|
+
- AμΆ 9.5β10 λ³΄κ° (6: ν¨μ + μΊμ μλ μ μ₯ + ν€λλΌμΈ 11λ²μ§Έ + handoff ν΅ν© κ²μ¦)
|
|
89
|
+
- μ±λ₯: --version cold start avg **506 ms** Β· MCP 54 λꡬ **591 ms**
|
|
90
|
+
|
|
91
|
+
### 5. 5μΆ λ§€νΈλ¦μ€ (λͺ¨λ μΆ λ³΄κ° μλ£)
|
|
92
|
+
| μΆ | 1.9.191 | 1.9.197 | Ξ |
|
|
93
|
+
|---|---|---|---|
|
|
94
|
+
| A. λ²μ© AI νλ€μ€ | 9 | **10** | +1 (probe + handoff μλ) |
|
|
95
|
+
| B. λ©ν° Sub-Agent | 8.5 | **9** | +0.5 (consensus lessons) |
|
|
96
|
+
| C. 곡μ μ€ν¬ μλ | 8 | **9** | +1 (official catalog handoff) |
|
|
97
|
+
| D. μ₯κΈ° λ§₯λ½ μ μ§ | 9.5 | **10** | +0.5 (7μΌ+/30μΌ+ recall) |
|
|
98
|
+
| E. κ²μΌλ¦ λ°©μ§ | 9 | **9.5** | +0.5 (next-actions) |
|
|
99
|
+
| **μ’
ν©** | **44/50 (88%)** | **47.5/50 (95%)** | **+7%** π― |
|
|
100
|
+
|
|
101
|
+
### 6. μλ release νλ¦
|
|
102
|
+
- main μλ push **59 λΌμ΄λ μ°μ** (1.9.140~197)
|
|
103
|
+
- npm publish μλ (1.9.178~)
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
3
107
|
## 1.9.196 β 2026-05-21
|
|
4
108
|
|
|
5
109
|
**π DμΆ (μ₯κΈ° λ§₯λ½ μ μ§) λ³΄κ° β 7μΌ+ μ₯κΈ° μ 체 + 30μΌ+ lessons νκ³ + ScheduleWakeup miss detector.**
|
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> **AI μ½λ© μμ΄μ νΈμ κ±°μ§ μλ£Β·μ€λ³΅Β·λ§κ°Β·μΆ©λμ λ§μμ£Όλ κ²μΒ·κΈ°μ΅Β·νμ
CLI νλ€μ€.**
|
|
4
4
|
|
|
5
|
-
[](https://www.npmjs.com/package/leerness) [](https://www.npmjs.com/package/leerness) []() []() []() []() []() []() [-brightgreen)]() []() []() []() []() []()
|
|
6
6
|
|
|
7
7
|
```
|
|
8
8
|
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
@@ -12,9 +12,9 @@
|
|
|
12
12
|
β βββ ββββββ ββββββ ββββββββββββββββββββββββ ββββββββ β
|
|
13
13
|
β βββββββββββββββββββββββββββ ββββββ ββββββββββββββββββββββ β
|
|
14
14
|
β βββββββββββββββββββββββββββ ββββββ βββββββββββββββββββββ β
|
|
15
|
-
β v1.9.
|
|
15
|
+
β v1.9.198 AI Agent Reliability Harness + Sandbox β
|
|
16
16
|
β verify Β· remember Β· orchestrate Β· audit Β· sandbox Β· drift β
|
|
17
|
-
β
|
|
17
|
+
β π€ best agent μλ μΆμ² Β· λ§€νΈλ¦μ€ 96/100 Β· 128 λΌμ΄λ β
|
|
18
18
|
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
19
19
|
```
|
|
20
20
|
|
package/bin/harness.js
CHANGED
|
@@ -7,7 +7,7 @@ const cp = require('child_process');
|
|
|
7
7
|
const os = require('os'); // 1.9.178: _publishToNpm μμ os.tmpdir() μ¬μ© (μ μ import)
|
|
8
8
|
const readline = require('readline');
|
|
9
9
|
|
|
10
|
-
const VERSION = '1.9.
|
|
10
|
+
const VERSION = '1.9.198';
|
|
11
11
|
|
|
12
12
|
// 1.9.184: DEP0190 (child_process shell: true) deprecation warning μ΅μ (μ¬μ©μ λͺ
μ).
|
|
13
13
|
// leerness λ cross-platform PATH resolution μ μν΄ shell: true λ₯Ό μλμ μΌλ‘ μ¬μ© (claude.cmd / ollama.cmd λ± Windows .cmd μ²λ¦¬).
|
|
@@ -1662,6 +1662,39 @@ async function skillAutoCacheCmd(root, sub) {
|
|
|
1662
1662
|
if (c.expired) log(` β κ°±μ : leerness skill auto-cache refresh`);
|
|
1663
1663
|
}
|
|
1664
1664
|
|
|
1665
|
+
// 1.9.198: BμΆ (λ©ν° Sub-Agent μ€μΌμ€νΈλΌ) λ³΄κ° β handoff μμ task keyword λ§€μΉ best agent μΆμ²
|
|
1666
|
+
// 1.9.193 μμ agents multi --execute κ²°κ³Όλ₯Ό lessons.md μ κΈ°λ‘ β μ΄λ₯Ό keyword λ§€μΉνμ¬ μΆμΆ
|
|
1667
|
+
// μ¬μ©μ/AI κ° κ°μ task μ¬μλ μ "κ³Όκ±° best agent μ°μ μλ" μ¦μ μΈμ§
|
|
1668
|
+
function _loadMultiAgentConsensusHistory(root, keyword) {
|
|
1669
|
+
try {
|
|
1670
|
+
const lp = lessonsPath(root);
|
|
1671
|
+
if (!exists(lp)) return [];
|
|
1672
|
+
const lt = read(lp);
|
|
1673
|
+
// 1.9.193 ν¨ν΄: ### YYYY-MM-DD multi-agent consensus β best=<agent> (1.9.193)
|
|
1674
|
+
// blocks λΆλ¦¬ ν keyword λ§€μΉ + best agent μΆμΆ
|
|
1675
|
+
const blocks = lt.split(/\n### /).slice(1).map(b => '### ' + b);
|
|
1676
|
+
const re193 = /multi-agent consensus β best=(\S+) \(1\.9\.193\)/;
|
|
1677
|
+
const fuzzyRe = keyword ? new RegExp(escapeRegex(keyword.slice(0, Math.max(4, Math.floor(keyword.length * 0.7)))), 'i') : null;
|
|
1678
|
+
const hits = [];
|
|
1679
|
+
for (const b of blocks) {
|
|
1680
|
+
const m = re193.exec(b);
|
|
1681
|
+
if (!m) continue;
|
|
1682
|
+
if (fuzzyRe && !fuzzyRe.test(b)) continue;
|
|
1683
|
+
// task / score μΆμΆ
|
|
1684
|
+
const taskM = b.match(/- task: ([^\n]+)/);
|
|
1685
|
+
const scoreM = b.match(/- best agent: \S+, score=([\d.]+)/);
|
|
1686
|
+
const dateM = b.match(/^### (\d{4}-\d{2}-\d{2})/);
|
|
1687
|
+
hits.push({
|
|
1688
|
+
date: dateM ? dateM[1] : '?',
|
|
1689
|
+
agent: m[1],
|
|
1690
|
+
task: taskM ? taskM[1].slice(0, 80) : '',
|
|
1691
|
+
score: scoreM ? Number(scoreM[1]) : null
|
|
1692
|
+
});
|
|
1693
|
+
}
|
|
1694
|
+
return hits;
|
|
1695
|
+
} catch { return []; }
|
|
1696
|
+
}
|
|
1697
|
+
|
|
1665
1698
|
// 1.9.194: EμΆ (κ²μΌλ¦ λ°©μ§) β handoff μμ λ€μ λ¨κ³ 1-3κ° μλ μ μ
|
|
1666
1699
|
// νμ¬ in-progress task description + Memory Surface (decisions/lessons/plan) μ‘°ν© β
|
|
1667
1700
|
// "λ€μ λ¨κ³λ‘ 무μμ ν μ§" μΆλ‘ (μ¬μ©μ/AI μ§μ μ
λ ₯ μμ΄ μ¦μ λ
ΈμΆ)
|
|
@@ -3487,10 +3520,19 @@ function handoff(root) {
|
|
|
3487
3520
|
parts.push(`π official ${m.total}/${m.cacheTotal} (${ageStr}${status})`);
|
|
3488
3521
|
}
|
|
3489
3522
|
} catch {}
|
|
3523
|
+
// 11) 1.9.197: AμΆ (λ²μ© AI νλ€μ€) 9.5β10 λ³΄κ° β provider probe 60λΆ μΊμ μλ λ
ΈμΆ
|
|
3524
|
+
// μ¬μ©μ λͺ
μ: "λ²μ© AI νλ€μ€ ... μ΅κ³ μ λꡬ" β λ§€ handoff μ 11 backend ready μν μ¦μ λ
ΈμΆ
|
|
3525
|
+
try {
|
|
3526
|
+
const pb = _readyBackendCountFromCache(root);
|
|
3527
|
+
if (pb.hasCache) {
|
|
3528
|
+
const ageLabel = pb.ageHours != null ? (pb.ageHours < 24 ? `${pb.ageHours}h` : `${Math.floor(pb.ageHours/24)}d`) : '?';
|
|
3529
|
+
parts.push(`π backend ${pb.ready}/${pb.total} (${ageLabel}${pb.expired ? 'β ' : 'β'})`);
|
|
3530
|
+
}
|
|
3531
|
+
} catch {}
|
|
3490
3532
|
if (parts.length) {
|
|
3491
3533
|
const isTty = process.stdout && process.stdout.isTTY;
|
|
3492
3534
|
const cy = s => isTty ? `\x1b[36m${s}\x1b[0m` : s;
|
|
3493
|
-
log(cy(`π ν€λλΌμΈ (1.9.81/93/113/152/162/192): ${parts.join(' Β· ')}`));
|
|
3535
|
+
log(cy(`π ν€λλΌμΈ (1.9.81/93/113/152/162/192/197): ${parts.join(' Β· ')}`));
|
|
3494
3536
|
}
|
|
3495
3537
|
} catch {}
|
|
3496
3538
|
}
|
|
@@ -3716,6 +3758,29 @@ function handoff(root) {
|
|
|
3716
3758
|
}
|
|
3717
3759
|
} catch {}
|
|
3718
3760
|
}
|
|
3761
|
+
// 1.9.198: BμΆ (λ©ν° Sub-Agent μ€μΌμ€νΈλΌ) λ³΄κ° β handoff μμ keyword λ§€μΉ best agent μλ μΆμ²
|
|
3762
|
+
// 1.9.193 lessons.md κΈ°λ‘μ νμ β "μ΄ task ν€μλλ μ΄μ μ agent X κ° best μλ€" νμ
|
|
3763
|
+
// λκΈ°: --no-multiagent-hint λλ LEERNESS_NO_MULTIAGENT_HINT=1
|
|
3764
|
+
if (!has('--no-multiagent-hint') && !has('--quiet') && process.env.LEERNESS_NO_MULTIAGENT_HINT !== '1') {
|
|
3765
|
+
try {
|
|
3766
|
+
const maHits = _loadMultiAgentConsensusHistory(root, keyword);
|
|
3767
|
+
if (maHits.length > 0) {
|
|
3768
|
+
// κ°μ₯ μ΅κ·Ό hit 1 + λμΌ agent λΉλ μΉ΄μ΄νΈ
|
|
3769
|
+
const recent = maHits[maHits.length - 1];
|
|
3770
|
+
const agentCounts = {};
|
|
3771
|
+
for (const h of maHits) { agentCounts[h.agent] = (agentCounts[h.agent] || 0) + 1; }
|
|
3772
|
+
const topAgent = Object.entries(agentCounts).sort((a, b) => b[1] - a[1])[0];
|
|
3773
|
+
const isTty = process.stdout && process.stdout.isTTY;
|
|
3774
|
+
const blu = s => isTty ? `\x1b[34m${s}\x1b[0m` : s;
|
|
3775
|
+
const dim = s => isTty ? `\x1b[2m${s}\x1b[0m` : s;
|
|
3776
|
+
log(blu(`## π€ task λ§€μΉ best agent (1.9.198 BμΆ) β ν€μλ "${keyword}"`));
|
|
3777
|
+
log(dim(` κ³Όκ±° multi-agent consensus ${maHits.length}건 β μΆμ² agent: ${topAgent[0]} (${topAgent[1]}ν best)`));
|
|
3778
|
+
log(dim(` μ΅κ·Ό hit: ${recent.date} agent=${recent.agent}${recent.score != null ? ` score=${recent.score.toFixed(3)}` : ''}`));
|
|
3779
|
+
log(dim(` β μ¬μ€ν: leerness agents multi "${(latestRow.request || '').slice(0, 60)}" --execute`));
|
|
3780
|
+
log('');
|
|
3781
|
+
}
|
|
3782
|
+
} catch {}
|
|
3783
|
+
}
|
|
3719
3784
|
// 1.9.196: DμΆ (μ₯κΈ° λ§₯λ½ μ μ§) λ³΄κ° β 30μΌ+ μ lessons μλ νκ³ (long-term memory recall)
|
|
3720
3785
|
// keyword μ λ§€μΉλλ 30μΌ+ μ€λλ lessons 1건 λ
ΈμΆ β μνμ§ κ³Όκ±° κ΅ν μ¬μκΈ°
|
|
3721
3786
|
// λκΈ°: --no-longterm-recall λλ LEERNESS_NO_LONGTERM_RECALL=1
|
|
@@ -5586,6 +5651,8 @@ function providerCmd(root, sub, ...args) {
|
|
|
5586
5651
|
const json = has('--json');
|
|
5587
5652
|
const timeoutMs = Number(arg('--timeout', '1500'));
|
|
5588
5653
|
const results = await _probeProviderEndpoints(root, timeoutMs);
|
|
5654
|
+
// 1.9.197: μΊμ μλ μ μ₯ (handoff μλ ν΅ν©μ©)
|
|
5655
|
+
if (!has('--no-cache')) _writeProviderProbeCache(root, results);
|
|
5589
5656
|
if (json) { log(JSON.stringify(results, null, 2)); return; }
|
|
5590
5657
|
log(`# leerness provider probe (1.9.195 β AμΆ λ²μ© AI νλ€μ€ 보κ°)`);
|
|
5591
5658
|
log(`νμμμ: ${timeoutMs}ms`);
|
|
@@ -5665,6 +5732,41 @@ async function _probeProviderEndpoints(root, timeoutMs) {
|
|
|
5665
5732
|
return result;
|
|
5666
5733
|
}
|
|
5667
5734
|
|
|
5735
|
+
// 1.9.197: AμΆ 9.5β10 λ³΄κ° β provider probe κ²°κ³Ό 60λΆ μΊμ (handoff μλ ν΅ν©)
|
|
5736
|
+
// μ¬μ©μ λͺ
μ (1.9.191): "λ²μ© AI νλ€μ€ ... μ΅κ³ μ λꡬ"
|
|
5737
|
+
// λ§€ handoff λ§λ€ 11 backend probe λΉμ© (~1.5μ΄)μ μΊμλ‘ ν‘μ β 1/60 λΌμ΄λλ§ μ€μ probe
|
|
5738
|
+
// μΊμ μμΉ: .harness/provider-probe-cache.json (λΉμν¬λ¦Ώ, 체ν¬μΈ κ°λ₯)
|
|
5739
|
+
const _PROVIDER_PROBE_CACHE_TTL_MS = 60 * 60 * 1000;
|
|
5740
|
+
function _providerProbeCachePath(root) { return path.join(root, '.harness', 'provider-probe-cache.json'); }
|
|
5741
|
+
function _loadProviderProbeCache(root) {
|
|
5742
|
+
try {
|
|
5743
|
+
const fp = _providerProbeCachePath(root);
|
|
5744
|
+
if (!exists(fp)) return null;
|
|
5745
|
+
const j = JSON.parse(read(fp));
|
|
5746
|
+
if (!j.at || !j.result) return null;
|
|
5747
|
+
const ageMs = Date.now() - new Date(j.at).getTime();
|
|
5748
|
+
return { ...j, ageMs, expired: ageMs > _PROVIDER_PROBE_CACHE_TTL_MS };
|
|
5749
|
+
} catch { return null; }
|
|
5750
|
+
}
|
|
5751
|
+
function _writeProviderProbeCache(root, result) {
|
|
5752
|
+
try {
|
|
5753
|
+
mkdirp(path.join(root, '.harness'));
|
|
5754
|
+
writeUtf8(_providerProbeCachePath(root), JSON.stringify({ at: new Date().toISOString(), result }, null, 2));
|
|
5755
|
+
return true;
|
|
5756
|
+
} catch { return false; }
|
|
5757
|
+
}
|
|
5758
|
+
// handoff ν€λλΌμΈμ© β μΊμ hit μ μ¦μ λ°ν, miss μ null (async probe trigger λ handoff κ° μ§μ )
|
|
5759
|
+
function _readyBackendCountFromCache(root) {
|
|
5760
|
+
const c = _loadProviderProbeCache(root);
|
|
5761
|
+
if (!c || !c.result) return { ready: 0, total: 11, ageHours: null, expired: false, hasCache: false };
|
|
5762
|
+
const r = c.result;
|
|
5763
|
+
const ready = (r.cli || []).filter(x => x.found).length
|
|
5764
|
+
+ (r.endpoints || []).filter(x => x.reachable).length
|
|
5765
|
+
+ (r.cloudKeys || []).filter(x => x.present).length;
|
|
5766
|
+
const total = (r.cli || []).length + (r.endpoints || []).length + (r.cloudKeys || []).length;
|
|
5767
|
+
return { ready, total, ageHours: Math.floor(c.ageMs / 3600000), expired: c.expired, hasCache: true };
|
|
5768
|
+
}
|
|
5769
|
+
|
|
5668
5770
|
// 1.9.195: HTTP endpoint reachability check (μμ‘΄μ± 0)
|
|
5669
5771
|
function _probeHttpEndpoint(url, timeoutMs) {
|
|
5670
5772
|
return new Promise((resolve) => {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "leerness",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.198",
|
|
4
4
|
"description": "Leerness: λΉνκ΄΄ λ§μ΄κ·Έλ μ΄μ
, μλ λ²μ κ°μ§Β·μ
λ°μ΄νΈ, κ³ν/μ§ν/νΈλμ€ν μλν, κ²μΌλ¦Β·μν¬λ¦ΏΒ·μΈμ½λ© μλ κ°λ, Claude Code μ¬λμ ν΅ν©μ κ°μΆ νκ΅μ΄ μ°μ AI κ°λ° νλ€μ€.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"leerness",
|