notsleep 1.1.0 → 1.2.0

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 (49) hide show
  1. package/.env.example +130 -124
  2. package/README.md +67 -0
  3. package/dashboard/index.html +22 -4
  4. package/dist/agent.d.ts +16 -0
  5. package/dist/agent.d.ts.map +1 -1
  6. package/dist/agent.js +126 -45
  7. package/dist/agent.js.map +1 -1
  8. package/dist/config.d.ts.map +1 -1
  9. package/dist/config.js +17 -13
  10. package/dist/config.js.map +1 -1
  11. package/dist/context.d.ts.map +1 -1
  12. package/dist/context.js +12 -0
  13. package/dist/context.js.map +1 -1
  14. package/dist/cost.d.ts +5 -1
  15. package/dist/cost.d.ts.map +1 -1
  16. package/dist/cost.js +17 -2
  17. package/dist/cost.js.map +1 -1
  18. package/dist/dashboard.d.ts +2 -0
  19. package/dist/dashboard.d.ts.map +1 -1
  20. package/dist/dashboard.js.map +1 -1
  21. package/dist/fileconfig.d.ts +5 -0
  22. package/dist/fileconfig.d.ts.map +1 -1
  23. package/dist/fileconfig.js.map +1 -1
  24. package/dist/index.js +21 -21
  25. package/dist/memory.d.ts +9 -0
  26. package/dist/memory.d.ts.map +1 -1
  27. package/dist/memory.js +27 -0
  28. package/dist/memory.js.map +1 -1
  29. package/dist/provider.d.ts.map +1 -1
  30. package/dist/provider.js +42 -6
  31. package/dist/provider.js.map +1 -1
  32. package/dist/repomap.d.ts +39 -0
  33. package/dist/repomap.d.ts.map +1 -0
  34. package/dist/repomap.js +286 -0
  35. package/dist/repomap.js.map +1 -0
  36. package/dist/schema.d.ts.map +1 -1
  37. package/dist/schema.js +9 -0
  38. package/dist/schema.js.map +1 -1
  39. package/dist/test-dashboard.d.ts.map +1 -1
  40. package/dist/test-dashboard.js +9 -1
  41. package/dist/test-dashboard.js.map +1 -1
  42. package/dist/tools.d.ts +19 -0
  43. package/dist/tools.d.ts.map +1 -1
  44. package/dist/tools.js +207 -85
  45. package/dist/tools.js.map +1 -1
  46. package/dist/types.d.ts +12 -0
  47. package/dist/types.d.ts.map +1 -1
  48. package/dist/types.js.map +1 -1
  49. package/package.json +1 -1
package/.env.example CHANGED
@@ -1,124 +1,130 @@
1
- # ╔══════════════════════════════════════════════════════════╗
2
- # ║ NotSleep Configuration ║
3
- # ╚══════════════════════════════════════════════════════════╝
4
- #
5
- # Copy file ini jadi .env lalu isi sesuai kebutuhan:
6
- # copy .env.example .env
7
- #
8
-
9
- # ─── Provider ────────────────────────────────────────────
10
- # Pilih: "openai" atau "anthropic"
11
- NOTSLEEP_PROVIDER=openai
12
-
13
- # ─── OpenAI ──────────────────────────────────────────────
14
- OPENAI_API_KEY=sk-...
15
- OPENAI_MODEL=gpt-4o
16
- # Custom base URL (untuk Azure, local proxy, LM Studio, Ollama, dll)
17
- # OPENAI_BASE_URL=https://api.openai.com/v1
18
-
19
- # ─── Anthropic ───────────────────────────────────────────
20
- ANTHROPIC_API_KEY=sk-ant-...
21
- ANTHROPIC_MODEL=claude-sonnet-4-20250514
22
- # ANTHROPIC_BASE_URL=https://api.anthropic.com
23
-
24
- # ─── Registry model (gaya OpenCode / models.dev) ─────────
25
- # Alih-alih pilih provider + model terpisah, cukup satu string "provider/model".
26
- # NotSleep sudah punya baseURL bawaan untuk provider populer di bawah — kamu
27
- # tinggal isi API key-nya. Aktifkan dengan NOTSLEEP_MODEL atau field "model"
28
- # di notsleep.json, atau flag --model provider/model.
29
- # NOTSLEEP_MODEL=groq/llama-3.3-70b-versatile
30
- #
31
- # Model murah untuk kerja internal agent (summarize context, generate task).
32
- # Bisa "provider/model" atau id polos (pakai kredensial provider utama).
33
- # NOTSLEEP_SMALL_MODEL=groq/llama-3.1-8b-instant
34
- #
35
- # Provider bawaan (isi key yang relevan saja):
36
- # openai/... OPENAI_API_KEY
37
- # anthropic/... ANTHROPIC_API_KEY (SDK native)
38
- # openrouter/... OPENROUTER_API_KEY (mis. openrouter/anthropic/claude-3.5-sonnet)
39
- # groq/... GROQ_API_KEY
40
- # deepseek/... DEEPSEEK_API_KEY
41
- # together/... TOGETHER_API_KEY
42
- # xai/... XAI_API_KEY
43
- # fireworks/... FIREWORKS_API_KEY
44
- # mistral/... MISTRAL_API_KEY
45
- # perplexity/... PERPLEXITY_API_KEY
46
- # gemini/... GEMINI_API_KEY
47
- # ollama/... (lokal, tanpa key)
48
- # limitrouter/... OPENAI_API_KEY
49
- # GROQ_API_KEY=gsk-...
50
- # OPENROUTER_API_KEY=sk-or-...
51
-
52
- # ─── Agent Behavior ─────────────────────────────────────
53
- # Max loop iterations sebelum agent berhenti paksa
54
- NOTSLEEP_MAX_ITERATIONS=1000
55
-
56
- # Continuous mode: setelah 1 task selesai, otomatis lanjut task berikutnya
57
- # true = agent tidak berhenti sampai queue kosong / kamu stop manual
58
- # false = agent berhenti setelah 1 task selesai
59
- NOTSLEEP_CONTINUOUS=false
60
-
61
- # ─── Context Window Management ──────────────────────────
62
- # Batas token context window. KOSONGKAN / 0 = auto-detect dari model.
63
- # Auto-detect sync live dari models.dev (di-cache 24 jam), fallback ke
64
- # endpoint /models provider, lalu ke tabel statis. Isi manual hanya kalau
65
- # mau override.
66
- # NOTSLEEP_CONTEXT_WINDOW_LIMIT=120000
67
- #
68
- # Matikan sync jaringan model metadata (offline / air-gapped): pakai cache
69
- # atau tabel statis saja.
70
- # NOTSLEEP_NO_MODEL_SYNC=1
71
-
72
- # Kapan mulai summarize (0.75 = kalau context sudah 75% penuh)
73
- NOTSLEEP_SUMMARIZE_THRESHOLD=0.75
74
-
75
- # ─── Error Handling ─────────────────────────────────────
76
- # Max retry kalau API error (rate limit, server error, network)
77
- NOTSLEEP_MAX_RETRIES=10
78
-
79
- # Base delay untuk exponential backoff (ms)
80
- NOTSLEEP_RETRY_BASE_DELAY_MS=1000
81
-
82
- # Timeout untuk tool execution (ms) - default 2 menit
83
- NOTSLEEP_TOOL_TIMEOUT_MS=120000
84
-
85
- # ─── Self-Learning Memory ───────────────────────────────
86
- # Memori pelajaran persisten lintas-run (LOCAL by default, tidak di-push).
87
- # NOTSLEEP_MEMORY=false # matikan memori
88
- # NOTSLEEP_MEMORY_FILE=.notsleep/memory.md # lokasi file (di .notsleep/ = lokal)
89
- # NOTSLEEP_MEMORY_MAX=200 # batas jumlah pelajaran
90
- # NOTSLEEP_AUTO_REFLECT=false # matikan auto-refleksi tiap task selesai
91
-
92
- # ─── Web Dashboard ──────────────────────────────────────
93
- # Aktifkan dashboard otomatis tanpa flag --ui
94
- # NOTSLEEP_DASHBOARD=true
95
- # Port untuk web dashboard (aktifkan dengan --ui)
96
- NOTSLEEP_DASHBOARD_PORT=3120
97
-
98
- # ─── Storage ────────────────────────────────────────────
99
- # Folder untuk simpan checkpoint (crash recovery)
100
- NOTSLEEP_CHECKPOINT_DIR=.notsleep/checkpoints
101
-
102
- # Folder untuk simpan log files
103
- NOTSLEEP_LOG_DIR=.notsleep/logs
104
-
105
- # File yang kalau dibuat, agent akan berhenti
106
- # Cara stop: echo. > .notsleep/STOP
107
- NOTSLEEP_STOP_FILE=.notsleep/STOP
108
-
109
- # ─── Config File (alternatif .env) ──────────────────────
110
- # Selain .env, kamu bisa pakai file JSON: notsleep.json (project)
111
- # atau ~/.notsleep/config.json (global). Bikin dengan wizard:
112
- # notsleep init # bikin notsleep.json di project ini
113
- # notsleep init --global # bikin config global
114
- # notsleep config # lihat config final + sumbernya
115
- #
116
- # Prioritas (yang atas menang):
117
- # 1. CLI flags (--model, --provider, dst)
118
- # 2. notsleep.json (project)
119
- # 3. ~/.notsleep/config.json (global)
120
- # 4. .env / environment
121
- # 5. default bawaan
122
- #
123
- # Di notsleep.json, API key bisa pakai referensi env biar aman:
124
- # "apiKey": "{env:OPENAI_API_KEY}"
1
+ # ╔══════════════════════════════════════════════════════════╗
2
+ # ║ NotSleep Configuration ║
3
+ # ╚══════════════════════════════════════════════════════════╝
4
+ #
5
+ # Copy file ini jadi .env lalu isi sesuai kebutuhan:
6
+ # copy .env.example .env
7
+ #
8
+
9
+ # ─── Provider ────────────────────────────────────────────
10
+ # Pilih: "openai" atau "anthropic"
11
+ NOTSLEEP_PROVIDER=openai
12
+
13
+ # ─── OpenAI ──────────────────────────────────────────────
14
+ OPENAI_API_KEY=sk-...
15
+ OPENAI_MODEL=gpt-4o
16
+ # Custom base URL (untuk Azure, local proxy, LM Studio, Ollama, dll)
17
+ # OPENAI_BASE_URL=https://api.openai.com/v1
18
+
19
+ # ─── Anthropic ───────────────────────────────────────────
20
+ ANTHROPIC_API_KEY=sk-ant-...
21
+ ANTHROPIC_MODEL=claude-sonnet-4-20250514
22
+ # ANTHROPIC_BASE_URL=https://api.anthropic.com
23
+
24
+ # ─── Registry model (gaya OpenCode / models.dev) ─────────
25
+ # Alih-alih pilih provider + model terpisah, cukup satu string "provider/model".
26
+ # NotSleep sudah punya baseURL bawaan untuk provider populer di bawah — kamu
27
+ # tinggal isi API key-nya. Aktifkan dengan NOTSLEEP_MODEL atau field "model"
28
+ # di notsleep.json, atau flag --model provider/model.
29
+ # NOTSLEEP_MODEL=groq/llama-3.3-70b-versatile
30
+ #
31
+ # Model murah untuk kerja internal agent (summarize context, generate task).
32
+ # Bisa "provider/model" atau id polos (pakai kredensial provider utama).
33
+ # NOTSLEEP_SMALL_MODEL=groq/llama-3.1-8b-instant
34
+ #
35
+ # Provider bawaan (isi key yang relevan saja):
36
+ # openai/... OPENAI_API_KEY
37
+ # anthropic/... ANTHROPIC_API_KEY (SDK native)
38
+ # openrouter/... OPENROUTER_API_KEY (mis. openrouter/anthropic/claude-3.5-sonnet)
39
+ # groq/... GROQ_API_KEY
40
+ # deepseek/... DEEPSEEK_API_KEY
41
+ # together/... TOGETHER_API_KEY
42
+ # xai/... XAI_API_KEY
43
+ # fireworks/... FIREWORKS_API_KEY
44
+ # mistral/... MISTRAL_API_KEY
45
+ # perplexity/... PERPLEXITY_API_KEY
46
+ # gemini/... GEMINI_API_KEY
47
+ # ollama/... (lokal, tanpa key)
48
+ # limitrouter/... OPENAI_API_KEY
49
+ # GROQ_API_KEY=gsk-...
50
+ # OPENROUTER_API_KEY=sk-or-...
51
+
52
+ # ─── Agent Behavior ─────────────────────────────────────
53
+ # Max loop iterations sebelum agent berhenti paksa
54
+ NOTSLEEP_MAX_ITERATIONS=1000
55
+
56
+ # Continuous mode: setelah 1 task selesai, otomatis lanjut task berikutnya
57
+ # true = agent tidak berhenti sampai queue kosong / kamu stop manual
58
+ # false = agent berhenti setelah 1 task selesai
59
+ NOTSLEEP_CONTINUOUS=false
60
+
61
+ # ─── Context Window Management ──────────────────────────
62
+ # Batas token context window. KOSONGKAN / 0 = auto-detect dari model.
63
+ # Auto-detect sync live dari models.dev (di-cache 24 jam), fallback ke
64
+ # endpoint /models provider, lalu ke tabel statis. Isi manual hanya kalau
65
+ # mau override.
66
+ # NOTSLEEP_CONTEXT_WINDOW_LIMIT=120000
67
+ #
68
+ # Matikan sync jaringan model metadata (offline / air-gapped): pakai cache
69
+ # atau tabel statis saja.
70
+ # NOTSLEEP_NO_MODEL_SYNC=1
71
+
72
+ # Kapan mulai summarize (0.75 = kalau context sudah 75% penuh)
73
+ NOTSLEEP_SUMMARIZE_THRESHOLD=0.75
74
+
75
+ # ─── Error Handling ─────────────────────────────────────
76
+ # Max retry kalau API error (rate limit, server error, network)
77
+ NOTSLEEP_MAX_RETRIES=10
78
+
79
+ # Base delay untuk exponential backoff (ms)
80
+ NOTSLEEP_RETRY_BASE_DELAY_MS=1000
81
+
82
+ # Timeout untuk tool execution (ms) - default 2 menit
83
+ NOTSLEEP_TOOL_TIMEOUT_MS=120000
84
+
85
+ # ─── Self-Learning Memory ───────────────────────────────
86
+ # Memori pelajaran persisten lintas-run (LOCAL by default, tidak di-push).
87
+ # NOTSLEEP_MEMORY=false # matikan memori
88
+ # NOTSLEEP_MEMORY_FILE=.notsleep/memory.md # lokasi file (di .notsleep/ = lokal)
89
+ # NOTSLEEP_MEMORY_MAX=200 # batas jumlah pelajaran
90
+ # NOTSLEEP_AUTO_REFLECT=false # matikan auto-refleksi tiap task selesai
91
+
92
+ # ─── Web Dashboard ──────────────────────────────────────
93
+ # Aktifkan dashboard otomatis tanpa flag --ui
94
+ # NOTSLEEP_DASHBOARD=true
95
+ # Port untuk web dashboard (aktifkan dengan --ui)
96
+ NOTSLEEP_DASHBOARD_PORT=3120
97
+
98
+ # ─── Storage ────────────────────────────────────────────
99
+ # Folder untuk simpan checkpoint (crash recovery)
100
+ NOTSLEEP_CHECKPOINT_DIR=.notsleep/checkpoints
101
+
102
+ # Folder untuk simpan log files
103
+ NOTSLEEP_LOG_DIR=.notsleep/logs
104
+
105
+ # File yang kalau dibuat, agent akan berhenti
106
+ # Cara stop: echo. > .notsleep/STOP
107
+ NOTSLEEP_STOP_FILE=.notsleep/STOP
108
+
109
+ # ─── Config File (alternatif .env) ──────────────────────
110
+ # Selain .env, kamu bisa pakai file JSON: notsleep.json (project)
111
+ # atau ~/.notsleep/config.json (global). Bikin dengan wizard:
112
+ # notsleep init # bikin notsleep.json di project ini
113
+ # notsleep init --global # bikin config global
114
+ # notsleep config # lihat config final + sumbernya
115
+ #
116
+ # Prioritas (yang atas menang):
117
+ # 1. CLI flags (--model, --provider, dst)
118
+ # 2. notsleep.json (project)
119
+ # 3. ~/.notsleep/config.json (global)
120
+ # 4. .env / environment
121
+ # 5. default bawaan
122
+ #
123
+ # Di notsleep.json, API key bisa pakai referensi env biar aman:
124
+ # "apiKey": "{env:OPENAI_API_KEY}"
125
+
126
+ # ─── Repository Map ─────────────────────────────────────
127
+ # Peta codebase terkompresi (simbol per file, diperingkat) yang disuntik ke
128
+ # prompt supaya agent tak baca file buta-butaan.
129
+ # NOTSLEEP_REPO_MAP=false # matikan
130
+ # NOTSLEEP_REPO_MAP_TOKENS=2000 # budget token peta
package/README.md CHANGED
@@ -189,6 +189,41 @@ bare model id, which reuses the primary provider's key + base URL (e.g. primary
189
189
  `gpt-4o`, `small_model: "gpt-4o-mini"`). CLI: `--small-model`. Unset → internal
190
190
  calls use the primary model.
191
191
 
192
+ ### Repository map — the codebase at a glance
193
+
194
+ The biggest waste in an autonomous loop is the agent opening files just to find
195
+ where things live. NotSleep builds a **compressed, ranked map of the codebase**
196
+ and injects it into the system prompt, so the agent navigates straight to the
197
+ right file instead of reading everything.
198
+
199
+ ```
200
+ REPOSITORY MAP (the codebase at a glance — top-level symbols per file, most-referenced first).
201
+ Use this to jump STRAIGHT to the right file instead of reading files to find things.
202
+
203
+ src/types.ts
204
+ type Provider · interface AgentConfig · interface Message · interface QueuedTask · ...
205
+ src/logger.ts
206
+ class Logger · enum LogLevel · interface LogEntry
207
+ src/tools.ts
208
+ fn createBuiltinTools · fn parseRetryAfter · fn backoffDelay · ...
209
+ ```
210
+
211
+ - **Language-aware** symbol extraction (TS/JS, Python, Go, Rust, Java/Kotlin,
212
+ Ruby, PHP, C-family, C#) — no heavy parser dependency.
213
+ - **Ranked like Aider's repo map**: a symbol's importance is how many *other*
214
+ files reference it, so core types outrank file-local helpers.
215
+ - **Token-budgeted** — the lowest-signal files are dropped, never the core ones.
216
+
217
+ On NotSleep's own repo this is a **~970-token map of 35 files, built in 25 ms** —
218
+ replacing the tens of thousands of tokens an agent would burn reading files
219
+ blindly.
220
+
221
+ ```json
222
+ { "repoMap": { "enabled": true, "maxTokens": 2000 } }
223
+ ```
224
+
225
+ Disable with `"enabled": false` or `NOTSLEEP_REPO_MAP=false`.
226
+
192
227
  ### Self-learning memory
193
228
 
194
229
  The agent keeps a persistent memory of lessons across runs, so it gets better
@@ -297,6 +332,38 @@ All settings can also be configured via `.env` file or CLI flags:
297
332
  | `NOTSLEEP_RETRY_BASE_DELAY_MS` | `1000` | Base delay for exponential backoff |
298
333
  | `NOTSLEEP_TOOL_TIMEOUT_MS` | `120000` | Timeout for tool execution |
299
334
 
335
+ ## Cost
336
+
337
+ **NotSleep itself is free** (MIT). It has no fees and phones no one — but it
338
+ **calls an LLM API**, and you pay **your own provider** with **your own API
339
+ key**. There's no shared/hosted cost: what you spend is entirely your choice.
340
+
341
+ How much depends on the model and how long you run:
342
+
343
+ | Setup | Cost |
344
+ |-------|------|
345
+ | **Ollama** (a local model on your machine) | **$0** — fully offline, no API calls |
346
+ | **Free tiers** (Groq, Gemini) | **$0** up to the provider's quota |
347
+ | **Cheap models** (`claude-haiku`, `deepseek`, `gemini-*-flash`, `*-mini`) | cents per cycle |
348
+ | **Frontier models** (Opus, GPT-5) | more — cache to keep it low |
349
+
350
+ Keeping it cheap:
351
+
352
+ - **Pick a cheap or local model** — it's one string: `--model ollama/llama3`,
353
+ `--model groq/llama-3.3-70b`, `--model deepseek/deepseek-chat`.
354
+ - **Use `small_model`** so the agent's internal calls (summaries, task
355
+ generation) run on something cheap.
356
+ - **Cap spend** with `--max-cost 5` (the agent stops when the estimate crosses
357
+ your budget).
358
+ - **Prompt caching.** The agent is read-heavy — it re-sends the growing context
359
+ every turn — so caching matters a lot. OpenAI, DeepSeek, and most proxies
360
+ cache automatically; NotSleep sets Anthropic `cache_control` for you so
361
+ Anthropic-direct runs are cached too. Cached input is billed ~10× cheaper,
362
+ which can turn a "$30" run into cents.
363
+
364
+ The dashboard's **Est. Cost** is a best-effort, cache-aware estimate — a rough
365
+ guide, not a bill. Your provider's dashboard is the source of truth.
366
+
300
367
  ## Programmatic API
301
368
 
302
369
  ```typescript
@@ -272,6 +272,11 @@
272
272
  /* ─── Log Panel ──────────────────────────── */
273
273
  .log-panel {
274
274
  grid-row: 2;
275
+ /* min-height:0 lets this grid item shrink to its 1fr track and scroll
276
+ internally, instead of expanding past the viewport (which pushed the
277
+ stats row off-screen). min-width:0 does the same for long log lines. */
278
+ min-height: 0;
279
+ min-width: 0;
275
280
  }
276
281
 
277
282
  .log-body {
@@ -331,6 +336,8 @@
331
336
  display: flex;
332
337
  flex-direction: column;
333
338
  gap: 16px;
339
+ min-height: 0;
340
+ min-width: 0;
334
341
  }
335
342
 
336
343
  /* ─── Task Queue ─────────────────────────── */
@@ -491,15 +498,22 @@
491
498
  font-size: 12px;
492
499
  color: var(--accent);
493
500
  display: flex;
494
- align-items: center;
501
+ align-items: flex-start;
495
502
  gap: 8px;
503
+ flex-shrink: 0;
504
+ /* A long task/mission can be thousands of chars — cap it so it scrolls
505
+ instead of blowing up the panel height. */
506
+ max-height: 64px;
507
+ overflow-y: auto;
496
508
  }
509
+ #currentTaskText { word-break: break-word; }
497
510
 
498
511
  .current-task-label {
499
512
  font-weight: 700;
500
513
  text-transform: uppercase;
501
514
  font-size: 10px;
502
515
  letter-spacing: 0.5px;
516
+ flex-shrink: 0;
503
517
  }
504
518
  </style>
505
519
  </head>
@@ -541,7 +555,7 @@
541
555
  </div>
542
556
  <div class="stat-card">
543
557
  <div id="statTokens" class="stat-value">0</div>
544
- <div class="stat-label">Tokens</div>
558
+ <div class="stat-label">Total tokens</div>
545
559
  </div>
546
560
  <div class="stat-card">
547
561
  <div id="statCost" class="stat-value">$0</div>
@@ -723,9 +737,13 @@ function updateState(s) {
723
737
  const ctxFill = document.getElementById('ctxFill');
724
738
  ctxFill.style.width = Math.min(ctxPct, 100) + '%';
725
739
  ctxFill.className = 'progress-bar-fill ' + (ctxPct >= 85 ? 'ctx-high' : ctxPct >= 60 ? 'ctx-warn' : 'ctx-ok');
726
- const ctxTokens = Math.round((s.contextUsage || 0) * (s.contextLimit || 0));
740
+ // Prefer the exact prompt_tokens reported by the API (matches your provider's
741
+ // "input tokens"); fall back to the usage ratio before the first response.
742
+ const ctxTokens = s.contextTokens != null
743
+ ? s.contextTokens
744
+ : Math.round((s.contextUsage || 0) * (s.contextLimit || 0));
727
745
  document.getElementById('ctxLabel').textContent =
728
- `${ctxPct}% · ${formatNumber(ctxTokens)} / ${formatNumber(s.contextLimit || 0)}`;
746
+ `${ctxPct}% · ${formatNumber(ctxTokens)} / ${formatNumber(s.contextLimit || 0)} tokens`;
729
747
 
730
748
  // Cost-per-hour, derived from est. cost and elapsed time (relevant for long runs).
731
749
  const elapsedHr = s.stats.startTime ? (Date.now() - s.stats.startTime) / 3600000 : 0;
package/dist/agent.d.ts CHANGED
@@ -64,6 +64,22 @@ export declare class Agent {
64
64
  */
65
65
  private consecutiveErrors;
66
66
  private static readonly MAX_CONSECUTIVE_ERRORS;
67
+ /**
68
+ * Consecutive turns spent ONLY reading/exploring (no edit, shell, or other
69
+ * state-changing action). Weaker models can loop reading files without ever
70
+ * acting; when this streak crosses the threshold we nudge them to make a
71
+ * concrete change. Reset to 0 whenever a productive tool is used.
72
+ */
73
+ private exploreStreak;
74
+ private static readonly EXPLORE_NUDGE_AT;
75
+ /**
76
+ * Whether the current task has already received its "wrap up, you're near the
77
+ * per-task budget" warning. Reset when a new task starts. Lets the model
78
+ * finish gracefully (call task_complete) instead of being cut off abruptly.
79
+ */
80
+ private wrapUpWarned;
81
+ /** Tools that only observe — using ONLY these counts as "exploring". */
82
+ private static readonly READ_ONLY_TOOLS;
67
83
  constructor(config: AgentConfig, logger: Logger);
68
84
  /**
69
85
  * Register a custom tool.
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,WAAW,EAA2B,OAAO,EAAc,QAAQ,EAAE,cAAc,EAAyB,MAAM,SAAS,CAAC;AAErI,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAGlC,OAAO,EAAE,eAAe,EAAoB,MAAM,aAAa,CAAC;AAMhE;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAyClE;AAED,qBAAa,KAAK;IAChB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,QAAQ,CAAc;IAC9B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,QAAQ,CAAY;IAC5B,OAAO,CAAC,KAAK,CAAW;IACxB,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,MAAM,CAAU;IAExB,sEAAsE;IACtE,OAAO,CAAC,SAAS,CAAe;IAChC,OAAO,CAAC,aAAa,CAAgB;IAErC;;;;;OAKG;IACH,OAAO,CAAC,yBAAyB,CAAK;IAEtC,oCAAoC;IACpC,OAAO,CAAC,SAAS,CAAgC;IAEjD,iDAAiD;IACjD,OAAO,CAAC,MAAM,CAA4B;IAE1C;;;;OAIG;IACH,OAAO,CAAC,gBAAgB,CAAK;IAE7B;;;;OAIG;IACH,OAAO,CAAC,sBAAsB,CAAK;IAEnC;;OAEG;IACH,OAAO,CAAC,oBAAoB,CAAK;IAEjC;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAM;gBAExC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM;IAyC/C;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAInC;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,eAAe,GAAG,IAAI;IAc9C,OAAO,CAAC,sBAAsB;IAkD9B,sCAAsC;IACtC,OAAO,CAAC,cAAc;IAyCtB;;;;;;;;;;;;;OAaG;IACG,GAAG,CAAC,eAAe,EAAE,MAAM,EAAE,oBAAoB,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;QAC1E,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,QAAQ,CAAC;KACjB,CAAC;IAsSF,OAAO,CAAC,kBAAkB;IA2B1B,OAAO,CAAC,YAAY;IAKpB;;;;;OAKG;YACW,cAAc;IA+B5B,8EAA8E;IAC9E,OAAO,CAAC,WAAW;IAYnB;;OAEG;IACH,OAAO,CAAC,UAAU;IAuBlB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAc/B;;OAEG;YACW,WAAW;IAiFzB;;OAEG;YACW,eAAe;IA6G7B;;;;;;;OAOG;IACH,OAAO,CAAC,YAAY;IAapB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,oBAAoB;IA4B5B;;;OAGG;YACW,aAAa;IAsH3B,oDAAoD;IACpD,OAAO,CAAC,qBAAqB;IAI7B;;OAEG;IACH,OAAO,CAAC,cAAc;IAkBtB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA2BzB,OAAO,CAAC,KAAK;IAMb;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IAS1B,2EAA2E;IAC3E,OAAO,CAAC,iBAAiB;IA2BzB;;;;;OAKG;YACW,kBAAkB;CAqCjC"}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}