zelari-code 1.6.0 → 1.7.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/dist/cli/hooks/historyCompaction.js +6 -5
- package/dist/cli/hooks/historyCompaction.js.map +1 -1
- package/dist/cli/hooks/useChatTurn.js +28 -22
- package/dist/cli/hooks/useChatTurn.js.map +1 -1
- package/dist/cli/main.bundled.js +502 -43
- package/dist/cli/main.bundled.js.map +4 -4
- package/dist/cli/runHeadless.js +79 -8
- package/dist/cli/runHeadless.js.map +1 -1
- package/dist/cli/utils/envNumber.js +62 -0
- package/dist/cli/utils/envNumber.js.map +1 -0
- package/package.json +1 -1
package/dist/cli/runHeadless.js
CHANGED
|
@@ -16,6 +16,8 @@
|
|
|
16
16
|
import { AgentHarness } from '@zelari/core/harness';
|
|
17
17
|
import { createBuiltinToolRegistry } from './toolRegistry.js';
|
|
18
18
|
import { emitEvent, openaiCompatibleProvider, resolveHeadlessKey, resolveHeadlessProvider, } from './headless.js';
|
|
19
|
+
import { buildSystemPrompt, getAllTools, SINGLE_AGENT_IDENTITY_MODULE, buildLanguagePolicyModuleFor, } from '@zelari/core/skills';
|
|
20
|
+
import { envNumber } from './utils/envNumber.js';
|
|
19
21
|
export async function runHeadless(opts) {
|
|
20
22
|
const { provider, model } = resolveHeadlessProvider(opts);
|
|
21
23
|
const key = await resolveHeadlessKey(provider);
|
|
@@ -42,11 +44,81 @@ async function runHeadlessSingle(opts, provider, model, providerStream) {
|
|
|
42
44
|
description: t.function.description,
|
|
43
45
|
parameters: t.function.parameters,
|
|
44
46
|
}));
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
47
|
+
const toolNames = tools.map((t) => t.name);
|
|
48
|
+
// v1.7.0: route through buildSystemPrompt with SINGLE_AGENT_IDENTITY_MODULE
|
|
49
|
+
// + the language-policy directive so the headless single-mode replies in
|
|
50
|
+
// the user's language. Before this, the prompt was an inline 3-line array
|
|
51
|
+
// missing 7 of 11 behavioral directives (anti-confabulation, act-don't-
|
|
52
|
+
// describe, output self-check, clarification protocol, safety, formatting,
|
|
53
|
+
// tool-usage) AND the response language policy — two regressions in one.
|
|
54
|
+
// The fallback below preserves the pre-1.7 inline behavior for any case
|
|
55
|
+
// where buildSystemPrompt throws (e.g. test context without a populated
|
|
56
|
+
// catalog).
|
|
57
|
+
//
|
|
58
|
+
// v1.7.0 fix (agy audit): build the language module ONCE outside the
|
|
59
|
+
// try/catch so a thrown detection error in `buildLanguagePolicyModuleFor`
|
|
60
|
+
// does not re-throw inside the catch (which would crash the CLI instead
|
|
61
|
+
// of recovering). The module's directive content is wrapped in try/catch
|
|
62
|
+
// too, so even a Unicode edge case degrades to a minimal "reply in
|
|
63
|
+
// Italian" stub.
|
|
64
|
+
let systemPrompt;
|
|
65
|
+
let languageDirectiveContent;
|
|
66
|
+
try {
|
|
67
|
+
languageDirectiveContent = buildLanguagePolicyModuleFor(opts.task).content;
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
// Detection threw (e.g. malformed input). Use a safe stub so the rest
|
|
71
|
+
// of the prompt assembly still proceeds.
|
|
72
|
+
languageDirectiveContent = '# Response Language\nReply in the user\'s language when possible, otherwise Italian.';
|
|
73
|
+
}
|
|
74
|
+
try {
|
|
75
|
+
const headlessRole = {
|
|
76
|
+
id: 'single',
|
|
77
|
+
name: 'Zelari Code',
|
|
78
|
+
codename: 'zelari',
|
|
79
|
+
role: 'headless coding agent',
|
|
80
|
+
color: '#00d9a3',
|
|
81
|
+
avatar: '◆',
|
|
82
|
+
tools: toolNames,
|
|
83
|
+
// v1.7.0 fix (agy audit): include platform/shell context in the role
|
|
84
|
+
// prompt so the agent knows its cwd and shell — previously this was
|
|
85
|
+
// empty (systemPrompt: '') and the agent lacked the platform block
|
|
86
|
+
// the TUI single-agent path gets.
|
|
87
|
+
systemPrompt: [
|
|
88
|
+
'# Platform',
|
|
89
|
+
`platform: ${process.platform}`,
|
|
90
|
+
`shell: ${process.platform === 'win32' ? 'cmd.exe / Git Bash (auto-detected)' : '/bin/sh'}`,
|
|
91
|
+
'',
|
|
92
|
+
'# Working Directory',
|
|
93
|
+
`You are running in: ${process.cwd()}`,
|
|
94
|
+
'All relative file paths are resolved against this directory.',
|
|
95
|
+
'The shell is NON-INTERACTIVE (stdin closed): pass non-interactive flags (--yes, --force, --template).',
|
|
96
|
+
].join('\n'),
|
|
97
|
+
};
|
|
98
|
+
systemPrompt = buildSystemPrompt(headlessRole, {
|
|
99
|
+
tools: getAllTools(),
|
|
100
|
+
toolNames,
|
|
101
|
+
aiConfig: {
|
|
102
|
+
enabledSkills: [],
|
|
103
|
+
enabledTools: toolNames,
|
|
104
|
+
customPromptModules: [SINGLE_AGENT_IDENTITY_MODULE, {
|
|
105
|
+
type: 'language-policy',
|
|
106
|
+
title: 'Response Language',
|
|
107
|
+
priority: 5,
|
|
108
|
+
content: languageDirectiveContent,
|
|
109
|
+
}],
|
|
110
|
+
agentSkillConfigs: [],
|
|
111
|
+
},
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
systemPrompt = [
|
|
116
|
+
'You are zelari-code, a CLI coding agent. Be concise and direct.',
|
|
117
|
+
'When the user asks you to write code, debug, or explore, be proactive: list files and read key files to understand the project.',
|
|
118
|
+
'When you finish a task, briefly summarize what you did.',
|
|
119
|
+
languageDirectiveContent,
|
|
120
|
+
].join('\n');
|
|
121
|
+
}
|
|
50
122
|
const harness = new AgentHarness({
|
|
51
123
|
model,
|
|
52
124
|
provider,
|
|
@@ -59,9 +131,8 @@ async function runHeadlessSingle(opts, provider, model, providerStream) {
|
|
|
59
131
|
toolRegistry,
|
|
60
132
|
providerStream,
|
|
61
133
|
maxToolLoopIterations: (() => {
|
|
62
|
-
const
|
|
63
|
-
|
|
64
|
-
return Number.isFinite(n) && n > 0 ? n : 30;
|
|
134
|
+
const n = envNumber(process.env.ZELARI_MAX_TOOL_LOOP_ITERATIONS, { default: 30, min: 1 });
|
|
135
|
+
return n;
|
|
65
136
|
})(),
|
|
66
137
|
});
|
|
67
138
|
let finalReason = 'completed';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runHeadless.js","sourceRoot":"","sources":["../../src/cli/runHeadless.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,YAAY,EAAyB,MAAM,sBAAsB,CAAC;AAE3E,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EACL,SAAS,EACT,wBAAwB,EACxB,kBAAkB,EAClB,uBAAuB,GAExB,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"runHeadless.js","sourceRoot":"","sources":["../../src/cli/runHeadless.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,YAAY,EAAyB,MAAM,sBAAsB,CAAC;AAE3E,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EACL,SAAS,EACT,wBAAwB,EACxB,kBAAkB,EAClB,uBAAuB,GAExB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,iBAAiB,EACjB,WAAW,EACX,4BAA4B,EAC5B,4BAA4B,GAC7B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAqB;IACrD,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAE1D,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC/C,IAAI,OAAO,IAAI,GAAG,EAAE,CAAC;QACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC;QAChE,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,cAAc,GAAG,wBAAwB,CAAC;QAC9C,UAAU,EAAE,QAAuE;QACnF,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,KAAK;KACN,CAAC,CAAC;IAEH,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,OAAO,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,iBAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;AAClE,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,IAAqB,EACrB,QAAgB,EAChB,KAAa,EACb,cAAgC;IAEhC,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IACtC,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,yBAAyB,EAAE,CAAC;IAC/D,MAAM,KAAK,GAAoB,YAAY,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtE,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI;QACrB,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW;QACnC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,UAAqC;KAC7D,CAAC,CAAC,CAAC;IACJ,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAE3C,4EAA4E;IAC5E,yEAAyE;IACzE,0EAA0E;IAC1E,wEAAwE;IACxE,2EAA2E;IAC3E,yEAAyE;IACzE,wEAAwE;IACxE,wEAAwE;IACxE,YAAY;IACZ,EAAE;IACF,qEAAqE;IACrE,0EAA0E;IAC1E,wEAAwE;IACxE,yEAAyE;IACzE,mEAAmE;IACnE,iBAAiB;IACjB,IAAI,YAAoB,CAAC;IACzB,IAAI,wBAAgC,CAAC;IACrC,IAAI,CAAC;QACH,wBAAwB,GAAG,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;IAC7E,CAAC;IAAC,MAAM,CAAC;QACP,sEAAsE;QACtE,yCAAyC;QACzC,wBAAwB,GAAG,sFAAsF,CAAC;IACpH,CAAC;IACD,IAAI,CAAC;QACH,MAAM,YAAY,GAAG;YACnB,EAAE,EAAE,QAAQ;YACZ,IAAI,EAAE,aAAa;YACnB,QAAQ,EAAE,QAAQ;YAClB,IAAI,EAAE,uBAAuB;YAC7B,KAAK,EAAE,SAAS;YAChB,MAAM,EAAE,GAAG;YACX,KAAK,EAAE,SAAS;YAChB,qEAAqE;YACrE,oEAAoE;YACpE,mEAAmE;YACnE,kCAAkC;YAClC,YAAY,EAAE;gBACZ,YAAY;gBACZ,aAAa,OAAO,CAAC,QAAQ,EAAE;gBAC/B,UAAU,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,oCAAoC,CAAC,CAAC,CAAC,SAAS,EAAE;gBAC3F,EAAE;gBACF,qBAAqB;gBACrB,uBAAuB,OAAO,CAAC,GAAG,EAAE,EAAE;gBACtC,8DAA8D;gBAC9D,uGAAuG;aACxG,CAAC,IAAI,CAAC,IAAI,CAAC;SACb,CAAC;QACF,YAAY,GAAG,iBAAiB,CAAC,YAAY,EAAE;YAC7C,KAAK,EAAE,WAAW,EAAE;YACpB,SAAS;YACT,QAAQ,EAAE;gBACR,aAAa,EAAE,EAAE;gBACjB,YAAY,EAAE,SAAS;gBACvB,mBAAmB,EAAE,CAAC,4BAA4B,EAAE;wBAClD,IAAI,EAAE,iBAAiB;wBACvB,KAAK,EAAE,mBAAmB;wBAC1B,QAAQ,EAAE,CAAC;wBACX,OAAO,EAAE,wBAAwB;qBAClC,CAAC;gBACF,iBAAiB,EAAE,EAAE;aACtB;SACF,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,YAAY,GAAG;YACb,iEAAiE;YACjE,iIAAiI;YACjI,yDAAyD;YACzD,wBAAwB;SACzB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;QAC/B,KAAK;QACL,QAAQ;QACR,SAAS;QACT,QAAQ,EAAE;YACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE;YACzC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;SACrC;QACD,KAAK;QACL,YAAY;QACZ,cAAc;QACd,qBAAqB,EAAE,CAAC,GAAG,EAAE;YAC3B,MAAM,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,+BAA+B,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC1F,OAAO,CAAC,CAAC;QACX,CAAC,CAAC,EAAE;KACL,CAAC,CAAC;IAEH,IAAI,WAAW,GAAwC,WAAW,CAAC;IACnE,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,IAAI,CAAC;QACH,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;YACxC,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC3B,SAAS,CAAC,KAAK,CAAC,CAAC;YACnB,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;gBACnC,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;oBAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACpC,CAAC;qBAAM,CAAC;oBACN,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC/B,CAAC;YACH,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBACtC,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC;gBAC3B,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO;oBAAE,QAAQ,GAAG,CAAC,CAAC;YAC7C,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAClC,IAAI,KAAK,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;oBAC/B,QAAQ,GAAG,CAAC,CAAC;gBACf,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,2CAA2C,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAChG,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5C,CAAC;IACD,gEAAgE;IAChE,gDAAgD;IAChD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAEzB,IAAI,WAAW,KAAK,OAAO;QAAE,OAAO,CAAC,CAAC;IACtC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,IAAqB,EACrB,QAAgB,EAChB,KAAa,EACb,cAAgC;IAEhC,4DAA4D;IAC5D,8DAA8D;IAC9D,iEAAiE;IACjE,kCAAkC;IAClC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;IACnE,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IACtC,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,yBAAyB,EAAE,CAAC;IAC/D,MAAM,YAAY,GAAG;QACnB,WAAW,EAAE,OAAO,CAAC,GAAG,EAAE;QAC1B,eAAe,EAAE,GAAG,EAAE,CAAC,IAAI;KAC5B,CAAC;IACF,MAAM,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;IAC9F,MAAM,EAAE,2BAA2B,EAAE,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC;IACpF,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAClE,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;IAE/D,MAAM,OAAO,GAAG,sBAAsB,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,2BAA2B,CAAC,OAAO,CAAC,CAAC;IACrD,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAClC,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,EAAE;YAAE,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC;IACD,iBAAiB,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC;IACjD,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;IAE1C,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE;YACnD,MAAM,EAAE,UAAU;YAClB,KAAK;YACL,QAAQ,EAAE,mBAAmB;YAC7B,cAAc;YACd,SAAS;YACT,KAAK,EAAE,YAAY;YACnB,aAAa;SACd,CAAC,EAAE,CAAC;YACH,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC3B,SAAS,CAAC,KAAK,CAAC,CAAC;YACnB,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;gBAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACpC,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;gBAClE,QAAQ,GAAG,CAAC,CAAC;YACf,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;gBAChE,QAAQ,GAAG,CAAC,CAAC;YACf,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,2CAA2C,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAChG,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse a string from env / user input into a bounded integer.
|
|
3
|
+
*
|
|
4
|
+
* @param raw The raw env-var value (already trimmed by the caller when needed).
|
|
5
|
+
* Empty string and "undefined" / "null" tokens are treated as unset.
|
|
6
|
+
* @param opts See {@link EnvNumberOptions}.
|
|
7
|
+
*/
|
|
8
|
+
export function envNumber(raw, opts) {
|
|
9
|
+
const { default: def, min, max } = opts;
|
|
10
|
+
if (raw === undefined || raw === null)
|
|
11
|
+
return def;
|
|
12
|
+
const trimmed = raw.trim();
|
|
13
|
+
if (trimmed.length === 0)
|
|
14
|
+
return def;
|
|
15
|
+
// Defensive: some env vars accidentally end up as the literal string
|
|
16
|
+
// "undefined" / "null" when JSON.stringify(undefined) leaks in. Treat
|
|
17
|
+
// those as unset too.
|
|
18
|
+
if (trimmed.toLowerCase() === 'undefined' || trimmed.toLowerCase() === 'null')
|
|
19
|
+
return def;
|
|
20
|
+
const parsed = Number.parseInt(trimmed, 10);
|
|
21
|
+
// parseInt with non-numeric trailing chars (e.g. "30x") silently returns
|
|
22
|
+
// the prefix. Reject anything that doesn't fully parse. The validation:
|
|
23
|
+
//
|
|
24
|
+
// 1. Must be finite (NaN, Infinity rejected).
|
|
25
|
+
// 2. The integer part of the input must round-trip to the same magnitude.
|
|
26
|
+
//
|
|
27
|
+
// We intentionally ACCEPT these input forms:
|
|
28
|
+
// - Leading `+` sign: "+30" → 30 (some shell scripts emit this)
|
|
29
|
+
// - Leading zeros: "0030" → 30 (octal-style, harmless in decimal parseInt)
|
|
30
|
+
// - Negative sign: "-30" → -30
|
|
31
|
+
//
|
|
32
|
+
// We intentionally REJECT:
|
|
33
|
+
// - Trailing junk: "30x" (parseInt returns 30 but the input was malformed)
|
|
34
|
+
// - Unicode minus: "−30" (U+2212, NOT ASCII U+002D; parseInt sees NaN)
|
|
35
|
+
// - Floats: "30.5" (truncating to 30 silently is the bug we're avoiding)
|
|
36
|
+
//
|
|
37
|
+
// Strategy: strip an optional sign, strip leading zeros, then compare the
|
|
38
|
+
// round-trip. If the input was a negative number, the parsed result must
|
|
39
|
+
// round-trip back to the same magnitude (without the sign) — and we check
|
|
40
|
+
// the sign explicitly.
|
|
41
|
+
if (!Number.isFinite(parsed))
|
|
42
|
+
return def;
|
|
43
|
+
const absStr = `${Math.abs(parsed)}`;
|
|
44
|
+
const body = trimmed.replace(/^[-+]/, '').replace(/^0+(?=\d)/, '');
|
|
45
|
+
if (body !== absStr)
|
|
46
|
+
return def;
|
|
47
|
+
// Sign sanity: input must start with `-` (negative) or `+`/digit (non-negative).
|
|
48
|
+
// Catches inputs like "--30" (double-negative) which parseInt would interpret
|
|
49
|
+
// as 30 but the syntax is bogus.
|
|
50
|
+
const firstChar = trimmed[0];
|
|
51
|
+
const expectedSign = parsed < 0 ? '-' : /[0-9+]/.test(firstChar ?? '');
|
|
52
|
+
const actualSign = parsed < 0 ? firstChar === '-' : firstChar !== '-';
|
|
53
|
+
if (!expectedSign || !actualSign)
|
|
54
|
+
return def;
|
|
55
|
+
let clamped = parsed;
|
|
56
|
+
if (min !== undefined && clamped < min)
|
|
57
|
+
clamped = min;
|
|
58
|
+
if (max !== undefined && clamped > max)
|
|
59
|
+
clamped = max;
|
|
60
|
+
return clamped;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=envNumber.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"envNumber.js","sourceRoot":"","sources":["../../../src/cli/utils/envNumber.ts"],"names":[],"mappings":"AAoCA;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CAAC,GAA8B,EAAE,IAAsB;IAC9E,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IACxC,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,GAAG,CAAC;IAClD,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IACrC,qEAAqE;IACrE,sEAAsE;IACtE,sBAAsB;IACtB,IAAI,OAAO,CAAC,WAAW,EAAE,KAAK,WAAW,IAAI,OAAO,CAAC,WAAW,EAAE,KAAK,MAAM;QAAE,OAAO,GAAG,CAAC;IAE1F,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC5C,yEAAyE;IACzE,wEAAwE;IACxE,EAAE;IACF,gDAAgD;IAChD,4EAA4E;IAC5E,EAAE;IACF,6CAA6C;IAC7C,qEAAqE;IACrE,kFAAkF;IAClF,sCAAsC;IACtC,EAAE;IACF,2BAA2B;IAC3B,kFAAkF;IAClF,8EAA8E;IAC9E,sFAAsF;IACtF,EAAE;IACF,0EAA0E;IAC1E,yEAAyE;IACzE,0EAA0E;IAC1E,uBAAuB;IACvB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,GAAG,CAAC;IACzC,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;IACrC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACnE,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,GAAG,CAAC;IAChC,iFAAiF;IACjF,8EAA8E;IAC9E,iCAAiC;IACjC,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,YAAY,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IACvE,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,GAAG,CAAC,CAAC,CAAC,SAAS,KAAK,GAAG,CAAC;IACtE,IAAI,CAAC,YAAY,IAAI,CAAC,UAAU;QAAE,OAAO,GAAG,CAAC;IAE7C,IAAI,OAAO,GAAG,MAAM,CAAC;IACrB,IAAI,GAAG,KAAK,SAAS,IAAI,OAAO,GAAG,GAAG;QAAE,OAAO,GAAG,GAAG,CAAC;IACtD,IAAI,GAAG,KAAK,SAAS,IAAI,OAAO,GAAG,GAAG;QAAE,OAAO,GAAG,GAAG,CAAC;IACtD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zelari-code",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.7.0",
|
|
4
4
|
"description": "Zelari Code — AI Council coding agent CLI. Multi-agent orchestration (Caronte, Nettuno, Gerione, Plutone, Minosse, Lucifero) with slash commands, provider-agnostic LLM streaming, and self-update.",
|
|
5
5
|
"author": "N-THEM Studio",
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE",
|