@bragi-gmbh/codebus 1.2.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/bin/codebus.js +2 -0
- package/dist/binding-guard.js +97 -0
- package/dist/binding-guard.js.map +1 -0
- package/dist/client.js +94 -0
- package/dist/client.js.map +1 -0
- package/dist/commands/ack.js +47 -0
- package/dist/commands/ack.js.map +1 -0
- package/dist/commands/archive.js +21 -0
- package/dist/commands/archive.js.map +1 -0
- package/dist/commands/as.js +299 -0
- package/dist/commands/as.js.map +1 -0
- package/dist/commands/ask.js +189 -0
- package/dist/commands/ask.js.map +1 -0
- package/dist/commands/auth.js +33 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/checkin.js +235 -0
- package/dist/commands/checkin.js.map +1 -0
- package/dist/commands/decision.js +52 -0
- package/dist/commands/decision.js.map +1 -0
- package/dist/commands/digest.js +117 -0
- package/dist/commands/digest.js.map +1 -0
- package/dist/commands/doctor.js +106 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/factory.js +191 -0
- package/dist/commands/factory.js.map +1 -0
- package/dist/commands/github-login.js +205 -0
- package/dist/commands/github-login.js.map +1 -0
- package/dist/commands/graph.js +88 -0
- package/dist/commands/graph.js.map +1 -0
- package/dist/commands/health.js +34 -0
- package/dist/commands/health.js.map +1 -0
- package/dist/commands/inbox.js +83 -0
- package/dist/commands/inbox.js.map +1 -0
- package/dist/commands/ingest.js +553 -0
- package/dist/commands/ingest.js.map +1 -0
- package/dist/commands/init.js +97 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/install.js +520 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/invite.js +152 -0
- package/dist/commands/invite.js.map +1 -0
- package/dist/commands/jira.js +237 -0
- package/dist/commands/jira.js.map +1 -0
- package/dist/commands/join.js +96 -0
- package/dist/commands/join.js.map +1 -0
- package/dist/commands/links.js +66 -0
- package/dist/commands/links.js.map +1 -0
- package/dist/commands/login.js +84 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/morning.js +121 -0
- package/dist/commands/morning.js.map +1 -0
- package/dist/commands/next.js +66 -0
- package/dist/commands/next.js.map +1 -0
- package/dist/commands/onboarding.js +109 -0
- package/dist/commands/onboarding.js.map +1 -0
- package/dist/commands/pack.js +276 -0
- package/dist/commands/pack.js.map +1 -0
- package/dist/commands/plan-gh.js +425 -0
- package/dist/commands/plan-gh.js.map +1 -0
- package/dist/commands/plan.js +465 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/pr.js +88 -0
- package/dist/commands/pr.js.map +1 -0
- package/dist/commands/question.js +142 -0
- package/dist/commands/question.js.map +1 -0
- package/dist/commands/read.js +84 -0
- package/dist/commands/read.js.map +1 -0
- package/dist/commands/refs.js +357 -0
- package/dist/commands/refs.js.map +1 -0
- package/dist/commands/reply.js +38 -0
- package/dist/commands/reply.js.map +1 -0
- package/dist/commands/repo.js +1198 -0
- package/dist/commands/repo.js.map +1 -0
- package/dist/commands/report.js +41 -0
- package/dist/commands/report.js.map +1 -0
- package/dist/commands/resolve-refs.js +21 -0
- package/dist/commands/resolve-refs.js.map +1 -0
- package/dist/commands/resolve.js +93 -0
- package/dist/commands/resolve.js.map +1 -0
- package/dist/commands/send.js +168 -0
- package/dist/commands/send.js.map +1 -0
- package/dist/commands/sent.js +22 -0
- package/dist/commands/sent.js.map +1 -0
- package/dist/commands/session.js +426 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/commands/statusline.js +43 -0
- package/dist/commands/statusline.js.map +1 -0
- package/dist/commands/task.js +140 -0
- package/dist/commands/task.js.map +1 -0
- package/dist/commands/tick.js +233 -0
- package/dist/commands/tick.js.map +1 -0
- package/dist/commands/upgrade.js +76 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/commands/watch.js +169 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/commands/whoami.js +27 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/config.js +103 -0
- package/dist/config.js.map +1 -0
- package/dist/directives.js +102 -0
- package/dist/directives.js.map +1 -0
- package/dist/errors.js +110 -0
- package/dist/errors.js.map +1 -0
- package/dist/git-hooks.js +116 -0
- package/dist/git-hooks.js.map +1 -0
- package/dist/graph-bootstrap.js +95 -0
- package/dist/graph-bootstrap.js.map +1 -0
- package/dist/graph-remote.js +889 -0
- package/dist/graph-remote.js.map +1 -0
- package/dist/graph.js +335 -0
- package/dist/graph.js.map +1 -0
- package/dist/index.js +154 -0
- package/dist/index.js.map +1 -0
- package/dist/kit/graph-publish.mjs +400 -0
- package/dist/mail-latency.js +120 -0
- package/dist/mail-latency.js.map +1 -0
- package/dist/mcp-registry.js +859 -0
- package/dist/mcp-registry.js.map +1 -0
- package/dist/mcp.js +193 -0
- package/dist/mcp.js.map +1 -0
- package/dist/output.js +12 -0
- package/dist/output.js.map +1 -0
- package/dist/positioning.js +21 -0
- package/dist/positioning.js.map +1 -0
- package/dist/rolestore.js +89 -0
- package/dist/rolestore.js.map +1 -0
- package/dist/session.js +49 -0
- package/dist/session.js.map +1 -0
- package/dist/sessionstore.js +736 -0
- package/dist/sessionstore.js.map +1 -0
- package/dist/version-check.js +97 -0
- package/dist/version-check.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { writeFile, mkdir, readFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { resolveConfig } from "../config.js";
|
|
4
|
+
import { makeCtx, workspaceId } from "../client.js";
|
|
5
|
+
import { CACHE_DIR } from "../session.js";
|
|
6
|
+
import { render } from "../output.js";
|
|
7
|
+
import { CodebusError } from "../errors.js";
|
|
8
|
+
export const DIGEST_FILE = join(CACHE_DIR, "digest.json");
|
|
9
|
+
const COUNT_LABEL = {
|
|
10
|
+
1: "ASK", 2: "BLOCKER", 3: "REVIEW", 4: "STALE", 5: "DECISION", 6: "UNCLAIMED",
|
|
11
|
+
// 7 (0048, narrowed by 0061): unhandled messages that are actionable — type
|
|
12
|
+
// ask/handoff, or any type with required_action set. Delivery gap #1,
|
|
13
|
+
// appended rather than interleaved into 1-6 (several tests pin those
|
|
14
|
+
// literal values).
|
|
15
|
+
7: "MESSAGE",
|
|
16
|
+
// 8 (0061 — RC2): unhandled FYI messages (note/plan, no required_action).
|
|
17
|
+
// Split out of what was one undifferentiated "MESSAGE" bucket so a needs-
|
|
18
|
+
// reply work order is never indistinguishable from FYI chatter in the
|
|
19
|
+
// counts. Ranked and counted separately; never a reason to act.
|
|
20
|
+
8: "FYI",
|
|
21
|
+
};
|
|
22
|
+
export function digestCounts(items) {
|
|
23
|
+
const counts = {};
|
|
24
|
+
for (const i of items) {
|
|
25
|
+
const label = COUNT_LABEL[i.class_rank] ?? "OTHER";
|
|
26
|
+
counts[label] = (counts[label] ?? 0) + 1;
|
|
27
|
+
}
|
|
28
|
+
return counts;
|
|
29
|
+
}
|
|
30
|
+
// FYI class (0061, RC2): class_rank 8 is deliberately non-actionable — the
|
|
31
|
+
// whole point of the class-7/8 split is that nothing is owed on an item in
|
|
32
|
+
// class 8. review finding on this PR: NEXT (`codebus next`, MCP
|
|
33
|
+
// `codebus_next`/`codebus_state.next`) used to take snapshot.items[0]
|
|
34
|
+
// unconditionally, so once every actionable item cleared, the top-ranked FYI
|
|
35
|
+
// note surfaced as NEXT and commandsFor("message") told the agent to read and
|
|
36
|
+
// REPLY to it — presenting "no action required" mail as a work order, the
|
|
37
|
+
// exact confusion this migration exists to remove. Shared by next.ts and
|
|
38
|
+
// mcp.ts so both surfaces agree on what counts as "the next thing to do":
|
|
39
|
+
// the first item that isn't FYI, or null if only FYI remains (a clear bus,
|
|
40
|
+
// not a work order).
|
|
41
|
+
const NON_ACTIONABLE_CLASS_RANK = 8;
|
|
42
|
+
export function nextActionableItem(items) {
|
|
43
|
+
return items.find((i) => i.class_rank !== NON_ACTIONABLE_CLASS_RANK) ?? null;
|
|
44
|
+
}
|
|
45
|
+
// Fetches the digest from the server (RLS-scoped to the calling identity) and
|
|
46
|
+
// persists the snapshot for statusline. Shared by `digest refresh` and `next`.
|
|
47
|
+
export async function fetchAndCacheDigest(ctx) {
|
|
48
|
+
const ws = await workspaceId(ctx);
|
|
49
|
+
const { data, error } = await ctx.supabase.rpc("bus_digest", { p_workspace: ws });
|
|
50
|
+
if (error)
|
|
51
|
+
throw new CodebusError(error.message);
|
|
52
|
+
const items = (data ?? []);
|
|
53
|
+
// S5: Count speak_now messages in my inbox that are still UNHANDLED. Gate on
|
|
54
|
+
// handled_at, not read_at (review MAJOR finding #2 — delivery gap #5/#6):
|
|
55
|
+
// read_at is a pure "opened" marker, so gating here on read_at meant a
|
|
56
|
+
// speak_now message that had merely been peeked (`codebus read`) dropped out
|
|
57
|
+
// of this count forever even though it was never actually handled/replied.
|
|
58
|
+
// Also scope to the selected workspace: without messages.workspace_id in the
|
|
59
|
+
// filter, an agent in multiple workspaces got a count polluted by every
|
|
60
|
+
// OTHER workspace's speak_now mail, not just the one the digest is for.
|
|
61
|
+
// Best-effort: a failure yields 0, never breaks the digest.
|
|
62
|
+
let speakNowCount = 0;
|
|
63
|
+
try {
|
|
64
|
+
const { count } = await ctx.supabase
|
|
65
|
+
.from("message_recipients")
|
|
66
|
+
.select("*, messages!inner(urgency, workspace_id)", { count: "exact", head: true })
|
|
67
|
+
.is("handled_at", null)
|
|
68
|
+
.is("archived_at", null)
|
|
69
|
+
.eq("messages.workspace_id", ws)
|
|
70
|
+
.eq("messages.urgency", "speak_now");
|
|
71
|
+
speakNowCount = count ?? 0;
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// best-effort — speak_now_count stays 0
|
|
75
|
+
}
|
|
76
|
+
const snapshot = {
|
|
77
|
+
generated_at: new Date().toISOString(),
|
|
78
|
+
workspace: ctx.workspaceSlug,
|
|
79
|
+
agent: ctx.agentSlug,
|
|
80
|
+
counts: digestCounts(items),
|
|
81
|
+
items,
|
|
82
|
+
speak_now_count: speakNowCount,
|
|
83
|
+
};
|
|
84
|
+
await mkdir(CACHE_DIR, { recursive: true });
|
|
85
|
+
await writeFile(DIGEST_FILE, JSON.stringify(snapshot, null, 2), { mode: 0o600 });
|
|
86
|
+
return snapshot;
|
|
87
|
+
}
|
|
88
|
+
export async function readCachedDigest() {
|
|
89
|
+
try {
|
|
90
|
+
return JSON.parse(await readFile(DIGEST_FILE, "utf8"));
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
async function refreshCmd(o) {
|
|
97
|
+
const ctx = await makeCtx(resolveConfig(o));
|
|
98
|
+
const snapshot = await fetchAndCacheDigest(ctx);
|
|
99
|
+
// attention KPI (best-effort)
|
|
100
|
+
await workspaceId(ctx).then((ws) => ctx.supabase.from("session_log").insert({ workspace_id: ws, kind: "digest" }), () => undefined).then(() => undefined, () => undefined);
|
|
101
|
+
if (o.json) {
|
|
102
|
+
console.log(JSON.stringify(snapshot, null, 2));
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const summary = Object.entries(snapshot.counts).map(([k, v]) => `${v} ${k}`).join(" | ") || "nothing pending";
|
|
106
|
+
console.log(`CodeBus digest (${snapshot.agent} @ ${snapshot.workspace}): ${summary}`);
|
|
107
|
+
if (snapshot.items.length) {
|
|
108
|
+
console.log(render(snapshot.items.slice(0, 10).map((i) => ({
|
|
109
|
+
id: i.display_id, kind: i.kind, score: i.score, reason: i.reason,
|
|
110
|
+
})), { json: false }));
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
export function registerDigest(program, g) {
|
|
114
|
+
const d = program.command("digest").description("deterministic attention digest");
|
|
115
|
+
g(d.command("refresh")).action(refreshCmd);
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=digest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"digest.js","sourceRoot":"","sources":["../../src/commands/digest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { loadFileConfig, CONFIG_FILE } from "../config.js";
|
|
5
|
+
import { exchangeToken } from "../session.js";
|
|
6
|
+
import { makeCtx, workspaceId } from "../client.js";
|
|
7
|
+
import { fetchAndCacheDigest } from "./digest.js";
|
|
8
|
+
import { detectEnvironment, OK, WARN, FAIL } from "./login.js";
|
|
9
|
+
import { stopHookInstalled, inClaudeCodeSession, codexHooksInstalled, inCodexSession, watchRecentlyArmed, MAIL_LATENCY_WARNING } from "../mail-latency.js";
|
|
10
|
+
// `codebus doctor` — diagnoses the full chain and keeps going past failures so
|
|
11
|
+
// one run shows everything that's wrong. Exits 1 if any hard check fails.
|
|
12
|
+
export async function doctorCmd(o) {
|
|
13
|
+
const file = loadFileConfig();
|
|
14
|
+
const env = process.env;
|
|
15
|
+
let hardFail = false;
|
|
16
|
+
const ok = (msg) => console.log(`${OK} ${msg}`);
|
|
17
|
+
const warn = (msg) => console.log(`${WARN} ${msg}`);
|
|
18
|
+
const fail = (msg) => { console.log(`${FAIL} ${msg}`); hardFail = true; };
|
|
19
|
+
const url = o.url ?? env.CODEBUS_URL ?? file.url;
|
|
20
|
+
const anonKey = o.anonKey ?? env.SUPABASE_ANON_KEY ?? file.anonKey;
|
|
21
|
+
const token = o.token ?? env.CODEBUS_TOKEN ?? file.token;
|
|
22
|
+
const workspace = o.workspace ?? env.CODEBUS_WORKSPACE ?? file.workspace ?? "default";
|
|
23
|
+
existsSync(CONFIG_FILE) ? ok(`Config file: ${CONFIG_FILE}`) : warn("No config file (run: codebus init)");
|
|
24
|
+
url ? ok(`CodeBus URL configured (${url})`) : fail("CodeBus URL missing (codebus init or CODEBUS_URL)");
|
|
25
|
+
anonKey ? ok("Anon key configured") : fail("Anon key missing (codebus init or SUPABASE_ANON_KEY)");
|
|
26
|
+
token ? ok("Token present") : fail("Token missing (codebus login --token <token>)");
|
|
27
|
+
let liveCtx;
|
|
28
|
+
if (url && anonKey && token) {
|
|
29
|
+
try {
|
|
30
|
+
const session = await exchangeToken(url, token, fetch, anonKey);
|
|
31
|
+
ok(`Auth token valid → agent: ${session.agent.slug}`);
|
|
32
|
+
try {
|
|
33
|
+
const ctx = await makeCtx({ url, token, workspace, anonKey });
|
|
34
|
+
liveCtx = ctx;
|
|
35
|
+
await workspaceId(ctx);
|
|
36
|
+
ok(`Workspace membership valid (${workspace})`);
|
|
37
|
+
const { data } = await ctx.supabase
|
|
38
|
+
.from("agents").select("people!person_id(slug)").eq("slug", ctx.agentSlug).single();
|
|
39
|
+
const person = data?.people?.slug;
|
|
40
|
+
person ? ok(`Person: ${person}`) : warn("Agent not linked to a person (accountability rollup disabled)");
|
|
41
|
+
await fetchAndCacheDigest(ctx);
|
|
42
|
+
ok("Digest refresh works");
|
|
43
|
+
}
|
|
44
|
+
catch (e) {
|
|
45
|
+
fail(`Workspace/digest check failed: ${e.message}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch (e) {
|
|
49
|
+
fail(`Auth failed: ${e.message}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const det = await detectEnvironment();
|
|
53
|
+
det.repo ? ok(`Git repo detected: ${det.repo}${det.branch ? `@${det.branch}` : ""}`) : warn("Not inside a git repo");
|
|
54
|
+
// Claude wiring: statusline command + SessionStart hook in ~/.claude/settings.json
|
|
55
|
+
const claudeSettings = join(homedir(), ".claude", "settings.json");
|
|
56
|
+
try {
|
|
57
|
+
const s = JSON.parse(readFileSync(claudeSettings, "utf8"));
|
|
58
|
+
const sl = s?.statusLine?.command ?? "";
|
|
59
|
+
sl.includes("codebus statusline") ? ok("Claude statusline installed") : warn("Claude statusline not installed (codebus install claude)");
|
|
60
|
+
const hooks = JSON.stringify(s?.hooks ?? {});
|
|
61
|
+
hooks.includes("codebus session start") ? ok("Claude session-start hook installed") : warn("Claude session-start hook not installed (codebus install claude)");
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
det.claude
|
|
65
|
+
? warn("Claude Code found but not wired (codebus install claude)")
|
|
66
|
+
: warn("Claude Code not found");
|
|
67
|
+
}
|
|
68
|
+
existsSync(join(homedir(), ".codebus", "bin", "codex"))
|
|
69
|
+
? ok("Codex wrapper installed")
|
|
70
|
+
: (det.codex ? warn("Codex found but wrapper not installed (codebus install codex)") : warn("Codex not found"));
|
|
71
|
+
// Delivery gap #8: mail latency is unbounded when NEITHER a turn-boundary
|
|
72
|
+
// Stop hook nor a live/recent watch window is present. Check loudly, not
|
|
73
|
+
// just the halves separately — an agent with no hook AND no watch never
|
|
74
|
+
// sees new mail until someone happens to poll.
|
|
75
|
+
//
|
|
76
|
+
// Review MAJOR finding #5: "installed" and "applies to THIS process" are
|
|
77
|
+
// different questions. Each hook is machine-wide config; it only ever fires
|
|
78
|
+
// inside an actual session of ITS OWN tool (CLAUDECODE / CODEX_THREAD_ID
|
|
79
|
+
// env). Report installed status honestly for both Claude and Codex (RC3:
|
|
80
|
+
// Codex ships a genuine Stop hook too — codex-rs/hooks, see
|
|
81
|
+
// mail-latency.ts's codexHooksInstalled doc comment), but the mail-latency
|
|
82
|
+
// verdict below counts a hook only when this doctor run is itself inside
|
|
83
|
+
// that tool's session — otherwise a recent watch (scoped to the selected
|
|
84
|
+
// workspace) is required instead.
|
|
85
|
+
const hookOk = stopHookInstalled();
|
|
86
|
+
hookOk ? ok("Claude Stop hook installed (turn-boundary mail surfacing)") : warn("Claude Stop hook not installed (codebus install claude)");
|
|
87
|
+
if (hookOk && !inClaudeCodeSession()) {
|
|
88
|
+
warn("not currently running inside Claude Code — the installed Stop hook cannot fire for THIS process/session");
|
|
89
|
+
}
|
|
90
|
+
const codexHookOk = codexHooksInstalled();
|
|
91
|
+
codexHookOk ? ok("Codex Stop hook installed (turn-boundary mail surfacing)") : warn("Codex Stop hook not installed (codebus install codex)");
|
|
92
|
+
if (codexHookOk && !inCodexSession()) {
|
|
93
|
+
warn("not currently running inside Codex — the installed Codex Stop hook cannot fire for THIS process/session");
|
|
94
|
+
}
|
|
95
|
+
const hookAppliesHere = (hookOk && inClaudeCodeSession()) || (codexHookOk && inCodexSession());
|
|
96
|
+
if (!hookAppliesHere) {
|
|
97
|
+
const armed = liveCtx ? await watchRecentlyArmed(liveCtx) : false;
|
|
98
|
+
if (armed)
|
|
99
|
+
ok("watch recently armed (this workspace) — mail latency bounded despite no applicable Stop hook");
|
|
100
|
+
else
|
|
101
|
+
warn(MAIL_LATENCY_WARNING);
|
|
102
|
+
}
|
|
103
|
+
if (hardFail)
|
|
104
|
+
process.exit(1);
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAa,cAAc,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,WAAW,EAAO,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,cAAc,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE3J,+EAA+E;AAC/E,0EAA0E;AAC1E,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,CAAY;IAC1C,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;IAC9B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IACxB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,MAAM,EAAE,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC;IAC5D,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAElF,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,GAAG,CAAC;IACjD,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,IAAI,GAAG,CAAC,iBAAiB,IAAI,IAAI,CAAC,OAAO,CAAC;IACnE,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC,KAAK,CAAC;IACzD,MAAM,SAAS,GAAG,CAAC,CAAC,SAAS,IAAI,GAAG,CAAC,iBAAiB,IAAI,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC;IAEtF,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IACzG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,2BAA2B,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;IACxG,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;IACnG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;IAEpF,IAAI,OAAwB,CAAC;IAC7B,IAAI,GAAG,IAAI,OAAO,IAAI,KAAK,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YAChE,EAAE,CAAC,6BAA6B,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YACtD,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;gBAC9D,OAAO,GAAG,GAAG,CAAC;gBACd,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;gBACvB,EAAE,CAAC,+BAA+B,SAAS,GAAG,CAAC,CAAC;gBAChD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,GAAG,CAAC,QAAQ;qBAChC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,CAAC;gBACtF,MAAM,MAAM,GAAI,IAAmD,EAAE,MAAM,EAAE,IAAI,CAAC;gBAClF,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;gBACzG,MAAM,mBAAmB,CAAC,GAAG,CAAC,CAAC;gBAC/B,EAAE,CAAC,sBAAsB,CAAC,CAAC;YAC7B,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,CAAC,kCAAmC,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,gBAAiB,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,iBAAiB,EAAE,CAAC;IACtC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,sBAAsB,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAErH,mFAAmF;IACnF,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;IACnE,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC;QAC3D,MAAM,EAAE,GAAG,CAAC,EAAE,UAAU,EAAE,OAAO,IAAI,EAAE,CAAC;QACxC,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,6BAA6B,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;QACzI,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QAC7C,KAAK,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,qCAAqC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;IACjK,CAAC;IAAC,MAAM,CAAC;QACP,GAAG,CAAC,MAAM;YACR,CAAC,CAAC,IAAI,CAAC,0DAA0D,CAAC;YAClE,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACpC,CAAC;IAED,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QACrD,CAAC,CAAC,EAAE,CAAC,yBAAyB,CAAC;QAC/B,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAElH,0EAA0E;IAC1E,yEAAyE;IACzE,wEAAwE;IACxE,+CAA+C;IAC/C,EAAE;IACF,yEAAyE;IACzE,4EAA4E;IAC5E,yEAAyE;IACzE,yEAAyE;IACzE,4DAA4D;IAC5D,2EAA2E;IAC3E,yEAAyE;IACzE,yEAAyE;IACzE,kCAAkC;IAClC,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;IACnC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,2DAA2D,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;IAC3I,IAAI,MAAM,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAAC;QACrC,IAAI,CAAC,yGAAyG,CAAC,CAAC;IAClH,CAAC;IACD,MAAM,WAAW,GAAG,mBAAmB,EAAE,CAAC;IAC1C,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,0DAA0D,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;IAC7I,IAAI,WAAW,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;QACrC,IAAI,CAAC,yGAAyG,CAAC,CAAC;IAClH,CAAC;IACD,MAAM,eAAe,GAAG,CAAC,MAAM,IAAI,mBAAmB,EAAE,CAAC,IAAI,CAAC,WAAW,IAAI,cAAc,EAAE,CAAC,CAAC;IAC/F,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAClE,IAAI,KAAK;YAAE,EAAE,CAAC,8FAA8F,CAAC,CAAC;;YACzG,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAClC,CAAC;IAED,IAAI,QAAQ;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { Option } from "commander";
|
|
3
|
+
import { resolveConfig } from "../config.js";
|
|
4
|
+
import { makeCtx, workspaceId } from "../client.js";
|
|
5
|
+
import { CodebusError } from "../errors.js";
|
|
6
|
+
import { render } from "../output.js";
|
|
7
|
+
/**
|
|
8
|
+
* 0076 does not add a display_id column to factory_tasks: the task UUID is
|
|
9
|
+
* the ledger's identity. Keep the CLI's typed surface recognizable while
|
|
10
|
+
* making the presentation ID reversible for the RPCs.
|
|
11
|
+
*/
|
|
12
|
+
const FACTORY_TASK_PREFIX = "CB-FTASK-";
|
|
13
|
+
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
14
|
+
export function factoryTaskDisplayId(taskId) {
|
|
15
|
+
return `${FACTORY_TASK_PREFIX}${taskId}`;
|
|
16
|
+
}
|
|
17
|
+
export function resolveFactoryTaskId(idOrDisplay) {
|
|
18
|
+
const raw = /^CB-FTASK-/i.test(idOrDisplay)
|
|
19
|
+
? idOrDisplay.slice(FACTORY_TASK_PREFIX.length)
|
|
20
|
+
: idOrDisplay;
|
|
21
|
+
if (!UUID_RE.test(raw)) {
|
|
22
|
+
throw new CodebusError(`invalid factory task id: ${idOrDisplay} (expected ${FACTORY_TASK_PREFIX}<uuid> or a UUID)`);
|
|
23
|
+
}
|
|
24
|
+
return raw;
|
|
25
|
+
}
|
|
26
|
+
function asResult(data, operation) {
|
|
27
|
+
if (!data || typeof data !== "object" || Array.isArray(data)) {
|
|
28
|
+
throw new CodebusError(`${operation} RPC returned an invalid response`);
|
|
29
|
+
}
|
|
30
|
+
return data;
|
|
31
|
+
}
|
|
32
|
+
function decorateResult(result, taskId) {
|
|
33
|
+
const rawTaskId = taskId ?? (typeof result.task_id === "string" ? result.task_id : undefined)
|
|
34
|
+
?? (result.task && typeof result.task.id === "string" ? result.task.id : undefined);
|
|
35
|
+
if (!rawTaskId)
|
|
36
|
+
return result;
|
|
37
|
+
return {
|
|
38
|
+
...result,
|
|
39
|
+
id: factoryTaskDisplayId(rawTaskId),
|
|
40
|
+
display_id: factoryTaskDisplayId(rawTaskId),
|
|
41
|
+
...(result.task_id ? {} : { task_id: rawTaskId }),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function submitHumanRow(result) {
|
|
45
|
+
return {
|
|
46
|
+
id: result.display_id ?? result.id ?? "—",
|
|
47
|
+
verdict: result.accepted === true ? "accepted" : "rejected",
|
|
48
|
+
state: result.state ?? "—",
|
|
49
|
+
deduped: result.deduped ?? false,
|
|
50
|
+
admission_id: result.admission_id ?? "—",
|
|
51
|
+
...(result.reason_code ? { reason_code: result.reason_code } : {}),
|
|
52
|
+
...(result.reason ? { reason: result.reason } : {}),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function statusHumanRow(result) {
|
|
56
|
+
const task = result.task && typeof result.task === "object" ? result.task : result;
|
|
57
|
+
return {
|
|
58
|
+
id: result.display_id ?? result.id ?? (task.id ? factoryTaskDisplayId(task.id) : "—"),
|
|
59
|
+
repo: task.repo ?? "—",
|
|
60
|
+
target_sha: task.target_sha ?? "—",
|
|
61
|
+
state: task.state ?? result.state ?? "—",
|
|
62
|
+
risk: task.risk ?? "—",
|
|
63
|
+
ack_state: task.ack_state ?? "—",
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
function cancelHumanRow(result) {
|
|
67
|
+
return {
|
|
68
|
+
id: result.display_id ?? result.id ?? "—",
|
|
69
|
+
state: result.state ?? "—",
|
|
70
|
+
noop: result.noop ?? false,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
function rejectSubmit(result) {
|
|
74
|
+
const reasonCode = typeof result.reason_code === "string" && result.reason_code
|
|
75
|
+
? result.reason_code
|
|
76
|
+
: "unknown_rejection";
|
|
77
|
+
const reason = typeof result.reason === "string" && result.reason
|
|
78
|
+
? result.reason
|
|
79
|
+
: "factory admission was rejected";
|
|
80
|
+
throw new CodebusError(`factory submit rejected [${reasonCode}]: ${reason}`);
|
|
81
|
+
}
|
|
82
|
+
function readTask(task) {
|
|
83
|
+
if (!task.startsWith("@"))
|
|
84
|
+
return task;
|
|
85
|
+
const path = task.slice(1);
|
|
86
|
+
if (!path)
|
|
87
|
+
throw new CodebusError("--task @file requires a file path");
|
|
88
|
+
try {
|
|
89
|
+
return readFileSync(path, "utf8");
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
93
|
+
throw new CodebusError(`unable to read task file '${path}': ${detail}`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/** Shared submit core, kept small so the RPC boundary is easy to test. */
|
|
97
|
+
export async function submitFactoryCore(ctx, options) {
|
|
98
|
+
const ws = await workspaceId(ctx);
|
|
99
|
+
const task = readTask(options.task);
|
|
100
|
+
// `auto` means no caller-imposed elevation. Passing null lets 0076 derive
|
|
101
|
+
// the conservative server-owned risk from its pinned fixture snapshot;
|
|
102
|
+
// med/high are advisory elevations and remain subject to that server gate.
|
|
103
|
+
const pRisk = options.risk === "auto" ? null : (options.risk ?? null);
|
|
104
|
+
// factory_submit's own SQL default (0076) targets the one real fleet lane,
|
|
105
|
+
// ('cerebras-openai', 1) -- there is no public flag for this because there
|
|
106
|
+
// is only one lane to pick from today. These two env vars exist solely so
|
|
107
|
+
// cli/test/integration/factory.test.ts can exercise the real submit path
|
|
108
|
+
// end-to-end against a test-only profile it provisions itself (never a
|
|
109
|
+
// seed file -- a seed file's guard can't reliably tell local from a
|
|
110
|
+
// self-hosted/remote target `db push --include-seed` can reach, so
|
|
111
|
+
// fixture creation lives in the test's own beforeAll instead). Gated to
|
|
112
|
+
// the same "are we under test" check cli/src/mcp.ts already uses, so a
|
|
113
|
+
// real production CLI process ignores both vars unconditionally -- this
|
|
114
|
+
// can only ever SELECT which already-provisioned engine_profiles row to
|
|
115
|
+
// ask about, never enable one: factory_submit still requires that row to
|
|
116
|
+
// have `enabled = true` server-side (0076), which nothing here can grant.
|
|
117
|
+
const underTest = process.env.VITEST === "true" || process.env.NODE_ENV === "test";
|
|
118
|
+
const engineOverride = underTest ? process.env.CODEBUS_FACTORY_ENGINE : undefined;
|
|
119
|
+
const rawProfileVersionOverride = underTest ? process.env.CODEBUS_FACTORY_PROFILE_VERSION : undefined;
|
|
120
|
+
const profileVersionOverride = rawProfileVersionOverride && /^[1-9]\d*$/.test(rawProfileVersionOverride)
|
|
121
|
+
? Number(rawProfileVersionOverride)
|
|
122
|
+
: undefined;
|
|
123
|
+
const { data, error } = await ctx.supabase.rpc("factory_submit", {
|
|
124
|
+
p_workspace_id: ws,
|
|
125
|
+
p_repo: options.repo,
|
|
126
|
+
p_target_sha: options.targetSha,
|
|
127
|
+
p_task: task,
|
|
128
|
+
p_risk: pRisk,
|
|
129
|
+
p_rerun: options.rerun ?? false,
|
|
130
|
+
...(engineOverride ? { p_engine: engineOverride } : {}),
|
|
131
|
+
...(profileVersionOverride !== undefined ? { p_profile_version: profileVersionOverride } : {}),
|
|
132
|
+
});
|
|
133
|
+
if (error)
|
|
134
|
+
throw new CodebusError(`factory submit RPC failed: ${error.message}`);
|
|
135
|
+
const result = decorateResult(asResult(data, "factory submit"));
|
|
136
|
+
if (result.accepted !== true && result.accepted !== false) {
|
|
137
|
+
throw new CodebusError("factory submit RPC returned no admission verdict");
|
|
138
|
+
}
|
|
139
|
+
if (result.accepted === true && typeof result.task_id !== "string") {
|
|
140
|
+
throw new CodebusError("factory submit RPC admitted a task without returning its id");
|
|
141
|
+
}
|
|
142
|
+
return { ...result, verdict: result.accepted ? "accepted" : "rejected" };
|
|
143
|
+
}
|
|
144
|
+
/** Shared status core; the RPC remains the only factory read path. */
|
|
145
|
+
export async function statusFactoryCore(ctx, idOrDisplay) {
|
|
146
|
+
const taskId = resolveFactoryTaskId(idOrDisplay);
|
|
147
|
+
const { data, error } = await ctx.supabase.rpc("factory_status", { p_task_id: taskId });
|
|
148
|
+
if (error)
|
|
149
|
+
throw new CodebusError(`factory status RPC failed: ${error.message}`);
|
|
150
|
+
return decorateResult(asResult(data, "factory status"), taskId);
|
|
151
|
+
}
|
|
152
|
+
/** Shared cancel core; the RPC owns requester/owner authorization and state. */
|
|
153
|
+
export async function cancelFactoryCore(ctx, idOrDisplay) {
|
|
154
|
+
const taskId = resolveFactoryTaskId(idOrDisplay);
|
|
155
|
+
const { data, error } = await ctx.supabase.rpc("factory_cancel", { p_task_id: taskId });
|
|
156
|
+
if (error)
|
|
157
|
+
throw new CodebusError(`factory cancel RPC failed: ${error.message}`);
|
|
158
|
+
return decorateResult(asResult(data, "factory cancel"), taskId);
|
|
159
|
+
}
|
|
160
|
+
async function submitFactory(o) {
|
|
161
|
+
const ctx = await makeCtx(resolveConfig(o));
|
|
162
|
+
const result = await submitFactoryCore(ctx, o);
|
|
163
|
+
console.log(o.json ? render([result], { json: true }) : render([submitHumanRow(result)], { json: false }));
|
|
164
|
+
if (result.accepted !== true)
|
|
165
|
+
rejectSubmit(result);
|
|
166
|
+
}
|
|
167
|
+
async function statusFactory(id, o) {
|
|
168
|
+
const ctx = await makeCtx(resolveConfig(o));
|
|
169
|
+
const result = await statusFactoryCore(ctx, id);
|
|
170
|
+
console.log(o.json ? render([result], { json: true }) : render([statusHumanRow(result)], { json: false }));
|
|
171
|
+
}
|
|
172
|
+
async function cancelFactory(id, o) {
|
|
173
|
+
const ctx = await makeCtx(resolveConfig(o));
|
|
174
|
+
const result = await cancelFactoryCore(ctx, id);
|
|
175
|
+
console.log(o.json ? render([result], { json: true }) : render([cancelHumanRow(result)], { json: false }));
|
|
176
|
+
}
|
|
177
|
+
export function registerFactory(program, g) {
|
|
178
|
+
const factory = program.command("factory").description("coding factory intake");
|
|
179
|
+
g(factory.command("submit"))
|
|
180
|
+
.requiredOption("--repo <fixture>", "registered fixture repository slug")
|
|
181
|
+
.requiredOption("--task <text|@file>", "task text or @path to a UTF-8 task file")
|
|
182
|
+
.requiredOption("--target-sha <sha>", "exact fixture target commit SHA")
|
|
183
|
+
.option("--rerun", "submit an explicit rerun instead of collapsing onto a live task")
|
|
184
|
+
.addOption(new Option("--risk <risk>", "automatic server risk, or advisory med/high")
|
|
185
|
+
.choices(["auto", "med", "high"])
|
|
186
|
+
.default("auto"))
|
|
187
|
+
.action(submitFactory);
|
|
188
|
+
g(factory.command("status").argument("<id>", "CB-FTASK-<uuid> or UUID")).action(statusFactory);
|
|
189
|
+
g(factory.command("cancel").argument("<id>", "CB-FTASK-<uuid> or UUID")).action(cancelFactory);
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/commands/factory.ts"],"names":[],"mappings":"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"}
|