@mu-crew/mu 3.12.0 → 3.13.1

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 (58) hide show
  1. package/dist/chunk-3BARPJLY.js +44 -0
  2. package/dist/{chunk-R2SVBZAB.js → chunk-45KQLMEL.js} +193 -93
  3. package/dist/chunk-45KQLMEL.js.map +1 -0
  4. package/dist/{chunk-XV7J56GD.js → chunk-G434JKV2.js} +4 -3
  5. package/dist/{chunk-XV7J56GD.js.map → chunk-G434JKV2.js.map} +1 -1
  6. package/dist/{chunk-IRPTNVJC.js → chunk-KUGUFBWH.js} +8622 -6026
  7. package/dist/chunk-KUGUFBWH.js.map +1 -0
  8. package/dist/{chunk-77GBZ2KR.js → chunk-QITLNZEM.js} +3 -1
  9. package/dist/{chunk-77GBZ2KR.js.map → chunk-QITLNZEM.js.map} +1 -1
  10. package/dist/{chunk-TEGZOXML.js → chunk-VIEYQMQA.js} +12 -10
  11. package/dist/chunk-VIEYQMQA.js.map +1 -0
  12. package/dist/{chunk-L2ABBTYG.js → chunk-WI6AWCMK.js} +3 -1
  13. package/dist/{chunk-L2ABBTYG.js.map → chunk-WI6AWCMK.js.map} +1 -1
  14. package/dist/{cli-MDCJEU74.js → cli-CKOMHBXV.js} +3581 -107
  15. package/dist/cli-CKOMHBXV.js.map +1 -0
  16. package/dist/cli.js +4 -3
  17. package/dist/cli.js.map +1 -1
  18. package/dist/devtools-LS4ZEPWM.js +3772 -0
  19. package/dist/devtools-LS4ZEPWM.js.map +1 -0
  20. package/dist/extension/mu-pi.js +206 -61
  21. package/dist/extension/mu-pi.js.map +1 -1
  22. package/dist/index.d.ts +309 -228
  23. package/dist/index.js +12 -5
  24. package/dist/tui-LFJ5P4Y2.js +40956 -0
  25. package/dist/tui-LFJ5P4Y2.js.map +1 -0
  26. package/dist/tui-sync-worker.js +4 -3
  27. package/dist/tui-sync-worker.js.map +1 -1
  28. package/dist/yank-XDOONQSL.js +13 -0
  29. package/docs/ARCHITECTURE.md +4 -1
  30. package/docs/ROADMAP.md +43 -38
  31. package/docs/VISION.md +8 -0
  32. package/docs/VOCABULARY.md +3 -1
  33. package/docs/architecture/dag.md +4 -0
  34. package/docs/architecture/sync.md +8 -0
  35. package/docs/architecture/tui.md +11 -2
  36. package/docs/guide/delegate.md +6 -4
  37. package/docs/guide/recovery.md +4 -0
  38. package/docs/reference/env.md +2 -2
  39. package/package.json +2 -1
  40. package/skills/mu/SKILL.md +12 -2
  41. package/skills/mu/recipes/adversarial-review.md +3 -0
  42. package/skills/mu/recipes/backlog-triage.md +2 -0
  43. package/skills/mu/recipes/findings.md +7 -0
  44. package/skills/mu/recipes/long-run.md +3 -1
  45. package/skills/mu/recipes/loop-until-done.md +3 -1
  46. package/skills/mu/recipes/orchestrator-loop.md +4 -0
  47. package/skills/mu/recipes/ultrathink.md +3 -1
  48. package/skills/mu/recipes/watcher.md +6 -1
  49. package/dist/chunk-IRPTNVJC.js.map +0 -1
  50. package/dist/chunk-PZ5AY32C.js +0 -10
  51. package/dist/chunk-R2SVBZAB.js.map +0 -1
  52. package/dist/chunk-TEGZOXML.js.map +0 -1
  53. package/dist/cli-MDCJEU74.js.map +0 -1
  54. package/dist/tui-LO75XA3O.js +0 -6452
  55. package/dist/tui-LO75XA3O.js.map +0 -1
  56. package/dist/yank-T3AYQTVR.js +0 -12
  57. /package/dist/{chunk-PZ5AY32C.js.map → chunk-3BARPJLY.js.map} +0 -0
  58. /package/dist/{yank-T3AYQTVR.js.map → yank-XDOONQSL.js.map} +0 -0
package/dist/index.d.ts CHANGED
@@ -1,6 +1,17 @@
1
1
  import { Database } from 'better-sqlite3';
2
2
 
3
3
  type CtlState = "busy" | "idle";
4
+ /**
5
+ * pi is waiting on a blocking extension dialog (ui_prompt_start without
6
+ * its ui_prompt_end): a confirm, select, input, editor or custom prompt.
7
+ * `kind` and `title` are the innermost open dialog's; `since` is when the
8
+ * first one opened (ms epoch).
9
+ */
10
+ type CtlBlocked = {
11
+ kind: string;
12
+ title?: string;
13
+ since: number;
14
+ };
4
15
  /** Session commands the `command` op runs: `/new`, `/reload`, `/compact`. */
5
16
  declare const CTL_COMMANDS: readonly ["new", "reload", "compact"];
6
17
  type CtlCommandName = (typeof CTL_COMMANDS)[number];
@@ -22,6 +33,8 @@ interface StateReading {
22
33
  pending?: boolean;
23
34
  /** ctl only: pi's settled-run count (`mu agent wait --after-runs`). */
24
35
  runs?: number;
36
+ /** ctl only: the extension dialog pi is waiting on (state needs_permission). */
37
+ blocked?: CtlBlocked;
25
38
  }
26
39
  interface StateAgentRef {
27
40
  name: string;
@@ -30,8 +43,9 @@ interface StateAgentRef {
30
43
  /** When set and it names pi, the control socket is the state source. */
31
44
  cli?: string;
32
45
  }
33
- /** ctl's idle maps to needs_input, the same as murmur's idle. */
34
- declare function ctlRuntimeState(state: CtlState): RuntimeState;
46
+ /** ctl's idle maps to needs_input, the same as murmur's idle; an open
47
+ * extension dialog (`blocked`) maps to needs_permission. */
48
+ declare function ctlRuntimeState(state: CtlState, blocked?: CtlBlocked): RuntimeState;
35
49
  declare const UNKNOWN_REASON: {
36
50
  readonly murmurMissing: "murmur not installed";
37
51
  readonly extensionMissing: "murmur pi extension not linked";
@@ -466,9 +480,14 @@ interface MuxBackend {
466
480
  listPanesInSession(session: string): Promise<MuxPane[]>;
467
481
  splitWindow(opts: SplitWindowOptions): Promise<string>;
468
482
  killPane(paneId: string): Promise<void>;
483
+ /** False only when the mux reports the pane (or server) gone; throws
484
+ * when the probe itself fails, so liveness gates fail closed. */
469
485
  paneExists(paneId: string): Promise<boolean>;
470
486
  paneTTY(paneId: string): Promise<string>;
471
487
  setPaneTitle(paneId: string, title: string): Promise<void>;
488
+ /** Stop the pane's program from retitling it (tmux `allow-set-title off`;
489
+ * pi emits OSC "π - <cwd>"). No-op where the backend has no equivalent. */
490
+ lockPaneTitle(paneId: string): Promise<void>;
472
491
  getPaneTitle(paneId: string): Promise<string | undefined>;
473
492
  currentAgentName(): Promise<string | undefined>;
474
493
  /** Name of the session the CALLER is running inside, or undefined
@@ -672,7 +691,7 @@ type HerdrExecutor = (args: readonly string[]) => Promise<HerdrExecResult>;
672
691
  * Required: the fast test tier may not shell out.
673
692
  */
674
693
  declare function setHerdrExecutor(executor: HerdrExecutor): HerdrExecutor;
675
- /** Restore the real (execa-backed) executor. */
694
+ /** Restore the real (child_process-backed) executor. */
676
695
  declare function resetHerdrExecutor(): void;
677
696
  /**
678
697
  * True iff a `herdr status` payload describes a server mu can drive.
@@ -753,7 +772,7 @@ type TmuxExecutor = (args: readonly string[]) => Promise<TmuxExecResult>;
753
772
  * tests can restore it cleanly. Production code should never call this.
754
773
  */
755
774
  declare function setTmuxExecutor(executor: TmuxExecutor): TmuxExecutor;
756
- /** Restore the real (execa-backed) executor. */
775
+ /** Restore the real (child_process-backed) executor. */
757
776
  declare function resetTmuxExecutor(): void;
758
777
  /**
759
778
  * Run an arbitrary tmux command. The single point of contact with the
@@ -837,6 +856,8 @@ declare function splitWindow(opts: SplitWindowOptions): Promise<string>;
837
856
  declare function killPane(paneId: string): Promise<void>;
838
857
  declare function paneExists(paneId: string): Promise<boolean>;
839
858
  declare function setPaneTitle(paneId: string, title: string): Promise<void>;
859
+ /** Pane-scoped `allow-set-title off`: OSC title escapes from the app no longer overwrite the mu title. */
860
+ declare function lockPaneTitle(paneId: string): Promise<void>;
840
861
  /**
841
862
  * Look up the window id (e.g. `@42`) that contains a given pane id
842
863
  * (e.g. `%15`). Used by spawn so we can apply window-scoped options
@@ -1203,6 +1224,14 @@ type InterruptResult = {
1203
1224
  declare function interruptAgent(db: Db, name: string, text: string, opts: AbortAgentOptions): Promise<InterruptResult>;
1204
1225
 
1205
1226
  type VcsBackendName = "jj" | "sl" | "git" | "none";
1227
+ /** Out-parameter for `detect()`: set `failed` when a root probe could not
1228
+ * answer (spawn error, signal, timeout) as opposed to cleanly saying "not
1229
+ * this VCS". A caller that caches the detected backend must not cache
1230
+ * when `failed` is set: the probe may have hidden a higher-precedence
1231
+ * backend. */
1232
+ interface ProbeReport {
1233
+ failed: boolean;
1234
+ }
1206
1235
  interface RebaseResult {
1207
1236
  /** The ref the workspace was actually rebased onto (resolved
1208
1237
  * symbolic-or-revset → concrete name). For git that is the
@@ -1340,8 +1369,9 @@ interface VcsBackend {
1340
1369
  readonly name: VcsBackendName;
1341
1370
  /** True iff this backend should handle `projectRoot`. Implementations
1342
1371
  * check for the relevant marker dir (`.jj`, `.sl`, `.git`); `none`
1343
- * always returns true and is consulted last. */
1344
- detect(projectRoot: string): Promise<boolean>;
1372
+ * always returns true and is consulted last. `report.failed` is set
1373
+ * when a root probe was indeterminate (see `ProbeReport`). */
1374
+ detect(projectRoot: string, report?: ProbeReport): Promise<boolean>;
1345
1375
  createWorkspace(opts: CreateWorkspaceOptions$1): Promise<CreateWorkspaceResult>;
1346
1376
  freeWorkspace(opts: FreeWorkspaceOptions$1): Promise<FreeWorkspaceResult$1>;
1347
1377
  /**
@@ -1477,7 +1507,7 @@ declare const slBackend: VcsBackend;
1477
1507
  /** Return the backend that should handle projectRoot. Walks BACKENDS
1478
1508
  * in precedence order; never returns undefined because noneBackend
1479
1509
  * always claims. */
1480
- declare function detectBackend(projectRoot: string): Promise<VcsBackend>;
1510
+ declare function detectBackend(projectRoot: string, report?: ProbeReport): Promise<VcsBackend>;
1481
1511
  /** Look up a backend by name. Throws on unknown name. Used by
1482
1512
  * `mu agent spawn --workspace-backend ...` to honour an explicit
1483
1513
  * override. */
@@ -1584,6 +1614,8 @@ type SpawnCtl = "ok" | "missing" | "refused" | "skipped";
1584
1614
  type SpawnedAgent = AgentRow & {
1585
1615
  ctl: SpawnCtl;
1586
1616
  ctlSocket: string;
1617
+ /** Set when the startup scan saw a Claude trust dialog parked in the pane. */
1618
+ trustDialog?: true;
1587
1619
  };
1588
1620
  /**
1589
1621
  * Spawn a new agent in its tmux pane and register it in the DB.
@@ -1901,6 +1933,20 @@ declare class AgentCtlUnreachableError extends Error implements HasNextSteps {
1901
1933
  constructor(agentName: string, workstream: string, socket: string, kind: "missing" | "refused");
1902
1934
  errorNextSteps(): NextStep[];
1903
1935
  }
1936
+ /**
1937
+ * A side-effecting ctl request (send, fresh, interrupt, command) was
1938
+ * written to a live agent's socket, then no reply arrived (timeout or
1939
+ * close). pi may have queued the prompt, so a blind resend can duplicate it.
1940
+ */
1941
+ declare class AgentSendIndeterminateError extends Error implements HasNextSteps {
1942
+ readonly agentName: string;
1943
+ readonly workstream: string;
1944
+ readonly op: string;
1945
+ readonly reason: string;
1946
+ readonly name = "AgentSendIndeterminateError";
1947
+ constructor(agentName: string, workstream: string, op: string, reason: string);
1948
+ errorNextSteps(): NextStep[];
1949
+ }
1904
1950
  /**
1905
1951
  * A ctl verb (send, abort, ...) found the agent's control socket silent
1906
1952
  * AND its pane gone: the process exited (or the pane was closed behind
@@ -1984,6 +2030,21 @@ declare class AgentBusyError extends Error implements HasNextSteps {
1984
2030
  command?: string | undefined);
1985
2031
  errorNextSteps(): NextStep[];
1986
2032
  }
2033
+ /**
2034
+ * `mu workspace free` refused: the owning agent is mid-turn, waiting on
2035
+ * a permission, or unreadable with a live pane. Freeing would pull the
2036
+ * checkout out from under it. CLI-only guard; `agent close` and spawn
2037
+ * rollback call the SDK directly and are unaffected.
2038
+ */
2039
+ declare class WorkspaceOwnerBusyError extends Error implements HasNextSteps {
2040
+ readonly agentName: string;
2041
+ readonly workstream: string;
2042
+ readonly state: string;
2043
+ readonly detail?: string | undefined;
2044
+ readonly name = "WorkspaceOwnerBusyError";
2045
+ constructor(agentName: string, workstream: string, state: string, detail?: string | undefined);
2046
+ errorNextSteps(): NextStep[];
2047
+ }
1987
2048
  /**
1988
2049
  * A slash command other than `/new`, `/reload`, `/compact` sent to a pi
1989
2050
  * agent. The control socket cannot run it (pi.sendUserMessage would
@@ -1999,6 +2060,18 @@ declare class AgentSlashCommandUnsupportedError extends Error implements HasNext
1999
2060
  constructor(agentName: string, workstream: string, text: string, supported: readonly string[]);
2000
2061
  errorNextSteps(): NextStep[];
2001
2062
  }
2063
+ /**
2064
+ * An empty message sent to a pi agent over the control socket.
2065
+ * pi.sendUserMessage("") is meaningless; a bare Enter is a pane
2066
+ * keystroke, so `--via mux` is the explicit way to press it.
2067
+ */
2068
+ declare class AgentEmptySendError extends Error implements HasNextSteps {
2069
+ readonly agentName: string;
2070
+ readonly workstream: string;
2071
+ readonly name = "AgentEmptySendError";
2072
+ constructor(agentName: string, workstream: string);
2073
+ errorNextSteps(): NextStep[];
2074
+ }
2002
2075
 
2003
2076
  /** The signal set kick supports. SIGINT is graceful (matches Ctrl-C
2004
2077
  * semantics — what the operator probably wanted in the first place);
@@ -2231,7 +2304,9 @@ declare function refreshAgentTitle(db: Db, agentName: string, workstream: string
2231
2304
  * crashed (or was explicitly closed mid-task) leaves the task graph
2232
2305
  * in a wrong state — IN_PROGRESS forever, with no owner to release.
2233
2306
  */
2234
- declare function deleteAgent(db: Db, name: string, workstream: string): boolean;
2307
+ declare function deleteAgent(db: Db, name: string, workstream: string,
2308
+ /** When set, delete only if the row still has this pane id (checked inside the reaper transaction). */
2309
+ expectedPaneId?: string): boolean;
2235
2310
  declare function isValidAgentName(name: string): boolean;
2236
2311
  /**
2237
2312
  * Send text to an agent and submit it. A pi agent gets it through its
@@ -2878,222 +2953,6 @@ interface TaskNoteRow {
2878
2953
  createdAt: string;
2879
2954
  }
2880
2955
 
2881
- interface TaskEdges {
2882
- /** Tasks that must close before this one can start (blockers). */
2883
- blockers: string[];
2884
- /** Tasks that this one blocks (dependents). */
2885
- dependents: string[];
2886
- }
2887
- /** One end of an edge with the neighbour's current status attached.
2888
- * Used by `mu task show` to group blockers/dependents into
2889
- * "still gating" vs "satisfied" buckets without making the renderer
2890
- * do a second round-trip to the DB per neighbour. */
2891
- interface TaskEdgeWithStatus {
2892
- name: string;
2893
- status: TaskStatus;
2894
- substate: TaskSubstate;
2895
- }
2896
- interface TaskEdgesWithStatus {
2897
- /** Tasks that must close before this one can start (blockers),
2898
- * carrying each blocker's current status. */
2899
- blockers: TaskEdgeWithStatus[];
2900
- /** Tasks that this one blocks (dependents), carrying each
2901
- * dependent's current status. */
2902
- dependents: TaskEdgeWithStatus[];
2903
- }
2904
- /**
2905
- * Direct (one-hop) edges for a task. For transitive prerequisites, use
2906
- * `getPrerequisites()`; this helper is the immediate-neighbour view used
2907
- * by `mu task show`.
2908
- */
2909
- declare function getTaskEdges(db: Db, taskLocalId: string, workstream: string): TaskEdges;
2910
- /**
2911
- * Same one-hop edge view as `getTaskEdges`, but each neighbour is
2912
- * returned as `{ name, status }` so callers can group / colour by
2913
- * status without an N+1 round-trip. Used by `mu task show` to split
2914
- * "blocked by" (still-gating) from "satisfied" (already-CLOSED)
2915
- * blockers, and the symmetric split on the dependents side
2916
- * (task_show_blocked_by_renders_closed). OPEN and IN_PROGRESS stay in
2917
- * the still-gating bucket; CLOSED is satisfied.
2918
- */
2919
- declare function getTaskEdgesWithStatus(db: Db, taskLocalId: string, workstream: string): TaskEdgesWithStatus;
2920
- /**
2921
- * All tasks transitively reachable from `taskId` via reverse-edge
2922
- * traversal (i.e. the set of tasks that block this one), including the
2923
- * task itself.
2924
- */
2925
- declare function getPrerequisites(db: Db, taskLocalId: string, workstream: string): Set<string>;
2926
- interface BlockEdgeResult {
2927
- /** True iff a row was actually inserted (vs. already present). */
2928
- added: boolean;
2929
- }
2930
- /**
2931
- * Add the edge `blocker → blocked` ('blocker blocks blocked').
2932
- * Idempotent (existing edge → `added: false`). Validates:
2933
- *
2934
- * - both tasks exist
2935
- * - same workstream (cross-workstream edges forbidden)
2936
- * - no cycle (the new edge wouldn't form a path blocked → ... → blocker)
2937
- * - blocker ≠ blocked (no self-reference)
2938
- */
2939
- declare function addBlockEdge(db: Db, workstream: string, blocked: string, blocker: string): BlockEdgeResult;
2940
- interface RemoveBlockEdgeResult {
2941
- /** True iff a row was actually deleted (vs. no such edge). */
2942
- removed: boolean;
2943
- }
2944
- /**
2945
- * Remove the edge `blocker → blocked`. Idempotent (no edge →
2946
- * `removed: false`). Does NOT validate task existence — if the
2947
- * edge is gone there's nothing to do, regardless of whether the
2948
- * tasks are gone too.
2949
- */
2950
- declare function removeBlockEdge(db: Db, workstream: string, blocked: string, blocker: string): RemoveBlockEdgeResult;
2951
- interface ReparentTaskResult {
2952
- /** Edges removed (i.e. all incoming `to_task = taskId` edges). */
2953
- removedEdges: number;
2954
- /** Edges added (after duplicate blockers are canonicalised). */
2955
- addedEdges: number;
2956
- }
2957
- /**
2958
- * Atomically replace every incoming edge of `taskId` with new ones
2959
- * `blocker[i] → taskId`. Pass an empty `blockers` array to clear all
2960
- * incoming edges (the task becomes ready iff its status allows).
2961
- *
2962
- * Validates ALL new blockers up-front (existence + same workstream +
2963
- * cycle check); if any fails, no DELETE happens — the call is fully
2964
- * atomic via a single transaction.
2965
- *
2966
- * Cycle reasoning: removing the existing incoming edges to `taskId`
2967
- * doesn't change `taskId`'s OUTGOING reachability, so
2968
- * `wouldCreateCycle(db, blocker, taskId)` evaluated against the
2969
- * pre-state gives the right answer for each new edge.
2970
- */
2971
- declare function reparentTask(db: Db, taskLocalId: string, blockers: readonly string[], scope: {
2972
- workstream: string;
2973
- }): ReparentTaskResult;
2974
-
2975
- interface AddTaskOptions {
2976
- localId: string;
2977
- workstream: string;
2978
- title: string;
2979
- /** 1..100; enforced by schema CHECK. */
2980
- impact: number;
2981
- /** > 0; enforced by schema CHECK. */
2982
- effortDays: number;
2983
- /**
2984
- * Tasks that block this one. Edges inserted as `blocker -> newTask`.
2985
- * Each blocker must already exist AND share this task's workstream
2986
- * (cross-workstream edges are forbidden); cycle check guards each
2987
- * edge. The CLI surfaces this as `--blocked-by`; the SDK key matches.
2988
- */
2989
- blockedBy?: string[];
2990
- /** Start as OPEN/triage (a proposal, e.g. a review finding) instead of OPEN/todo. */
2991
- triage?: boolean;
2992
- }
2993
- /**
2994
- * Atomically create a task and (optionally) its incoming blocked-by
2995
- * edges.
2996
- *
2997
- * The task insert + every edge insert + cycle check happen inside one
2998
- * SQLite transaction. If any blocker is missing or any edge would
2999
- * create a cycle, the entire add rolls back.
3000
- *
3001
- * Cycle check for `addTask` is structurally trivial (a fresh task has
3002
- * no outgoing edges, so `to -> ... -> from` is impossible). It's still
3003
- * called here so the same primitive is exercised by tests.
3004
- */
3005
- declare function addTask(db: Db, opts: AddTaskOptions): TaskRow;
3006
- interface AddNoteOptions {
3007
- /** Free-form author label. Convention: agent name, "user", or "orchestrator". */
3008
- author?: string;
3009
- /** Workstream context (operator-facing name). v5: tasks.local_id is
3010
- * per-workstream unique, so this is required to disambiguate. */
3011
- workstream: string;
3012
- }
3013
- declare function addNote(db: Db, taskLocalId: string, content: string, opts: AddNoteOptions): {
3014
- author: string | null;
3015
- content: string;
3016
- createdAt: string;
3017
- };
3018
- interface DeleteTaskResult {
3019
- /** True iff the row existed and was deleted. False on a dry-run
3020
- * (preview) AND on the idempotent missing-row case. */
3021
- deleted: boolean;
3022
- /** Number of `task_edges` rows cascaded out (informational). On a
3023
- * dry-run, this is the would-be count. */
3024
- deletedEdges: number;
3025
- /** Number of `task_notes` rows cascaded out (informational). On a
3026
- * dry-run, this is the would-be count. */
3027
- deletedNotes: number;
3028
- /** True iff this was a dry-run (`opts.dryRun: true`). On a
3029
- * dry-run `deleted` is false and the counts are the would-be
3030
- * counts; the DB is unchanged. Always false on a commit / on a
3031
- * missing-row idempotent no-op. */
3032
- dryRun: boolean;
3033
- /** True iff a matching task row was found at the time of the
3034
- * call. Discriminator for the CLI: a dry-run that found nothing
3035
- * (`present: false`) renders differently from a dry-run that
3036
- * found an existing task with zero edges and zero notes
3037
- * (`present: true, deletedEdges: 0, deletedNotes: 0`). */
3038
- present: boolean;
3039
- /** The op group the delete wrote, for `mu undo <group> --yes`. Null
3040
- * when nothing was deleted (dry-run or missing row). */
3041
- group: string | null;
3042
- }
3043
- interface DeleteTaskOptions {
3044
- /** When true, return the cascade preview (would-be edge / note
3045
- * counts) without mutating. The CLI uses this to power the bare
3046
- * `mu task delete <id>` two-phase pattern (mirrors
3047
- * `mu workstream teardown` / `mu undo`). Surfaced
3048
- * by feedback ws task
3049
- * fb_task_delete_no_yes (impact=30): a dogfood report typed
3050
- * `mu task delete X --yes` (mirroring workstream teardown) and got
3051
- * 'unknown option --yes' — the verb took no confirmation flag at
3052
- * all. Two failed deletes left long-named tasks lingering. */
3053
- dryRun?: boolean;
3054
- }
3055
- /**
3056
- * Delete a task. FK CASCADE on `task_edges` (from + to) and
3057
- * `task_notes` cleans the joined rows automatically. Idempotent on
3058
- * a missing task (returns `deleted: false`).
3059
- *
3060
- * Pre-counts the cascade victims for reporting because SQLite's
3061
- * `changes()` only reports rows directly affected by the DELETE.
3062
- *
3063
- * With `opts.dryRun: true`, returns the would-be counts without
3064
- * touching the DB (no mutation, so no op is written). The CLI bare
3065
- * `mu task delete <id>` form uses this; `--yes` calls through with
3066
- * `dryRun: false`.
3067
- */
3068
- declare function deleteTask(db: Db, localId: string, workstream: string, opts?: DeleteTaskOptions): DeleteTaskResult;
3069
- interface UpdateTaskOptions {
3070
- title?: string;
3071
- /** 1..100; enforced by schema CHECK. */
3072
- impact?: number;
3073
- /** > 0; enforced by schema CHECK. */
3074
- effortDays?: number;
3075
- }
3076
- interface UpdateTaskResult {
3077
- /** True iff at least one field actually changed. */
3078
- updated: boolean;
3079
- /** The fields whose values differ post-update (in `UpdateTaskOptions`'s
3080
- * camelCase shape). Empty when `updated: false`. */
3081
- changedFields: string[];
3082
- }
3083
- /**
3084
- * Update scalar fields on a task. Each option is independently optional;
3085
- * passing none is a typed no-op (returns `updated: false, changedFields: []`).
3086
- * Fields whose new value equals the current value are skipped (no row change).
3087
- *
3088
- * NOT for status (use `closeTask` / `openTask` / `setTaskStatus`), owner
3089
- * (use `claimTask` / `releaseTask`), local_id (rename is deferred), or
3090
- * workstream (cross-workstream moves are deferred).
3091
- */
3092
- interface UpdateTaskScopeOption {
3093
- workstream: string;
3094
- }
3095
- declare function updateTask(db: Db, localId: string, opts: UpdateTaskOptions, scope: UpdateTaskScopeOption): UpdateTaskResult;
3096
-
3097
2956
  declare const WORKSPACE_STALE_THRESHOLD = 10;
3098
2957
  declare function isWorkspaceStale(behind: number | null | undefined): boolean;
3099
2958
 
@@ -3370,8 +3229,13 @@ declare class TaskClaimStaleWorkspaceError extends Error implements HasNextSteps
3370
3229
  declare class CycleError extends Error implements HasNextSteps {
3371
3230
  readonly from: string;
3372
3231
  readonly to: string;
3232
+ /** Existing path `to -> … -> from` (task names) that the new edge would close. */
3233
+ readonly path: readonly string[];
3234
+ readonly workstream?: string | undefined;
3373
3235
  readonly name = "CycleError";
3374
- constructor(from: string, to: string);
3236
+ constructor(from: string, to: string,
3237
+ /** Existing path `to -> … -> from` (task names) that the new edge would close. */
3238
+ path?: readonly string[], workstream?: string | undefined);
3375
3239
  errorNextSteps(): NextStep[];
3376
3240
  }
3377
3241
  /**
@@ -3504,6 +3368,222 @@ declare class InvalidSubstateError extends Error implements HasNextSteps {
3504
3368
  errorNextSteps(): NextStep[];
3505
3369
  }
3506
3370
 
3371
+ interface TaskEdges {
3372
+ /** Tasks that must close before this one can start (blockers). */
3373
+ blockers: string[];
3374
+ /** Tasks that this one blocks (dependents). */
3375
+ dependents: string[];
3376
+ }
3377
+ /** One end of an edge with the neighbour's current status attached.
3378
+ * Used by `mu task show` to group blockers/dependents into
3379
+ * "still gating" vs "satisfied" buckets without making the renderer
3380
+ * do a second round-trip to the DB per neighbour. */
3381
+ interface TaskEdgeWithStatus {
3382
+ name: string;
3383
+ status: TaskStatus;
3384
+ substate: TaskSubstate;
3385
+ }
3386
+ interface TaskEdgesWithStatus {
3387
+ /** Tasks that must close before this one can start (blockers),
3388
+ * carrying each blocker's current status. */
3389
+ blockers: TaskEdgeWithStatus[];
3390
+ /** Tasks that this one blocks (dependents), carrying each
3391
+ * dependent's current status. */
3392
+ dependents: TaskEdgeWithStatus[];
3393
+ }
3394
+ /**
3395
+ * Direct (one-hop) edges for a task. For transitive prerequisites, use
3396
+ * `getPrerequisites()`; this helper is the immediate-neighbour view used
3397
+ * by `mu task show`.
3398
+ */
3399
+ declare function getTaskEdges(db: Db, taskLocalId: string, workstream: string): TaskEdges;
3400
+ /**
3401
+ * Same one-hop edge view as `getTaskEdges`, but each neighbour is
3402
+ * returned as `{ name, status }` so callers can group / colour by
3403
+ * status without an N+1 round-trip. Used by `mu task show` to split
3404
+ * "blocked by" (still-gating) from "satisfied" (already-CLOSED)
3405
+ * blockers, and the symmetric split on the dependents side
3406
+ * (task_show_blocked_by_renders_closed). OPEN and IN_PROGRESS stay in
3407
+ * the still-gating bucket; CLOSED is satisfied.
3408
+ */
3409
+ declare function getTaskEdgesWithStatus(db: Db, taskLocalId: string, workstream: string): TaskEdgesWithStatus;
3410
+ /**
3411
+ * All tasks transitively reachable from `taskId` via reverse-edge
3412
+ * traversal (i.e. the set of tasks that block this one), including the
3413
+ * task itself.
3414
+ */
3415
+ declare function getPrerequisites(db: Db, taskLocalId: string, workstream: string): Set<string>;
3416
+ interface BlockEdgeResult {
3417
+ /** True iff a row was actually inserted (vs. already present). */
3418
+ added: boolean;
3419
+ }
3420
+ /**
3421
+ * Add the edge `blocker → blocked` ('blocker blocks blocked').
3422
+ * Idempotent (existing edge → `added: false`). Validates:
3423
+ *
3424
+ * - both tasks exist
3425
+ * - same workstream (cross-workstream edges forbidden)
3426
+ * - no cycle (the new edge wouldn't form a path blocked → ... → blocker)
3427
+ * - blocker ≠ blocked (no self-reference)
3428
+ */
3429
+ declare function addBlockEdge(db: Db, workstream: string, blocked: string, blocker: string): BlockEdgeResult;
3430
+ interface RemoveBlockEdgeResult {
3431
+ /** True iff a row was actually deleted (vs. no such edge). */
3432
+ removed: boolean;
3433
+ }
3434
+ /**
3435
+ * Remove the edge `blocker → blocked`. Idempotent (no edge →
3436
+ * `removed: false`). Does NOT validate task existence — if the
3437
+ * edge is gone there's nothing to do, regardless of whether the
3438
+ * tasks are gone too.
3439
+ */
3440
+ declare function removeBlockEdge(db: Db, workstream: string, blocked: string, blocker: string): RemoveBlockEdgeResult;
3441
+ interface ReparentTaskResult {
3442
+ /** Edges removed (i.e. all incoming `to_task = taskId` edges). */
3443
+ removedEdges: number;
3444
+ /** Edges added (after duplicate blockers are canonicalised). */
3445
+ addedEdges: number;
3446
+ }
3447
+ /**
3448
+ * Atomically replace every incoming edge of `taskId` with new ones
3449
+ * `blocker[i] → taskId`. Pass an empty `blockers` array to clear all
3450
+ * incoming edges (the task becomes ready iff its status allows).
3451
+ *
3452
+ * Validates ALL new blockers up-front (existence + same workstream +
3453
+ * cycle check); if any fails, no DELETE happens — the call is fully
3454
+ * atomic via a single transaction.
3455
+ *
3456
+ * Cycle reasoning: removing the existing incoming edges to `taskId`
3457
+ * doesn't change `taskId`'s OUTGOING reachability, so
3458
+ * `wouldCreateCycle(db, blocker, taskId)` evaluated against the
3459
+ * pre-state gives the right answer for each new edge.
3460
+ */
3461
+ declare function reparentTask(db: Db, taskLocalId: string, blockers: readonly string[], scope: {
3462
+ workstream: string;
3463
+ }): ReparentTaskResult;
3464
+
3465
+ interface AddTaskOptions {
3466
+ localId: string;
3467
+ workstream: string;
3468
+ title: string;
3469
+ /** 1..100; enforced by schema CHECK. */
3470
+ impact: number;
3471
+ /** > 0; enforced by schema CHECK. */
3472
+ effortDays: number;
3473
+ /**
3474
+ * Tasks that block this one. Edges inserted as `blocker -> newTask`.
3475
+ * Each blocker must already exist AND share this task's workstream
3476
+ * (cross-workstream edges are forbidden); cycle check guards each
3477
+ * edge. The CLI surfaces this as `--blocked-by`; the SDK key matches.
3478
+ */
3479
+ blockedBy?: string[];
3480
+ /** Start as OPEN/triage (a proposal, e.g. a review finding) instead of OPEN/todo. */
3481
+ triage?: boolean;
3482
+ }
3483
+ /**
3484
+ * Atomically create a task and (optionally) its incoming blocked-by
3485
+ * edges.
3486
+ *
3487
+ * The task insert + every edge insert + cycle check happen inside one
3488
+ * SQLite transaction. If any blocker is missing or any edge would
3489
+ * create a cycle, the entire add rolls back.
3490
+ *
3491
+ * Cycle check for `addTask` is structurally trivial (a fresh task has
3492
+ * no outgoing edges, so `to -> ... -> from` is impossible). It's still
3493
+ * called here so the same primitive is exercised by tests.
3494
+ */
3495
+ declare function addTask(db: Db, opts: AddTaskOptions): TaskRow;
3496
+ interface AddNoteOptions {
3497
+ /** Free-form author label. Convention: agent name, "user", or "orchestrator". */
3498
+ author?: string;
3499
+ /** Workstream context (operator-facing name). v5: tasks.local_id is
3500
+ * per-workstream unique, so this is required to disambiguate. */
3501
+ workstream: string;
3502
+ }
3503
+ declare function addNote(db: Db, taskLocalId: string, content: string, opts: AddNoteOptions): {
3504
+ author: string | null;
3505
+ content: string;
3506
+ createdAt: string;
3507
+ };
3508
+ interface DeleteTaskResult {
3509
+ /** True iff the row existed and was deleted. False on a dry-run
3510
+ * (preview) AND on the idempotent missing-row case. */
3511
+ deleted: boolean;
3512
+ /** Number of `task_edges` rows cascaded out (informational). On a
3513
+ * dry-run, this is the would-be count. */
3514
+ deletedEdges: number;
3515
+ /** Number of `task_notes` rows cascaded out (informational). On a
3516
+ * dry-run, this is the would-be count. */
3517
+ deletedNotes: number;
3518
+ /** True iff this was a dry-run (`opts.dryRun: true`). On a
3519
+ * dry-run `deleted` is false and the counts are the would-be
3520
+ * counts; the DB is unchanged. Always false on a commit / on a
3521
+ * missing-row idempotent no-op. */
3522
+ dryRun: boolean;
3523
+ /** True iff a matching task row was found at the time of the
3524
+ * call. Discriminator for the CLI: a dry-run that found nothing
3525
+ * (`present: false`) renders differently from a dry-run that
3526
+ * found an existing task with zero edges and zero notes
3527
+ * (`present: true, deletedEdges: 0, deletedNotes: 0`). */
3528
+ present: boolean;
3529
+ /** The op group the delete wrote, for `mu undo <group> --yes`. Null
3530
+ * when nothing was deleted (dry-run or missing row). */
3531
+ group: string | null;
3532
+ }
3533
+ interface DeleteTaskOptions {
3534
+ /** When true, return the cascade preview (would-be edge / note
3535
+ * counts) without mutating. The CLI uses this to power the bare
3536
+ * `mu task delete <id>` two-phase pattern (mirrors
3537
+ * `mu workstream teardown` / `mu undo`). Surfaced
3538
+ * by feedback ws task
3539
+ * fb_task_delete_no_yes (impact=30): a dogfood report typed
3540
+ * `mu task delete X --yes` (mirroring workstream teardown) and got
3541
+ * 'unknown option --yes' — the verb took no confirmation flag at
3542
+ * all. Two failed deletes left long-named tasks lingering. */
3543
+ dryRun?: boolean;
3544
+ }
3545
+ /**
3546
+ * Delete a task. FK CASCADE on `task_edges` (from + to) and
3547
+ * `task_notes` cleans the joined rows automatically. Idempotent on
3548
+ * a missing task (returns `deleted: false`).
3549
+ *
3550
+ * Pre-counts the cascade victims for reporting because SQLite's
3551
+ * `changes()` only reports rows directly affected by the DELETE.
3552
+ *
3553
+ * With `opts.dryRun: true`, returns the would-be counts without
3554
+ * touching the DB (no mutation, so no op is written). The CLI bare
3555
+ * `mu task delete <id>` form uses this; `--yes` calls through with
3556
+ * `dryRun: false`.
3557
+ */
3558
+ declare function deleteTask(db: Db, localId: string, workstream: string, opts?: DeleteTaskOptions): DeleteTaskResult;
3559
+ interface UpdateTaskOptions {
3560
+ title?: string;
3561
+ /** 1..100; enforced by schema CHECK. */
3562
+ impact?: number;
3563
+ /** > 0; enforced by schema CHECK. */
3564
+ effortDays?: number;
3565
+ }
3566
+ interface UpdateTaskResult {
3567
+ /** True iff at least one field actually changed. */
3568
+ updated: boolean;
3569
+ /** The fields whose values differ post-update (in `UpdateTaskOptions`'s
3570
+ * camelCase shape). Empty when `updated: false`. */
3571
+ changedFields: string[];
3572
+ }
3573
+ /**
3574
+ * Update scalar fields on a task. Each option is independently optional;
3575
+ * passing none is a typed no-op (returns `updated: false, changedFields: []`).
3576
+ * Fields whose new value equals the current value are skipped (no row change).
3577
+ *
3578
+ * NOT for status (use `closeTask` / `openTask` / `setTaskStatus`), owner
3579
+ * (use `claimTask` / `releaseTask`), local_id (rename is deferred), or
3580
+ * workstream (cross-workstream moves are deferred).
3581
+ */
3582
+ interface UpdateTaskScopeOption {
3583
+ workstream: string;
3584
+ }
3585
+ declare function updateTask(db: Db, localId: string, opts: UpdateTaskOptions, scope: UpdateTaskScopeOption): UpdateTaskResult;
3586
+
3507
3587
  /** Thrown when a title has no ASCII letter or digit, so no id can be
3508
3588
  * derived from it (any non-ASCII script, or pure punctuation). Exit 2
3509
3589
  * (usage) with the verb's --help; the fix is the `<id>` positional.
@@ -4056,7 +4136,7 @@ declare function emitEvent(db: Db, workstream: string | null, intent: LocalInten
4056
4136
  * `string` so a typo is a compile error and the set stays auditable —
4057
4137
  * `mu log`'s formatter (v2-log-verb) switches on exactly these.
4058
4138
  */
4059
- type LocalIntent = "agent.spawn" | "agent.close" | "agent.adopt" | "agent.kick" | "agent.send" | "agent.stall" | "workspace.create" | "workspace.free" | "workspace.refresh";
4139
+ type LocalIntent = "agent.spawn" | "agent.spawn_failed" | "agent.close" | "agent.adopt" | "agent.kick" | "agent.send" | "agent.abort" | "agent.stall" | "workspace.create" | "workspace.free" | "workspace.refresh";
4060
4140
 
4061
4141
  interface Track {
4062
4142
  /** Goal tasks (no outgoing edges) belonging to this track. */
@@ -5386,6 +5466,7 @@ declare const tmux_listPanes: typeof listPanes;
5386
5466
  declare const tmux_listPanesInSession: typeof listPanesInSession;
5387
5467
  declare const tmux_listSessions: typeof listSessions;
5388
5468
  declare const tmux_listWindows: typeof listWindows;
5469
+ declare const tmux_lockPaneTitle: typeof lockPaneTitle;
5389
5470
  declare const tmux_newSession: typeof newSession;
5390
5471
  declare const tmux_newSessionWithPane: typeof newSessionWithPane;
5391
5472
  declare const tmux_newWindow: typeof newWindow;
@@ -5405,7 +5486,7 @@ declare const tmux_sleep: typeof sleep;
5405
5486
  declare const tmux_splitWindow: typeof splitWindow;
5406
5487
  declare const tmux_tmuxBackend: typeof tmuxBackend;
5407
5488
  declare namespace tmux {
5408
- export { type tmux_AttachTarget as AttachTarget, type tmux_CaptureOptions as CaptureOptions, type tmux_MuxCommand as MuxCommand, tmux_MuxError as MuxError, type tmux_MuxHealth as MuxHealth, type tmux_NewSessionOptions as NewSessionOptions, type tmux_NewSessionWithPaneOptions as NewSessionWithPaneOptions, type tmux_NewWindowOptions as NewWindowOptions, tmux_PANE_ID_RE as PANE_ID_RE, tmux_PaneNotFoundError as PaneNotFoundError, type tmux_SendOptions as SendOptions, type tmux_SendWarning as SendWarning, type tmux_SplitWindowOptions as SplitWindowOptions, type tmux_TmuxBackend as TmuxBackend, tmux_TmuxError as TmuxError, type tmux_TmuxExecResult as TmuxExecResult, type tmux_TmuxExecutor as TmuxExecutor, type tmux_TmuxPane as TmuxPane, type tmux_TmuxSession as TmuxSession, type tmux_TmuxWindow as TmuxWindow, tmux_assertValidPaneId as assertValidPaneId, tmux_attachCommands as attachCommands, tmux_attachHint as attachHint, tmux_awaitPaneQuiescence as awaitPaneQuiescence, tmux_capturePane as capturePane, tmux_currentAgentName as currentAgentName, tmux_currentPaneTitle as currentPaneTitle, tmux_currentSessionName as currentSessionName, tmux_defaultSendDelayMs as defaultSendDelayMs, tmux_defaultSendReadinessMs as defaultSendReadinessMs, tmux_enableMuPaneBorders as enableMuPaneBorders, tmux_enableMuPaneBordersForPane as enableMuPaneBordersForPane, tmux_enableMuPaneBordersForSession as enableMuPaneBordersForSession, tmux_getPaneTitle as getPaneTitle, tmux_getWindowIdForPane as getWindowIdForPane, tmux_hasWorkMarker as hasWorkMarker, tmux_healthCheck as healthCheck, tmux_isValidPaneId as isValidPaneId, tmux_killPane as killPane, tmux_killSession as killSession, tmux_listPanes as listPanes, tmux_listPanesInSession as listPanesInSession, tmux_listSessions as listSessions, tmux_listWindows as listWindows, tmux_newSession as newSession, tmux_newSessionWithPane as newSessionWithPane, tmux_newWindow as newWindow, tmux_paneExists as paneExists, tmux_paneNotFoundNextSteps as paneNotFoundNextSteps, tmux_paneTTY as paneTTY, tmux_parseAgentNameFromTitle as parseAgentNameFromTitle, tmux_resetSleep as resetSleep, tmux_resetTmuxExecutor as resetTmuxExecutor, tmux_selectLayout as selectLayout, tmux_sendToPane as sendToPane, tmux_sessionExists as sessionExists, tmux_setPaneTitle as setPaneTitle, tmux_setSleepForTests as setSleepForTests, tmux_setTmuxExecutor as setTmuxExecutor, tmux_sleep as sleep, tmux_splitWindow as splitWindow, tmux$1 as tmux, tmux_tmuxBackend as tmuxBackend };
5489
+ export { type tmux_AttachTarget as AttachTarget, type tmux_CaptureOptions as CaptureOptions, type tmux_MuxCommand as MuxCommand, tmux_MuxError as MuxError, type tmux_MuxHealth as MuxHealth, type tmux_NewSessionOptions as NewSessionOptions, type tmux_NewSessionWithPaneOptions as NewSessionWithPaneOptions, type tmux_NewWindowOptions as NewWindowOptions, tmux_PANE_ID_RE as PANE_ID_RE, tmux_PaneNotFoundError as PaneNotFoundError, type tmux_SendOptions as SendOptions, type tmux_SendWarning as SendWarning, type tmux_SplitWindowOptions as SplitWindowOptions, type tmux_TmuxBackend as TmuxBackend, tmux_TmuxError as TmuxError, type tmux_TmuxExecResult as TmuxExecResult, type tmux_TmuxExecutor as TmuxExecutor, type tmux_TmuxPane as TmuxPane, type tmux_TmuxSession as TmuxSession, type tmux_TmuxWindow as TmuxWindow, tmux_assertValidPaneId as assertValidPaneId, tmux_attachCommands as attachCommands, tmux_attachHint as attachHint, tmux_awaitPaneQuiescence as awaitPaneQuiescence, tmux_capturePane as capturePane, tmux_currentAgentName as currentAgentName, tmux_currentPaneTitle as currentPaneTitle, tmux_currentSessionName as currentSessionName, tmux_defaultSendDelayMs as defaultSendDelayMs, tmux_defaultSendReadinessMs as defaultSendReadinessMs, tmux_enableMuPaneBorders as enableMuPaneBorders, tmux_enableMuPaneBordersForPane as enableMuPaneBordersForPane, tmux_enableMuPaneBordersForSession as enableMuPaneBordersForSession, tmux_getPaneTitle as getPaneTitle, tmux_getWindowIdForPane as getWindowIdForPane, tmux_hasWorkMarker as hasWorkMarker, tmux_healthCheck as healthCheck, tmux_isValidPaneId as isValidPaneId, tmux_killPane as killPane, tmux_killSession as killSession, tmux_listPanes as listPanes, tmux_listPanesInSession as listPanesInSession, tmux_listSessions as listSessions, tmux_listWindows as listWindows, tmux_lockPaneTitle as lockPaneTitle, tmux_newSession as newSession, tmux_newSessionWithPane as newSessionWithPane, tmux_newWindow as newWindow, tmux_paneExists as paneExists, tmux_paneNotFoundNextSteps as paneNotFoundNextSteps, tmux_paneTTY as paneTTY, tmux_parseAgentNameFromTitle as parseAgentNameFromTitle, tmux_resetSleep as resetSleep, tmux_resetTmuxExecutor as resetTmuxExecutor, tmux_selectLayout as selectLayout, tmux_sendToPane as sendToPane, tmux_sessionExists as sessionExists, tmux_setPaneTitle as setPaneTitle, tmux_setSleepForTests as setSleepForTests, tmux_setTmuxExecutor as setTmuxExecutor, tmux_sleep as sleep, tmux_splitWindow as splitWindow, tmux$1 as tmux, tmux_tmuxBackend as tmuxBackend };
5409
5490
  }
5410
5491
 
5411
5492
  /** What undoing one op will do. */
@@ -5712,4 +5793,4 @@ declare function summarizeWorkstream(db: Db, opts: WorkstreamOptions): Promise<W
5712
5793
  */
5713
5794
  declare function teardownWorkstream(db: Db, opts: TeardownWorkstreamOptions): Promise<TeardownResult>;
5714
5795
 
5715
- export { AGENT_STATE_GLYPH, type AbortAgentOptions, type AbortResult, type AddNoteOptions, type AddTaskOptions, type AdoptAgentOptions, type AdoptAgentResult, AgentAbortNeedsCtlError, AgentAbortTimeoutError, AgentBusyError, AgentCtlUnreachableError, AgentDiedOnSpawnError, AgentExistsError, AgentExtensionOutdatedError, AgentFreshNeedsCtlError, AgentNameExhaustedError, AgentNotFoundError, AgentNotInWorkstreamError, AgentPaneDeadError, type AgentRow, AgentSlashCommandUnsupportedError, AgentSpawnCliNotFoundError, AgentSpawnStartupError, type AmbientOptions, type AmbientResult, type AppendLogOptions, type ApplyResult, type BlockEdgeResult, CAPTURE_TRIGGER_DDL, CURRENT_SCHEMA_VERSION, type CaptureDb, type CaptureIntent, type CaptureOptions, type CaseCollision, type CheapDriftReport, type ClaimResult, type ClaimTaskOptions, ClaimerNotRegisteredError, type CloseAgentOptions, type CloseAgentResult, type CloseSubstate, type CloseTaskResult, type CommandResolutionResult, type CommandResolver, CrossWorkstreamEdgeError, type CtlLink, CycleError, DEFAULT_SUBSTATE, DRIFT_REPORT_CAP, type Db, type DeleteTaskResult, type DoctorCheck, type DoctorStatus, type DoctorSummary, DriftDetectedError, type DriftRecord, type DriftReport, EXPECTED_TABLES, type EvidenceOption, type FileLockOptions, type FleetHazard, type FlushResult, type FsProbe, type FullDag, GLYPH, GroupIdAmbiguousError, type GroupSummary, HazardFailError, type HazardSeverity, type Hlc, HlcOverflowError, HlcParseError, HomeDirAsProjectRootError, type IdFromTitleResult, type IngestFromDbResult, type IngestResult, type InsertAgentInput, InvalidSubstateError, type InverseOp, KNOWN_INTENTS, KNOWN_VERBS, type KickAgentOptions, type KickAgentResult, type KickProcessExecutor, type KickSignal, type KnownIntent, LinkConflictError, type LinkState, type LinkStatus, type ListLiveAgentsOptions, type ListLogsOptions, type ListNotesOptions, type ListReadyOptions, type ListTasksOptions, type LiveAgent, type LiveAgentsView, type LoadFullDagOptions, type LoadWorkstreamSnapshotOptions, type LocalIntent, type LogKind, LogKindReservedError, type LogRow, MACHINE_LOCAL_ENTITIES, MACHINE_LOCAL_TABLES, MU_SHIM_MARKER, MachineIdentityMissingError, type MachineLocalEntity, type MachineLocalLoss, type MachineLocalTable, type MuxBackend, type MuxBackendName, MuxError, type MuxPane, type MuxPaneStatus, type MuxSession, type MuxWindow, type NewSessionOptions, type NewWindowOptions, NoForegroundProcessError, NoMultiplexerError, NothingToUndoError, OP_CTX_DDL, type Op, type OpContext, OpEntityNotSyncedError, OpKeyMalformedError, type OpenDbOptions, type OwnedTasksSummary, PANE_ID_RE, PEER_SHORT_LEN, PEER_STALE_MS, PORTABLE_TABLES, PaneNotFoundError, PaneNotInSessionError, type ParkTaskOptions, type PeerSegment, type PeerStatus, type PortableTable, ReaperDetectedDuringWaitError, type RebuildOptions, type RebuildReport, RebuildTargetExistsError, RebuildTargetIsSourceError, type ReconcileMode, type ReconcileOptions, type ReconcileReport, type ReleaseResult, type ReleaseTaskOptions, type RemoveBlockEdgeResult, type RenderableOp, type RenderedOp, type ReparentTaskResult, type RoiBucket, type RuntimeState, SEGMENT_FORMAT_VERSION, SYNCED_ENTITIES, SchemaTooNewError, SchemaTooOldError, type SegmentDefect, type SegmentDefectKind, type SegmentLine, type SegmentManifest, type SendOptions, type SendResult, type SendWarning, type SetStatusOptions, type SetStatusResult, type SlugifyResult, type SpawnAgentOptions, type SplitWindowOptions, StallDetectedDuringWaitError, type StateReading, type StateSource, type StrandedWorkspaceOrphan, SubstateReasonRequiredError, type SyncPassResult, SyncPeerNotFoundError, SyncPeerRefAmbiguousError, SyncSourceNotFoundError, type SyncedEntity, TASK_STATUSES, TASK_STATUS_LIST, TASK_SUBSTATES, TASK_SUBSTATE_ROWS, TaskAlreadyOwnedError, TaskClaimStaleWorkspaceError, type TaskEdgeWithStatus, type TaskEdges, type TaskEdgesWithStatus, TaskExistsError, TaskIdInvalidError, TaskInTriageError, TaskNotFoundError, TaskNotInWorkstreamError, type TaskNoteRow, type TaskPair, TaskParkStateError, TaskParkedError, type TaskRow, type TaskStatus, type TaskSubstate, TaskTitleSlugEmptyError, type TaskWaitOptions, type TaskWaitRef, type TaskWaitResult, type TaskWaitTaskState, type TeardownResult, TmuxError, type TmuxExecResult, type TmuxExecutor, type TmuxPane, type TmuxSession, type TmuxWindow, type Track, type Transport, UNKNOWN_REASON, UndoGroupNotFoundError, type UndoOptions, type UndoPlan, type UndoResult, UndoSupersededError, type UpdateTaskOptions, type UpdateTaskResult, type VcsBackend, type VcsBackendName, WORKSPACE_STALE_THRESHOLD, WorkspaceConflictError, WorkspaceDirtyError, WorkspaceExistsError, type WorkspaceFailure, WorkspaceNotFoundError, type WorkspaceOrphan, WorkspacePathNotEmptyError, WorkspacePreservedError, type WorkspaceRow, type WorkspaceStaleness, WorkspaceVcsRequiredError, WorkstreamExistsError, WorkstreamNameInvalidError, WorkstreamNameReservedError, WorkstreamNotFoundError, type WorkstreamOptions, type WorkstreamSnapshot, type WorkstreamSnapshotSlowFields, type WorkstreamSummary, abortAgent, acceptTask, activeMux, addBlockEdge, addNote, addTask, adoptAgent, agentKey, agentStateGlyph, agentStateHistogram, ambientFlush, ambientIngest, ambientSyncPass, appendLog, applyIncomingOp, applyOp, applyOps, assertValidPaneId, awaitPaneQuiescence, backendByName, capturePane, checkCaseCollisions, checkCheapDriftInvariant, checkCommandResolvable, checkDbInsideSyncDir, checkDrift, checkFleetHazards, checkNetworkMount, claimTask, classifyFsType, closeAgent, closeTask, compareHlc, composeAgentTitle, countProblems, createWorkspace, ctlRuntimeState, currentAgentName, currentOpContext, currentPaneTitle, decorateWithDirty, decorateWithStaleness, defaultDbPath, defaultSendDelayMs, defaultSendReadinessMs, defaultSpawnLivenessMs, defaultStateDir, deleteAgent, deleteTask, detectBackend, detectMux, discoverPeers, driftRemediation, emitEvent, ensureWorkstream, envVarNameForCli, expectsCtl, findCaseCollisions, flushSegment, foregroundPgid, formatDriftRecord, formatHlc, formatPair, freeWorkspace, getAgent, getAgentByPane, getParallelTracks, getPrerequisites, getTask, getTaskEdges, getTaskEdgesWithStatus, getWaitPollCount, getWatermark, getWorkspaceForAgent, getWorkspaceStaleness, gitBackend, hasWorkMarker, idFromTitle, idFromTitleVerbose, ingestFromDb, ingestSegment, insertAgent, inspectLinks, installCapture, interruptAgent, isKickSignal, isPathInside, isTaskStatus, isValidAgentName, isValidPair, isValidPaneId, isValidTaskId, isValidWorkstreamName, isWorkspaceStale, jjBackend, kickAgent, killPane, killSession, latestSeq, linkPi, linkSkill, listAgents, listAllOrphanWorkspaces, listBlocked, listGoals, listInProgress, listLiveAgents, listLogs, listNotes, listPanes, listPanesInSession, listReady, listRecentClosed, listRecentGroups, listSessions, listTasks, listTasksByOwner, listWindows, listWorkspaceOrphans, listWorkspaces, listWorkstreams, loadDoctorChecks, loadDoctorSummary, loadFullDag, loadWorkstreamSnapshot, loadWorkstreamSnapshotFast, loadWorkstreamSnapshotSlow, localMachineId, locksDir, mapLegacyStatus, mergeSnapshotFastSlow, mostRecentGroup, murmurAvailable, mux, muxByName, newSession, newSessionWithPane, newWindow, nextHlc, noneBackend, opSubject, openDb, openTask, paneExists, paneTTY, parkTask, parseAgentNameFromTitle, parseHlc, parseOpKey, parsePsTtyOutput, peerStatuses, planUndo, priorFieldValue, probeFilesystem, readAgent, readAgentStates, readFileLockMeta, readManifest, rebuildInto, receiveHlc, reconcile, refreshAgentTitle, releaseTask, remediationParagraph, removeBlockEdge, renderForest, renderOp, renderOpLine, renderTaskTree, repairPeer, reparentTask, resetCommandResolverForTests, resetKickProcessExecutor, resetMux, resetSleep, resetTmuxExecutor, resetWaitPollCount, resetWatermark, resolveActorIdentity, resolveCliCommand, resolveCliCommandWithSource, resolveGroupId, resolvePair, resolvePeerRef, roiBucket, segmentLineCount, segmentPath, selectLayout, sendToAgent, sendToPane, sendViaTransport, sessionExists, setCommandResolverForTests, setKickProcessExecutor, setMuxForTests, setPaneTitle, setSleepForTests, setTaskStatus, setTmuxExecutor, setWaitSleepForTests, setWaitStuckWarnForTests, setWatermark, slBackend, sleep, slugifyTitle, slugifyTitleVerbose, spawnAgent, splitWindow, summarizeOwnedTasks, summarizeWorkstream, syncDir, syncEnabled, syncPass, teardownWorkstream, tmux, tmuxBackend, transportNextSteps, undoGroup, unparkTask, updateTask, verifyAgainstManifest, waitForTasks, withCaptureSuppressed, withFileLock, withOpContext, workspacePath, workspacesRoot, yankCommandForCheck };
5796
+ export { AGENT_STATE_GLYPH, type AbortAgentOptions, type AbortResult, type AddNoteOptions, type AddTaskOptions, type AdoptAgentOptions, type AdoptAgentResult, AgentAbortNeedsCtlError, AgentAbortTimeoutError, AgentBusyError, AgentCtlUnreachableError, AgentDiedOnSpawnError, AgentEmptySendError, AgentExistsError, AgentExtensionOutdatedError, AgentFreshNeedsCtlError, AgentNameExhaustedError, AgentNotFoundError, AgentNotInWorkstreamError, AgentPaneDeadError, type AgentRow, AgentSendIndeterminateError, AgentSlashCommandUnsupportedError, AgentSpawnCliNotFoundError, AgentSpawnStartupError, type AmbientOptions, type AmbientResult, type AppendLogOptions, type ApplyResult, type BlockEdgeResult, CAPTURE_TRIGGER_DDL, CURRENT_SCHEMA_VERSION, type CaptureDb, type CaptureIntent, type CaptureOptions, type CaseCollision, type CheapDriftReport, type ClaimResult, type ClaimTaskOptions, ClaimerNotRegisteredError, type CloseAgentOptions, type CloseAgentResult, type CloseSubstate, type CloseTaskResult, type CommandResolutionResult, type CommandResolver, CrossWorkstreamEdgeError, type CtlLink, CycleError, DEFAULT_SUBSTATE, DRIFT_REPORT_CAP, type Db, type DeleteTaskResult, type DoctorCheck, type DoctorStatus, type DoctorSummary, DriftDetectedError, type DriftRecord, type DriftReport, EXPECTED_TABLES, type EvidenceOption, type FileLockOptions, type FleetHazard, type FlushResult, type FsProbe, type FullDag, GLYPH, GroupIdAmbiguousError, type GroupSummary, HazardFailError, type HazardSeverity, type Hlc, HlcOverflowError, HlcParseError, HomeDirAsProjectRootError, type IdFromTitleResult, type IngestFromDbResult, type IngestResult, type InsertAgentInput, InvalidSubstateError, type InverseOp, KNOWN_INTENTS, KNOWN_VERBS, type KickAgentOptions, type KickAgentResult, type KickProcessExecutor, type KickSignal, type KnownIntent, LinkConflictError, type LinkState, type LinkStatus, type ListLiveAgentsOptions, type ListLogsOptions, type ListNotesOptions, type ListReadyOptions, type ListTasksOptions, type LiveAgent, type LiveAgentsView, type LoadFullDagOptions, type LoadWorkstreamSnapshotOptions, type LocalIntent, type LogKind, LogKindReservedError, type LogRow, MACHINE_LOCAL_ENTITIES, MACHINE_LOCAL_TABLES, MU_SHIM_MARKER, MachineIdentityMissingError, type MachineLocalEntity, type MachineLocalLoss, type MachineLocalTable, type MuxBackend, type MuxBackendName, MuxError, type MuxPane, type MuxPaneStatus, type MuxSession, type MuxWindow, type NewSessionOptions, type NewWindowOptions, NoForegroundProcessError, NoMultiplexerError, NothingToUndoError, OP_CTX_DDL, type Op, type OpContext, OpEntityNotSyncedError, OpKeyMalformedError, type OpenDbOptions, type OwnedTasksSummary, PANE_ID_RE, PEER_SHORT_LEN, PEER_STALE_MS, PORTABLE_TABLES, PaneNotFoundError, PaneNotInSessionError, type ParkTaskOptions, type PeerSegment, type PeerStatus, type PortableTable, ReaperDetectedDuringWaitError, type RebuildOptions, type RebuildReport, RebuildTargetExistsError, RebuildTargetIsSourceError, type ReconcileMode, type ReconcileOptions, type ReconcileReport, type ReleaseResult, type ReleaseTaskOptions, type RemoveBlockEdgeResult, type RenderableOp, type RenderedOp, type ReparentTaskResult, type RoiBucket, type RuntimeState, SEGMENT_FORMAT_VERSION, SYNCED_ENTITIES, SchemaTooNewError, SchemaTooOldError, type SegmentDefect, type SegmentDefectKind, type SegmentLine, type SegmentManifest, type SendOptions, type SendResult, type SendWarning, type SetStatusOptions, type SetStatusResult, type SlugifyResult, type SpawnAgentOptions, type SplitWindowOptions, StallDetectedDuringWaitError, type StateReading, type StateSource, type StrandedWorkspaceOrphan, SubstateReasonRequiredError, type SyncPassResult, SyncPeerNotFoundError, SyncPeerRefAmbiguousError, SyncSourceNotFoundError, type SyncedEntity, TASK_STATUSES, TASK_STATUS_LIST, TASK_SUBSTATES, TASK_SUBSTATE_ROWS, TaskAlreadyOwnedError, TaskClaimStaleWorkspaceError, type TaskEdgeWithStatus, type TaskEdges, type TaskEdgesWithStatus, TaskExistsError, TaskIdInvalidError, TaskInTriageError, TaskNotFoundError, TaskNotInWorkstreamError, type TaskNoteRow, type TaskPair, TaskParkStateError, TaskParkedError, type TaskRow, type TaskStatus, type TaskSubstate, TaskTitleSlugEmptyError, type TaskWaitOptions, type TaskWaitRef, type TaskWaitResult, type TaskWaitTaskState, type TeardownResult, TmuxError, type TmuxExecResult, type TmuxExecutor, type TmuxPane, type TmuxSession, type TmuxWindow, type Track, type Transport, UNKNOWN_REASON, UndoGroupNotFoundError, type UndoOptions, type UndoPlan, type UndoResult, UndoSupersededError, type UpdateTaskOptions, type UpdateTaskResult, type VcsBackend, type VcsBackendName, WORKSPACE_STALE_THRESHOLD, WorkspaceConflictError, WorkspaceDirtyError, WorkspaceExistsError, type WorkspaceFailure, WorkspaceNotFoundError, type WorkspaceOrphan, WorkspaceOwnerBusyError, WorkspacePathNotEmptyError, WorkspacePreservedError, type WorkspaceRow, type WorkspaceStaleness, WorkspaceVcsRequiredError, WorkstreamExistsError, WorkstreamNameInvalidError, WorkstreamNameReservedError, WorkstreamNotFoundError, type WorkstreamOptions, type WorkstreamSnapshot, type WorkstreamSnapshotSlowFields, type WorkstreamSummary, abortAgent, acceptTask, activeMux, addBlockEdge, addNote, addTask, adoptAgent, agentKey, agentStateGlyph, agentStateHistogram, ambientFlush, ambientIngest, ambientSyncPass, appendLog, applyIncomingOp, applyOp, applyOps, assertValidPaneId, awaitPaneQuiescence, backendByName, capturePane, checkCaseCollisions, checkCheapDriftInvariant, checkCommandResolvable, checkDbInsideSyncDir, checkDrift, checkFleetHazards, checkNetworkMount, claimTask, classifyFsType, closeAgent, closeTask, compareHlc, composeAgentTitle, countProblems, createWorkspace, ctlRuntimeState, currentAgentName, currentOpContext, currentPaneTitle, decorateWithDirty, decorateWithStaleness, defaultDbPath, defaultSendDelayMs, defaultSendReadinessMs, defaultSpawnLivenessMs, defaultStateDir, deleteAgent, deleteTask, detectBackend, detectMux, discoverPeers, driftRemediation, emitEvent, ensureWorkstream, envVarNameForCli, expectsCtl, findCaseCollisions, flushSegment, foregroundPgid, formatDriftRecord, formatHlc, formatPair, freeWorkspace, getAgent, getAgentByPane, getParallelTracks, getPrerequisites, getTask, getTaskEdges, getTaskEdgesWithStatus, getWaitPollCount, getWatermark, getWorkspaceForAgent, getWorkspaceStaleness, gitBackend, hasWorkMarker, idFromTitle, idFromTitleVerbose, ingestFromDb, ingestSegment, insertAgent, inspectLinks, installCapture, interruptAgent, isKickSignal, isPathInside, isTaskStatus, isValidAgentName, isValidPair, isValidPaneId, isValidTaskId, isValidWorkstreamName, isWorkspaceStale, jjBackend, kickAgent, killPane, killSession, latestSeq, linkPi, linkSkill, listAgents, listAllOrphanWorkspaces, listBlocked, listGoals, listInProgress, listLiveAgents, listLogs, listNotes, listPanes, listPanesInSession, listReady, listRecentClosed, listRecentGroups, listSessions, listTasks, listTasksByOwner, listWindows, listWorkspaceOrphans, listWorkspaces, listWorkstreams, loadDoctorChecks, loadDoctorSummary, loadFullDag, loadWorkstreamSnapshot, loadWorkstreamSnapshotFast, loadWorkstreamSnapshotSlow, localMachineId, locksDir, mapLegacyStatus, mergeSnapshotFastSlow, mostRecentGroup, murmurAvailable, mux, muxByName, newSession, newSessionWithPane, newWindow, nextHlc, noneBackend, opSubject, openDb, openTask, paneExists, paneTTY, parkTask, parseAgentNameFromTitle, parseHlc, parseOpKey, parsePsTtyOutput, peerStatuses, planUndo, priorFieldValue, probeFilesystem, readAgent, readAgentStates, readFileLockMeta, readManifest, rebuildInto, receiveHlc, reconcile, refreshAgentTitle, releaseTask, remediationParagraph, removeBlockEdge, renderForest, renderOp, renderOpLine, renderTaskTree, repairPeer, reparentTask, resetCommandResolverForTests, resetKickProcessExecutor, resetMux, resetSleep, resetTmuxExecutor, resetWaitPollCount, resetWatermark, resolveActorIdentity, resolveCliCommand, resolveCliCommandWithSource, resolveGroupId, resolvePair, resolvePeerRef, roiBucket, segmentLineCount, segmentPath, selectLayout, sendToAgent, sendToPane, sendViaTransport, sessionExists, setCommandResolverForTests, setKickProcessExecutor, setMuxForTests, setPaneTitle, setSleepForTests, setTaskStatus, setTmuxExecutor, setWaitSleepForTests, setWaitStuckWarnForTests, setWatermark, slBackend, sleep, slugifyTitle, slugifyTitleVerbose, spawnAgent, splitWindow, summarizeOwnedTasks, summarizeWorkstream, syncDir, syncEnabled, syncPass, teardownWorkstream, tmux, tmuxBackend, transportNextSteps, undoGroup, unparkTask, updateTask, verifyAgainstManifest, waitForTasks, withCaptureSuppressed, withFileLock, withOpContext, workspacePath, workspacesRoot, yankCommandForCheck };