deel-local-cli 1.13.0 → 1.14.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 (54) hide show
  1. package/README.ko.md +32 -26
  2. package/README.md +32 -26
  3. package/bin/deel.js +6 -1
  4. package/package.json +3 -2
  5. package/src/acp/map.js +367 -367
  6. package/src/acp/serve.js +830 -810
  7. package/src/agent/budget.js +156 -156
  8. package/src/agent/commit.js +534 -534
  9. package/src/agent/compact.js +441 -441
  10. package/src/agent/effort.js +308 -308
  11. package/src/agent/evolve.js +263 -263
  12. package/src/agent/loop.js +1755 -1728
  13. package/src/agent/memory.js +156 -156
  14. package/src/agent/mention.js +210 -210
  15. package/src/agent/recall.js +222 -222
  16. package/src/agent/session.js +1056 -1056
  17. package/src/backend/adapter.js +1355 -1355
  18. package/src/backend/cachemark.js +223 -223
  19. package/src/backend/detect.js +327 -327
  20. package/src/backend/http.js +460 -460
  21. package/src/backend/mcp.js +407 -407
  22. package/src/backend/price.js +260 -260
  23. package/src/backend/probe.js +487 -487
  24. package/src/backend/quota.js +274 -274
  25. package/src/backend/tokens.js +59 -59
  26. package/src/backend/toolfit.js +352 -352
  27. package/src/backend/wire.js +715 -715
  28. package/src/cmdnames.js +68 -0
  29. package/src/commands.js +3116 -3184
  30. package/src/config.js +283 -283
  31. package/src/i18n/en.js +545 -545
  32. package/src/i18n/ja.js +498 -498
  33. package/src/i18n/ko.js +592 -592
  34. package/src/i18n/zh.js +498 -498
  35. package/src/oneshot.js +685 -625
  36. package/src/pack/selfpack.js +15 -2
  37. package/src/pack/sheet.en.js +16 -2
  38. package/src/pack/tar.js +154 -154
  39. package/src/pack/zip.js +235 -235
  40. package/src/plugins/manage.js +416 -416
  41. package/src/repl.js +2616 -2616
  42. package/src/safety/audit.js +148 -148
  43. package/src/safety/guard.js +714 -641
  44. package/src/safety/network.js +200 -200
  45. package/src/tools/fastgrep.js +229 -229
  46. package/src/tools/fsutil.js +312 -291
  47. package/src/tools/index.js +2590 -2560
  48. package/src/tools/jobs.js +876 -876
  49. package/src/tools/spawn.js +213 -213
  50. package/src/tools/verify.js +358 -358
  51. package/src/tools/webfetch.js +418 -418
  52. package/src/ui/export.js +233 -233
  53. package/src/ui/pick.js +115 -115
  54. package/src/ui/status.js +617 -617
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
+ }