aibroker 0.53.4 → 0.54.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/.metadata_never_index +0 -0
- package/dist/daemon/budget-cli.d.ts.map +1 -1
- package/dist/daemon/budget-cli.js +22 -3
- package/dist/daemon/budget-cli.js.map +1 -1
- package/dist/transport/screen.d.ts +7 -0
- package/dist/transport/screen.d.ts.map +1 -1
- package/dist/transport/screen.js +17 -3
- package/dist/transport/screen.js.map +1 -1
- package/docker/ota/src/landing.ts +22 -24
- package/docker/ota/src/server.ts +5 -1
- package/package.json +1 -1
|
File without changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"budget-cli.d.ts","sourceRoot":"","sources":["../../src/daemon/budget-cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;
|
|
1
|
+
{"version":3,"file":"budget-cli.d.ts","sourceRoot":"","sources":["../../src/daemon/budget-cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AA0HH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA+F7D"}
|
|
@@ -48,6 +48,7 @@ function show() {
|
|
|
48
48
|
const pct = percent();
|
|
49
49
|
const on = cfg.enabled !== false && existsSync(FILE);
|
|
50
50
|
console.log(` ceiling ${on ? `${cfg.ceilingPercent ?? 96}%` : "off — nothing stops"}`);
|
|
51
|
+
console.log(` managed ${typeof cfg.managedCeilingPercent === "number" ? `${cfg.managedCeilingPercent}% — managed sessions only` : "off"}`);
|
|
51
52
|
console.log(` now at ${pct === null ? "unknown" : `${pct}%`}`);
|
|
52
53
|
if (cfg.resetsAtIso) {
|
|
53
54
|
const at = new Date(cfg.resetsAtIso);
|
|
@@ -59,7 +60,8 @@ function show() {
|
|
|
59
60
|
console.log("");
|
|
60
61
|
console.log(" Crossing the ceiling asks every WORKING managed session for a handover,");
|
|
61
62
|
console.log(" pauses its arming, and refuses new prompts everywhere until the reset.");
|
|
62
|
-
console.log("
|
|
63
|
+
console.log(" Crossing the managed line does the same to managed sessions only;");
|
|
64
|
+
console.log(" everything else keeps answering. Sessions sitting idle are left alone.");
|
|
63
65
|
}
|
|
64
66
|
/**
|
|
65
67
|
* Act on the ceiling now rather than at the next tick.
|
|
@@ -159,6 +161,22 @@ export async function runBudget(args) {
|
|
|
159
161
|
console.log(`Ceiling set to ${n}%.`);
|
|
160
162
|
return;
|
|
161
163
|
}
|
|
164
|
+
if (action === "managed") {
|
|
165
|
+
if (value === "off" || value === "clear") {
|
|
166
|
+
write({ ...cfg, managedCeilingPercent: null });
|
|
167
|
+
console.log("Managed line off. Managed sessions now stop only at the ceiling.");
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
const n = Number(value);
|
|
171
|
+
if (!Number.isFinite(n) || n <= 0 || n > 100) {
|
|
172
|
+
console.error("Usage: aibroker budget managed <1-100|off>");
|
|
173
|
+
process.exit(1);
|
|
174
|
+
}
|
|
175
|
+
write({ ...cfg, managedCeilingPercent: n });
|
|
176
|
+
console.log(`Managed sessions stop at ${n}% of the weekly budget; everything else keeps going. Checking now:`);
|
|
177
|
+
checkNow();
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
162
180
|
if (action === "resets") {
|
|
163
181
|
if (!value) {
|
|
164
182
|
console.error('Usage: aibroker budget resets "2026-01-31T08:00" (local time, or "clear")');
|
|
@@ -178,11 +196,12 @@ export async function runBudget(args) {
|
|
|
178
196
|
console.log(`Resume after ${at.toLocaleString()}.`);
|
|
179
197
|
return;
|
|
180
198
|
}
|
|
181
|
-
console.log("Usage: aibroker budget [status|on|off|ceiling <n>|resets <time>]");
|
|
199
|
+
console.log("Usage: aibroker budget [status|on|off|ceiling <n>|managed <n|off>|resets <time>]");
|
|
182
200
|
console.log("");
|
|
183
201
|
console.log(" off ignore the limit entirely — the escape hatch");
|
|
184
202
|
console.log(" on put the ceiling back");
|
|
185
|
-
console.log(" ceiling <n> stop at n% of the weekly budget");
|
|
203
|
+
console.log(" ceiling <n> stop EVERYTHING at n% of the weekly budget");
|
|
204
|
+
console.log(" managed <n> stand MANAGED sessions down at n%, leave the rest running");
|
|
186
205
|
console.log(' resets <time> when the window reopens, e.g. "2026-01-31T08:00"');
|
|
187
206
|
if (action)
|
|
188
207
|
process.exit(1);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"budget-cli.js","sourceRoot":"","sources":["../../src/daemon/budget-cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,kBAAkB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"budget-cli.js","sourceRoot":"","sources":["../../src/daemon/budget-cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,13 @@ export declare const INPUT_LINE: RegExp;
|
|
|
10
10
|
export declare const CLAUDE_UI: RegExp;
|
|
11
11
|
/** A shell prompt: a line ending in a common prompt terminator. */
|
|
12
12
|
export declare const SHELL_PROMPT: RegExp;
|
|
13
|
+
/**
|
|
14
|
+
* A row of the background-agents panel Claude draws UNDER its status lines
|
|
15
|
+
* while agents run: a "main" header, one `◯ <agent> <task> · <time> · <tokens>`
|
|
16
|
+
* row per agent, an overflow count, and the navigation hint. Up to a dozen
|
|
17
|
+
* lines, all Claude's own, all below the closing rule.
|
|
18
|
+
*/
|
|
19
|
+
export declare const AGENT_PANEL: RegExp;
|
|
13
20
|
/** Collapse whitespace so wrapped and padded terminal text compares sanely. */
|
|
14
21
|
export declare function flatten(s: string): string;
|
|
15
22
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screen.d.ts","sourceRoot":"","sources":["../../src/transport/screen.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,+CAA+C;AAC/C,eAAO,MAAM,UAAU,QAAU,CAAC;AAClC,kEAAkE;AAClE,eAAO,MAAM,SAAS,QAAW,CAAC;AAClC,mEAAmE;AACnE,eAAO,MAAM,YAAY,QAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"screen.d.ts","sourceRoot":"","sources":["../../src/transport/screen.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,+CAA+C;AAC/C,eAAO,MAAM,UAAU,QAAU,CAAC;AAClC,kEAAkE;AAClE,eAAO,MAAM,SAAS,QAAW,CAAC;AAClC,mEAAmE;AACnE,eAAO,MAAM,YAAY,QAAgB,CAAC;AAC1C;;;;;GAKG;AACH,eAAO,MAAM,WAAW,QAAoF,CAAC;AAE7G,+EAA+E;AAC/E,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAA0C;AAEpF;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAyBpD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CASrD;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAMtD;AAED,6DAA6D;AAC7D,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKnD;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAGvE"}
|
package/dist/transport/screen.js
CHANGED
|
@@ -10,6 +10,13 @@ export const INPUT_LINE = /^\s*❯/;
|
|
|
10
10
|
export const CLAUDE_UI = /─{20,}/;
|
|
11
11
|
/** A shell prompt: a line ending in a common prompt terminator. */
|
|
12
12
|
export const SHELL_PROMPT = /[➜$%#»]\s*$/;
|
|
13
|
+
/**
|
|
14
|
+
* A row of the background-agents panel Claude draws UNDER its status lines
|
|
15
|
+
* while agents run: a "main" header, one `◯ <agent> <task> · <time> · <tokens>`
|
|
16
|
+
* row per agent, an overflow count, and the navigation hint. Up to a dozen
|
|
17
|
+
* lines, all Claude's own, all below the closing rule.
|
|
18
|
+
*/
|
|
19
|
+
export const AGENT_PANEL = /^\s*(❯\s*)?⏺\s+main\b|^\s*[◯●◉]\s+\S+\s{2,}|^\s*↓\s+\d+\s+more\b|↑\/↓ to select/;
|
|
13
20
|
/** Collapse whitespace so wrapped and padded terminal text compares sanely. */
|
|
14
21
|
export function flatten(s) { return s.replace(/\s+/g, " ").trim(); }
|
|
15
22
|
/**
|
|
@@ -36,11 +43,18 @@ export function isClaudeReady(frame) {
|
|
|
36
43
|
return false;
|
|
37
44
|
// Claude renders only its status lines below the box; a shell fills the rest
|
|
38
45
|
// of the screen, pushing the box further and further up.
|
|
39
|
-
|
|
46
|
+
//
|
|
47
|
+
// The background-agents panel is the exception: with agents running Claude
|
|
48
|
+
// draws up to a dozen more rows under the status lines, and a session that
|
|
49
|
+
// was plainly working was read as "at a shell" for exactly that reason —
|
|
50
|
+
// the manager could not arm it and every send was refused (2026-09-03).
|
|
51
|
+
// Those rows are Claude's, so they do not count against the box.
|
|
52
|
+
const below = lines.slice(lastRule + 1).filter((l) => !AGENT_PANEL.test(l));
|
|
53
|
+
if (below.length > 8)
|
|
40
54
|
return false;
|
|
41
55
|
// Belt and braces: an explicit prompt below the box means the shell has it.
|
|
42
|
-
for (
|
|
43
|
-
if (SHELL_PROMPT.test(
|
|
56
|
+
for (const l of below) {
|
|
57
|
+
if (SHELL_PROMPT.test(l))
|
|
44
58
|
return false;
|
|
45
59
|
}
|
|
46
60
|
return lines.some((l) => INPUT_LINE.test(l));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screen.js","sourceRoot":"","sources":["../../src/transport/screen.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,+CAA+C;AAC/C,MAAM,CAAC,MAAM,UAAU,GAAG,OAAO,CAAC;AAClC,kEAAkE;AAClE,MAAM,CAAC,MAAM,SAAS,GAAG,QAAQ,CAAC;AAClC,mEAAmE;AACnE,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"screen.js","sourceRoot":"","sources":["../../src/transport/screen.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,51 +1,49 @@
|
|
|
1
1
|
import { Request } from "express";
|
|
2
2
|
import { AppMeta } from "./paths.js";
|
|
3
3
|
|
|
4
|
+
/**
|
|
5
|
+
* One landing page per app. Each platform that has a file gets its own
|
|
6
|
+
* button — an app published for iOS and Android must not hide one behind the
|
|
7
|
+
* other, which is what happened when the page branched on `meta.platform`
|
|
8
|
+
* (the platform of the most recent publish).
|
|
9
|
+
*/
|
|
4
10
|
export function renderLanding(req: Request, slug: string, meta: AppMeta): string {
|
|
5
11
|
const proto = (req.headers["x-forwarded-proto"] as string | undefined) ?? req.protocol;
|
|
6
12
|
const host = req.headers.host ?? "localhost";
|
|
7
13
|
const base = `${proto}://${host}`;
|
|
8
14
|
|
|
9
|
-
|
|
15
|
+
const buttons: string[] = [];
|
|
16
|
+
const notes: string[] = [];
|
|
17
|
+
|
|
18
|
+
if (meta.ipaFile) {
|
|
10
19
|
const manifestUrl = `${base}/install/${slug}/manifest.plist`;
|
|
11
20
|
const itmsUrl = `itms-services://?action=download-manifest&url=${encodeURIComponent(manifestUrl)}`;
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
a
|
|
18
|
-
|
|
19
|
-
<body>
|
|
20
|
-
<h1>${meta.name}</h1>
|
|
21
|
-
<p>Version ${meta.version}</p>
|
|
22
|
-
${meta.icon ? `<img src="/install/${slug}/icon.png" width="120" height="120" style="border-radius:22px">` : ""}
|
|
23
|
-
<br>
|
|
24
|
-
<a class="btn" href="${itmsUrl}">Install on iOS</a>
|
|
25
|
-
<p style="margin-top:32px;font-size:13px;color:#888">
|
|
26
|
-
Ad-hoc build — your device UDID must be in the provisioning profile.
|
|
27
|
-
</p>
|
|
28
|
-
</body>
|
|
29
|
-
</html>`;
|
|
21
|
+
buttons.push(`<a class="btn ios" href="${itmsUrl}">Install on iOS</a>`);
|
|
22
|
+
notes.push("iOS: ad-hoc build — your device UDID must be in the provisioning profile.");
|
|
23
|
+
}
|
|
24
|
+
if (meta.apkFile) {
|
|
25
|
+
const apkUrl = `${base}/install/${slug}/${meta.apkFile}`;
|
|
26
|
+
buttons.push(`<a class="btn android" href="${apkUrl}">Download APK</a>`);
|
|
27
|
+
notes.push('Android: enable "Install unknown apps" in settings before installing.');
|
|
30
28
|
}
|
|
31
29
|
|
|
32
|
-
// Android
|
|
33
|
-
const apkUrl = `${base}/install/${slug}/${meta.apkFile ?? ""}`;
|
|
34
30
|
return `<!DOCTYPE html>
|
|
35
31
|
<html>
|
|
36
32
|
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
|
|
37
33
|
<title>Install ${meta.name}</title>
|
|
38
34
|
<style>body{font-family:system-ui;max-width:480px;margin:60px auto;padding:0 24px;text-align:center}
|
|
39
|
-
a.btn{display:
|
|
35
|
+
a.btn{display:block;margin:16px auto 0;max-width:280px;padding:14px 32px;border-radius:12px;text-decoration:none;font-size:18px}
|
|
36
|
+
a.ios{background:#007aff;color:#fff}
|
|
37
|
+
a.android{background:#3ddc84;color:#000}</style>
|
|
40
38
|
</head>
|
|
41
39
|
<body>
|
|
42
40
|
<h1>${meta.name}</h1>
|
|
43
41
|
<p>Version ${meta.version}</p>
|
|
44
42
|
${meta.icon ? `<img src="/install/${slug}/icon.png" width="120" height="120" style="border-radius:22px">` : ""}
|
|
45
43
|
<br>
|
|
46
|
-
|
|
44
|
+
${buttons.join("\n")}
|
|
47
45
|
<p style="margin-top:32px;font-size:13px;color:#888">
|
|
48
|
-
|
|
46
|
+
${notes.join("<br>")}
|
|
49
47
|
</p>
|
|
50
48
|
</body>
|
|
51
49
|
</html>`;
|
package/docker/ota/src/server.ts
CHANGED
|
@@ -76,7 +76,11 @@ app.post("/api/apps", requirePublisher, upload.single("file"), async (req: Reque
|
|
|
76
76
|
|
|
77
77
|
await rename(req.file.path, dest);
|
|
78
78
|
|
|
79
|
+
// Merge into the existing record so an iOS publish keeps the APK and vice
|
|
80
|
+
// versa; the landing page offers every platform that has a file.
|
|
81
|
+
const previous = readMeta(slug);
|
|
79
82
|
const meta: AppMeta = {
|
|
83
|
+
...(previous ?? {}),
|
|
80
84
|
name, bundleId, version, platform,
|
|
81
85
|
updatedAt: new Date().toISOString(),
|
|
82
86
|
updatedBy: callerLogin(req),
|
|
@@ -119,7 +123,7 @@ app.get("/install/:slug/", (req: Request, res: Response) => {
|
|
|
119
123
|
app.get("/install/:slug/manifest.plist", (req: Request, res: Response) => {
|
|
120
124
|
const { slug } = req.params;
|
|
121
125
|
const meta = readMeta(slug);
|
|
122
|
-
if (!meta || meta.
|
|
126
|
+
if (!meta || !meta.ipaFile) {
|
|
123
127
|
res.status(404).send("Not found");
|
|
124
128
|
return;
|
|
125
129
|
}
|