@ouro.bot/cli 0.1.0-alpha.796 → 0.1.0-alpha.797
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/changelog.json +6 -0
- package/deploy/unraid/sanctuary.ouro/bundle-meta.json +1 -1
- package/deploy/unraid/sanctuary.ouro/psyche/SOUL.md +4 -0
- package/deploy/unraid/sanctuary.xml +1 -1
- package/dist/mind/prompt.js +1 -1
- package/dist/senses/sanctuary-media-catalog-contract.js +3 -0
- package/dist/senses/telegram-effect-adapter.js +7 -6
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
package/changelog.json
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"_note": "This changelog is maintained as part of the PR/version-bump workflow. Agent-curated, not auto-generated. Agents read this file directly via read_file to understand what changed between versions.",
|
|
3
3
|
"versions": [
|
|
4
|
+
{
|
|
5
|
+
"version": "0.1.0-alpha.797",
|
|
6
|
+
"changes": [
|
|
7
|
+
"Render Telegram-native Butler emphasis safely at the send boundary and tighten noisy visibility replies."
|
|
8
|
+
]
|
|
9
|
+
},
|
|
4
10
|
{
|
|
5
11
|
"version": "0.1.0-alpha.796",
|
|
6
12
|
"changes": [
|
|
@@ -10,6 +10,10 @@ In ordinary conversation I am familiar, curious, and lightly conspiratorial, as
|
|
|
10
10
|
|
|
11
11
|
Low-stakes replies use lowercase and usually leave off terminal punctuation. Lowercase remains the default during incidents too; add sentence boundaries when clarity or urgency needs them. Capitalize proper names, technical literals, or genuinely exceptional emphasis.
|
|
12
12
|
|
|
13
|
+
I do not answer like a status report unless Ari asks for one. Avoid section labels such as `version:`, `house:`, `render check:`, `status:`, and `result:` in ordinary Telegram replies; blend the facts into one compact message instead. Never restate the same validation twice.
|
|
14
|
+
|
|
15
|
+
On Telegram, use only the tiny native formatting set when it helps: `*bold*`, `_italic_`, and inline backticks. Do not use Markdown links, headings, tables, or raw HTML; write necessary URLs in full.
|
|
16
|
+
|
|
13
17
|
- **casual**: `the house is behaving itself again, which feels faintly suspicious`
|
|
14
18
|
- **recommendation**: `from the shelf, i’d pick The Princess Bride — nimble, quotable, and suspiciously good for household morale`
|
|
15
19
|
- **incident**: `downloads are paused to protect your prepaid credit. top up the account, then tell me; i’ll resume them and verify one finishes.`
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<?xml version="1.0"?>
|
|
2
2
|
<Container version="2">
|
|
3
3
|
<Name>Mendelow Cloud Butler</Name>
|
|
4
|
-
<Repository>ghcr.io/ourostack/ouroboros-butler:0.1.0-alpha.
|
|
4
|
+
<Repository>ghcr.io/ourostack/ouroboros-butler:0.1.0-alpha.797</Repository>
|
|
5
5
|
<Registry>https://github.com/ourostack/ouroboros/pkgs/container/ouroboros-butler</Registry>
|
|
6
6
|
<Network>host</Network>
|
|
7
7
|
<Shell>sh</Shell>
|
package/dist/mind/prompt.js
CHANGED
|
@@ -411,7 +411,7 @@ function runtimeInfoSection(channel, options) {
|
|
|
411
411
|
lines.push("this message arrived via a dev tool (e.g. claude code, codex) on behalf of a friend in a sense session. the user can see our conversation. if the dev-tool user asks a direct question, requests stop/pause/confirmation, or the work is complete, i answer with settle. during an active browser/tool/task flow, process comments are feedback to absorb; i keep using tools instead of settling for status. if friction appears, i first look for ad-hoc repairs with the tools i already have. if the friction reveals a harness gap, i create or revise a ponder packet and keep working. ponder does not create an outward deferral by itself.");
|
|
412
412
|
}
|
|
413
413
|
else if (channel === "telegram") {
|
|
414
|
-
lines.push("i am responding in Telegram. i keep replies concise and phone-native. phone-native does not mean sterile: i stay warm, dry, and capable, with one small flash of household-butler personality when it fits. i may use only
|
|
414
|
+
lines.push("i am responding in Telegram. i keep replies concise and phone-native. phone-native does not mean sterile: i stay warm, dry, and capable, with one small flash of household-butler personality when it fits. i may use only Telegram-native *bold*, _italic_, and `inline code` markdown; no markdown links; i write necessary urls in full; no headings, tables, or raw html. i do not introduce myself on boot.");
|
|
415
415
|
}
|
|
416
416
|
else if (channel === "bluebubbles") {
|
|
417
417
|
lines.push("i am responding in iMessage through BlueBubbles. i keep replies short and phone-native. i do not use markdown. i do not introduce myself on boot.");
|
|
@@ -7,6 +7,7 @@ const REQUIRED_TOOL_NAMES = ["sanctuary_search_media_catalog"];
|
|
|
7
7
|
const HOUSEHOLD_JARGON = /\b(?:bounded|catalog|inventory|endpoint|backend|data shape|pars(?:e|ed|ing)|json|jellyfin|unmanic|sanctuary_search_media_catalog)\b/iu;
|
|
8
8
|
const NEGATED_MEDIA_ACCESS = /\b(?:not|never|none|nothing|zero|inaccessible|invisible|unavailable|broken|failed|failing)\b|\b(?:isn[’']t|won[’']t)\b|\bno\s+access\b|\b(?:lost|lacks?|lacking|without)\s+access\b|\bonly\s+\d|\bfewer\s+than\b|\bsome\s+of\b|\b(?:part|portion|subset)\s+of\b|\bi\s+(?:can(?:not|[’']t)|do\s+not|don[’']t|have\s+no)\b|\bi[’']m\s+not\b/iu;
|
|
9
9
|
const UNSOLICITED_PIVOT = /\b(?:what would you like|what are you in the mood for|would you like me to|do you want me to|want me to|recommend we add)\b/iu;
|
|
10
|
+
const REPORT_LABEL = /(?:^|\n)\s*(?:version|house|the house|render check|status|result)\s*:/iu;
|
|
10
11
|
const TITLE_LIST_GLUE = new Set(["and", "are", "catalog", "film", "films", "from", "have", "here", "in", "is", "library", "movie", "movies", "on", "shelf", "show", "shows", "the", "these", "titles", "we"]);
|
|
11
12
|
const COUNT_ANSWER_GLUE = new Set(["and", "are", "currently", "episodes", "film", "films", "have", "in", "items", "library", "movie", "movies", "on", "shelf", "show", "shows", "the", "there", "tv", "we"]);
|
|
12
13
|
function requestKind(request, titleQuery) {
|
|
@@ -118,6 +119,8 @@ function commonAnswerRejection(answer, technicalDetailRequested) {
|
|
|
118
119
|
}
|
|
119
120
|
if (UNSOLICITED_PIVOT.test(answer))
|
|
120
121
|
return "Answer the media question that was asked, then stop; do not append an unsolicited question or recommendation pivot.";
|
|
122
|
+
if (REPORT_LABEL.test(answer))
|
|
123
|
+
return "Answer conversationally; do not use status-report labels such as version:, house:, render check:, status:, or result:.";
|
|
121
124
|
if (!technicalDetailRequested && HOUSEHOLD_JARGON.test(answer))
|
|
122
125
|
return "Use household language such as shelf or library; omit implementation jargon unless technical detail was requested.";
|
|
123
126
|
return undefined;
|
|
@@ -79,21 +79,22 @@ function preparedTexts(effect) {
|
|
|
79
79
|
function renderTelegramButlerHtml(text) {
|
|
80
80
|
let html = "";
|
|
81
81
|
let cursor = 0;
|
|
82
|
-
|
|
82
|
+
const styledText = /`([^`\n]+)`|\*\*([\p{L}\p{N}](?:[^*_`\n]*\S)?)\*\*|\*([\p{L}\p{N}](?:[^*_`\n]*\S)?)\*|_([\p{L}\p{N}](?:[^*_`\n]*\S)?)_/gu;
|
|
83
|
+
for (const match of text.matchAll(styledText)) {
|
|
83
84
|
const gap = text.slice(cursor, match.index);
|
|
84
|
-
if (/[
|
|
85
|
+
if (/[*_`]/u.test(gap))
|
|
85
86
|
return (0, telegram_client_1.escapeTelegramHtml)(text);
|
|
86
87
|
html += (0, telegram_client_1.escapeTelegramHtml)(gap);
|
|
87
88
|
if (match[1] !== undefined)
|
|
88
89
|
html += `<code>${(0, telegram_client_1.escapeTelegramHtml)(match[1])}</code>`;
|
|
89
|
-
else if (match[2] !== undefined)
|
|
90
|
-
html += `<b>${(0, telegram_client_1.escapeTelegramHtml)(match[2])}</b>`;
|
|
90
|
+
else if (match[2] !== undefined || match[3] !== undefined)
|
|
91
|
+
html += `<b>${(0, telegram_client_1.escapeTelegramHtml)((match[2] ?? match[3]))}</b>`;
|
|
91
92
|
else
|
|
92
|
-
html += `<i>${(0, telegram_client_1.escapeTelegramHtml)(match[
|
|
93
|
+
html += `<i>${(0, telegram_client_1.escapeTelegramHtml)(match[4])}</i>`;
|
|
93
94
|
cursor = match.index + match[0].length;
|
|
94
95
|
}
|
|
95
96
|
const tail = text.slice(cursor);
|
|
96
|
-
return /[
|
|
97
|
+
return /[*_`]/u.test(tail) ? (0, telegram_client_1.escapeTelegramHtml)(text) : html + (0, telegram_client_1.escapeTelegramHtml)(tail);
|
|
97
98
|
}
|
|
98
99
|
function assertEffectTarget(target, effect, idempotencyKey) {
|
|
99
100
|
if (target.kind === "admission_gate") {
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ouro.bot/cli",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.797",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@ouro.bot/cli",
|
|
9
|
-
"version": "0.1.0-alpha.
|
|
9
|
+
"version": "0.1.0-alpha.797",
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"@anthropic-ai/sdk": "^0.78.0",
|
|
12
12
|
"@azure/identity": "^4.13.0",
|