trantor 0.18.25 → 0.18.27
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/.claude-plugin/plugin.json +1 -1
- package/bin/crew-runner.mjs +10 -3
- package/bin/policy.mjs +11 -2
- package/hub.mjs +6 -0
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "trantor",
|
|
3
|
-
"version": "0.18.
|
|
3
|
+
"version": "0.18.27",
|
|
4
4
|
"description": "Trantor — the hub-world for AI agent crews: live message bus, presence, project Kanban/flow board + crew orchestration for independent AI coding agents (Claude, Codex, Gemini, Kimi, DeepSeek)",
|
|
5
5
|
"mcpServers": {
|
|
6
6
|
"relay": {
|
package/bin/crew-runner.mjs
CHANGED
|
@@ -609,9 +609,16 @@ function composedTurn({ base = "", wakeText = "", ctxText = "", againText = "",
|
|
|
609
609
|
// never wake on your own broadcasts: a claude seat's report contains "claude:" and matched the
|
|
610
610
|
// @mention filter, buying one echo turn per report (seen live on the first pulsed orchestrator)
|
|
611
611
|
msgs = msgs.filter(m => m.from !== SESSION);
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
612
|
+
// #5760 (the night of 08-31): the hub's hourly "same-project-sessions" FYI woke every seat
|
|
613
|
+
// into a real CLI turn — three wedged for hours mid-chatter, one on the metered pool. That
|
|
614
|
+
// kind is pure coordination CONTEXT ("no human needs to relay this" — and no turn needs to
|
|
615
|
+
// burn on it either): batch it like a broadcast. file-conflict and linked-activity overseer
|
|
616
|
+
// warnings still wake — those are actionable by the seat right now.
|
|
617
|
+
const fyi = msgs.filter(m => m.from === "hub:duty" && String(m.text || "").startsWith("🤝 OVERSEER same-project-sessions"));
|
|
618
|
+
const rest = msgs.filter(m => !fyi.includes(m));
|
|
619
|
+
const direct = rest.filter(m => m.to === SESSION);
|
|
620
|
+
const mentions = rest.filter(m => m.to === "all" && (m.text.includes(`@${AGENT}`) || m.text.toLowerCase().includes(`${AGENT}:`)));
|
|
621
|
+
const bcast = [...rest.filter(m => m.to === "all" && !mentions.includes(m)), ...fyi];
|
|
615
622
|
pendingBcast.push(...bcast); // wake-policy: plain broadcasts batch, they don't wake
|
|
616
623
|
const wake = [...direct, ...mentions];
|
|
617
624
|
if (!wake.length) { if (bcast.length) { savePending(pendingWake, pendingBcast); log(`${bcast.length} broadcast(s) batched (no wake) — ${pendingBcast.length} pending`); } continue; }
|
package/bin/policy.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
// trantor policy — the autonomy ladder's admin surface (PRD §6): show levels + links,
|
|
3
3
|
// set a project's level, declare that two projects are codependent.
|
|
4
|
-
// trantor policy show | set <project> <1-4> | link <a> <b> --reason "<why>"
|
|
4
|
+
// trantor policy show | set <project> <1-4> | link <a> <b> --reason "<why>" | unlink <a> <b>
|
|
5
5
|
// Drafted by scrooge (deepseek-v4-flash), integrated by the orchestrator.
|
|
6
6
|
import { readFileSync } from "node:fs";
|
|
7
7
|
import { join } from "node:path";
|
|
@@ -30,7 +30,7 @@ const post = async (hub, payload) => {
|
|
|
30
30
|
|
|
31
31
|
const legend = { 1: "1 observe", 2: "2 warn", 3: "3 gate", 4: "4 auto" };
|
|
32
32
|
function usage() {
|
|
33
|
-
console.log('usage: trantor policy show | set <project> <1-4> | link <a> <b> --reason "<why>"');
|
|
33
|
+
console.log('usage: trantor policy show | set <project> <1-4> | link <a> <b> --reason "<why>" | unlink <a> <b>');
|
|
34
34
|
process.exit(1);
|
|
35
35
|
}
|
|
36
36
|
|
|
@@ -71,4 +71,13 @@ if (cmd === "link") {
|
|
|
71
71
|
process.exit(0);
|
|
72
72
|
}
|
|
73
73
|
|
|
74
|
+
if (cmd === "unlink") {
|
|
75
|
+
if (!arg1 || !arg2) usage();
|
|
76
|
+
for (const hub of hubs) {
|
|
77
|
+
try { await post(hub, { unlink: { projects: [arg1, arg2] } }); console.log(`✓ ${arg1} ↮ ${arg2} on ${hub}`); }
|
|
78
|
+
catch (err) { console.warn(`⚠ ${hub}: ${err.message}`); }
|
|
79
|
+
}
|
|
80
|
+
process.exit(0);
|
|
81
|
+
}
|
|
82
|
+
|
|
74
83
|
usage();
|
package/hub.mjs
CHANGED
|
@@ -1504,6 +1504,12 @@ const server = http.createServer(async (req, res) => {
|
|
|
1504
1504
|
declaredBy: auth?.identity?.name || String(b.by || ""), ts: now() });
|
|
1505
1505
|
}
|
|
1506
1506
|
}
|
|
1507
|
+
// Unlink is link's inverse (#5397 shipped the app's Unlink button before this existed —
|
|
1508
|
+
// a declared codependency the operator can make, they must also be able to unmake).
|
|
1509
|
+
if (b.unlink && Array.isArray(b.unlink.projects) && b.unlink.projects.length >= 2) {
|
|
1510
|
+
const key = b.unlink.projects.slice(0, 4).map(x => canon(String(x).slice(0, 80))).sort().join(" ");
|
|
1511
|
+
p.links = (p.links || []).filter(l => (l.projects || []).slice().sort().join(" ") !== key);
|
|
1512
|
+
}
|
|
1507
1513
|
state.orgPolicy = p; dirty = true;
|
|
1508
1514
|
return json(res, 200, { ok: true, ...overseerPolicy() });
|
|
1509
1515
|
}
|