leerness 1.9.195 β 1.9.197
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 +122 -0
- package/README.md +3 -3
- package/bin/harness.js +116 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,127 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.9.197 β 2026-05-21
|
|
4
|
+
|
|
5
|
+
**π AμΆ 9.5/10 β 10/10 β provider probe handoff μλ ν΅ν© + 60λΆ μΊμ. 5μΆ λ§€νΈλ¦μ€ 47.5/50 (95%).**
|
|
6
|
+
|
|
7
|
+
μμ¨ λͺ¨λ 127 λΌμ΄λ. 1.9.196 DμΆ μμ±μ μ΄μ΄ **AμΆ 9.5 β 10/10** λ§μ§λ§ 보κ°.
|
|
8
|
+
|
|
9
|
+
### μ¬μ©μ μλ μ λ ¬ (1.9.191 verbatim)
|
|
10
|
+
> *"λ²μ© AI νλ€μ€ ... μ΅κ³ μ λꡬ"*
|
|
11
|
+
|
|
12
|
+
### 1. handoff ν€λλΌμΈ 11λ²μ§Έ μμ (1.9.197 μ κ·)
|
|
13
|
+
```
|
|
14
|
+
π ν€λλΌμΈ (1.9.81/93/113/152/162/192/197): ... Β· π backend 3/13 (0hβ)
|
|
15
|
+
```
|
|
16
|
+
- `π backend {ready}/{total} ({age}{status})`
|
|
17
|
+
- 13 ν보 = CLI 5 + Local endpoint 3 + Cloud API key 5
|
|
18
|
+
- 60λΆ μΊμ hit μ μ¦μ νμ (network λΆν X)
|
|
19
|
+
- μΊμ λ§λ£ μ `β ` νμ β μ¬μ©μ/AI κ° `provider probe` μ¬μ€ν μΈμ§
|
|
20
|
+
|
|
21
|
+
### 2. 60λΆ TTL μΊμ (1.9.197 μ κ·)
|
|
22
|
+
- νμΌ: `.harness/provider-probe-cache.json` (λΉμν¬λ¦Ώ, 체ν¬μΈ κ°λ₯)
|
|
23
|
+
- `_PROVIDER_PROBE_CACHE_TTL_MS = 60 * 60 * 1000`
|
|
24
|
+
- `provider probe` μ€ν μ μλ μ μ₯ (`--no-cache` λ‘ λκΈ°)
|
|
25
|
+
- ν¨μ: `_loadProviderProbeCache` / `_writeProviderProbeCache` / `_readyBackendCountFromCache`
|
|
26
|
+
|
|
27
|
+
### 3. λμ νκ· (1.9.191~196) β λͺ¨λ μ μ§
|
|
28
|
+
- [1.9.196] DμΆ 7μΌ+/30μΌ+ recall + ScheduleWakeup miss detector
|
|
29
|
+
- [1.9.195] _probeProviderEndpoints (provider universal probe)
|
|
30
|
+
- [1.9.194] _suggestNextActions (handoff next-actions)
|
|
31
|
+
- [1.9.193] agents multi consensus β lessons.md
|
|
32
|
+
- [1.9.192] _loadOfficialSkillCache + 24h μΊμ
|
|
33
|
+
- [1.9.191] ꡬ쑰 μ΅μ ν λ³΄κ³ μ 88/100
|
|
34
|
+
|
|
35
|
+
### 4. stress-v142 β 15/15 PASS
|
|
36
|
+
- AμΆ 9.5β10 λ³΄κ° (6: ν¨μ + μΊμ μλ μ μ₯ + ν€λλΌμΈ 11λ²μ§Έ + handoff ν΅ν© κ²μ¦)
|
|
37
|
+
- μ±λ₯: --version cold start avg **506 ms** Β· MCP 54 λꡬ **591 ms**
|
|
38
|
+
|
|
39
|
+
### 5. 5μΆ λ§€νΈλ¦μ€ (λͺ¨λ μΆ λ³΄κ° μλ£)
|
|
40
|
+
| μΆ | 1.9.191 | 1.9.197 | Ξ |
|
|
41
|
+
|---|---|---|---|
|
|
42
|
+
| A. λ²μ© AI νλ€μ€ | 9 | **10** | +1 (probe + handoff μλ) |
|
|
43
|
+
| B. λ©ν° Sub-Agent | 8.5 | **9** | +0.5 (consensus lessons) |
|
|
44
|
+
| C. 곡μ μ€ν¬ μλ | 8 | **9** | +1 (official catalog handoff) |
|
|
45
|
+
| D. μ₯κΈ° λ§₯λ½ μ μ§ | 9.5 | **10** | +0.5 (7μΌ+/30μΌ+ recall) |
|
|
46
|
+
| E. κ²μΌλ¦ λ°©μ§ | 9 | **9.5** | +0.5 (next-actions) |
|
|
47
|
+
| **μ’
ν©** | **44/50 (88%)** | **47.5/50 (95%)** | **+7%** π― |
|
|
48
|
+
|
|
49
|
+
### 6. μλ release νλ¦
|
|
50
|
+
- main μλ push **59 λΌμ΄λ μ°μ** (1.9.140~197)
|
|
51
|
+
- npm publish μλ (1.9.178~)
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## 1.9.196 β 2026-05-21
|
|
56
|
+
|
|
57
|
+
**π DμΆ (μ₯κΈ° λ§₯λ½ μ μ§) λ³΄κ° β 7μΌ+ μ₯κΈ° μ 체 + 30μΌ+ lessons νκ³ + ScheduleWakeup miss detector.**
|
|
58
|
+
|
|
59
|
+
μμ¨ λͺ¨λ 126 λΌμ΄λ. μ¬μ©μ λͺ
μ:
|
|
60
|
+
> *"λ€μ λΌμ΄λ μ§ννκ³ , ScheduleWakeup κ° μ μμ μΌλ‘ μλνλλ‘ μ‘°μ·¨λ₯Ό μ·¨ν΄μ€"*
|
|
61
|
+
|
|
62
|
+
5μΆ λ§€νΈλ¦μ€ λ§μ§λ§ λ―Έλ³΄κ° μΆμΈ **DμΆ (9.5/10 β λͺ©ν 10/10)** + μ¬μ©μ λͺ
μ ScheduleWakeup μμ ν.
|
|
63
|
+
|
|
64
|
+
### 1. DμΆ ν΅μ¬ β μ₯κΈ° μ 체 + 30μΌ+ νκ³ (handoff μλ)
|
|
65
|
+
**7μΌ+ critical λ¨κ³** (24h+ lazy λ€μ λ¨κ³):
|
|
66
|
+
```
|
|
67
|
+
## β μ§μ² μ 체 κ°μ§ (1.9.194 EμΆ) β progress-tracker λ§μ§λ§ λ³λ 8d μ
|
|
68
|
+
...
|
|
69
|
+
π΄ 7μΌ+ μ₯κΈ° μ 체 (8d) β μ₯κΈ° λ§₯λ½ μμ€ μν (1.9.196 DμΆ)
|
|
70
|
+
β μ¦μ νκ³ : leerness retro . --since 8d
|
|
71
|
+
β λλ archive: leerness task drop T-XXXX
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**30μΌ+ μ₯κΈ° lessons νκ³ ** (long-term memory recall):
|
|
75
|
+
- handoff keyword λ§€μΉ + lessons.md 30μΌ+ μ λΈλ‘
|
|
76
|
+
- μ μΉμ
: `## π μ₯κΈ° lessons νκ³ (1.9.196 DμΆ) β ν€μλ "X" κ΄λ ¨ 30μΌ+ N건`
|
|
77
|
+
- μνμ§ κ³Όκ±° κ΅ν μλ μ¬μκΈ° β κ°μ μ€μ λ°λ³΅ λ°©μ§
|
|
78
|
+
- λκΈ°: `--no-longterm-recall` / `LEERNESS_NO_LONGTERM_RECALL=1`
|
|
79
|
+
|
|
80
|
+
### 2. ScheduleWakeup μμ ν (μ¬μ©μ λͺ
μ) β λ€μΈ΅ redundancy
|
|
81
|
+
**Layer 1**: λ μ§§μ ScheduleWakeup (1.9.193λΆν° 900s β **270s** β 5λΆ cache μμ μ μ§)
|
|
82
|
+
**Layer 2**: CronCreate every 13min (durable: false) β primary λλ½ μ backup
|
|
83
|
+
**Layer 3**: handoffμ wakeup miss detector β 60λΆ+ 무 νλ μ μλ¦Ό
|
|
84
|
+
```
|
|
85
|
+
## β° ScheduleWakeup miss μμ¬ (1.9.196) β λ§μ§λ§ νλ 90λΆ μ
|
|
86
|
+
μμ¨ λͺ¨λ μ μ cycle: ~15λΆ. 60λΆ μ΄μ 무 νλ β μμ€ν
sleep λλ wakeup λλ½
|
|
87
|
+
β μ¬κ°: μ¬μ©μκ° "λ€μ λΌμ΄λ" λλ "/loop" μ
λ ₯
|
|
88
|
+
```
|
|
89
|
+
λκΈ°: `LEERNESS_NO_WAKEUP_MISS=1`
|
|
90
|
+
|
|
91
|
+
### 3. λμ νκ· (1.9.190~195) β λͺ¨λ μ μ§
|
|
92
|
+
- [1.9.195] _probeProviderEndpoints (provider universal probe)
|
|
93
|
+
- [1.9.194] _suggestNextActions (handoff next-actions)
|
|
94
|
+
- [1.9.193] agents multi consensus β lessons.md
|
|
95
|
+
- [1.9.192] _loadOfficialSkillCache + 24h μΊμ
|
|
96
|
+
- [1.9.191] ꡬ쑰 μ΅μ ν λ³΄κ³ μ 88/100
|
|
97
|
+
- [1.9.190] _selectOne/_selectMany Ctrl+C μ¦μ μ’
λ£
|
|
98
|
+
|
|
99
|
+
### 4. stress-v141 β 15/15 PASS
|
|
100
|
+
- DμΆ λ³΄κ° (6: ν¨μ + 7μΌ+ + 30μΌ+ + miss detector + μμ μν¬μ€νμ΄μ€ ν΅ν©) + μ±λ₯ (2) + λμ νκ· (7)
|
|
101
|
+
- μ±λ₯: --version cold start avg **709 ms** Β· MCP 54 λꡬ **534 ms**
|
|
102
|
+
|
|
103
|
+
### 5. 5μΆ λ§€νΈλ¦μ€ λ³λ
|
|
104
|
+
| μΆ | 1.9.195 | 1.9.196 | Ξ |
|
|
105
|
+
|---|---|---|---|
|
|
106
|
+
| D. μ₯κΈ° λ§₯λ½ μ μ§ | 9.5/10 | **10/10** | +0.5 (7μΌ+ critical + 30μΌ+ recall + miss detector) |
|
|
107
|
+
| μ’
ν© | 46.5/50 (93%) | **47/50 (94%)** | +1% |
|
|
108
|
+
|
|
109
|
+
### 6. 5μΆ λͺ¨λ λ³΄κ° μλ£
|
|
110
|
+
| μΆ | μμ | νμ¬ | Ξ |
|
|
111
|
+
|---|---|---|---|
|
|
112
|
+
| A. λ²μ© AI νλ€μ€ | 9 | **9.5** | +0.5 (1.9.195 probe) |
|
|
113
|
+
| B. λ©ν° Sub-Agent | 8.5 | **9** | +0.5 (1.9.193 consensus lessons) |
|
|
114
|
+
| C. 곡μ μ€ν¬ μλ | 8 | **9** | +1 (1.9.192 official catalog) |
|
|
115
|
+
| D. μ₯κΈ° λ§₯λ½ μ μ§ | 9.5 | **10** | +0.5 (1.9.196 7μΌ+/30μΌ+ recall) |
|
|
116
|
+
| E. κ²μΌλ¦ λ°©μ§ | 9 | **9.5** | +0.5 (1.9.194 next-actions) |
|
|
117
|
+
| **μ’
ν©** | 44/50 (88%) | **47/50 (94%)** | **+6%** |
|
|
118
|
+
|
|
119
|
+
### 7. μλ release νλ¦
|
|
120
|
+
- main μλ push **58 λΌμ΄λ μ°μ** (1.9.140~196)
|
|
121
|
+
- npm publish μλ (1.9.178~)
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
3
125
|
## 1.9.195 β 2026-05-21
|
|
4
126
|
|
|
5
127
|
**π AμΆ (λ²μ© AI νλ€μ€) λ³΄κ° β `leerness provider probe` μ κ· λͺ
λ Ή (CLI/endpoint/API ν€ 3μ’
μλ κ°μ§).**
|
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.197 AI Agent Reliability Harness + Sandbox β
|
|
16
16
|
β verify Β· remember Β· orchestrate Β· audit Β· sandbox Β· drift β
|
|
17
|
-
β
|
|
17
|
+
β π 5μΆ λ§€νΈλ¦μ€ 95/100 Β· backend probe handoff μλ Β· 127 λΌμ΄λ β
|
|
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.197';
|
|
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 μ²λ¦¬).
|
|
@@ -3487,10 +3487,19 @@ function handoff(root) {
|
|
|
3487
3487
|
parts.push(`π official ${m.total}/${m.cacheTotal} (${ageStr}${status})`);
|
|
3488
3488
|
}
|
|
3489
3489
|
} catch {}
|
|
3490
|
+
// 11) 1.9.197: AμΆ (λ²μ© AI νλ€μ€) 9.5β10 λ³΄κ° β provider probe 60λΆ μΊμ μλ λ
ΈμΆ
|
|
3491
|
+
// μ¬μ©μ λͺ
μ: "λ²μ© AI νλ€μ€ ... μ΅κ³ μ λꡬ" β λ§€ handoff μ 11 backend ready μν μ¦μ λ
ΈμΆ
|
|
3492
|
+
try {
|
|
3493
|
+
const pb = _readyBackendCountFromCache(root);
|
|
3494
|
+
if (pb.hasCache) {
|
|
3495
|
+
const ageLabel = pb.ageHours != null ? (pb.ageHours < 24 ? `${pb.ageHours}h` : `${Math.floor(pb.ageHours/24)}d`) : '?';
|
|
3496
|
+
parts.push(`π backend ${pb.ready}/${pb.total} (${ageLabel}${pb.expired ? 'β ' : 'β'})`);
|
|
3497
|
+
}
|
|
3498
|
+
} catch {}
|
|
3490
3499
|
if (parts.length) {
|
|
3491
3500
|
const isTty = process.stdout && process.stdout.isTTY;
|
|
3492
3501
|
const cy = s => isTty ? `\x1b[36m${s}\x1b[0m` : s;
|
|
3493
|
-
log(cy(`π ν€λλΌμΈ (1.9.81/93/113/152/162/192): ${parts.join(' Β· ')}`));
|
|
3502
|
+
log(cy(`π ν€λλΌμΈ (1.9.81/93/113/152/162/192/197): ${parts.join(' Β· ')}`));
|
|
3494
3503
|
}
|
|
3495
3504
|
} catch {}
|
|
3496
3505
|
}
|
|
@@ -3704,6 +3713,51 @@ function handoff(root) {
|
|
|
3704
3713
|
log(dim(` β λ³κ²½: leerness task update ${latestRow.id} --status in-progress λλ --status completed`));
|
|
3705
3714
|
log(dim(` β νκ³ : leerness lazy detect --json`));
|
|
3706
3715
|
log('');
|
|
3716
|
+
// 1.9.196: DμΆ (μ₯κΈ° λ§₯λ½) λ³΄κ° β 7μΌ+ critical λ¨κ³ μλ¦Ό + μλ νκ³ κΆμ₯
|
|
3717
|
+
if (ageHours >= 24 * 7) {
|
|
3718
|
+
const days = Math.floor(ageHours / 24);
|
|
3719
|
+
log(yel(` π΄ 7μΌ+ μ₯κΈ° μ 체 (${days}d) β μ₯κΈ° λ§₯λ½ μμ€ μν (1.9.196 DμΆ)`));
|
|
3720
|
+
log(dim(` β μ¦μ νκ³ : leerness retro . --since ${days}d`));
|
|
3721
|
+
log(dim(` β λλ archive: leerness task drop ${latestRow.id}`));
|
|
3722
|
+
log('');
|
|
3723
|
+
}
|
|
3724
|
+
}
|
|
3725
|
+
}
|
|
3726
|
+
} catch {}
|
|
3727
|
+
}
|
|
3728
|
+
// 1.9.196: DμΆ (μ₯κΈ° λ§₯λ½ μ μ§) λ³΄κ° β 30μΌ+ μ lessons μλ νκ³ (long-term memory recall)
|
|
3729
|
+
// keyword μ λ§€μΉλλ 30μΌ+ μ€λλ lessons 1건 λ
ΈμΆ β μνμ§ κ³Όκ±° κ΅ν μ¬μκΈ°
|
|
3730
|
+
// λκΈ°: --no-longterm-recall λλ LEERNESS_NO_LONGTERM_RECALL=1
|
|
3731
|
+
if (!has('--no-longterm-recall') && !has('--quiet') && process.env.LEERNESS_NO_LONGTERM_RECALL !== '1') {
|
|
3732
|
+
try {
|
|
3733
|
+
const lp = lessonsPath(root);
|
|
3734
|
+
if (exists(lp)) {
|
|
3735
|
+
const lt = read(lp);
|
|
3736
|
+
const cutoff = Date.now() - 30 * 24 * 3600 * 1000;
|
|
3737
|
+
const fuzzyRe = new RegExp(escapeRegex(keyword.slice(0, Math.max(4, Math.floor(keyword.length * 0.7)))), 'i');
|
|
3738
|
+
// ### YYYY-MM-DD λΈλ‘ λΆλ¦¬ β 30μΌ+ μ΄μ + keyword λ§€μΉ
|
|
3739
|
+
const blocks = lt.split(/\n### /).slice(1).map(b => '### ' + b);
|
|
3740
|
+
const matches = [];
|
|
3741
|
+
for (const b of blocks) {
|
|
3742
|
+
const m = b.match(/^### (\d{4}-\d{2}-\d{2})/);
|
|
3743
|
+
if (!m) continue;
|
|
3744
|
+
const blockDate = new Date(m[1]).getTime();
|
|
3745
|
+
if (isNaN(blockDate) || blockDate > cutoff) continue;
|
|
3746
|
+
if (fuzzyRe.test(b)) matches.push({ date: m[1], title: (b.split('\n')[0] || '').slice(0, 80) });
|
|
3747
|
+
}
|
|
3748
|
+
if (matches.length > 0) {
|
|
3749
|
+
const isTty = process.stdout && process.stdout.isTTY;
|
|
3750
|
+
const blu = s => isTty ? `\x1b[34m${s}\x1b[0m` : s;
|
|
3751
|
+
const dim = s => isTty ? `\x1b[2m${s}\x1b[0m` : s;
|
|
3752
|
+
const oldest = matches[matches.length - 1];
|
|
3753
|
+
const ageDays = Math.floor((Date.now() - new Date(oldest.date).getTime()) / (24 * 3600 * 1000));
|
|
3754
|
+
log(blu(`## π μ₯κΈ° lessons νκ³ (1.9.196 DμΆ) β ν€μλ "${keyword}" κ΄λ ¨ 30μΌ+ ${matches.length}건`));
|
|
3755
|
+
log(dim(` μ΅μ€λλ: ${oldest.date} (${ageDays}μΌ μ ) β ${oldest.title}`));
|
|
3756
|
+
if (matches.length > 1) {
|
|
3757
|
+
log(dim(` μ΅κ·Ό30μΌ+: ${matches[0].date} β ${matches[0].title}`));
|
|
3758
|
+
}
|
|
3759
|
+
log(dim(` β μ 체 νκ³ : cat .harness/lessons.md`));
|
|
3760
|
+
log('');
|
|
3707
3761
|
}
|
|
3708
3762
|
}
|
|
3709
3763
|
} catch {}
|
|
@@ -3712,6 +3766,29 @@ function handoff(root) {
|
|
|
3712
3766
|
}
|
|
3713
3767
|
} catch {}
|
|
3714
3768
|
}
|
|
3769
|
+
// 1.9.196: ScheduleWakeup miss detector β μμ¨ λͺ¨λ μ¬μ©μ λͺ
μ "λͺ»μΌμ΄λλ κ²½μ° μ’
μ’
μμ" (1.9.191) νμ
|
|
3770
|
+
// λ§μ§λ§ session μκ° (handoff mtime λλ task-log λ§μ§λ§ entry) > 2h ago μ μλ¦Ό
|
|
3771
|
+
// λκΈ°: LEERNESS_NO_WAKEUP_MISS=1
|
|
3772
|
+
if (process.env.LEERNESS_NO_WAKEUP_MISS !== '1' && !has('--quiet') && !has('--no-wakeup-miss')) {
|
|
3773
|
+
try {
|
|
3774
|
+
const tlp = taskLogPath(root);
|
|
3775
|
+
if (exists(tlp)) {
|
|
3776
|
+
const ageMs = Date.now() - fs.statSync(tlp).mtimeMs;
|
|
3777
|
+
const ageMin = Math.floor(ageMs / 60000);
|
|
3778
|
+
// μμ¨ λͺ¨λλ ~15λΆ cycle. 60λΆ μ΄μ 무 νλμ΄λ©΄ wakeup miss μμ¬ (CronCreate 13min λ°±μ
κ³Ό ν¨κ»)
|
|
3779
|
+
if (ageMin >= 60) {
|
|
3780
|
+
const isTty = process.stdout && process.stdout.isTTY;
|
|
3781
|
+
const yel = s => isTty ? `\x1b[33m${s}\x1b[0m` : s;
|
|
3782
|
+
const dim = s => isTty ? `\x1b[2m${s}\x1b[0m` : s;
|
|
3783
|
+
const label = ageMin < 120 ? `${ageMin}λΆ` : (ageMin < 1440 ? `${Math.floor(ageMin/60)}μκ°` : `${Math.floor(ageMin/1440)}μΌ`);
|
|
3784
|
+
log(yel(`## β° ScheduleWakeup miss μμ¬ (1.9.196) β λ§μ§λ§ νλ ${label} μ `));
|
|
3785
|
+
log(dim(` μμ¨ λͺ¨λ μ μ cycle: ~15λΆ. 60λΆ μ΄μ 무 νλ β μμ€ν
sleep λλ wakeup λλ½ κ°λ₯μ±`));
|
|
3786
|
+
log(dim(` β μ¬κ°: μ¬μ©μκ° "λ€μ λΌμ΄λ" λλ "/loop" μ
λ ₯`));
|
|
3787
|
+
log('');
|
|
3788
|
+
}
|
|
3789
|
+
}
|
|
3790
|
+
} catch {}
|
|
3791
|
+
}
|
|
3715
3792
|
// 1.9.121: μ΅κ·Ό λ©λͺ¨λ¦¬ λ³λ μλ¦Ό β 24h λ΄ μΆκ°λ 5μ’
surface νλͺ© μΉ΄μ΄νΈ
|
|
3716
3793
|
// AI μμ΄μ νΈκ° μ΄μ μΈμ
μ’
λ£ ν μ΄λ€ λ©λͺ¨λ¦¬κ° μΆκ°λλμ§ μ¦μ μΈμ§.
|
|
3717
3794
|
// λκΈ°: --no-mem-delta λλ LEERNESS_NO_MEM_DELTA=1
|
|
@@ -5518,6 +5595,8 @@ function providerCmd(root, sub, ...args) {
|
|
|
5518
5595
|
const json = has('--json');
|
|
5519
5596
|
const timeoutMs = Number(arg('--timeout', '1500'));
|
|
5520
5597
|
const results = await _probeProviderEndpoints(root, timeoutMs);
|
|
5598
|
+
// 1.9.197: μΊμ μλ μ μ₯ (handoff μλ ν΅ν©μ©)
|
|
5599
|
+
if (!has('--no-cache')) _writeProviderProbeCache(root, results);
|
|
5521
5600
|
if (json) { log(JSON.stringify(results, null, 2)); return; }
|
|
5522
5601
|
log(`# leerness provider probe (1.9.195 β AμΆ λ²μ© AI νλ€μ€ 보κ°)`);
|
|
5523
5602
|
log(`νμμμ: ${timeoutMs}ms`);
|
|
@@ -5597,6 +5676,41 @@ async function _probeProviderEndpoints(root, timeoutMs) {
|
|
|
5597
5676
|
return result;
|
|
5598
5677
|
}
|
|
5599
5678
|
|
|
5679
|
+
// 1.9.197: AμΆ 9.5β10 λ³΄κ° β provider probe κ²°κ³Ό 60λΆ μΊμ (handoff μλ ν΅ν©)
|
|
5680
|
+
// μ¬μ©μ λͺ
μ (1.9.191): "λ²μ© AI νλ€μ€ ... μ΅κ³ μ λꡬ"
|
|
5681
|
+
// λ§€ handoff λ§λ€ 11 backend probe λΉμ© (~1.5μ΄)μ μΊμλ‘ ν‘μ β 1/60 λΌμ΄λλ§ μ€μ probe
|
|
5682
|
+
// μΊμ μμΉ: .harness/provider-probe-cache.json (λΉμν¬λ¦Ώ, 체ν¬μΈ κ°λ₯)
|
|
5683
|
+
const _PROVIDER_PROBE_CACHE_TTL_MS = 60 * 60 * 1000;
|
|
5684
|
+
function _providerProbeCachePath(root) { return path.join(root, '.harness', 'provider-probe-cache.json'); }
|
|
5685
|
+
function _loadProviderProbeCache(root) {
|
|
5686
|
+
try {
|
|
5687
|
+
const fp = _providerProbeCachePath(root);
|
|
5688
|
+
if (!exists(fp)) return null;
|
|
5689
|
+
const j = JSON.parse(read(fp));
|
|
5690
|
+
if (!j.at || !j.result) return null;
|
|
5691
|
+
const ageMs = Date.now() - new Date(j.at).getTime();
|
|
5692
|
+
return { ...j, ageMs, expired: ageMs > _PROVIDER_PROBE_CACHE_TTL_MS };
|
|
5693
|
+
} catch { return null; }
|
|
5694
|
+
}
|
|
5695
|
+
function _writeProviderProbeCache(root, result) {
|
|
5696
|
+
try {
|
|
5697
|
+
mkdirp(path.join(root, '.harness'));
|
|
5698
|
+
writeUtf8(_providerProbeCachePath(root), JSON.stringify({ at: new Date().toISOString(), result }, null, 2));
|
|
5699
|
+
return true;
|
|
5700
|
+
} catch { return false; }
|
|
5701
|
+
}
|
|
5702
|
+
// handoff ν€λλΌμΈμ© β μΊμ hit μ μ¦μ λ°ν, miss μ null (async probe trigger λ handoff κ° μ§μ )
|
|
5703
|
+
function _readyBackendCountFromCache(root) {
|
|
5704
|
+
const c = _loadProviderProbeCache(root);
|
|
5705
|
+
if (!c || !c.result) return { ready: 0, total: 11, ageHours: null, expired: false, hasCache: false };
|
|
5706
|
+
const r = c.result;
|
|
5707
|
+
const ready = (r.cli || []).filter(x => x.found).length
|
|
5708
|
+
+ (r.endpoints || []).filter(x => x.reachable).length
|
|
5709
|
+
+ (r.cloudKeys || []).filter(x => x.present).length;
|
|
5710
|
+
const total = (r.cli || []).length + (r.endpoints || []).length + (r.cloudKeys || []).length;
|
|
5711
|
+
return { ready, total, ageHours: Math.floor(c.ageMs / 3600000), expired: c.expired, hasCache: true };
|
|
5712
|
+
}
|
|
5713
|
+
|
|
5600
5714
|
// 1.9.195: HTTP endpoint reachability check (μμ‘΄μ± 0)
|
|
5601
5715
|
function _probeHttpEndpoint(url, timeoutMs) {
|
|
5602
5716
|
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.197",
|
|
4
4
|
"description": "Leerness: λΉνκ΄΄ λ§μ΄κ·Έλ μ΄μ
, μλ λ²μ κ°μ§Β·μ
λ°μ΄νΈ, κ³ν/μ§ν/νΈλμ€ν μλν, κ²μΌλ¦Β·μν¬λ¦ΏΒ·μΈμ½λ© μλ κ°λ, Claude Code μ¬λμ ν΅ν©μ κ°μΆ νκ΅μ΄ μ°μ AI κ°λ° νλ€μ€.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"leerness",
|