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.
@@ -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 systemPrompt = [
46
- 'You are zelari-code, a CLI coding agent. Be concise and direct.',
47
- 'When the user asks you to write code, debug, or explore, be proactive: list files and read key files to understand the project.',
48
- 'When you finish a task, briefly summarize what you did.',
49
- ].join('\n');
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 raw = process.env.ZELARI_MAX_TOOL_LOOP_ITERATIONS;
63
- const n = raw ? Number.parseInt(raw, 10) : 30;
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":"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"}
1
+ {"version":3,"file":"runHeadless.js","sourceRoot":"","sources":["../../src/cli/runHeadless.ts"],"names":[],"mappings":"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"}
@@ -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.6.0",
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",