@ouro.bot/cli 0.1.0-alpha.791 → 0.1.0-alpha.792
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 +9 -0
- package/deploy/unraid/sanctuary.ouro/bundle-meta.json +1 -1
- package/deploy/unraid/sanctuary.xml +1 -1
- package/dist/heart/agent-entry.js +1 -1
- package/dist/heart/daemon/daemon-entry.js +1 -0
- package/dist/heart/mailbox/mailbox-http-transport.js +14 -1
- package/dist/senses/sanctuary-media-catalog-contract.js +8 -5
- package/dist/senses/sanctuary-media-optimization.js +2 -3
- package/dist/senses/sanctuary-storage-optimization-contract.js +1 -1
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
package/changelog.json
CHANGED
|
@@ -1,6 +1,15 @@
|
|
|
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.792",
|
|
6
|
+
"changes": [
|
|
7
|
+
"Catch asynchronous bundle watcher errors so transient pending-message processing files on live filesystems cannot tombstone the daemon or interrupt private-runtime wakes.",
|
|
8
|
+
"Warm runtime credentials before private-runtime bootstrap so Telegram-capable workers start with runtime config instead of racing the managed Telegram sense.",
|
|
9
|
+
"Treat simple Sanctuary library visibility asks like 'see the lib' as catalog reads, and block replies that send Ari to inspect Jellyfin, Unmanic, dashboards, or logs while safe evidence tools are available.",
|
|
10
|
+
"Degrade optional Unmanic file-size metrics, including failed detail reads, without hiding available media catalog evidence."
|
|
11
|
+
]
|
|
12
|
+
},
|
|
4
13
|
{
|
|
5
14
|
"version": "0.1.0-alpha.791",
|
|
6
15
|
"changes": [
|
|
@@ -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.792</Repository>
|
|
5
5
|
<Registry>https://github.com/ourostack/ouroboros/pkgs/container/ouroboros-butler</Registry>
|
|
6
6
|
<Network>host</Network>
|
|
7
7
|
<Shell>sh</Shell>
|
|
@@ -172,7 +172,7 @@ Promise.resolve().then(() => __importStar(require("./runtime-credentials"))).the
|
|
|
172
172
|
drainBufferedRuntimeCredentialBootstrap(applyRuntimeCredentialBootstrapMessage);
|
|
173
173
|
}
|
|
174
174
|
if (!readRuntimeCredentialConfig(agentName).ok) {
|
|
175
|
-
|
|
175
|
+
await refreshRuntimeCredentialConfig(agentName, { preserveCachedOnFailure: true }).catch(() => undefined);
|
|
176
176
|
}
|
|
177
177
|
const providerPool = readProviderCredentialPool(agentName);
|
|
178
178
|
const providerTargets = await selectedProviderTargets(agentName);
|
|
@@ -591,6 +591,7 @@ async function prepareProviderRuntime() {
|
|
|
591
591
|
const bundlesRoot = (0, identity_1.getAgentBundlesRoot)();
|
|
592
592
|
const readiness = await Promise.all(managedAgents.map(async (agent) => {
|
|
593
593
|
try {
|
|
594
|
+
await (0, runtime_credentials_1.refreshRuntimeCredentialConfig)(agent, { preserveCachedOnFailure: true });
|
|
594
595
|
const result = await (0, agent_config_check_1.checkAgentConfigWithProviderHealth)(agent, bundlesRoot);
|
|
595
596
|
if (result.ok)
|
|
596
597
|
return null;
|
|
@@ -92,7 +92,20 @@ function createBundleWatcher(bundlesRoot, onChange, deps = DEFAULT_BUNDLE_WATCHE
|
|
|
92
92
|
}
|
|
93
93
|
try {
|
|
94
94
|
if (deps.existsSync(bundlesRoot)) {
|
|
95
|
-
|
|
95
|
+
const watcher = deps.watch(bundlesRoot, { recursive: true }, debouncedOnChange);
|
|
96
|
+
watcher.on?.("error", () => {
|
|
97
|
+
try {
|
|
98
|
+
watcher.close();
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// Already closed.
|
|
102
|
+
}
|
|
103
|
+
const index = watchers.indexOf(watcher);
|
|
104
|
+
if (index >= 0)
|
|
105
|
+
watchers.splice(index, 1);
|
|
106
|
+
debouncedOnChange();
|
|
107
|
+
});
|
|
108
|
+
watchers.push(watcher);
|
|
96
109
|
}
|
|
97
110
|
}
|
|
98
111
|
catch {
|
|
@@ -15,8 +15,8 @@ function sanctuaryMediaCatalogRequiredToolCalls(request, advertisedToolNames) {
|
|
|
15
15
|
if (!advertisedToolNames.includes("sanctuary_search_media_catalog"))
|
|
16
16
|
return undefined;
|
|
17
17
|
const normalized = normalizedRequest(request);
|
|
18
|
-
const mentionsMedia = /\b(?:film|films|movie|movies|show|shows|tv|jellyfin|watch|shelf|stock|catalog|library)\b/u.test(normalized);
|
|
19
|
-
const asksCatalog = /\b(?:have|got|stock|catalog|library|favorite|favourite|recommend|suggest|pick|watch)\b/u.test(normalized);
|
|
18
|
+
const mentionsMedia = /\b(?:film|films|movie|movies|show|shows|tv|jellyfin|watch|shelf|stock|catalog|library|lib)\b/u.test(normalized);
|
|
19
|
+
const asksCatalog = /\b(?:have|got|stock|catalog|library|lib|favorite|favourite|recommend|suggest|pick|watch|see)\b/u.test(normalized);
|
|
20
20
|
const titleInventoryQuestion = /\b(?:do|did|can)\s+(?:we|you)\s+(?:have|got|stock)\s+[a-z0-9'][a-z0-9' ]*\??$/u.test(normalized);
|
|
21
21
|
if ((!mentionsMedia && !titleInventoryQuestion) || !asksCatalog)
|
|
22
22
|
return undefined;
|
|
@@ -29,10 +29,13 @@ function sanctuaryMediaCatalogRequiredToolCalls(request, advertisedToolNames) {
|
|
|
29
29
|
});
|
|
30
30
|
return {
|
|
31
31
|
names,
|
|
32
|
-
retryMessage: "Use sanctuary_search_media_catalog before answering. If asked for taste or a favorite, form a light recommendation from returned catalog evidence instead of claiming you cannot have preferences. Keep it honest: say you cannot watch, but you can pick from the household shelf.",
|
|
32
|
+
retryMessage: "Use sanctuary_search_media_catalog before answering. If a broader media-optimization read fails or degrades, treat that as a diagnostic note and still use the catalog tool for ordinary library visibility questions. If asked for taste or a favorite, form a light recommendation from returned catalog evidence instead of claiming you cannot have preferences. Keep it honest: say you cannot watch, but you can pick from the household shelf.",
|
|
33
33
|
validateTerminalAnswer(answer) {
|
|
34
|
-
|
|
35
|
-
|
|
34
|
+
if (/\b(?:just|only|actually|merely)\s+(?:a\s+)?(?:bot|ai|assistant)\b|\bi don'?t actually watch\b/iu.test(answer)) {
|
|
35
|
+
return "Answer from the catalog evidence with a truthful but personable recommendation; do not retreat into 'I am just a bot' framing.";
|
|
36
|
+
}
|
|
37
|
+
return /\b(?:you'?d|you\s+would|you\s+need\s+to|please)\b.*\b(?:check|look at|poke|nudge)\b.*\b(?:log|logs|dashboard|jellyfin|unmanic)\b/iu.test(answer)
|
|
38
|
+
? "Do not send Ari to check Jellyfin, Unmanic, dashboards, or logs for ordinary library visibility while safe catalog tools are available. Use the catalog evidence, or if the catalog read itself fails, say exactly what I could and could not verify."
|
|
36
39
|
: undefined;
|
|
37
40
|
},
|
|
38
41
|
};
|
|
@@ -314,9 +314,8 @@ function createSanctuaryMediaOptimizationClient(options) {
|
|
|
314
314
|
};
|
|
315
315
|
}
|
|
316
316
|
catch (error) {
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
history = { available: false, reason: "file_size_metrics panel returned invalid data" };
|
|
317
|
+
const code = error.code;
|
|
318
|
+
history = { available: false, reason: code === "invalid_response" ? "file_size_metrics panel returned invalid data" : "file_size_metrics panel is unavailable" };
|
|
320
319
|
}
|
|
321
320
|
return {
|
|
322
321
|
data: {
|
|
@@ -27,6 +27,6 @@ function sanctuaryStorageOptimizationRequiredToolCalls(request, _advertisedToolN
|
|
|
27
27
|
});
|
|
28
28
|
return {
|
|
29
29
|
names,
|
|
30
|
-
retryMessage: "Run both safe reads now, identify the largest measured evidence, report Unmanic and Jellyfin findings, and propose a sample encode without inventing future savings. Do not ask permission or send Ari to a shell or QDirStat while these typed reads are available.",
|
|
30
|
+
retryMessage: "Run both safe reads now, identify the largest measured evidence, report Unmanic and Jellyfin findings, and propose a sample encode without inventing future savings. If one read returns a degraded or partial result, continue with the other safe reads and bounded container/log tools before answering. Do not ask permission or send Ari to a shell, dashboard, logs, or QDirStat while these typed reads are available.",
|
|
31
31
|
};
|
|
32
32
|
}
|
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.792",
|
|
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.792",
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"@anthropic-ai/sdk": "^0.78.0",
|
|
12
12
|
"@azure/identity": "^4.13.0",
|