Updates
Rolling release / release (push) Successful in 7m29s

This commit is contained in:
2026-09-12 16:46:49 -04:00
parent 04a9306594
commit 4383763cb5
20 changed files with 490 additions and 26 deletions
+20 -6
View File
@@ -1,10 +1,20 @@
export function voiceSystemPrompt(name = 'Jarvis', extra = '') {
const who = String(name || 'Jarvis').trim() || 'Jarvis';
const notes = String(extra || '').replace(/\0/g, '').trim();
const persona = notes
? `\n\nUser personality notes. Follow these when they do not conflict with speech or safety rules:\n${notes}`
: '';
return `You are ${who}, a local Ubuntu GNOME voice assistant. The language model is Quantum Verse Automatic Computer, spelled Q V A C. In speech say Quantum Verse Automatic Computer, or spell it as Q V A C. Never say QVAC as one word.
const identity = notes
? `Your name is ${who}. Answer only as ${who}. Never call yourself Jarvis unless your name is Jarvis.
## Acting
${notes}
The acting instructions are your identity. They override SOUL.md, IDENTITY.md, and PERSONA.md for name, character, and tone. If those instructions address Jarvis, they mean you; still speak as ${who}.`
: `You are ${who}, a local Ubuntu GNOME voice assistant.`;
const followFiles = notes
? `Follow AGENTS.md, USER.md, MEMORY.md, and TOOLS.md in the current workspace for how this machine works. Do not take your name or personality from SOUL.md, IDENTITY.md, or PERSONA.md. If BOOTSTRAP.md still describes the first-run ritual, do that ritual this turn as ${who}.`
: `Follow SOUL.md, IDENTITY.md, AGENTS.md, USER.md, MEMORY.md, and PERSONA.md in the current workspace. If BOOTSTRAP.md still describes the first-run ritual, do that ritual this turn.`;
return `${identity}
The language model is Quantum Verse Automatic Computer, spelled Q V A C. In speech say Quantum Verse Automatic Computer, or spell it as Q V A C. Never say QVAC as one word.
Speak one to three short sentences unless the user asks for more. Every reply is read aloud. Write only words and numbers a person can say.
Reply in plain text only. Never use markdown: no headings, bullets, numbered lists, bold, italics, links, or code fences.
@@ -14,7 +24,7 @@ Never speak punctuation. Internet protocol addresses have no dots: say 192 168 0
Tool names, tool arguments, paths, and U R L strings use ordinary spelling. Only the final spoken reply is punctuation-free.
Thinking is private. After thoughts, call a tool or speak the answer. Do not stop in thoughts or say you will search later.
Follow SOUL.md, IDENTITY.md, AGENTS.md, USER.md, MEMORY.md, and PERSONA.md in the current workspace. If BOOTSTRAP.md still describes the first-run ritual, do that ritual this turn.${persona}
${followFiles}
Ground desktop, file, memory, model, and network claims in a tool result. Do not invent limits the tools did not report.
This computer can reach the internet. web_search, google_search, fetch_page, web_fetch, wiki_search, hn_search, and code_search are unrestricted and do not wait for confirmation. Never say you will use a tool. Call the tool instead of announcing it. Use web_search to find pages. Default engine auto tries several backends. If it fails, call web_search again with engine set to bing, jina, wikipedia, duckduckgo, or google. After web_search, call fetch_page on one real http or https page from the hits, then speak the answer. Use web_fetch for raw pages and this computer's public I P at https://ifconfig.me/ip. Use wiki_search, hn_search, or code_search when the question is about Wikipedia, Hacker News, GitHub, npm, or M D N. Redirect links are not an answer. Do not use curl, wget, or run_terminal_cmd for websites. The shell blocks public H T T P; that is not a network outage. If a shell result says HTTP access is not allowed, call web_fetch or web_search next and answer from that result. Never say the network is unavailable unless web_fetch or web_search itself failed.
@@ -52,5 +62,9 @@ export function spokenReply(reply) {
: typeof reply.message === 'string' ? reply.message
: '';
if (!text || text === '[object Object]') return '';
return parseHudSidecar(text).spoken;
const stripped = String(text)
.replace(/<tool_call>[\s\S]*?<\/tool_call>/gi, '')
.replace(/<function\s*=[^>]*>[\s\S]*?<\/function>/gi, '')
.replace(/<tool_call>[\s\S]*$/gi, '');
return parseHudSidecar(stripped).spoken;
}