deel-local-cli 1.10.0 → 1.13.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 (55) hide show
  1. package/README.ko.md +1167 -1166
  2. package/README.md +1224 -1223
  3. package/bin/deel.js +1 -1
  4. package/package.json +2 -2
  5. package/src/acp/map.js +367 -362
  6. package/src/acp/serve.js +810 -769
  7. package/src/agent/budget.js +156 -153
  8. package/src/agent/commit.js +534 -511
  9. package/src/agent/compact.js +158 -31
  10. package/src/agent/effort.js +308 -197
  11. package/src/agent/evolve.js +263 -213
  12. package/src/agent/filemem.js +16 -2
  13. package/src/agent/loop.js +1728 -1516
  14. package/src/agent/memory.js +156 -152
  15. package/src/agent/mention.js +210 -210
  16. package/src/agent/recall.js +222 -209
  17. package/src/agent/session.js +1056 -948
  18. package/src/backend/adapter.js +1355 -798
  19. package/src/backend/cachemark.js +223 -0
  20. package/src/backend/detect.js +327 -288
  21. package/src/backend/http.js +460 -458
  22. package/src/backend/mcp.js +407 -395
  23. package/src/backend/price.js +260 -197
  24. package/src/backend/probe.js +487 -473
  25. package/src/backend/quota.js +274 -157
  26. package/src/backend/retry.js +30 -6
  27. package/src/backend/tokens.js +59 -0
  28. package/src/backend/toolfit.js +352 -325
  29. package/src/backend/wire.js +715 -0
  30. package/src/commands.js +3184 -2998
  31. package/src/config.js +283 -244
  32. package/src/i18n/en.js +545 -520
  33. package/src/i18n/ja.js +498 -473
  34. package/src/i18n/ko.js +592 -567
  35. package/src/i18n/zh.js +498 -473
  36. package/src/oneshot.js +625 -549
  37. package/src/pack/tar.js +154 -132
  38. package/src/pack/zip.js +235 -217
  39. package/src/plugins/manage.js +416 -336
  40. package/src/providers/bedrock.js +17 -0
  41. package/src/repl.js +2616 -2515
  42. package/src/safety/audit.js +148 -129
  43. package/src/safety/guard.js +641 -526
  44. package/src/safety/network.js +200 -157
  45. package/src/tools/fastgrep.js +229 -214
  46. package/src/tools/fsutil.js +291 -250
  47. package/src/tools/index.js +2560 -2523
  48. package/src/tools/jobs.js +876 -795
  49. package/src/tools/label.js +52 -0
  50. package/src/tools/spawn.js +213 -99
  51. package/src/tools/verify.js +358 -357
  52. package/src/tools/webfetch.js +418 -393
  53. package/src/ui/export.js +233 -217
  54. package/src/ui/pick.js +115 -115
  55. package/src/ui/status.js +617 -610
package/src/ui/pick.js CHANGED
@@ -1,115 +1,115 @@
1
- // 고른 번호 + 하고 싶은 말, 한 줄에서 갈라 읽기.
2
- //
3
- // ── 사람 말 ─────────────────────────────────────────────────────────────
4
- //
5
- // 「사용자에게 계획 물어볼 때 번호만 입력하는 게 아니라, 번호를 고르고
6
- // 의견이 있으면 의견도 입력할 수 있게」
7
- //
8
- // 여태는 둘 중 하나였다. 숫자만 치면 그 줄을 고른 것이고, 그 밖의 글은
9
- // **고른 것 없이** 통째로 자유 답이었다. 그래서 「2번인데 파일은 나눠서」
10
- // 라고 치면 2번을 고른 사실이 사라진다. 사람은 골랐다고 생각하는데
11
- // 모델에게는 고른 것이 없는 문장 하나만 간다.
12
- //
13
- // 실제로는 이렇게 답하고 싶어진다 —
14
- //
15
- // 2 파일은 나눠서 해줘 (고르고 + 덧붙이고)
16
- // 2: 파일은 나눠서 해줘
17
- // 2, 파일은 나눠서 해줘
18
- // 2 - 파일은 나눠서 해줘
19
- // 1,3 (둘 다)
20
- // 1 3 둘 다 하되 순서는 반대로
21
- //
22
- // ── 어디서 멈추나 ───────────────────────────────────────────────────────
23
- //
24
- // 숫자로 읽는 것은 **머리에 붙은, 목록 안에 있는 수**뿐이다. 그 뒤로는 다
25
- // 사람 말이다. 이 선이 없으면 「3개만 해줘」 가 3번을 고른 것이 된다 —
26
- // 사람이 고른 적 없는 것을 골랐다고 하는 셈이라, 안 받느니만 못하다.
27
- // 그래서 수 바로 뒤에 글자가 붙어 있으면(3개) 수로 안 읽는다.
28
- //
29
- // 목록에 없는 수도 안 읽는다. 선택지가 둘인데 「5분만 기다려」 라고 치면
30
- // 그건 고른 것이 아니라 하는 말이다.
31
-
32
- /** 수 뒤에 올 수 있는 것 — 끝, 빈칸, 그리고 흔한 구분표. `1.5` 는 수가 아니다. */
33
- const 수뒤 = /^(\d{1,3})(?:\s*[.)::\]](?!\d)|\s*[,,、·]|\s|$)/;
34
-
35
- /** 수와 말 사이에 사람이 흔히 넣는 것들. 말 앞머리에서 떼어 낸다. */
36
- const 사이표 = /^[\s,,、·::\-–—>]+/;
37
-
38
- /**
39
- * 답 한 줄을 「고른 번호들」과 「덧붙인 말」로 가른다.
40
- *
41
- * @param {string} 답 사람이 친 그대로
42
- * @param {string[]} 고를것 보여 준 선택지
43
- * @returns {{번호들: number[], 덧말: string, 글: string}}
44
- * 글 — 모델에게 보낼 한 줄. 고른 것이 없으면 친 글 그대로다.
45
- */
46
- export function 고른것풀기(답, 고를것 = []) {
47
- const 원 = String(답 ?? '').trim();
48
- const 목록 = Array.isArray(고를것) ? 고를것 : [];
49
- if (!원) return { 번호들: [], 덧말: '', 글: '' };
50
-
51
- const 번호들 = [];
52
- let 남은 = 원;
53
- for (;;) {
54
- const m = 수뒤.exec(남은);
55
- if (!m) break;
56
- const n = Number(m[1]);
57
- // 목록 밖의 수는 고른 것이 아니라 하는 말이다.
58
- if (!Number.isInteger(n) || n < 1 || n > 목록.length) break;
59
- // 같은 것을 두 번 쳐도 한 번만 센다 — 「1 1」 을 두 갈래로 읽을 까닭이 없다.
60
- if (!번호들.includes(n)) 번호들.push(n);
61
- 남은 = 남은.slice(m[0].length).replace(사이표, '');
62
- }
63
-
64
- const 덧말 = 남은.trim();
65
- // 아무 수도 못 읽었으면 여태와 똑같다 — 친 글이 그대로 답이다.
66
- if (!번호들.length) return { 번호들: [], 덧말: '', 글: 원 };
67
-
68
- const 고른 = 번호들.map((n) => String(목록[n - 1] ?? '').trim()).filter(Boolean);
69
- const 글 = 고른.join(' · ') + (덧말 ? ` — ${덧말}` : '');
70
- return { 번호들, 덧말, 글 };
71
- }
72
-
73
- /**
74
- * 계획 상자의 답을 읽는다.
75
- *
76
- * 여기 갈래가 있다.
77
- * · 그냥 진행 — ⏎ · y · yes · ㅇ · 진행
78
- * · 진행하되 한마디 — `y 검사도 같이 넣어줘`
79
- * · 그만 — n · no · ㄴ
80
- * · 그 밖의 글 — 그 말대로 다시 짜라 (여태 그대로)
81
- * · `3 이건 빼자` — 3단계에 대한 말로 붙여서 다시 짜라
82
- *
83
- * ⏎ 하나로 진행하는 것은 안 건드린다. 계획을 읽고 「그래」 하는 데
84
- * 두 글자를 더 치게 하면, 그 두 글자 때문에 안 읽고 넘기게 된다.
85
- *
86
- * @param {string} 답
87
- * @param {number} 단계수 계획이 몇 단계인가 (번호를 가려내는 데 쓴다)
88
- * @returns {{갈래: '진행'|'그만'|'다시', 덧말: string, 단계: number|null}}
89
- */
90
- export function 계획답풀기(답, 단계수 = 0) {
91
- const 원 = String(답 ?? '').trim();
92
- if (!원) return { 갈래: '진행', 덧말: '', 단계: null };
93
-
94
- const 첫낱말 = 원.split(/\s+/)[0].toLowerCase();
95
- const 나머지 = 원.slice(원.split(/\s+/)[0].length).replace(사이표, '').trim();
96
-
97
- if (['n', 'no', 'ㄴ', '아니', '아니요', '취소'].includes(첫낱말)) {
98
- return { 갈래: '그만', 덧말: '', 단계: null };
99
- }
100
- if (['y', 'yes', 'ㅇ', '네', '예', '진행', 'ok', 'go'].includes(첫낱말)) {
101
- return { 갈래: '진행', 덧말: 나머지, 단계: null };
102
- }
103
-
104
- // 「3 이건 빼자」 — 그 단계에 대고 하는 말이다.
105
- const m = 수뒤.exec(원);
106
- if (m) {
107
- const n = Number(m[1]);
108
- if (Number.isInteger(n) && n >= 1 && n <= 단계수) {
109
- const 말 = 원.slice(m[0].length).replace(사이표, '').trim();
110
- if (말) return { 갈래: '다시', 덧말: 말, 단계: n };
111
- }
112
- }
113
-
114
- return { 갈래: '다시', 덧말: 원, 단계: null };
115
- }
1
+ // 고른 번호 + 하고 싶은 말, 한 줄에서 갈라 읽기.
2
+ //
3
+ // ── 사람 말 ─────────────────────────────────────────────────────────────
4
+ //
5
+ // 「사용자에게 계획 물어볼 때 번호만 입력하는 게 아니라, 번호를 고르고
6
+ // 의견이 있으면 의견도 입력할 수 있게」
7
+ //
8
+ // 여태는 둘 중 하나였다. 숫자만 치면 그 줄을 고른 것이고, 그 밖의 글은
9
+ // **고른 것 없이** 통째로 자유 답이었다. 그래서 「2번인데 파일은 나눠서」
10
+ // 라고 치면 2번을 고른 사실이 사라진다. 사람은 골랐다고 생각하는데
11
+ // 모델에게는 고른 것이 없는 문장 하나만 간다.
12
+ //
13
+ // 실제로는 이렇게 답하고 싶어진다 —
14
+ //
15
+ // 2 파일은 나눠서 해줘 (고르고 + 덧붙이고)
16
+ // 2: 파일은 나눠서 해줘
17
+ // 2, 파일은 나눠서 해줘
18
+ // 2 - 파일은 나눠서 해줘
19
+ // 1,3 (둘 다)
20
+ // 1 3 둘 다 하되 순서는 반대로
21
+ //
22
+ // ── 어디서 멈추나 ───────────────────────────────────────────────────────
23
+ //
24
+ // 숫자로 읽는 것은 **머리에 붙은, 목록 안에 있는 수**뿐이다. 그 뒤로는 다
25
+ // 사람 말이다. 이 선이 없으면 「3개만 해줘」 가 3번을 고른 것이 된다 —
26
+ // 사람이 고른 적 없는 것을 골랐다고 하는 셈이라, 안 받느니만 못하다.
27
+ // 그래서 수 바로 뒤에 글자가 붙어 있으면(3개) 수로 안 읽는다.
28
+ //
29
+ // 목록에 없는 수도 안 읽는다. 선택지가 둘인데 「5분만 기다려」 라고 치면
30
+ // 그건 고른 것이 아니라 하는 말이다.
31
+
32
+ /** 수 뒤에 올 수 있는 것 — 끝, 빈칸, 그리고 흔한 구분표. `1.5` 는 수가 아니다. */
33
+ const 수뒤 = /^(\d{1,3})(?:\s*[.)::\]](?!\d)|\s*[,,、·]|\s|$)/;
34
+
35
+ /** 수와 말 사이에 사람이 흔히 넣는 것들. 말 앞머리에서 떼어 낸다. */
36
+ const 사이표 = /^[\s,,、·::\-–—>]+/;
37
+
38
+ /**
39
+ * 답 한 줄을 「고른 번호들」과 「덧붙인 말」로 가른다.
40
+ *
41
+ * @param {string} 답 사람이 친 그대로
42
+ * @param {string[]} 고를것 보여 준 선택지
43
+ * @returns {{번호들: number[], 덧말: string, 글: string}}
44
+ * 글 — 모델에게 보낼 한 줄. 고른 것이 없으면 친 글 그대로다.
45
+ */
46
+ export function 고른것풀기(답, 고를것 = []) {
47
+ const 원 = String(답 ?? '').trim();
48
+ const 목록 = Array.isArray(고를것) ? 고를것 : [];
49
+ if (!원) return { 번호들: [], 덧말: '', 글: '' };
50
+
51
+ const 번호들 = [];
52
+ let 남은 = 원;
53
+ for (;;) {
54
+ const m = 수뒤.exec(남은);
55
+ if (!m) break;
56
+ const n = Number(m[1]);
57
+ // 목록 밖의 수는 고른 것이 아니라 하는 말이다.
58
+ if (!Number.isInteger(n) || n < 1 || n > 목록.length) break;
59
+ // 같은 것을 두 번 쳐도 한 번만 센다 — 「1 1」 을 두 갈래로 읽을 까닭이 없다.
60
+ if (!번호들.includes(n)) 번호들.push(n);
61
+ 남은 = 남은.slice(m[0].length).replace(사이표, '');
62
+ }
63
+
64
+ const 덧말 = 남은.trim();
65
+ // 아무 수도 못 읽었으면 여태와 똑같다 — 친 글이 그대로 답이다.
66
+ if (!번호들.length) return { 번호들: [], 덧말: '', 글: 원 };
67
+
68
+ const 고른 = 번호들.map((n) => String(목록[n - 1] ?? '').trim()).filter(Boolean);
69
+ const 글 = 고른.join(' · ') + (덧말 ? ` — ${덧말}` : '');
70
+ return { 번호들, 덧말, 글 };
71
+ }
72
+
73
+ /**
74
+ * 계획 상자의 답을 읽는다.
75
+ *
76
+ * 갈래는 셋(진행·그만·다시)이고, 들어오는 모양은 다섯이다.
77
+ * · 그냥 진행 — ⏎ · y · yes · ㅇ · 진행
78
+ * · 진행하되 한마디 — `y 검사도 같이 넣어줘`
79
+ * · 그만 — n · no · ㄴ
80
+ * · 그 밖의 글 — 그 말대로 다시 짜라 (여태 그대로)
81
+ * · `3 이건 빼자` — 3단계에 대한 말로 붙여서 다시 짜라
82
+ *
83
+ * ⏎ 하나로 진행하는 것은 안 건드린다. 계획을 읽고 「그래」 하는 데
84
+ * 두 글자를 더 치게 하면, 그 두 글자 때문에 안 읽고 넘기게 된다.
85
+ *
86
+ * @param {string} 답
87
+ * @param {number} 단계수 계획이 몇 단계인가 (번호를 가려내는 데 쓴다)
88
+ * @returns {{갈래: '진행'|'그만'|'다시', 덧말: string, 단계: number|null}}
89
+ */
90
+ export function 계획답풀기(답, 단계수 = 0) {
91
+ const 원 = String(답 ?? '').trim();
92
+ if (!원) return { 갈래: '진행', 덧말: '', 단계: null };
93
+
94
+ const 첫낱말 = 원.split(/\s+/)[0].toLowerCase();
95
+ const 나머지 = 원.slice(원.split(/\s+/)[0].length).replace(사이표, '').trim();
96
+
97
+ if (['n', 'no', 'ㄴ', '아니', '아니요', '취소'].includes(첫낱말)) {
98
+ return { 갈래: '그만', 덧말: '', 단계: null };
99
+ }
100
+ if (['y', 'yes', 'ㅇ', '네', '예', '진행', 'ok', 'go'].includes(첫낱말)) {
101
+ return { 갈래: '진행', 덧말: 나머지, 단계: null };
102
+ }
103
+
104
+ // 「3 이건 빼자」 — 그 단계에 대고 하는 말이다.
105
+ const m = 수뒤.exec(원);
106
+ if (m) {
107
+ const n = Number(m[1]);
108
+ if (Number.isInteger(n) && n >= 1 && n <= 단계수) {
109
+ const 말 = 원.slice(m[0].length).replace(사이표, '').trim();
110
+ if (말) return { 갈래: '다시', 덧말: 말, 단계: n };
111
+ }
112
+ }
113
+
114
+ return { 갈래: '다시', 덧말: 원, 단계: null };
115
+ }