@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.
Files changed (133) hide show
  1. package/bin/codebus.js +2 -0
  2. package/dist/binding-guard.js +97 -0
  3. package/dist/binding-guard.js.map +1 -0
  4. package/dist/client.js +94 -0
  5. package/dist/client.js.map +1 -0
  6. package/dist/commands/ack.js +47 -0
  7. package/dist/commands/ack.js.map +1 -0
  8. package/dist/commands/archive.js +21 -0
  9. package/dist/commands/archive.js.map +1 -0
  10. package/dist/commands/as.js +299 -0
  11. package/dist/commands/as.js.map +1 -0
  12. package/dist/commands/ask.js +189 -0
  13. package/dist/commands/ask.js.map +1 -0
  14. package/dist/commands/auth.js +33 -0
  15. package/dist/commands/auth.js.map +1 -0
  16. package/dist/commands/checkin.js +235 -0
  17. package/dist/commands/checkin.js.map +1 -0
  18. package/dist/commands/decision.js +52 -0
  19. package/dist/commands/decision.js.map +1 -0
  20. package/dist/commands/digest.js +117 -0
  21. package/dist/commands/digest.js.map +1 -0
  22. package/dist/commands/doctor.js +106 -0
  23. package/dist/commands/doctor.js.map +1 -0
  24. package/dist/commands/factory.js +191 -0
  25. package/dist/commands/factory.js.map +1 -0
  26. package/dist/commands/github-login.js +205 -0
  27. package/dist/commands/github-login.js.map +1 -0
  28. package/dist/commands/graph.js +88 -0
  29. package/dist/commands/graph.js.map +1 -0
  30. package/dist/commands/health.js +34 -0
  31. package/dist/commands/health.js.map +1 -0
  32. package/dist/commands/inbox.js +83 -0
  33. package/dist/commands/inbox.js.map +1 -0
  34. package/dist/commands/ingest.js +553 -0
  35. package/dist/commands/ingest.js.map +1 -0
  36. package/dist/commands/init.js +97 -0
  37. package/dist/commands/init.js.map +1 -0
  38. package/dist/commands/install.js +520 -0
  39. package/dist/commands/install.js.map +1 -0
  40. package/dist/commands/invite.js +152 -0
  41. package/dist/commands/invite.js.map +1 -0
  42. package/dist/commands/jira.js +237 -0
  43. package/dist/commands/jira.js.map +1 -0
  44. package/dist/commands/join.js +96 -0
  45. package/dist/commands/join.js.map +1 -0
  46. package/dist/commands/links.js +66 -0
  47. package/dist/commands/links.js.map +1 -0
  48. package/dist/commands/login.js +84 -0
  49. package/dist/commands/login.js.map +1 -0
  50. package/dist/commands/morning.js +121 -0
  51. package/dist/commands/morning.js.map +1 -0
  52. package/dist/commands/next.js +66 -0
  53. package/dist/commands/next.js.map +1 -0
  54. package/dist/commands/onboarding.js +109 -0
  55. package/dist/commands/onboarding.js.map +1 -0
  56. package/dist/commands/pack.js +276 -0
  57. package/dist/commands/pack.js.map +1 -0
  58. package/dist/commands/plan-gh.js +425 -0
  59. package/dist/commands/plan-gh.js.map +1 -0
  60. package/dist/commands/plan.js +465 -0
  61. package/dist/commands/plan.js.map +1 -0
  62. package/dist/commands/pr.js +88 -0
  63. package/dist/commands/pr.js.map +1 -0
  64. package/dist/commands/question.js +142 -0
  65. package/dist/commands/question.js.map +1 -0
  66. package/dist/commands/read.js +84 -0
  67. package/dist/commands/read.js.map +1 -0
  68. package/dist/commands/refs.js +357 -0
  69. package/dist/commands/refs.js.map +1 -0
  70. package/dist/commands/reply.js +38 -0
  71. package/dist/commands/reply.js.map +1 -0
  72. package/dist/commands/repo.js +1198 -0
  73. package/dist/commands/repo.js.map +1 -0
  74. package/dist/commands/report.js +41 -0
  75. package/dist/commands/report.js.map +1 -0
  76. package/dist/commands/resolve-refs.js +21 -0
  77. package/dist/commands/resolve-refs.js.map +1 -0
  78. package/dist/commands/resolve.js +93 -0
  79. package/dist/commands/resolve.js.map +1 -0
  80. package/dist/commands/send.js +168 -0
  81. package/dist/commands/send.js.map +1 -0
  82. package/dist/commands/sent.js +22 -0
  83. package/dist/commands/sent.js.map +1 -0
  84. package/dist/commands/session.js +426 -0
  85. package/dist/commands/session.js.map +1 -0
  86. package/dist/commands/statusline.js +43 -0
  87. package/dist/commands/statusline.js.map +1 -0
  88. package/dist/commands/task.js +140 -0
  89. package/dist/commands/task.js.map +1 -0
  90. package/dist/commands/tick.js +233 -0
  91. package/dist/commands/tick.js.map +1 -0
  92. package/dist/commands/upgrade.js +76 -0
  93. package/dist/commands/upgrade.js.map +1 -0
  94. package/dist/commands/watch.js +169 -0
  95. package/dist/commands/watch.js.map +1 -0
  96. package/dist/commands/whoami.js +27 -0
  97. package/dist/commands/whoami.js.map +1 -0
  98. package/dist/config.js +103 -0
  99. package/dist/config.js.map +1 -0
  100. package/dist/directives.js +102 -0
  101. package/dist/directives.js.map +1 -0
  102. package/dist/errors.js +110 -0
  103. package/dist/errors.js.map +1 -0
  104. package/dist/git-hooks.js +116 -0
  105. package/dist/git-hooks.js.map +1 -0
  106. package/dist/graph-bootstrap.js +95 -0
  107. package/dist/graph-bootstrap.js.map +1 -0
  108. package/dist/graph-remote.js +889 -0
  109. package/dist/graph-remote.js.map +1 -0
  110. package/dist/graph.js +335 -0
  111. package/dist/graph.js.map +1 -0
  112. package/dist/index.js +154 -0
  113. package/dist/index.js.map +1 -0
  114. package/dist/kit/graph-publish.mjs +400 -0
  115. package/dist/mail-latency.js +120 -0
  116. package/dist/mail-latency.js.map +1 -0
  117. package/dist/mcp-registry.js +859 -0
  118. package/dist/mcp-registry.js.map +1 -0
  119. package/dist/mcp.js +193 -0
  120. package/dist/mcp.js.map +1 -0
  121. package/dist/output.js +12 -0
  122. package/dist/output.js.map +1 -0
  123. package/dist/positioning.js +21 -0
  124. package/dist/positioning.js.map +1 -0
  125. package/dist/rolestore.js +89 -0
  126. package/dist/rolestore.js.map +1 -0
  127. package/dist/session.js +49 -0
  128. package/dist/session.js.map +1 -0
  129. package/dist/sessionstore.js +736 -0
  130. package/dist/sessionstore.js.map +1 -0
  131. package/dist/version-check.js +97 -0
  132. package/dist/version-check.js.map +1 -0
  133. package/package.json +47 -0
@@ -0,0 +1,66 @@
1
+ import { resolveConfig } from "../config.js";
2
+ import { makeCtx, workspaceId } from "../client.js";
3
+ import { render } from "../output.js";
4
+ import { CodebusError } from "../errors.js";
5
+ const DISPLAY_KIND = { MSG: "message", TASK: "task", DEC: "decision", Q: "question", PR: "pr" };
6
+ const KIND_TABLE = { message: "messages", task: "tasks", decision: "decisions", question: "questions", pr: "pull_requests" };
7
+ // Resolve a display id (CB-MSG-000123), external id (M22 / TASK-... / DEC-...) to (kind, uuid).
8
+ // display ids are only unique per workspace (bus_counters, 0004) — always
9
+ // scope the lookup, or a multi-workspace agent can resolve the WRONG
10
+ // workspace's node when two workspaces happen to share a display_id.
11
+ async function resolveNode(ctx, idArg) {
12
+ const dm = /^CB-(MSG|TASK|DEC|Q|PR)-/i.exec(idArg);
13
+ if (dm) {
14
+ const kind = DISPLAY_KIND[dm[1].toUpperCase()];
15
+ const ws = await workspaceId(ctx);
16
+ const { data } = await ctx.supabase.from(KIND_TABLE[kind]).select("id")
17
+ .eq("workspace_id", ws).eq("display_id", idArg.toUpperCase()).maybeSingle();
18
+ if (!data)
19
+ throw new CodebusError(`not found: ${idArg}`);
20
+ return { kind, id: data.id };
21
+ }
22
+ let kind = null;
23
+ if (/^TASK/i.test(idArg))
24
+ kind = "task";
25
+ else if (/^DEC/i.test(idArg))
26
+ kind = "decision";
27
+ else if (/^M\d+$/i.test(idArg))
28
+ kind = "message";
29
+ if (!kind)
30
+ throw new CodebusError(`use a display id (CB-MSG-…) or external id (M22 / TASK-… / DEC-…), got: ${idArg}`);
31
+ // external_id is likewise only unique per workspace (0011: unique index on
32
+ // (workspace_id, external_id)) — scope this lookup too.
33
+ const ws = await workspaceId(ctx);
34
+ const { data } = await ctx.supabase.from(KIND_TABLE[kind]).select("id")
35
+ .eq("workspace_id", ws).eq("external_id", idArg).maybeSingle();
36
+ if (!data)
37
+ throw new CodebusError(`not found: ${idArg}`);
38
+ return { kind, id: data.id };
39
+ }
40
+ const tag = (kind, display, external, title) => `${display || external || title || kind}`;
41
+ export async function linksCmd(idArg, o) {
42
+ const ctx = await makeCtx(resolveConfig(o));
43
+ const { kind, id } = await resolveNode(ctx, idArg);
44
+ const depth = Math.max(1, Math.min(6, parseInt(o.depth ?? "2", 10) || 2));
45
+ const { data, error } = await ctx.supabase.rpc("bus_connections", { p_kind: kind, p_id: id, p_depth: depth });
46
+ if (error)
47
+ throw new CodebusError(error.message);
48
+ const edges = (data ?? []);
49
+ if (o.json) {
50
+ console.log(JSON.stringify(edges, null, 2));
51
+ return;
52
+ }
53
+ if (edges.length === 0) {
54
+ console.log(`(no connections within depth ${depth} for ${idArg})`);
55
+ return;
56
+ }
57
+ const rows = edges.map((e) => ({
58
+ depth: e.depth,
59
+ from: tag(e.src_kind, e.src_display, e.src_external),
60
+ rel: e.rel,
61
+ to: e.dst_kind === "label" ? `"${e.dst_title}"` : tag(e.dst_kind, e.dst_display, e.dst_external),
62
+ subject: (e.dst_title ?? "").toString().slice(0, 44),
63
+ }));
64
+ console.log(render(rows, { json: false }));
65
+ }
66
+ //# sourceMappingURL=links.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"links.js","sourceRoot":"","sources":["../../src/commands/links.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ import { execFile } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ import { loadFileConfig, saveFileConfig, resolveConfig } from "../config.js";
4
+ import { exchangeToken } from "../session.js";
5
+ import { makeCtx, workspaceId } from "../client.js";
6
+ import { fetchAndCacheDigest } from "./digest.js";
7
+ import { CodebusError } from "../errors.js";
8
+ import { githubLoginCmd } from "./github-login.js";
9
+ const exec = promisify(execFile);
10
+ export const OK = "✓";
11
+ export const WARN = "⚠";
12
+ export const FAIL = "✗";
13
+ // The validation chain login and doctor share: authenticate → identify →
14
+ // workspace membership → digest refresh. Returns the resolved facts so init
15
+ // can print a summary.
16
+ export async function validateConnection(o) {
17
+ const cfg = resolveConfig(o);
18
+ if (!cfg.anonKey)
19
+ throw new CodebusError("no anon key — run `codebus init` (or set SUPABASE_ANON_KEY).");
20
+ const session = await exchangeToken(cfg.url, cfg.token, fetch, cfg.anonKey);
21
+ console.log(`${OK} Auth token valid (agent: ${session.agent.slug})`);
22
+ const ctx = await makeCtx(cfg);
23
+ await workspaceId(ctx);
24
+ console.log(`${OK} Workspace membership valid (${cfg.workspace})`);
25
+ const { data } = await ctx.supabase
26
+ .from("agents").select("people!person_id(slug)").eq("slug", ctx.agentSlug).single();
27
+ const person = data?.people?.slug ?? null;
28
+ console.log(`${OK} whoami: agent=${ctx.agentSlug} person=${person ?? "— (service agent or unlinked)"}`);
29
+ await fetchAndCacheDigest(ctx);
30
+ console.log(`${OK} Digest refresh works`);
31
+ return { agent: ctx.agentSlug, person, workspace: cfg.workspace };
32
+ }
33
+ // `codebus login --token cb_xxx` — stores the token, validates the full chain.
34
+ // `codebus login --github` — browser OAuth mirroring the web page (see
35
+ // github-login.ts): Supabase Auth signInWithOAuth(github) over a localhost PKCE
36
+ // callback → the EXISTING github_web_login() RPC → store the returned token.
37
+ export async function loginCmd(o) {
38
+ if (o.github) {
39
+ await githubLoginCmd(o);
40
+ return;
41
+ }
42
+ if (!o.token)
43
+ throw new CodebusError("login requires --token <token> (issued by your workspace admin).");
44
+ const facts = await validateConnection(o);
45
+ // Persist only after the chain passes — a bad token never lands in config.
46
+ saveFileConfig({
47
+ token: o.token,
48
+ ...(o.url ? { url: o.url } : {}),
49
+ ...(o.anonKey ? { anonKey: o.anonKey } : {}),
50
+ ...(o.workspace ? { workspace: o.workspace } : {}),
51
+ agent: facts.agent,
52
+ ...(facts.person ? { person: facts.person } : {}),
53
+ });
54
+ console.log(`${OK} Saved to ~/.codebus/config.json`);
55
+ console.log(`Logged in as ${facts.agent}${facts.person ? ` (person: ${facts.person})` : ""} @ ${facts.workspace}`);
56
+ }
57
+ export async function detectEnvironment() {
58
+ const probe = async (cmd, args) => {
59
+ try {
60
+ return (await exec(cmd, args)).stdout.trim() || null;
61
+ }
62
+ catch {
63
+ return null;
64
+ }
65
+ };
66
+ const has = async (bin) => (await probe("which", [bin])) !== null;
67
+ const [gitName, gitEmail, top, branch, claude, codex] = await Promise.all([
68
+ probe("git", ["config", "user.name"]),
69
+ probe("git", ["config", "user.email"]),
70
+ probe("git", ["rev-parse", "--show-toplevel"]),
71
+ probe("git", ["symbolic-ref", "--short", "HEAD"]),
72
+ has("claude"),
73
+ has("codex"),
74
+ ]);
75
+ const envVars = ["CODEBUS_URL", "CODEBUS_TOKEN", "CODEBUS_WORKSPACE", "CODEBUS_AGENT", "SUPABASE_ANON_KEY"]
76
+ .filter((k) => process.env[k]);
77
+ return {
78
+ gitName, gitEmail,
79
+ repo: top ? top.split("/").pop() : null, branch,
80
+ claude, codex, envVars,
81
+ };
82
+ }
83
+ export { loadFileConfig };
84
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAa,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACxF,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAEjC,MAAM,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC;AACtB,MAAM,CAAC,MAAM,IAAI,GAAG,GAAG,CAAC;AACxB,MAAM,CAAC,MAAM,IAAI,GAAG,GAAG,CAAC;AAExB,yEAAyE;AACzE,4EAA4E;AAC5E,uBAAuB;AACvB,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,CAAY;IAGnD,MAAM,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IAC7B,IAAI,CAAC,GAAG,CAAC,OAAO;QAAE,MAAM,IAAI,YAAY,CAAC,8DAA8D,CAAC,CAAC;IAEzG,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAC5E,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,6BAA6B,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;IAErE,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;IACvB,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,gCAAgC,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC;IAEnE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,GAAG,CAAC,QAAQ;SAChC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,CAAC;IACtF,MAAM,MAAM,GAAI,IAAmD,EAAE,MAAM,EAAE,IAAI,IAAI,IAAI,CAAC;IAC1F,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,kBAAkB,GAAG,CAAC,SAAS,WAAW,MAAM,IAAI,+BAA+B,EAAE,CAAC,CAAC;IAExG,MAAM,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAC;IAE1C,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC;AACpE,CAAC;AAMD,+EAA+E;AAC/E,uEAAuE;AACvE,gFAAgF;AAChF,6EAA6E;AAC7E,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,CAAY;IACzC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;QAAC,MAAM,cAAc,CAAC,CAAC,CAAC,CAAC;QAAC,OAAO;IAAC,CAAC;IAClD,IAAI,CAAC,CAAC,CAAC,KAAK;QAAE,MAAM,IAAI,YAAY,CAAC,kEAAkE,CAAC,CAAC;IAEzG,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAC1C,2EAA2E;IAC3E,cAAc,CAAC;QACb,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5C,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClD,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,kCAAkC,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;AACrH,CAAC;AAUD,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,MAAM,KAAK,GAAG,KAAK,EAAE,GAAW,EAAE,IAAc,EAAE,EAAE;QAClD,IAAI,CAAC;YAAC,OAAO,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,IAAI,CAAC;QAAC,CAAC;IACtF,CAAC,CAAC;IACF,MAAM,GAAG,GAAG,KAAK,EAAE,GAAW,EAAE,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IAC1E,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACxE,KAAK,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACrC,KAAK,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACtC,KAAK,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;QAC9C,KAAK,CAAC,KAAK,EAAE,CAAC,cAAc,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;QACjD,GAAG,CAAC,QAAQ,CAAC;QACb,GAAG,CAAC,OAAO,CAAC;KACb,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,CAAC,aAAa,EAAE,eAAe,EAAE,mBAAmB,EAAE,eAAe,EAAE,mBAAmB,CAAC;SACxG,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACjC,OAAO;QACL,OAAO,EAAE,QAAQ;QACjB,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM;QAChD,MAAM,EAAE,KAAK,EAAE,OAAO;KACvB,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,cAAc,EAAE,CAAC"}
@@ -0,0 +1,121 @@
1
+ import { resolveConfig } from "../config.js";
2
+ import { makeCtx } from "../client.js";
3
+ import { render } from "../output.js";
4
+ import { CodebusError } from "../errors.js";
5
+ export async function morningQueueCore(ctx, opts = {}) {
6
+ const { data, error } = await ctx.supabase.rpc("morning_queue", {
7
+ p_stale_hours_override: opts.staleHoursOverride ?? null,
8
+ p_include_drills: !!opts.includeDrills,
9
+ });
10
+ if (error)
11
+ throw new CodebusError(error.message);
12
+ return data;
13
+ }
14
+ export async function morningCursorAdvanceCore(ctx, toEventId, renderToken) {
15
+ const { error } = await ctx.supabase.rpc("morning_cursor_advance", {
16
+ p_to_event_id: toEventId, p_render_token: renderToken,
17
+ });
18
+ if (error)
19
+ throw new CodebusError(error.message);
20
+ }
21
+ function renderMorningHuman(r) {
22
+ const lines = [];
23
+ lines.push(`morning queue — generated ${r.generated_at}`);
24
+ lines.push(`cursor: ${r.cursor.from_event_id} -> ${r.cursor.to_event_id}`);
25
+ if (r.degraded.length)
26
+ lines.push(`(degraded: ${r.degraded.join(", ")})`);
27
+ if (r.security_blocked.length) {
28
+ lines.push("");
29
+ lines.push("SECURITY BLOCKED:");
30
+ for (const m of r.security_blocked) {
31
+ lines.push(` ${m.worker_slug} (migration ${m.migration_id}) — blocked ${Math.round(m.age_hours)}h ago, last_error=${m.last_error ?? "n/a"}`);
32
+ }
33
+ if (r.security_blocked_truncated)
34
+ lines.push(` (+${r.security_blocked_truncated} more, truncated)`);
35
+ }
36
+ if (r.spend.length) {
37
+ lines.push("");
38
+ lines.push("SPEND:");
39
+ for (const s of r.spend) {
40
+ lines.push(` ${s.kind}: $${s.mtd_usd} / $${s.ceiling_usd} (${s.pct}%) override_active=${s.override_active}`);
41
+ }
42
+ }
43
+ if (!r.plans.length) {
44
+ lines.push("");
45
+ lines.push("(no visible plans)");
46
+ }
47
+ for (const p of r.plans) {
48
+ lines.push("");
49
+ lines.push(`PLAN ${p.id} — ${p.title} [${p.status}]`);
50
+ if (p.frontier.length) {
51
+ lines.push(" frontier:");
52
+ for (const t of p.frontier)
53
+ lines.push(` ${t.ticket_id} (${t.type}) ${t.title}`);
54
+ if (p.frontier_truncated)
55
+ lines.push(` (+${p.frontier_truncated} more, truncated)`);
56
+ }
57
+ if (p.in_flight.length) {
58
+ lines.push(" in_flight:");
59
+ for (const d of p.in_flight)
60
+ lines.push(` ${d.ticket_id} -> ${d.agent} (dispatch ${d.dispatch_id}, ${Math.round(d.age_hours)}h)`);
61
+ }
62
+ if (p.grill.length) {
63
+ lines.push(" grill:");
64
+ for (const t of p.grill)
65
+ lines.push(` ${t.ticket_id} ${t.title} (${Math.round(t.age_hours)}h open)`);
66
+ }
67
+ if (p.resolutions.length) {
68
+ lines.push(" resolutions (since last run):");
69
+ for (const rr of p.resolutions)
70
+ lines.push(` ${rr.ticket_id} resolved by ${rr.resolved_by}: ${rr.summary}`);
71
+ if (p.resolutions_truncated)
72
+ lines.push(` (+${p.resolutions_truncated} more, truncated)`);
73
+ }
74
+ if (p.exceptions.length) {
75
+ lines.push(" exceptions:");
76
+ for (const e of p.exceptions)
77
+ lines.push(` [${e.kind}] ticket ${e.ticket_id}: ${e.detail}`);
78
+ }
79
+ }
80
+ return lines.join("\n");
81
+ }
82
+ export function registerMorning(program, g) {
83
+ g(program.command("morning"))
84
+ .option("--peek", "render without advancing the cursor")
85
+ .option("--stale-hours <n>", "override every visible plan's stale_hours for this render")
86
+ .option("--include-drills", "include is_drill=true plans")
87
+ .action(async (o) => {
88
+ const ctx = await makeCtx(resolveConfig(o));
89
+ const result = await morningQueueCore(ctx, {
90
+ staleHoursOverride: o.staleHours !== undefined ? Number(o.staleHours) : undefined,
91
+ includeDrills: !!o.includeDrills,
92
+ });
93
+ // `--json` emits morning_queue()'s output verbatim (spec §A.2.11) —
94
+ // no reshaping, so a direct RPC call and this render are byte-identical.
95
+ if (o.json)
96
+ console.log(JSON.stringify(result, null, 2));
97
+ else
98
+ console.log(renderMorningHuman(result));
99
+ if (!o.peek) {
100
+ await morningCursorAdvanceCore(ctx, result.cursor.to_event_id, result.cursor.render_token);
101
+ }
102
+ });
103
+ // Low-level escape hatch exercising the render-token round trip directly
104
+ // (also how the test suite drives the §A.2.11 negative cases: forged/
105
+ // future/foreign-caller/superseded tokens) — `codebus morning` above
106
+ // already calls this internally after every non---peek render.
107
+ g(program.command("morning-cursor-advance"))
108
+ .requiredOption("--to <id>", "the to_event_id from a morning_queue() render")
109
+ // NOT named --token: `g()` already defines a global `--token <token>`
110
+ // (the auth credential flag) — a second `--token` on this subcommand
111
+ // collides with it at commander registration time (fails fast on
112
+ // startup, every invocation, not just this one). --render-token names
113
+ // the specific HMAC value unambiguously.
114
+ .requiredOption("--render-token <t>", "that render's cursor.render_token")
115
+ .action(async (o) => {
116
+ const ctx = await makeCtx(resolveConfig(o));
117
+ await morningCursorAdvanceCore(ctx, Number(o.to), o.renderToken);
118
+ console.log(render([{ advanced_to: Number(o.to) }], { json: !!o.json }));
119
+ });
120
+ }
121
+ //# sourceMappingURL=morning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"morning.js","sourceRoot":"","sources":["../../src/commands/morning.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import { resolveConfig } from "../config.js";
2
+ import { makeCtx, workspaceId, identityIsGuessed, guessedIdentityWarning } from "../client.js";
3
+ import { fetchAndCacheDigest, nextActionableItem } from "./digest.js";
4
+ // Suggested follow-up commands per item kind, so the answer is actionable.
5
+ // Exported for reuse in MCP tool.
6
+ export function commandsFor(kind, displayId) {
7
+ switch (kind) {
8
+ case "question": return [`codebus question answer ${displayId} --body "..."`];
9
+ case "task": return [`codebus task review ${displayId}`, `codebus task done ${displayId} --evidence <ref>`];
10
+ case "pr": return [`codebus pr update ${displayId} --status approved`];
11
+ case "decision": return [`codebus links ${displayId}`];
12
+ // delivery gap #1: bus_digest's new class_rank 7 message items need a
13
+ // followup just like every other kind — read it, then either reply
14
+ // (which the 0048 trigger marks handled automatically) or `codebus ack`
15
+ // if it needed no reply.
16
+ case "message": return [`codebus read ${displayId}`, `codebus reply ${displayId} --body "..."`];
17
+ default: return [];
18
+ }
19
+ }
20
+ /**
21
+ * Shared core: compute the next ranked item with reason, score, and suggested commands.
22
+ * Used by both nextCmd and MCP codebus_next tool.
23
+ */
24
+ export async function computeNext(ctx) {
25
+ const snapshot = await fetchAndCacheDigest(ctx);
26
+ // review finding (0061): NEXT must never present a class-8 FYI message as
27
+ // work — see nextActionableItem's comment in digest.ts. If only FYI notes
28
+ // remain, the bus is genuinely clear of anything OWED, even though FYI
29
+ // mail is still visible via `codebus inbox`/digest counts.
30
+ const top = nextActionableItem(snapshot.items);
31
+ if (!top) {
32
+ return null;
33
+ }
34
+ return {
35
+ ...top,
36
+ commands: commandsFor(top.kind, top.display_id),
37
+ };
38
+ }
39
+ // Converts statusline pressure into ONE actionable item. The ranking lives in
40
+ // bus_digest (class ladder + spec §5.2 weights); rows arrive pre-sorted.
41
+ // Also refreshes the local snapshot so the statusline stays current.
42
+ export async function nextCmd(o) {
43
+ const ctx = await makeCtx(resolveConfig(o));
44
+ // attention KPI (best-effort)
45
+ await workspaceId(ctx).then((ws) => ctx.supabase.from("session_log").insert({ workspace_id: ws, kind: "next" }), () => undefined).then(() => undefined, () => undefined);
46
+ const top = await computeNext(ctx);
47
+ if (!o.json && identityIsGuessed(ctx))
48
+ process.stdout.write(guessedIdentityWarning(ctx, "priorities"));
49
+ if (!top) {
50
+ console.log(o.json ? "null" : "NEXT: nothing pending — bus is clear.");
51
+ return;
52
+ }
53
+ if (o.json) {
54
+ console.log(JSON.stringify(top, null, 2));
55
+ return;
56
+ }
57
+ console.log(`NEXT: ${top.display_id}`);
58
+ console.log(`Reason: ${top.reason} · score ${top.score}`);
59
+ console.log(`${top.kind}: ${top.title}`);
60
+ if (top.commands.length) {
61
+ console.log("Commands:");
62
+ for (const c of top.commands)
63
+ console.log(` ${c}`);
64
+ }
65
+ }
66
+ //# sourceMappingURL=next.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next.js","sourceRoot":"","sources":["../../src/commands/next.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,109 @@
1
+ import { resolveConfig } from "../config.js";
2
+ import { makeCtx, workspaceId } from "../client.js";
3
+ import { render } from "../output.js";
4
+ import { CodebusError } from "../errors.js";
5
+ // `codebus onboarding` — the adoption funnel (0023.1 #4), derived entirely from
6
+ // existing tables: Invited → Joined → First Session → Answered Welcome.
7
+ // Shows where people drop off; visibility follows RLS (welcome-question answers
8
+ // are only visible to their participants — typically the inviter, who is the
9
+ // natural reader of this report).
10
+ function median(xs) {
11
+ if (!xs.length)
12
+ return "—";
13
+ const s = [...xs].sort((a, b) => a - b);
14
+ const m = s.length % 2 ? s[(s.length - 1) / 2] : (s[s.length / 2 - 1] + s[s.length / 2]) / 2;
15
+ return m < 90 ? `${Math.round(m)} min` : `${(m / 60).toFixed(1)} h`;
16
+ }
17
+ export async function onboardingCmd(o) {
18
+ const ctx = await makeCtx(resolveConfig(o));
19
+ const ws = await workspaceId(ctx);
20
+ const { data: invites, error } = await ctx.supabase.from("invites")
21
+ .select("github_login, status, accepted_at, created_at, opened_at")
22
+ .eq("workspace_id", ws).order("created_at");
23
+ if (error)
24
+ throw new CodebusError(error.message);
25
+ const inviteToJoin = [];
26
+ const joinToSession = [];
27
+ const sessionToAnswer = [];
28
+ const rows = [];
29
+ for (const inv of invites ?? []) {
30
+ const login = inv.github_login;
31
+ const joined = inv.status === "accepted";
32
+ let firstSession = false, answered = null;
33
+ let firstSessionAt = null, answeredAt = null;
34
+ if (joined && login) {
35
+ // people!person_id!inner (not the bare `people!inner`): agents also
36
+ // carries owner_person_id -> people(id) (checkin_role, 0040+), so an
37
+ // unqualified embed is ambiguous between the two FKs and PostgREST
38
+ // rejects the query outright (PGRST201). The trailing `!inner` matters
39
+ // too — without it, a filter on the embedded resource's column
40
+ // (`.eq("people.github_login", …)`) is silently dropped rather than
41
+ // applied, and this returns an arbitrary unrelated agent instead of
42
+ // erroring. Because only `data` was destructured here, both failure
43
+ // modes were invisible and `agent` was effectively always wrong — the
44
+ // entire first-session / welcome-answered branch of the funnel has
45
+ // been dead (or wrong) since owner_person_id shipped. Bug, not by design.
46
+ const { data: agent, error: agentErr } = await ctx.supabase.from("agents")
47
+ .select("id, people!person_id!inner(github_login)").eq("people.github_login", login).limit(1).maybeSingle();
48
+ if (agentErr)
49
+ throw new CodebusError(agentErr.message);
50
+ if (agent) {
51
+ const { data: firstStart } = await ctx.supabase.from("session_log")
52
+ .select("created_at").eq("workspace_id", ws).eq("agent_id", agent.id)
53
+ .eq("kind", "start").order("created_at").limit(1).maybeSingle();
54
+ firstSession = !!firstStart;
55
+ firstSessionAt = firstStart?.created_at ?? null;
56
+ const { data: wq } = await ctx.supabase.from("questions")
57
+ .select("status, answered_at").eq("workspace_id", ws).eq("to_agent_id", agent.id)
58
+ .like("title", "Welcome %").maybeSingle();
59
+ answered = wq ? wq.status !== "open" : null; // null = not visible to you / none
60
+ answeredAt = wq?.answered_at ?? null;
61
+ }
62
+ }
63
+ const min = (a, b) => (Date.parse(b) - Date.parse(a)) / 60000;
64
+ if (joined && inv.accepted_at)
65
+ inviteToJoin.push(min(inv.created_at, inv.accepted_at));
66
+ if (inv.accepted_at && firstSessionAt)
67
+ joinToSession.push(min(inv.accepted_at, firstSessionAt));
68
+ if (firstSessionAt && answeredAt)
69
+ sessionToAnswer.push(min(firstSessionAt, answeredAt));
70
+ const done = joined && firstSession && answered === true;
71
+ rows.push({
72
+ who: login ?? "(open link)",
73
+ invited: "✓",
74
+ opened: inv.opened_at ? "✓" : "·",
75
+ joined: joined ? "✓" : "·",
76
+ first_session: firstSession ? "✓" : "·",
77
+ welcome_answered: answered === true ? "✓" : answered === false ? "·" : "?",
78
+ completed: done ? "✓" : "·",
79
+ });
80
+ }
81
+ if (o.report) {
82
+ const c = (k) => rows.filter((r) => r[k] === "✓").length;
83
+ const report = {
84
+ invited: rows.length, opened: c("opened"), joined: c("joined"),
85
+ first_session: c("first_session"), welcome_answered: c("welcome_answered"),
86
+ completed: c("completed"),
87
+ median_invite_to_join: median(inviteToJoin),
88
+ median_join_to_first_session: median(joinToSession),
89
+ median_session_to_welcome_answer: median(sessionToAnswer),
90
+ };
91
+ if (o.json) {
92
+ console.log(JSON.stringify({ report, rows }, null, 2));
93
+ return;
94
+ }
95
+ console.log(`Onboarding Funnel (${ctx.workspaceSlug})`);
96
+ console.log(`Invited: ${report.invited}`);
97
+ console.log(`Opened: ${report.opened}`);
98
+ console.log(`Joined: ${report.joined}`);
99
+ console.log(`First Session: ${report.first_session} ← the metric that matters`);
100
+ console.log(`Welcome Answered: ${report.welcome_answered}`);
101
+ console.log(`Completed: ${report.completed}`);
102
+ console.log(`Median Invite → Join: ${report.median_invite_to_join}`);
103
+ console.log(`Median Join → First Session: ${report.median_join_to_first_session}`);
104
+ console.log(`Median Session → Welcome Answer: ${report.median_session_to_welcome_answer}`);
105
+ return;
106
+ }
107
+ console.log(render(rows, { json: !!o.json }));
108
+ }
109
+ //# sourceMappingURL=onboarding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding.js","sourceRoot":"","sources":["../../src/commands/onboarding.ts"],"names":[],"mappings":"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"}