@damian87/omp 0.2.0 → 0.4.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 (57) hide show
  1. package/.github/skills/weighted-consensus/SKILL.md +120 -0
  2. package/README.md +59 -1
  3. package/catalog/capabilities.json +46 -0
  4. package/catalog/skills-general.json +29 -1
  5. package/dist/src/cli.d.ts +8 -0
  6. package/dist/src/cli.js +147 -3
  7. package/dist/src/cli.js.map +1 -1
  8. package/dist/src/council/config.d.ts +32 -0
  9. package/dist/src/council/config.js +84 -0
  10. package/dist/src/council/config.js.map +1 -0
  11. package/dist/src/council/engine.d.ts +19 -0
  12. package/dist/src/council/engine.js +193 -0
  13. package/dist/src/council/engine.js.map +1 -0
  14. package/dist/src/council/index.d.ts +20 -0
  15. package/dist/src/council/index.js +72 -0
  16. package/dist/src/council/index.js.map +1 -0
  17. package/dist/src/council/prompts.d.ts +32 -0
  18. package/dist/src/council/prompts.js +173 -0
  19. package/dist/src/council/prompts.js.map +1 -0
  20. package/dist/src/council/synth.d.ts +15 -0
  21. package/dist/src/council/synth.js +57 -0
  22. package/dist/src/council/synth.js.map +1 -0
  23. package/dist/src/council/types.d.ts +96 -0
  24. package/dist/src/council/types.js +4 -0
  25. package/dist/src/council/types.js.map +1 -0
  26. package/dist/src/mode-state/paths.d.ts +6 -0
  27. package/dist/src/mode-state/paths.js +12 -0
  28. package/dist/src/mode-state/paths.js.map +1 -1
  29. package/dist/src/team/api.d.ts +60 -1
  30. package/dist/src/team/api.js +101 -0
  31. package/dist/src/team/api.js.map +1 -1
  32. package/dist/src/team/config.d.ts +7 -0
  33. package/dist/src/team/config.js +16 -0
  34. package/dist/src/team/config.js.map +1 -0
  35. package/dist/src/team/mailbox.d.ts +30 -0
  36. package/dist/src/team/mailbox.js +188 -0
  37. package/dist/src/team/mailbox.js.map +1 -0
  38. package/dist/src/team/runtime.d.ts +9 -1
  39. package/dist/src/team/runtime.js +18 -12
  40. package/dist/src/team/runtime.js.map +1 -1
  41. package/dist/src/team/types.d.ts +25 -0
  42. package/dist/src/team/worker-bootstrap.js +29 -0
  43. package/dist/src/team/worker-bootstrap.js.map +1 -1
  44. package/dist/test/catalog.test.d.ts +1 -0
  45. package/dist/test/catalog.test.js +21 -0
  46. package/dist/test/catalog.test.js.map +1 -0
  47. package/dist/test/jira.test.d.ts +1 -0
  48. package/dist/test/jira.test.js +26 -0
  49. package/dist/test/jira.test.js.map +1 -0
  50. package/dist/test/lint.test.d.ts +1 -0
  51. package/dist/test/lint.test.js +9 -0
  52. package/dist/test/lint.test.js.map +1 -0
  53. package/dist/test/sync.test.d.ts +1 -0
  54. package/dist/test/sync.test.js +15 -0
  55. package/dist/test/sync.test.js.map +1 -0
  56. package/docs/plans/2026-05-29-team-messaging-and-nudge-gating-design.md +170 -0
  57. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../src/council/prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { CouncilDeps, CouncilMemberResult, CouncilSynthOutput, CouncilTaskSpec, ResolvedCouncilConfig } from "./types.js";
2
+ export interface SynthesizeResult {
3
+ ok: boolean;
4
+ synth?: CouncilSynthOutput;
5
+ rawStdout?: string;
6
+ rawStderr?: string;
7
+ error?: string;
8
+ }
9
+ /**
10
+ * Run the synthesizer over surviving members. Never fabricates a verdict: if the
11
+ * synth call fails or is unparseable, returns ok:false with the raw output.
12
+ * The returned synth's per_member_summary is authoritatively rebuilt from ALL
13
+ * members (including dropped ones) so the model can't omit a dropped member.
14
+ */
15
+ export declare function synthesize(config: ResolvedCouncilConfig, spec: CouncilTaskSpec, allMembers: CouncilMemberResult[], deps: CouncilDeps): Promise<SynthesizeResult>;
@@ -0,0 +1,57 @@
1
+ import { buildSynthPrompt, parseSynthOutput } from "./prompts.js";
2
+ function buildPerMemberSummary(members) {
3
+ return members.map((r) => ({
4
+ model: r.spec.model,
5
+ role: r.spec.role,
6
+ weight: r.spec.weight,
7
+ verdict: r.output?.verdict ?? "",
8
+ confidence: r.output?.confidence ?? 0,
9
+ dropped: r.status !== "ok",
10
+ dropReason: r.status !== "ok" ? r.dropReason : undefined,
11
+ }));
12
+ }
13
+ /**
14
+ * Run the synthesizer over surviving members. Never fabricates a verdict: if the
15
+ * synth call fails or is unparseable, returns ok:false with the raw output.
16
+ * The returned synth's per_member_summary is authoritatively rebuilt from ALL
17
+ * members (including dropped ones) so the model can't omit a dropped member.
18
+ */
19
+ export async function synthesize(config, spec, allMembers, deps) {
20
+ const survivors = allMembers.filter((m) => m.status === "ok");
21
+ const prompt = buildSynthPrompt(config, spec, survivors);
22
+ let res;
23
+ try {
24
+ res = await deps.spawn({
25
+ model: config.synthesizerModel,
26
+ prompt,
27
+ timeoutMs: config.perMemberTimeoutMs,
28
+ });
29
+ }
30
+ catch (err) {
31
+ return { ok: false, error: `synth spawn failed: ${String(err)}` };
32
+ }
33
+ if (res.timedOut) {
34
+ return { ok: false, rawStdout: res.stdout, rawStderr: res.stderr, error: "synth timed out" };
35
+ }
36
+ if (res.exitCode !== 0) {
37
+ return {
38
+ ok: false,
39
+ rawStdout: res.stdout,
40
+ rawStderr: res.stderr,
41
+ error: `synth exited ${res.exitCode}`,
42
+ };
43
+ }
44
+ const parsed = parseSynthOutput(res.stdout);
45
+ if (!parsed) {
46
+ return {
47
+ ok: false,
48
+ rawStdout: res.stdout,
49
+ rawStderr: res.stderr,
50
+ error: "synth output unparseable",
51
+ };
52
+ }
53
+ // Authoritative summary from engine-side member records.
54
+ parsed.per_member_summary = buildPerMemberSummary(allMembers);
55
+ return { ok: true, synth: parsed, rawStdout: res.stdout, rawStderr: res.stderr };
56
+ }
57
+ //# sourceMappingURL=synth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synth.js","sourceRoot":"","sources":["../../../src/council/synth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAkBlE,SAAS,qBAAqB,CAC5B,OAA8B;IAE9B,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACzB,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK;QACnB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI;QACjB,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM;QACrB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,IAAI,EAAE;QAChC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,UAAU,IAAI,CAAC;QACrC,OAAO,EAAE,CAAC,CAAC,MAAM,KAAK,IAAI;QAC1B,UAAU,EAAE,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;KACzD,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAA6B,EAC7B,IAAqB,EACrB,UAAiC,EACjC,IAAiB;IAEjB,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IAEzD,IAAI,GAAG,CAAC;IACR,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC;YACrB,KAAK,EAAE,MAAM,CAAC,gBAAgB;YAC9B,MAAM;YACN,SAAS,EAAE,MAAM,CAAC,kBAAkB;SACrC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,uBAAuB,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;IACpE,CAAC;IAED,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;QACjB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC/F,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,SAAS,EAAE,GAAG,CAAC,MAAM;YACrB,SAAS,EAAE,GAAG,CAAC,MAAM;YACrB,KAAK,EAAE,gBAAgB,GAAG,CAAC,QAAQ,EAAE;SACtC,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO;YACL,EAAE,EAAE,KAAK;YACT,SAAS,EAAE,GAAG,CAAC,MAAM;YACrB,SAAS,EAAE,GAAG,CAAC,MAAM;YACrB,KAAK,EAAE,0BAA0B;SAClC,CAAC;IACJ,CAAC;IAED,yDAAyD;IACzD,MAAM,CAAC,kBAAkB,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC;IAC9D,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;AACnF,CAAC"}
@@ -0,0 +1,96 @@
1
+ /** One council member: a model running under a role with a prior weight. */
2
+ export interface CouncilMemberSpec {
3
+ model: string;
4
+ role: string;
5
+ weight: number;
6
+ }
7
+ /** The task the council answers. Generic so /code-review etc. can reuse it. */
8
+ export interface CouncilTaskSpec {
9
+ question: string;
10
+ context?: string;
11
+ rubric?: string;
12
+ rolePack?: string;
13
+ members?: CouncilMemberSpec[];
14
+ minSurvivors?: number;
15
+ perMemberTimeoutMs?: number;
16
+ synthesizerModel?: string;
17
+ probe?: boolean;
18
+ maxConcurrency?: number;
19
+ tmpDir?: string;
20
+ }
21
+ /** What each member MUST emit (the member JSON contract). */
22
+ export interface CouncilMemberOutput {
23
+ verdict: string;
24
+ confidence: number;
25
+ rationale: string;
26
+ risks?: string[];
27
+ dissent?: string;
28
+ }
29
+ /** Per-member runtime classification. "unavailable" is distinct from "error". */
30
+ export type CouncilMemberStatus = "ok" | "timeout" | "error" | "unavailable" | "unparseable";
31
+ /** Per-member runtime result (engine-internal, surfaced in --json). */
32
+ export interface CouncilMemberResult {
33
+ spec: CouncilMemberSpec;
34
+ status: CouncilMemberStatus;
35
+ output?: CouncilMemberOutput;
36
+ rawStdout?: string;
37
+ rawStderr?: string;
38
+ exitCode?: number;
39
+ durationMs: number;
40
+ dropReason?: string;
41
+ jsonPath?: string;
42
+ }
43
+ export interface CouncilPerMemberSummary {
44
+ model: string;
45
+ role: string;
46
+ weight: number;
47
+ verdict: string;
48
+ confidence: number;
49
+ dropped: boolean;
50
+ dropReason?: string;
51
+ }
52
+ /** Synthesizer output schema (final verdict). */
53
+ export interface CouncilSynthOutput {
54
+ verdict: string;
55
+ confidence: number;
56
+ rationale: string;
57
+ minority_report: string;
58
+ per_member_summary: CouncilPerMemberSummary[];
59
+ }
60
+ /** Top-level engine result (what runCouncil returns / cli prints). */
61
+ export interface CouncilRunResult {
62
+ ok: boolean;
63
+ synth?: CouncilSynthOutput;
64
+ members: CouncilMemberResult[];
65
+ survivors: number;
66
+ dropped: number;
67
+ tmpDir: string;
68
+ error?: string;
69
+ }
70
+ /** Resolved configuration after merging spec > config > built-in default. */
71
+ export interface ResolvedCouncilConfig {
72
+ members: CouncilMemberSpec[];
73
+ synthesizerModel: string;
74
+ minSurvivors: number;
75
+ perMemberTimeoutMs: number;
76
+ maxConcurrency: number;
77
+ probe: boolean;
78
+ }
79
+ export interface SpawnRequest {
80
+ model: string;
81
+ prompt: string;
82
+ timeoutMs: number;
83
+ }
84
+ export interface SpawnResponse {
85
+ stdout: string;
86
+ stderr: string;
87
+ exitCode: number;
88
+ timedOut: boolean;
89
+ }
90
+ /** Real impl spawns `copilot --model <model> -p <prompt>`; tests inject a fake. */
91
+ export type CouncilSpawn = (req: SpawnRequest) => Promise<SpawnResponse>;
92
+ export interface CouncilDeps {
93
+ spawn: CouncilSpawn;
94
+ now?: () => number;
95
+ writeArtifact?: (path: string, data: string) => void;
96
+ }
@@ -0,0 +1,4 @@
1
+ // Type contracts for the weighted-consensus model council.
2
+ // See docs/plans / .omc/plans/weighted-consensus.md for the authoritative design.
3
+ export {};
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/council/types.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,kFAAkF"}
@@ -3,3 +3,9 @@ export declare function modeStatePath(cwd: string, mode: LoopMode): string;
3
3
  export declare function readModeStateJson<T>(cwd: string, mode: LoopMode): T | undefined;
4
4
  export declare function writeModeStateJson<T>(cwd: string, mode: LoopMode, value: T): void;
5
5
  export declare function clearModeState(cwd: string, mode: LoopMode): void;
6
+ /**
7
+ * True when any loop mode (ralph/ultrawork/ultraqa) is currently active.
8
+ * Single source of truth for mode-gated behaviour (e.g. team idle-nudge).
9
+ * Pure, side-effect-free read.
10
+ */
11
+ export declare function isLoopModeActive(cwd: string): boolean;
@@ -26,4 +26,16 @@ export function clearModeState(cwd, mode) {
26
26
  if (existsSync(p))
27
27
  unlinkSync(p);
28
28
  }
29
+ /**
30
+ * True when any loop mode (ralph/ultrawork/ultraqa) is currently active.
31
+ * Single source of truth for mode-gated behaviour (e.g. team idle-nudge).
32
+ * Pure, side-effect-free read.
33
+ */
34
+ export function isLoopModeActive(cwd) {
35
+ const modes = ["ralph", "ultrawork", "ultraqa"];
36
+ return modes.some((mode) => {
37
+ const state = readModeStateJson(cwd, mode);
38
+ return state?.active === true;
39
+ });
40
+ }
29
41
  //# sourceMappingURL=paths.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/mode-state/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACrG,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAInD,MAAM,UAAU,aAAa,CAAC,GAAW,EAAE,IAAc;IACvD,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAI,GAAW,EAAE,IAAc;IAC9D,MAAM,CAAC,GAAG,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACrC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAM,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAI,GAAW,EAAE,IAAc,EAAE,KAAQ;IACzE,MAAM,CAAC,GAAG,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACnC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IACpD,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC3D,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAW,EAAE,IAAc;IACxD,MAAM,CAAC,GAAG,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACnC,IAAI,UAAU,CAAC,CAAC,CAAC;QAAE,UAAU,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC"}
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/mode-state/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACrG,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAInD,MAAM,UAAU,aAAa,CAAC,GAAW,EAAE,IAAc;IACvD,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAI,GAAW,EAAE,IAAc;IAC9D,MAAM,CAAC,GAAG,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACrC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAM,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAI,GAAW,EAAE,IAAc,EAAE,KAAQ;IACzE,MAAM,CAAC,GAAG,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACnC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IACpD,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC3D,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAW,EAAE,IAAc;IACxD,MAAM,CAAC,GAAG,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACnC,IAAI,UAAU,CAAC,CAAC,CAAC;QAAE,UAAU,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,MAAM,KAAK,GAAe,CAAC,OAAO,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;IAC5D,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;QACzB,MAAM,KAAK,GAAG,iBAAiB,CAAuB,GAAG,EAAE,IAAI,CAAC,CAAC;QACjE,OAAO,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { type ClaimResult, type TransitionResult } from "./task-store.js";
2
- import type { TaskStatus } from "./types.js";
2
+ import { type TmuxApi } from "./tmux.js";
3
+ import type { MailboxMessageView, TaskStatus } from "./types.js";
3
4
  export interface ClaimInput {
4
5
  team_name: string;
5
6
  task_id: string;
@@ -18,3 +19,61 @@ export interface TransitionInput {
18
19
  cwd?: string;
19
20
  }
20
21
  export declare function apiTransitionTaskStatus(input: TransitionInput): TransitionResult;
22
+ export interface SendMessageInput {
23
+ team_name: string;
24
+ from: string;
25
+ to: string;
26
+ body: string;
27
+ cwd?: string;
28
+ }
29
+ export interface SendMessageResult {
30
+ ok: boolean;
31
+ messageId?: string;
32
+ nudged?: boolean;
33
+ error?: string;
34
+ }
35
+ /**
36
+ * Send a message to the leader or any registered worker. Rejects path-traversal
37
+ * and unknown recipients before any file I/O. Best-effort nudges the recipient
38
+ * worker's tmux pane (never the leader — it has no tracked pane).
39
+ */
40
+ export declare function apiSendMessage(input: SendMessageInput, tmux?: TmuxApi): Promise<SendMessageResult>;
41
+ export interface BroadcastInput {
42
+ team_name: string;
43
+ from: string;
44
+ body: string;
45
+ cwd?: string;
46
+ }
47
+ export interface BroadcastResult {
48
+ ok: boolean;
49
+ recipients: string[];
50
+ messageIds: string[];
51
+ errors?: string[];
52
+ }
53
+ /** Broadcast to every worker (except the sender) AND the leader. */
54
+ export declare function apiBroadcast(input: BroadcastInput, tmux?: TmuxApi): Promise<BroadcastResult>;
55
+ export interface MailboxListInput {
56
+ team_name: string;
57
+ worker: string;
58
+ undelivered_only?: boolean;
59
+ cwd?: string;
60
+ }
61
+ export interface MailboxListResult {
62
+ ok: boolean;
63
+ messages: MailboxMessageView[];
64
+ error?: string;
65
+ }
66
+ /** List a recipient's mailbox (merged with delivery receipts). */
67
+ export declare function apiMailboxList(input: MailboxListInput): MailboxListResult;
68
+ export interface MailboxMarkDeliveredInput {
69
+ team_name: string;
70
+ worker: string;
71
+ message_id: string;
72
+ cwd?: string;
73
+ }
74
+ export interface MailboxMarkDeliveredResult {
75
+ ok: boolean;
76
+ error?: string;
77
+ }
78
+ /** Mark a mailbox message delivered (appends a delivery receipt). */
79
+ export declare function apiMailboxMarkDelivered(input: MailboxMarkDeliveredInput): MailboxMarkDeliveredResult;
@@ -1,8 +1,14 @@
1
1
  import { resolve } from "node:path";
2
+ import { randomUUID } from "node:crypto";
2
3
  import { resolveTeamPaths, resolveWorkerPaths } from "./state-paths.js";
3
4
  import { tryClaimTask, transitionTask } from "./task-store.js";
4
5
  import { writeHeartbeat } from "./heartbeat.js";
5
6
  import { appendOutbox } from "./outbox.js";
7
+ import { loadTeamConfig } from "./config.js";
8
+ import { appendMailbox, listMailbox, markDelivered, validateRecipientName } from "./mailbox.js";
9
+ import { makeTmux, sendToWorker } from "./tmux.js";
10
+ /** Reserved recipient name for the team leader. */
11
+ const LEADER = "leader";
6
12
  export function apiClaimTask(input) {
7
13
  const cwd = resolve(input.cwd ?? process.cwd());
8
14
  const team = resolveTeamPaths(cwd, input.team_name);
@@ -52,4 +58,99 @@ export function apiTransitionTaskStatus(input) {
52
58
  }
53
59
  return transition;
54
60
  }
61
+ /**
62
+ * Send a message to the leader or any registered worker. Rejects path-traversal
63
+ * and unknown recipients before any file I/O. Best-effort nudges the recipient
64
+ * worker's tmux pane (never the leader — it has no tracked pane).
65
+ */
66
+ export async function apiSendMessage(input, tmux) {
67
+ const cwd = resolve(input.cwd ?? process.cwd());
68
+ // Path-traversal guard BEFORE config lookup — hard gate regardless of config.
69
+ if (!validateRecipientName(input.to)) {
70
+ return { ok: false, error: "invalid_recipient_name" };
71
+ }
72
+ if (!input.from || !input.body) {
73
+ return { ok: false, error: "invalid_input" };
74
+ }
75
+ const team = resolveTeamPaths(cwd, input.team_name);
76
+ const config = loadTeamConfig(team);
77
+ const isLeader = input.to === LEADER;
78
+ const recipient = config?.workers.find((w) => w.name === input.to);
79
+ if (!isLeader && !recipient) {
80
+ return { ok: false, error: "unknown_recipient" };
81
+ }
82
+ const message = {
83
+ type: "message",
84
+ id: randomUUID(),
85
+ from: input.from,
86
+ to: input.to,
87
+ body: input.body,
88
+ timestamp: new Date().toISOString(),
89
+ };
90
+ appendMailbox(team.mailboxDir, message);
91
+ // Best-effort nudge: only workers have a tracked pane; never nudge the leader.
92
+ let nudged = false;
93
+ const paneId = recipient?.paneId;
94
+ if (!isLeader && paneId) {
95
+ const undelivered = listMailbox(team.mailboxDir, input.to).filter((m) => !m.deliveredAt).length;
96
+ const trigger = `You have ${undelivered} new message(s). Read your mailbox: omp team api mailbox-list --input '{"team_name":"${input.team_name}","worker":"${input.to}"}' --json`;
97
+ try {
98
+ const api = tmux ?? makeTmux();
99
+ nudged = await sendToWorker(api, paneId, trigger, { rounds: 4, delayMs: 100 });
100
+ }
101
+ catch {
102
+ nudged = false; // nudge is best-effort; persistence already succeeded
103
+ }
104
+ }
105
+ return { ok: true, messageId: message.id, nudged };
106
+ }
107
+ /** Broadcast to every worker (except the sender) AND the leader. */
108
+ export async function apiBroadcast(input, tmux) {
109
+ const cwd = resolve(input.cwd ?? process.cwd());
110
+ const team = resolveTeamPaths(cwd, input.team_name);
111
+ const config = loadTeamConfig(team);
112
+ const recipientNames = [
113
+ ...(config?.workers.map((w) => w.name) ?? []),
114
+ LEADER,
115
+ ].filter((name) => name !== input.from);
116
+ const recipients = [];
117
+ const messageIds = [];
118
+ const errors = [];
119
+ for (const to of recipientNames) {
120
+ const result = await apiSendMessage({ team_name: input.team_name, from: input.from, to, body: input.body, cwd }, tmux);
121
+ if (result.ok && result.messageId) {
122
+ recipients.push(to);
123
+ messageIds.push(result.messageId);
124
+ }
125
+ else {
126
+ errors.push(`${to}: ${result.error ?? "unknown_error"}`);
127
+ }
128
+ }
129
+ return errors.length > 0
130
+ ? { ok: true, recipients, messageIds, errors }
131
+ : { ok: true, recipients, messageIds };
132
+ }
133
+ /** List a recipient's mailbox (merged with delivery receipts). */
134
+ export function apiMailboxList(input) {
135
+ const cwd = resolve(input.cwd ?? process.cwd());
136
+ if (!validateRecipientName(input.worker)) {
137
+ return { ok: false, messages: [], error: "invalid_recipient_name" };
138
+ }
139
+ const team = resolveTeamPaths(cwd, input.team_name);
140
+ let messages = listMailbox(team.mailboxDir, input.worker);
141
+ if (input.undelivered_only) {
142
+ messages = messages.filter((m) => !m.deliveredAt);
143
+ }
144
+ return { ok: true, messages };
145
+ }
146
+ /** Mark a mailbox message delivered (appends a delivery receipt). */
147
+ export function apiMailboxMarkDelivered(input) {
148
+ const cwd = resolve(input.cwd ?? process.cwd());
149
+ if (!validateRecipientName(input.worker)) {
150
+ return { ok: false, error: "invalid_recipient_name" };
151
+ }
152
+ const team = resolveTeamPaths(cwd, input.team_name);
153
+ const ok = markDelivered(team.mailboxDir, input.worker, input.message_id);
154
+ return ok ? { ok: true } : { ok: false, error: "message_not_found" };
155
+ }
55
156
  //# sourceMappingURL=api.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/team/api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/team/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,cAAc,EAA2C,MAAM,iBAAiB,CAAC;AACxG,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAChG,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAgB,MAAM,WAAW,CAAC;AAGjE,mDAAmD;AACnD,MAAM,MAAM,GAAG,QAAQ,CAAC;AASxB,MAAM,UAAU,YAAY,CAAC,KAAiB;IAC5C,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IACtG,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;QACd,cAAc,CAAC,MAAM,CAAC,aAAa,EAAE;YACnC,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,UAAU,EAAE,KAAK,CAAC,MAAM;YACxB,QAAQ,EAAE,KAAK,CAAC,SAAS;YACzB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACpC,SAAS,EAAE,CAAC;YACZ,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAaD,MAAM,UAAU,uBAAuB,CAAC,KAAsB;IAC5D,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IACpD,MAAM,UAAU,GAAG,cAAc,CAAC;QAChC,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,MAAM,EAAE,KAAK,CAAC,OAAO;QACrB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,UAAU,EAAE,KAAK,CAAC,WAAW;QAC7B,MAAM,EAAE,KAAK,CAAC,MAAM;KACrB,CAAC,CAAC;IACH,IAAI,UAAU,CAAC,EAAE,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACtD,MAAM,WAAW,GACf,KAAK,CAAC,EAAE,KAAK,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC;QAClG,YAAY,CAAC,MAAM,CAAC,UAAU,EAAE;YAC9B,IAAI,EAAE,WAAW;YACjB,MAAM,EAAE,KAAK,CAAC,OAAO;YACrB,MAAM,EAAE,KAAK,CAAC,EAAE;YAChB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;QACH,cAAc,CAAC,MAAM,CAAC,aAAa,EAAE;YACnC,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,UAAU,EAAE,KAAK,CAAC,MAAM;YACxB,QAAQ,EAAE,KAAK,CAAC,SAAS;YACzB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACpC,SAAS,EAAE,CAAC;YACZ,KAAK,EAAE,KAAK,CAAC,EAAE,KAAK,aAAa;SAClC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAqBD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAuB,EAAE,IAAc;IAC1E,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAEhD,8EAA8E;IAC9E,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;QACrC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC;IACxD,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAC/B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;IAC/C,CAAC;IAED,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAEpC,MAAM,QAAQ,GAAG,KAAK,CAAC,EAAE,KAAK,MAAM,CAAC;IACrC,MAAM,SAAS,GAAG,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC;IACnE,IAAI,CAAC,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC;QAC5B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC;IACnD,CAAC;IAED,MAAM,OAAO,GAAmB;QAC9B,IAAI,EAAE,SAAS;QACf,EAAE,EAAE,UAAU,EAAE;QAChB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IACF,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAExC,+EAA+E;IAC/E,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,MAAM,MAAM,GAAG,SAAS,EAAE,MAAM,CAAC;IACjC,IAAI,CAAC,QAAQ,IAAI,MAAM,EAAE,CAAC;QACxB,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC;QAChG,MAAM,OAAO,GAAG,YAAY,WAAW,wFAAwF,KAAK,CAAC,SAAS,eAAe,KAAK,CAAC,EAAE,YAAY,CAAC;QAClL,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;QACjF,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,GAAG,KAAK,CAAC,CAAC,sDAAsD;QACxE,CAAC;IACH,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC;AACrD,CAAC;AAgBD,oEAAoE;AACpE,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAqB,EAAE,IAAc;IACtE,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAEpC,MAAM,cAAc,GAAG;QACrB,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC7C,MAAM;KACP,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC;IAExC,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,MAAM,EAAE,IAAI,cAAc,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;QACvH,IAAI,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YAClC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACpB,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,MAAM,CAAC,KAAK,IAAI,eAAe,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC;QACtB,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE;QAC9C,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;AAC3C,CAAC;AAeD,kEAAkE;AAClE,MAAM,UAAU,cAAc,CAAC,KAAuB;IACpD,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAChD,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QACzC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC;IACtE,CAAC;IACD,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IACpD,IAAI,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1D,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;QAC3B,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAChC,CAAC;AAcD,qEAAqE;AACrE,MAAM,UAAU,uBAAuB,CAAC,KAAgC;IACtE,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAChD,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QACzC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC;IACxD,CAAC;IACD,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IACpD,MAAM,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAC1E,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC;AACvE,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { TeamStatePaths } from "./state-paths.js";
2
+ import type { TeamConfig } from "./types.js";
3
+ /**
4
+ * Read a team's config.json. Pure leaf read (no orchestration dependency) so
5
+ * both the runtime and the api layer can import it without a cycle.
6
+ */
7
+ export declare function loadTeamConfig(paths: TeamStatePaths): TeamConfig | undefined;
@@ -0,0 +1,16 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ /**
3
+ * Read a team's config.json. Pure leaf read (no orchestration dependency) so
4
+ * both the runtime and the api layer can import it without a cycle.
5
+ */
6
+ export function loadTeamConfig(paths) {
7
+ if (!existsSync(paths.configFile))
8
+ return undefined;
9
+ try {
10
+ return JSON.parse(readFileSync(paths.configFile, "utf8"));
11
+ }
12
+ catch {
13
+ return undefined;
14
+ }
15
+ }
16
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/team/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAInD;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,KAAqB;IAClD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC;QAAE,OAAO,SAAS,CAAC;IACpD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,CAAe,CAAC;IAC1E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { MailboxMessage, MailboxMessageView } from "./types.js";
2
+ /**
3
+ * Recipient names are used to build `<mailboxDir>/<recipient>.jsonl` paths and
4
+ * come from external CLI `--input` JSON. Reject anything that could escape the
5
+ * mailbox directory. Hard guard — call before constructing any file path.
6
+ */
7
+ export declare function validateRecipientName(name: string): boolean;
8
+ export declare function mailboxFilePath(mailboxDir: string, recipient: string): string;
9
+ export declare function mailboxOffsetPath(mailboxDir: string, recipient: string): string;
10
+ /** Append a message to its recipient's mailbox (keyed by msg.to). */
11
+ export declare function appendMailbox(mailboxDir: string, msg: MailboxMessage): void;
12
+ /**
13
+ * Mark a message delivered by APPENDING a DeliveryReceipt line (never rewrites
14
+ * the file, so active byte cursors stay valid). Returns false if no message
15
+ * with `messageId` exists (no receipt written).
16
+ */
17
+ export declare function markDelivered(mailboxDir: string, recipient: string, messageId: string): boolean;
18
+ /**
19
+ * Read new messages via byte cursor and advance it. The cursor advances past
20
+ * ALL lines (including delivery-receipt lines), but only `type: "message"`
21
+ * lines are returned — receipts are consumed but filtered from the result.
22
+ */
23
+ export declare function readNewMailbox(mailboxDir: string, recipient: string): MailboxMessage[];
24
+ /** Same filtering as readNewMailbox but does NOT advance the cursor. */
25
+ export declare function peekMailbox(mailboxDir: string, recipient: string): MailboxMessage[];
26
+ /**
27
+ * Full-file scan (no cursor). Returns every message merged with delivery info
28
+ * from any matching DeliveryReceipt line.
29
+ */
30
+ export declare function listMailbox(mailboxDir: string, recipient: string): MailboxMessageView[];