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.
- package/README.ko.md +1167 -1166
- package/README.md +1224 -1223
- package/bin/deel.js +1 -1
- package/package.json +2 -2
- package/src/acp/map.js +367 -362
- package/src/acp/serve.js +810 -769
- package/src/agent/budget.js +156 -153
- package/src/agent/commit.js +534 -511
- package/src/agent/compact.js +158 -31
- package/src/agent/effort.js +308 -197
- package/src/agent/evolve.js +263 -213
- package/src/agent/filemem.js +16 -2
- package/src/agent/loop.js +1728 -1516
- package/src/agent/memory.js +156 -152
- package/src/agent/mention.js +210 -210
- package/src/agent/recall.js +222 -209
- package/src/agent/session.js +1056 -948
- package/src/backend/adapter.js +1355 -798
- package/src/backend/cachemark.js +223 -0
- package/src/backend/detect.js +327 -288
- package/src/backend/http.js +460 -458
- package/src/backend/mcp.js +407 -395
- package/src/backend/price.js +260 -197
- package/src/backend/probe.js +487 -473
- package/src/backend/quota.js +274 -157
- package/src/backend/retry.js +30 -6
- package/src/backend/tokens.js +59 -0
- package/src/backend/toolfit.js +352 -325
- package/src/backend/wire.js +715 -0
- package/src/commands.js +3184 -2998
- package/src/config.js +283 -244
- package/src/i18n/en.js +545 -520
- package/src/i18n/ja.js +498 -473
- package/src/i18n/ko.js +592 -567
- package/src/i18n/zh.js +498 -473
- package/src/oneshot.js +625 -549
- package/src/pack/tar.js +154 -132
- package/src/pack/zip.js +235 -217
- package/src/plugins/manage.js +416 -336
- package/src/providers/bedrock.js +17 -0
- package/src/repl.js +2616 -2515
- package/src/safety/audit.js +148 -129
- package/src/safety/guard.js +641 -526
- package/src/safety/network.js +200 -157
- package/src/tools/fastgrep.js +229 -214
- package/src/tools/fsutil.js +291 -250
- package/src/tools/index.js +2560 -2523
- package/src/tools/jobs.js +876 -795
- package/src/tools/label.js +52 -0
- package/src/tools/spawn.js +213 -99
- package/src/tools/verify.js +358 -357
- package/src/tools/webfetch.js +418 -393
- package/src/ui/export.js +233 -217
- package/src/ui/pick.js +115 -115
- 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
|
+
}
|