deel-local-cli 1.8.0 → 1.12.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 (61) hide show
  1. package/README.ko.md +10 -25
  2. package/README.md +43 -51
  3. package/bin/deel.js +56 -13
  4. package/package.json +60 -60
  5. package/src/acp/serve.js +810 -732
  6. package/src/agent/budget.js +156 -153
  7. package/src/agent/compact.js +420 -296
  8. package/src/agent/effort.js +308 -177
  9. package/src/agent/evidence.js +2 -0
  10. package/src/agent/evolve.js +263 -213
  11. package/src/agent/filemem.js +155 -0
  12. package/src/agent/grade.js +51 -1
  13. package/src/agent/loop.js +1707 -1349
  14. package/src/agent/memory.js +156 -152
  15. package/src/agent/mention.js +210 -210
  16. package/src/agent/session.js +1049 -832
  17. package/src/agent/store.js +186 -9
  18. package/src/agent/threads.js +26 -1
  19. package/src/backend/adapter.js +1159 -615
  20. package/src/backend/cachemark.js +150 -0
  21. package/src/backend/detect.js +327 -288
  22. package/src/backend/learn.js +24 -0
  23. package/src/backend/mcp.js +96 -5
  24. package/src/backend/probe.js +131 -61
  25. package/src/backend/quota.js +250 -133
  26. package/src/backend/retry.js +30 -6
  27. package/src/backend/tokens.js +37 -0
  28. package/src/backend/toolfit.js +352 -0
  29. package/src/backend/wire.js +600 -0
  30. package/src/commands.js +3135 -2918
  31. package/src/config.js +47 -2
  32. package/src/i18n/en.js +544 -466
  33. package/src/i18n/index.js +18 -0
  34. package/src/i18n/ja.js +497 -417
  35. package/src/i18n/ko.js +591 -466
  36. package/src/i18n/zh.js +497 -417
  37. package/src/lsp/client.js +49 -5
  38. package/src/oneshot.js +620 -471
  39. package/src/pack/sbom.js +30 -4
  40. package/src/pack/selfpack.js +25 -9
  41. package/src/pack/sheet.en.js +288 -0
  42. package/src/pack/tar.js +65 -2
  43. package/src/plugins/manage.js +46 -9
  44. package/src/providers/bedrock.js +17 -0
  45. package/src/repl.js +2602 -2286
  46. package/src/safety/audit.js +92 -8
  47. package/src/safety/authcmd.js +14 -3
  48. package/src/safety/guard.js +143 -0
  49. package/src/safety/keystore.js +62 -39
  50. package/src/safety/undo.js +24 -6
  51. package/src/tools/fsutil.js +265 -250
  52. package/src/tools/index.js +239 -34
  53. package/src/tools/jobs.js +158 -29
  54. package/src/tools/verify.js +358 -328
  55. package/src/tools/webfetch.js +92 -9
  56. package/src/ui/md.js +201 -5
  57. package/src/ui/motion.js +0 -1
  58. package/src/ui/pastechip.js +50 -3
  59. package/src/ui/pick.js +115 -0
  60. package/src/ui/screen.js +23 -3
  61. package/src/ui/status.js +613 -610
package/src/config.js CHANGED
@@ -164,6 +164,23 @@ export function save(cfg, { toProject = false } = {}) {
164
164
  return p;
165
165
  }
166
166
 
167
+ /**
168
+ * 설정을 남긴다. 못 남겨도 던지지 않고, **왜 못 남겼는지를 돌려준다.**
169
+ *
170
+ * 부르는 자리가 아홉 군데인데 전부 `try { save(cfg) } catch {}` 였다. 「못
171
+ * 남겨도 이번 세션에는 먹는다」 는 맞는 말이지만, 그 뒤에 화면은 `✓` 를
172
+ * 찍는다 — 사람은 정해진 줄 알고 다음에 창을 열었다가 옛 값을 본다. 그리고
173
+ * 그때는 무엇 때문인지 알 길이 없다(홈이 읽기 전용인지, 디스크가 찼는지).
174
+ *
175
+ * 던지는 것은 안 바꾼다. 설정 하나 못 적었다고 대화가 끊기면 본말이 뒤집힌다.
176
+ *
177
+ * @returns {{ok: true, 자리: string} | {ok: false, 왜: string}}
178
+ */
179
+ export function 저장시도(cfg, 옵션 = {}) {
180
+ try { return { ok: true, 자리: save(cfg, 옵션) }; }
181
+ catch (err) { return { ok: false, 왜: err?.message ?? String(err) }; }
182
+ }
183
+
167
184
  export function activeProfile(cfg = load()) {
168
185
  if (!cfg.profiles.length) return null;
169
186
  return cfg.profiles.find((x) => x.id === cfg.active) ?? cfg.profiles[0];
@@ -172,6 +189,23 @@ export function activeProfile(cfg = load()) {
172
189
  // 환경변수가 있으면 파일보다 우선한다 — 사내망에서 키를 파일에 안 남기고 싶을 때 쓴다.
173
190
  const 푼것 = new Map(); // 잠긴 값 → 푼 글. 한 판에 한 번만 풀면 된다.
174
191
 
192
+ /**
193
+ * 잠근 열쇠를 못 푼 까닭. 화면이 한 번 읽어 가면 지워진다.
194
+ *
195
+ * ── 왜 있어야 하나 ──────────────────────────────────────────────────────
196
+ *
197
+ * keystore.js 의 풀기() 는 왜 못 풀었는지를 성실하게 만들어 돌려준다 —
198
+ * 「이 PC 의 이 계정에서 잠근 것만 풀립니다」 같은 말이다. 그 함수 머리말이
199
+ * 그렇게 하는 까닭까지 적어 뒀다: **빈 글자만 돌려주면 사람은 401 만 보고
200
+ * 게이트웨이를 의심한다.**
201
+ *
202
+ * 그런데 부르는 쪽이 그 말을 버리고 있었다. 빈 열쇠가 나가면 http.js 는
203
+ * Authorization 머리말을 아예 안 붙이고, 게이트웨이는 401 을 준다. 사람은
204
+ * 방화벽·주소·계정을 뒤진다. 진짜 까닭은 「설정 파일을 다른 PC 로 옮겼다」 인데.
205
+ */
206
+ let 열쇠탈 = null;
207
+ export function 열쇠탈소식() { const s = 열쇠탈; 열쇠탈 = null; return s; }
208
+
175
209
  export function resolveKey(profile) {
176
210
  const byName = profile?.id ? process.env[`DEEL_KEY_${profile.id.toUpperCase()}`] : null;
177
211
  const 값 = byName || process.env.DEEL_API_KEY || profile?.apiKey || '';
@@ -180,8 +214,19 @@ export function resolveKey(profile) {
180
214
  // 기다리는 시간이라, 판에 한 번만 풀고 들고 있는다.
181
215
  if (푼것.has(값)) return 푼것.get(값);
182
216
  const r = 풀기(값);
183
- 푼것.set(값, r.ok ? r.text : '');
184
- return r.ok ? r.text : '';
217
+ if (!r.ok) {
218
+ /*
219
+ * **실패는 안 담아 둔다.**
220
+ *
221
+ * 담아 두면 그 판 내내 다시 시도조차 안 한다. 사람이 그 사이에
222
+ * `deel setup` 으로 열쇠를 다시 넣어도 이 판에서는 영영 안 풀린다.
223
+ * 푸는 값이 0.2초라, 안 되는 것을 아껴서 얻을 것이 없다.
224
+ */
225
+ 열쇠탈 = r.why || '잠근 열쇠를 못 풀었습니다';
226
+ return '';
227
+ }
228
+ 푼것.set(값, r.text);
229
+ return r.text;
185
230
  }
186
231
 
187
232
  export function upsert(cfg, profile) {