@north-light/api 0.3.504 → 0.3.505

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.
@@ -30,7 +30,7 @@ import type { CancelReviewRequest, CreateReviewRequest, ListReviewsQuery, Review
30
30
  import type { CreateReviewCommentRequest, EditReviewCommentRequest, ListReviewCommentsQuery, ReadReviewCommentEventsQuery, ReviewCommentActionRequest, ReviewCommentDetailDTO, ReviewCommentEventsDTO, ReviewCommentForkDTO, ReviewCommentListDTO, ReviewCommentMutationDTO, ReviewCommentRangeBatchRequest, ReviewCommentRangeBatchResultDTO } from './dto/review-comments.js';
31
31
  import type { CancelInboxTicketRequest, CanceledTicketResultDTO, InboxListDTO, InboxPageDTO, InboxPageHistoryDTO, InboxPageResponseDTO, InboxTicketIdDTO, PageFeedbackResolutionDTO, PageResponsesDTO, PageTicketResultDTO, RespondInboxPageRequest } from './dto/inbox.js';
32
32
  import type { CreateHumanRequestDTO, CreateHumanRequestRequest, HumanRequestDTO, HumanRequestIdDTO, ReplaceHumanRequestRequest, RespondHumanRequestRequest, SettleHumanRequestRequest, PageComponentListDTO } from './dto/human-requests.js';
33
- import type { AttentionCountsDTO, AttentionDTO, DashboardDTO, DashboardQuery, HistoryGrepQuery, HistoryGrepResultDTO, HistoryReadQuery, HistoryStatsQuery, HistoryStatsResultDTO, HistoryReadResultDTO, HistorySearchQuery, HistorySearchResultDTO, GraphDTO, PruneRequest, PruneResultDTO, RosterDTO, SnapshotDTO } from './dto/canvas.js';
33
+ import type { AttentionCountsDTO, AttentionDTO, DashboardDTO, DashboardQuery, HistoryGrepQuery, HistoryGrepResultDTO, HistoryReadQuery, HistoryStatsQuery, HistoryStatsResultDTO, HistoryReadResultDTO, HistorySearchQuery, HistorySearchResultDTO, GraphDTO, PruneRequest, PruneResultDTO, LiveRootsDTO, RosterDTO, SnapshotDTO } from './dto/canvas.js';
34
34
  import type { AbandonWorktreeRequest, AbandonWorktreeResultDTO, CloseWorktreeResultDTO, QuarantinedWorktreeDTO, SpaceListDTO } from './dto/worktree.js';
35
35
  import type { BrokerExtensionStateDTO, BrokerExecutionRequest, BrokerGeneratedNameRequest, BrokerGeneratedNameResultDTO, BrokerModelCommitRequest, BrokerModelCommitResultDTO, BrokerParkActivityResultDTO, BrokerParkCompleteRequest, BrokerPersonaAckRequest, BrokerPersonaAckResultDTO, BrokerSessionBoundRequest, BrokerSessionBoundResultDTO, BrokerSettleDirective, BrokerSettleRequest, BrokerTelemetryRequest } from './dto/broker-ops.js';
36
36
  import type { AcknowledgeMailRequest, AcknowledgeMailResultDTO, ClaimMailRequest, ClaimMailResultDTO } from './dto/mail.js';
@@ -200,6 +200,7 @@ export declare class CrtrClient {
200
200
  commitBrokerGeneratedName(id: string, req: BrokerGeneratedNameRequest): Promise<BrokerGeneratedNameResultDTO>;
201
201
  commitBrokerPersonaAck(id: string, req: BrokerPersonaAckRequest): Promise<BrokerPersonaAckResultDTO>;
202
202
  closeNode(id: string, req?: CloseRequest): Promise<CloseResultDTO>;
203
+ markNodeRead(id: string): Promise<void>;
203
204
  recycleNode(id: string): Promise<NodeDetailDTO>;
204
205
  demoteNode(id: string): Promise<NodeDetailDTO>;
205
206
  promoteNode(id: string, req: PromoteRequest): Promise<NodeDetailDTO>;
@@ -447,6 +448,9 @@ export declare class CrtrClient {
447
448
  * two indexed queries server-side, no per-row enrichment. The recurring
448
449
  * poll target for attach/browser topology; use `canvasSnapshot` for the
449
450
  * enriched on-demand view. */
451
+ liveRoots(q?: {
452
+ profile?: string;
453
+ }): Promise<LiveRootsDTO>;
450
454
  canvasRoster(): Promise<RosterDTO>;
451
455
  /** Explicitly compressed browse snapshot; the Node-only canvas source
452
456
  * decompresses it because socketFetch does not interpret content-encoding. */
@@ -334,6 +334,9 @@ export class CrtrClient {
334
334
  closeNode(id, req) {
335
335
  return this.request('POST', routes.nodeClose(this.nodePath(id)), req ?? {});
336
336
  }
337
+ async markNodeRead(id) {
338
+ await this.request('POST', routes.nodeRead(this.nodePath(id)), {});
339
+ }
337
340
  recycleNode(id) {
338
341
  return this.request('POST', routes.nodeRecycle(this.nodePath(id)), {});
339
342
  }
@@ -824,6 +827,9 @@ export class CrtrClient {
824
827
  * two indexed queries server-side, no per-row enrichment. The recurring
825
828
  * poll target for attach/browser topology; use `canvasSnapshot` for the
826
829
  * enriched on-demand view. */
830
+ liveRoots(q = {}) {
831
+ return this.request('GET', withQuery(routes.canvasLiveRoots(), q));
832
+ }
827
833
  canvasRoster() {
828
834
  return this.request('GET', routes.canvasRoster());
829
835
  }
@@ -1,5 +1,5 @@
1
1
  /** The contract level this build serves and requires. Written by `scripts/contract.mjs release`; never edit by hand. */
2
- export declare const CONTRACT_LEVEL = "1.17";
2
+ export declare const CONTRACT_LEVEL = "1.18";
3
3
  /** Request header naming the one contract level the caller needs, e.g. `1.3`. Optional: absent means no check. */
4
4
  export declare const REQUIRED_CONTRACT_HEADER = "Crouter-Required-Contract";
5
5
  /** Response header listing the contract levels the server serves, comma-separated, one per major, e.g. `1.3`. */
@@ -12,7 +12,7 @@
12
12
  //
13
13
  // PURITY (spec §3.1): Node built-ins + `src/api/*` only.
14
14
  /** The contract level this build serves and requires. Written by `scripts/contract.mjs release`; never edit by hand. */
15
- export const CONTRACT_LEVEL = '1.17';
15
+ export const CONTRACT_LEVEL = '1.18';
16
16
  /** Request header naming the one contract level the caller needs, e.g. `1.3`. Optional: absent means no check. */
17
17
  export const REQUIRED_CONTRACT_HEADER = 'Crouter-Required-Contract';
18
18
  /** Response header listing the contract levels the server serves, comma-separated, one per major, e.g. `1.3`. */
@@ -68,6 +68,8 @@ export interface HistorySearchQuery {
68
68
  from?: string;
69
69
  /** Weigh full body text in ranking (`--body`). */
70
70
  weigh_body?: boolean;
71
+ /** One hit per node (its best-scoring artifact), every matching node, unpaginated. Requires non-empty `nodes`; each hit carries `node_id`. */
72
+ per_node?: boolean;
71
73
  /** relevance | recency | oldest — already resolved to the effective sort. */
72
74
  sort?: string;
73
75
  snippet_lines?: number;
@@ -303,6 +305,44 @@ export interface BrowseCanvasDTO {
303
305
  nodes: BrowseNodeDTO[];
304
306
  edges: RosterEdgeDTO[];
305
307
  }
308
+ /** One in-tree child of a live root, for the dashboard's expansion. */
309
+ export interface LiveRootChildDTO {
310
+ node_id: NodeIdDTO;
311
+ name: string;
312
+ status: NodeStatusDTO;
313
+ streaming: boolean;
314
+ asks: number;
315
+ fault: string | null;
316
+ }
317
+ /** One live root conversation with everything the dashboard row shows, counted over its whole subtree. */
318
+ export interface LiveRootDTO {
319
+ node_id: NodeIdDTO;
320
+ name: string;
321
+ cwd: string;
322
+ profile_id: string | null;
323
+ status: NodeStatusDTO;
324
+ /** The State line of the last recap; null before the first recap. */
325
+ state_line: string | null;
326
+ /** The persisted first message, shown while `state_line` is null. */
327
+ goal: string | null;
328
+ /** Pending inbox items (asks and reviews) from any node in the subtree. */
329
+ asks: number;
330
+ /** The oldest pending ask's inbox ticket id. */
331
+ first_ask_ticket_id: string | null;
332
+ /** The first fault in root-then-subtree order, as a short summary. */
333
+ fault: string | null;
334
+ /** Nodes in the subtree, root included, with an open turn and a live process. */
335
+ running_count: number;
336
+ /** The root settled a turn after a viewer was last shown the conversation. */
337
+ unread: boolean;
338
+ last_activity: IsoTime;
339
+ children: LiveRootChildDTO[];
340
+ }
341
+ /** `GET /v1/canvas/live-roots` — the dashboard's one-read projection. Person callers only. */
342
+ export interface LiveRootsDTO {
343
+ generated_at: IsoTime;
344
+ rows: LiveRootDTO[];
345
+ }
306
346
  /** One row in `GET /v1/canvas/graph`: exactly the node fields the attach graph displays. */
307
347
  export interface GraphNodeDTO {
308
348
  node_id: NodeIdDTO;
@@ -59,6 +59,7 @@ export declare const routes: {
59
59
  readonly brokerRecovery: (id: string) => string;
60
60
  readonly nodeFault: (id: string) => string;
61
61
  readonly nodeClose: (id: string) => string;
62
+ readonly nodeRead: (id: string) => string;
62
63
  readonly nodeRecycle: (id: string) => string;
63
64
  readonly nodeDemote: (id: string) => string;
64
65
  readonly nodePromote: (id: string) => string;
@@ -92,6 +93,7 @@ export declare const routes: {
92
93
  readonly canvasHistoryRead: () => string;
93
94
  readonly canvasHistoryStats: () => string;
94
95
  readonly canvasSnapshot: () => string;
96
+ readonly canvasLiveRoots: () => string;
95
97
  readonly canvasRoster: () => string;
96
98
  readonly canvasBrowse: () => string;
97
99
  readonly canvasAnalytics: () => string;
@@ -77,6 +77,7 @@ export const routes = {
77
77
  brokerRecovery: (id) => `${V}/broker/${id}/recovery`,
78
78
  nodeFault: (id) => `${V}/nodes/${id}/fault`,
79
79
  nodeClose: (id) => `${V}/nodes/${id}/close`,
80
+ nodeRead: (id) => `${V}/nodes/${id}/read`,
80
81
  nodeRecycle: (id) => `${V}/nodes/${id}/recycle`,
81
82
  nodeDemote: (id) => `${V}/nodes/${id}/demote`,
82
83
  nodePromote: (id) => `${V}/nodes/${id}/promote`,
@@ -114,6 +115,7 @@ export const routes = {
114
115
  canvasHistoryRead: () => `${V}/canvas/history/read`,
115
116
  canvasHistoryStats: () => `${V}/canvas/history/stats`,
116
117
  canvasSnapshot: () => `${V}/canvas/snapshot`,
118
+ canvasLiveRoots: () => `${V}/canvas/live-roots`,
117
119
  canvasRoster: () => `${V}/canvas/roster`,
118
120
  canvasBrowse: () => `${V}/canvas/browse`,
119
121
  canvasAnalytics: () => `${V}/canvas/analytics`,
@@ -1,15 +1,16 @@
1
1
  import type { BindingDefinition, SafetyRequirement } from './types.js';
2
2
  import type { AttachBindingId, AttachMenuBindingId } from './attach-control.js';
3
- type TmuxMenuAction = 'open' | 'attach' | 'show' | 'view-settings' | 'provider-options' | 'fold-tools' | 'show-working' | 'metadata' | 'promote' | 'demote-mode' | 'resume' | 'fork' | 'demote' | 'make-resident' | 'detach' | 'close-subtree' | 'background-bash' | 'file-review' | 'pin' | 'reload-viewer' | 'recap' | 'context' | 'context-admin' | 'providers' | 'plugins' | 'analytics' | 'graph' | 'focus-manager' | 'copy-id' | 'issues';
3
+ type TmuxMenuAction = 'open' | 'attach' | 'show' | 'view-settings' | 'provider-options' | 'fold-tools' | 'show-working' | 'metadata' | 'promote' | 'demote-mode' | 'resume' | 'fork' | 'demote' | 'make-resident' | 'detach' | 'close-subtree' | 'background-bash' | 'file-review' | 'pin' | 'reload-viewer' | 'recap' | 'context' | 'context-admin' | 'providers' | 'plugins' | 'analytics' | 'graph' | 'focus-manager' | 'copy-id' | 'issues' | 'dashboard';
4
4
  type TmuxMenuEntryAction = Exclude<TmuxMenuAction, 'open' | 'attach'> | `issue.${'idea' | 'bug'}`;
5
5
  type GraphAction = 'down' | 'up' | 'first' | 'last' | 'collapse-or-manager' | 'expand-or-child' | 'focus' | 'revive' | 'focus-manager' | 'close-subtree' | 'dismiss';
6
6
  type BrowseAction = 'quit' | 'down' | 'up' | 'first' | 'last' | 'expand-or-child' | 'collapse-or-parent' | 'toggle-fold' | 'tab-next' | 'tab-previous' | `tab.${1 | 2 | 3 | 4 | 5}` | 'close-subtree' | 'confirm-close' | 'sort' | 'scope' | 'profile' | 'residents' | 'preview' | 'report' | 'pin' | 'search' | 'revive-now' | 'focus' | 'focus-background' | 'yank-id';
7
+ type DashboardAction = 'down' | 'up' | 'first' | 'last' | 'expand' | 'collapse' | 'open' | 'pin' | 'rename' | 'close' | 'confirm-close' | 'cancel-close' | 'profile' | 'input' | 'input-cancel' | 'input-submit' | 'directory-next' | 'directory-previous' | 'help';
7
8
  type ProfileMenuAction = 'up' | 'down' | 'select' | 'accept-default' | 'abort' | `slot.${1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9}` | 'create' | 'search-existing' | 'use-root' | 'set-default' | 'add-directory' | 'unpin' | 'manage';
8
9
  type SetupAction = 'cancel' | 'tab-next' | 'tab-previous' | 'open' | 'list-down' | 'list-up' | 'toggle' | 'details' | 'advance' | 'cell-previous' | 'cell-next';
9
10
  type SetupKeybindingAction = 'edit' | 'commit-edit' | 'cancel-edit' | 'unbind' | 'reset-row' | 'reset-all' | 'save' | 'discard' | 'page-up' | 'page-down' | 'filter' | 'filter-delete' | 'filter-clear';
10
11
  type SetupModelsAction = 'open' | 'commit' | 'cancel' | 'scope-next';
11
- export type BindingId = `crtr.tmux.menu.${TmuxMenuAction}` | `crtr.tmux.menu.issue.${'idea' | 'bug'}` | AttachMenuBindingId | `crtr.tmux.menu-global.${TmuxMenuEntryAction}` | `crtr.tmux.node.${'next' | 'previous'}` | 'crtr.tmux.inbox.toggle' | `crtr.attach.scroll.${'up' | 'down' | 'page-up' | 'page-down' | 'live'}` | 'crtr.attach.mouse.toggle' | 'crtr.attach.copy.message' | 'crtr.attach.help.toggle' | `crtr.attach.search.${'next' | 'previous' | 'edit' | 'close'}` | AttachBindingId | `crtr.graph.${GraphAction}` | `crtr.graph.confirm.${'accept' | 'cancel'}` | `crtr.inspector.${'force-quit' | 'down' | 'up' | 'section-next' | 'section-prev' | 'page-down' | 'page-up' | 'toggle-detail' | 'cancel-item' | 'open-log' | 'confirm' | 'dismiss' | 'retarget' | 'refresh' | 'quit'}` | `crtr.browse.${BrowseAction}` | `crtr.browse.search.${'cancel' | 'commit' | 'delete' | 'quit'}` | `crtr.profile.menu.${ProfileMenuAction}` | `crtr.profile.search.${'up' | 'down' | 'pick' | 'back' | 'delete' | 'abort'}` | `crtr.setup.${SetupAction}` | `crtr.setup.confirm.${'accept' | 'back'}` | `crtr.setup.keybindings.${SetupKeybindingAction}` | `crtr.setup.models.${SetupModelsAction}`;
12
- export declare const BINDING_CATALOG: readonly [BindingDefinition<"crtr.tmux.menu.open">, BindingDefinition<"crtr.tmux.menu.attach">, ...(BindingDefinition<BindingId> | BindingDefinition<"crtr.tmux.node.next"> | BindingDefinition<"crtr.tmux.node.previous"> | BindingDefinition<"crtr.tmux.inbox.toggle"> | BindingDefinition<"crtr.attach.scroll.up"> | BindingDefinition<"crtr.attach.scroll.down"> | BindingDefinition<"crtr.attach.scroll.page-up"> | BindingDefinition<"crtr.attach.scroll.page-down"> | BindingDefinition<"crtr.attach.scroll.live"> | BindingDefinition<"crtr.attach.mouse.toggle"> | BindingDefinition<"crtr.attach.copy.message"> | BindingDefinition<"crtr.attach.search.next"> | BindingDefinition<"crtr.attach.search.previous"> | BindingDefinition<"crtr.attach.search.edit"> | BindingDefinition<"crtr.attach.search.close"> | BindingDefinition<"crtr.graph.down"> | BindingDefinition<"crtr.graph.up"> | BindingDefinition<"crtr.graph.first"> | BindingDefinition<"crtr.graph.last"> | BindingDefinition<"crtr.graph.collapse-or-manager"> | BindingDefinition<"crtr.graph.expand-or-child"> | BindingDefinition<"crtr.graph.focus"> | BindingDefinition<"crtr.graph.revive"> | BindingDefinition<"crtr.graph.focus-manager"> | BindingDefinition<"crtr.graph.close-subtree"> | BindingDefinition<"crtr.graph.dismiss"> | BindingDefinition<"crtr.graph.confirm.accept"> | BindingDefinition<"crtr.graph.confirm.cancel"> | BindingDefinition<"crtr.inspector.force-quit"> | BindingDefinition<"crtr.inspector.down"> | BindingDefinition<"crtr.inspector.up"> | BindingDefinition<"crtr.inspector.section-next"> | BindingDefinition<"crtr.inspector.section-prev"> | BindingDefinition<"crtr.inspector.page-down"> | BindingDefinition<"crtr.inspector.page-up"> | BindingDefinition<"crtr.inspector.toggle-detail"> | BindingDefinition<"crtr.inspector.cancel-item"> | BindingDefinition<"crtr.inspector.open-log"> | BindingDefinition<"crtr.inspector.confirm"> | BindingDefinition<"crtr.inspector.dismiss"> | BindingDefinition<"crtr.inspector.retarget"> | BindingDefinition<"crtr.inspector.refresh"> | BindingDefinition<"crtr.inspector.quit"> | BindingDefinition<"crtr.browse.quit"> | BindingDefinition<"crtr.browse.down"> | BindingDefinition<"crtr.browse.up"> | BindingDefinition<"crtr.browse.first"> | BindingDefinition<"crtr.browse.last"> | BindingDefinition<"crtr.browse.expand-or-child"> | BindingDefinition<"crtr.browse.collapse-or-parent"> | BindingDefinition<"crtr.browse.toggle-fold"> | BindingDefinition<"crtr.browse.tab-next"> | BindingDefinition<"crtr.browse.tab-previous"> | BindingDefinition<"crtr.browse.tab.2" | "crtr.browse.tab.5" | "crtr.browse.tab.4" | "crtr.browse.tab.3" | "crtr.browse.tab.1"> | BindingDefinition<"crtr.browse.close-subtree"> | BindingDefinition<"crtr.browse.confirm-close"> | BindingDefinition<"crtr.browse.sort"> | BindingDefinition<"crtr.browse.scope"> | BindingDefinition<"crtr.browse.profile"> | BindingDefinition<"crtr.browse.residents"> | BindingDefinition<"crtr.browse.preview"> | BindingDefinition<"crtr.browse.report"> | BindingDefinition<"crtr.browse.pin"> | BindingDefinition<"crtr.browse.search"> | BindingDefinition<"crtr.browse.revive-now"> | BindingDefinition<"crtr.browse.focus"> | BindingDefinition<"crtr.browse.focus-background"> | BindingDefinition<"crtr.browse.yank-id"> | BindingDefinition<"crtr.browse.search.cancel"> | BindingDefinition<"crtr.browse.search.commit"> | BindingDefinition<"crtr.browse.search.delete"> | BindingDefinition<"crtr.browse.search.quit"> | BindingDefinition<"crtr.profile.menu.up"> | BindingDefinition<"crtr.profile.menu.down"> | BindingDefinition<"crtr.profile.menu.select"> | BindingDefinition<"crtr.profile.menu.accept-default"> | BindingDefinition<"crtr.profile.menu.abort"> | BindingDefinition<"crtr.profile.menu.slot.2" | "crtr.profile.menu.slot.5" | "crtr.profile.menu.slot.4" | "crtr.profile.menu.slot.7" | "crtr.profile.menu.slot.3" | "crtr.profile.menu.slot.6" | "crtr.profile.menu.slot.1" | "crtr.profile.menu.slot.8" | "crtr.profile.menu.slot.9">)[], BindingDefinition<"crtr.profile.menu.create">, BindingDefinition<"crtr.profile.menu.search-existing">, BindingDefinition<"crtr.profile.menu.use-root">, BindingDefinition<"crtr.profile.menu.set-default">, BindingDefinition<"crtr.profile.menu.add-directory">, BindingDefinition<"crtr.profile.menu.unpin">, BindingDefinition<"crtr.profile.menu.manage">, BindingDefinition<"crtr.profile.search.up">, BindingDefinition<"crtr.profile.search.down">, BindingDefinition<"crtr.profile.search.pick">, BindingDefinition<"crtr.profile.search.back">, BindingDefinition<"crtr.profile.search.delete">, BindingDefinition<"crtr.profile.search.abort">, BindingDefinition<"crtr.setup.cancel">, BindingDefinition<"crtr.setup.tab-next">, BindingDefinition<"crtr.setup.tab-previous">, BindingDefinition<"crtr.setup.open">, BindingDefinition<"crtr.setup.list-down">, BindingDefinition<"crtr.setup.list-up">, BindingDefinition<"crtr.setup.toggle">, BindingDefinition<"crtr.setup.details">, BindingDefinition<"crtr.setup.advance">, BindingDefinition<"crtr.setup.confirm.accept">, BindingDefinition<"crtr.setup.confirm.back">, BindingDefinition<"crtr.setup.keybindings.edit">, BindingDefinition<"crtr.setup.keybindings.commit-edit">, BindingDefinition<"crtr.setup.keybindings.cancel-edit">, BindingDefinition<"crtr.setup.keybindings.unbind">, BindingDefinition<"crtr.setup.keybindings.reset-row">, BindingDefinition<"crtr.setup.keybindings.reset-all">, BindingDefinition<"crtr.setup.keybindings.save">, BindingDefinition<"crtr.setup.keybindings.discard">, BindingDefinition<"crtr.setup.keybindings.page-up">, BindingDefinition<"crtr.setup.keybindings.page-down">, BindingDefinition<"crtr.setup.keybindings.filter">, BindingDefinition<"crtr.setup.keybindings.filter-delete">, BindingDefinition<"crtr.setup.keybindings.filter-clear">, BindingDefinition<"crtr.setup.cell-previous">, BindingDefinition<"crtr.setup.cell-next">, BindingDefinition<"crtr.setup.models.open">, BindingDefinition<"crtr.setup.models.scope-next">, BindingDefinition<"crtr.setup.models.commit">, BindingDefinition<"crtr.setup.models.cancel">];
12
+ export type BindingId = `crtr.tmux.menu.${TmuxMenuAction}` | `crtr.tmux.menu.issue.${'idea' | 'bug'}` | AttachMenuBindingId | `crtr.tmux.menu-global.${TmuxMenuEntryAction}` | `crtr.tmux.node.${'next' | 'previous'}` | 'crtr.tmux.inbox.toggle' | `crtr.attach.scroll.${'up' | 'down' | 'page-up' | 'page-down' | 'live'}` | 'crtr.attach.mouse.toggle' | 'crtr.attach.copy.message' | 'crtr.attach.help.toggle' | `crtr.attach.search.${'next' | 'previous' | 'edit' | 'close'}` | AttachBindingId | `crtr.graph.${GraphAction}` | `crtr.graph.confirm.${'accept' | 'cancel'}` | `crtr.inspector.${'force-quit' | 'down' | 'up' | 'section-next' | 'section-prev' | 'page-down' | 'page-up' | 'toggle-detail' | 'cancel-item' | 'open-log' | 'confirm' | 'dismiss' | 'retarget' | 'refresh' | 'quit'}` | `crtr.browse.${BrowseAction}` | `crtr.browse.search.${'cancel' | 'commit' | 'delete' | 'quit'}` | `crtr.dashboard.${DashboardAction}` | `crtr.profile.menu.${ProfileMenuAction}` | `crtr.profile.search.${'up' | 'down' | 'pick' | 'back' | 'delete' | 'abort'}` | `crtr.setup.${SetupAction}` | `crtr.setup.confirm.${'accept' | 'back'}` | `crtr.setup.keybindings.${SetupKeybindingAction}` | `crtr.setup.models.${SetupModelsAction}`;
13
+ export declare const BINDING_CATALOG: readonly [BindingDefinition<"crtr.tmux.menu.open">, BindingDefinition<"crtr.tmux.menu.attach">, ...(BindingDefinition<BindingId> | BindingDefinition<"crtr.tmux.node.next"> | BindingDefinition<"crtr.tmux.node.previous"> | BindingDefinition<"crtr.tmux.inbox.toggle"> | BindingDefinition<"crtr.attach.scroll.up"> | BindingDefinition<"crtr.attach.scroll.down"> | BindingDefinition<"crtr.attach.scroll.page-up"> | BindingDefinition<"crtr.attach.scroll.page-down"> | BindingDefinition<"crtr.attach.scroll.live"> | BindingDefinition<"crtr.attach.mouse.toggle"> | BindingDefinition<"crtr.attach.copy.message"> | BindingDefinition<"crtr.attach.search.next"> | BindingDefinition<"crtr.attach.search.previous"> | BindingDefinition<"crtr.attach.search.edit"> | BindingDefinition<"crtr.attach.search.close"> | BindingDefinition<"crtr.graph.down"> | BindingDefinition<"crtr.graph.up"> | BindingDefinition<"crtr.graph.first"> | BindingDefinition<"crtr.graph.last"> | BindingDefinition<"crtr.graph.collapse-or-manager"> | BindingDefinition<"crtr.graph.expand-or-child"> | BindingDefinition<"crtr.graph.focus"> | BindingDefinition<"crtr.graph.revive"> | BindingDefinition<"crtr.graph.focus-manager"> | BindingDefinition<"crtr.graph.close-subtree"> | BindingDefinition<"crtr.graph.dismiss"> | BindingDefinition<"crtr.graph.confirm.accept"> | BindingDefinition<"crtr.graph.confirm.cancel"> | BindingDefinition<"crtr.inspector.force-quit"> | BindingDefinition<"crtr.inspector.down"> | BindingDefinition<"crtr.inspector.up"> | BindingDefinition<"crtr.inspector.section-next"> | BindingDefinition<"crtr.inspector.section-prev"> | BindingDefinition<"crtr.inspector.page-down"> | BindingDefinition<"crtr.inspector.page-up"> | BindingDefinition<"crtr.inspector.toggle-detail"> | BindingDefinition<"crtr.inspector.cancel-item"> | BindingDefinition<"crtr.inspector.open-log"> | BindingDefinition<"crtr.inspector.confirm"> | BindingDefinition<"crtr.inspector.dismiss"> | BindingDefinition<"crtr.inspector.retarget"> | BindingDefinition<"crtr.inspector.refresh"> | BindingDefinition<"crtr.inspector.quit"> | BindingDefinition<"crtr.browse.quit"> | BindingDefinition<"crtr.browse.down"> | BindingDefinition<"crtr.browse.up"> | BindingDefinition<"crtr.browse.first"> | BindingDefinition<"crtr.browse.last"> | BindingDefinition<"crtr.browse.expand-or-child"> | BindingDefinition<"crtr.browse.collapse-or-parent"> | BindingDefinition<"crtr.browse.toggle-fold"> | BindingDefinition<"crtr.browse.tab-next"> | BindingDefinition<"crtr.browse.tab-previous"> | BindingDefinition<"crtr.browse.tab.2" | "crtr.browse.tab.5" | "crtr.browse.tab.4" | "crtr.browse.tab.3" | "crtr.browse.tab.1"> | BindingDefinition<"crtr.browse.close-subtree"> | BindingDefinition<"crtr.browse.confirm-close"> | BindingDefinition<"crtr.browse.sort"> | BindingDefinition<"crtr.browse.scope"> | BindingDefinition<"crtr.browse.profile"> | BindingDefinition<"crtr.browse.residents"> | BindingDefinition<"crtr.browse.preview"> | BindingDefinition<"crtr.browse.report"> | BindingDefinition<"crtr.browse.pin"> | BindingDefinition<"crtr.browse.search"> | BindingDefinition<"crtr.browse.revive-now"> | BindingDefinition<"crtr.browse.focus"> | BindingDefinition<"crtr.browse.focus-background"> | BindingDefinition<"crtr.browse.yank-id"> | BindingDefinition<"crtr.browse.search.cancel"> | BindingDefinition<"crtr.browse.search.commit"> | BindingDefinition<"crtr.browse.search.delete"> | BindingDefinition<"crtr.browse.search.quit"> | BindingDefinition<"crtr.dashboard.down"> | BindingDefinition<"crtr.dashboard.up"> | BindingDefinition<"crtr.dashboard.first"> | BindingDefinition<"crtr.dashboard.last"> | BindingDefinition<"crtr.dashboard.expand"> | BindingDefinition<"crtr.dashboard.collapse"> | BindingDefinition<"crtr.dashboard.open"> | BindingDefinition<"crtr.dashboard.pin"> | BindingDefinition<"crtr.dashboard.rename"> | BindingDefinition<"crtr.dashboard.close"> | BindingDefinition<"crtr.dashboard.confirm-close"> | BindingDefinition<"crtr.dashboard.cancel-close"> | BindingDefinition<"crtr.dashboard.profile"> | BindingDefinition<"crtr.dashboard.input"> | BindingDefinition<"crtr.dashboard.input-cancel"> | BindingDefinition<"crtr.dashboard.input-submit"> | BindingDefinition<"crtr.dashboard.directory-next"> | BindingDefinition<"crtr.dashboard.directory-previous"> | BindingDefinition<"crtr.dashboard.help"> | BindingDefinition<"crtr.profile.menu.up"> | BindingDefinition<"crtr.profile.menu.down"> | BindingDefinition<"crtr.profile.menu.select"> | BindingDefinition<"crtr.profile.menu.accept-default"> | BindingDefinition<"crtr.profile.menu.abort"> | BindingDefinition<"crtr.profile.menu.slot.2" | "crtr.profile.menu.slot.5" | "crtr.profile.menu.slot.4" | "crtr.profile.menu.slot.7" | "crtr.profile.menu.slot.3" | "crtr.profile.menu.slot.6" | "crtr.profile.menu.slot.1" | "crtr.profile.menu.slot.8" | "crtr.profile.menu.slot.9">)[], BindingDefinition<"crtr.profile.menu.create">, BindingDefinition<"crtr.profile.menu.search-existing">, BindingDefinition<"crtr.profile.menu.use-root">, BindingDefinition<"crtr.profile.menu.set-default">, BindingDefinition<"crtr.profile.menu.add-directory">, BindingDefinition<"crtr.profile.menu.unpin">, BindingDefinition<"crtr.profile.menu.manage">, BindingDefinition<"crtr.profile.search.up">, BindingDefinition<"crtr.profile.search.down">, BindingDefinition<"crtr.profile.search.pick">, BindingDefinition<"crtr.profile.search.back">, BindingDefinition<"crtr.profile.search.delete">, BindingDefinition<"crtr.profile.search.abort">, BindingDefinition<"crtr.setup.cancel">, BindingDefinition<"crtr.setup.tab-next">, BindingDefinition<"crtr.setup.tab-previous">, BindingDefinition<"crtr.setup.open">, BindingDefinition<"crtr.setup.list-down">, BindingDefinition<"crtr.setup.list-up">, BindingDefinition<"crtr.setup.toggle">, BindingDefinition<"crtr.setup.details">, BindingDefinition<"crtr.setup.advance">, BindingDefinition<"crtr.setup.confirm.accept">, BindingDefinition<"crtr.setup.confirm.back">, BindingDefinition<"crtr.setup.keybindings.edit">, BindingDefinition<"crtr.setup.keybindings.commit-edit">, BindingDefinition<"crtr.setup.keybindings.cancel-edit">, BindingDefinition<"crtr.setup.keybindings.unbind">, BindingDefinition<"crtr.setup.keybindings.reset-row">, BindingDefinition<"crtr.setup.keybindings.reset-all">, BindingDefinition<"crtr.setup.keybindings.save">, BindingDefinition<"crtr.setup.keybindings.discard">, BindingDefinition<"crtr.setup.keybindings.page-up">, BindingDefinition<"crtr.setup.keybindings.page-down">, BindingDefinition<"crtr.setup.keybindings.filter">, BindingDefinition<"crtr.setup.keybindings.filter-delete">, BindingDefinition<"crtr.setup.keybindings.filter-clear">, BindingDefinition<"crtr.setup.cell-previous">, BindingDefinition<"crtr.setup.cell-next">, BindingDefinition<"crtr.setup.models.open">, BindingDefinition<"crtr.setup.models.scope-next">, BindingDefinition<"crtr.setup.models.commit">, BindingDefinition<"crtr.setup.models.cancel">];
13
14
  export declare const BINDING_IDS: ReadonlySet<string>;
14
15
  /** True for an action whose direct gesture is handled inside an attach viewer.
15
16
  * Tmux menu selectors and root shortcuts are chrome, not pane input. */
@@ -12,12 +12,12 @@ function binding(id, group, name, description, defaults, inputKind, contexts, sa
12
12
  });
13
13
  }
14
14
  const b = binding;
15
- function menuEntry(action, name, description, defaults, contexts) {
15
+ function menuEntry(action, name, description, defaults, contexts, globalDefaults = []) {
16
16
  const menuId = `crtr.tmux.menu.${action}`;
17
17
  const globalId = `crtr.tmux.menu-global.${action}`;
18
18
  return [
19
19
  b(menuId, 'Global tmux', name, description, defaults, 'tmux-menu-selector', contexts, undefined, { field: 'menu', pairedId: globalId }),
20
- b(globalId, 'Global tmux', name, description, [], 'tmux-global-action', ['tmux.root'], undefined, { field: 'global', pairedId: menuId }),
20
+ b(globalId, 'Global tmux', name, description, globalDefaults, 'tmux-global-action', ['tmux.root'], undefined, { field: 'global', pairedId: menuId }),
21
21
  ];
22
22
  }
23
23
  function attachEntry(menuId, actionId, name, description,
@@ -38,6 +38,7 @@ const SETUP_TAB_CONTEXTS = ['setup.login', 'setup.list', 'setup.keybindings', 's
38
38
  export const BINDING_CATALOG = Object.freeze([
39
39
  b('crtr.tmux.menu.open', 'Global tmux', 'Open crouter menu', 'Open the crouter action menu.', ['alt+c'], 'host-global', ['tmux.root']),
40
40
  b('crtr.tmux.menu.attach', 'Global tmux', 'Attach actions', 'Open the attach-viewer action submenu.', ['a'], 'tmux-menu-selector', ['tmux.menu']),
41
+ ...menuEntry('dashboard', 'Dashboard', 'Show the live root conversations in this pane: which need you, which are running, which are idle.', ['w'], ['tmux.menu'], ['alt+shift+d']),
41
42
  ...menuEntry('promote', 'Promote to orchestrator', 'Promote the focused node to orchestrator — it holds a roadmap and delegates.', ['o'], ['tmux.menu']),
42
43
  ...menuEntry('demote-mode', 'Demote to base node', 'Demote the focused orchestrator back to a base node — hands-on again in its own window, no roadmap to drive.', ['shift+o'], ['tmux.menu']),
43
44
  ...menuEntry('resume', 'Find node', 'Open the canvas navigator and go to the chosen node.', ['/'], ['tmux.menu']),
@@ -129,6 +130,7 @@ export const BINDING_CATALOG = Object.freeze([
129
130
  b('crtr.inspector.refresh', 'Inspector', 'Refresh', 'Refresh the Inspector now.', ['g', 'r'], 'terminal', ['inspector']),
130
131
  b('crtr.inspector.quit', 'Inspector', 'Quit', 'Leave the Inspector.', ['q'], 'terminal', ['inspector'], 'leave-screen'),
131
132
  ...browseBindings(),
133
+ ...dashboardBindings(),
132
134
  ...profileBindings(),
133
135
  ...setupBindings(),
134
136
  ]);
@@ -166,6 +168,33 @@ function browseBindings() {
166
168
  b('crtr.browse.search.quit', 'Browse and pickers', 'Quit browse', 'Leave canvas browse from search.', ['ctrl+c'], 'terminal', ['browse.search'], 'leave-screen'),
167
169
  ];
168
170
  }
171
+ function dashboardBindings() {
172
+ const ctx = 'dashboard';
173
+ const confirm = 'dashboard.confirm';
174
+ const input = 'dashboard.input';
175
+ const g = 'Dashboard';
176
+ return [
177
+ b('crtr.dashboard.down', g, 'Move down', 'Move to the next row.', ['j', 'down'], 'terminal', [ctx]),
178
+ b('crtr.dashboard.up', g, 'Move up', 'Move to the previous row.', ['k', 'up'], 'terminal', [ctx]),
179
+ b('crtr.dashboard.first', g, 'First row', 'Move to the first row.', ['g'], 'terminal', [ctx]),
180
+ b('crtr.dashboard.last', g, 'Last row', 'Move to the last row.', ['shift+g'], 'terminal', [ctx]),
181
+ b('crtr.dashboard.expand', g, 'Expand', 'Show the selected conversation’s children.', ['l', 'right'], 'terminal', [ctx]),
182
+ b('crtr.dashboard.collapse', g, 'Collapse', 'Hide the selected conversation’s children.', ['h', 'left'], 'terminal', [ctx]),
183
+ b('crtr.dashboard.open', g, 'Open', 'Open the selected conversation in this pane.', ['enter'], 'terminal', [ctx]),
184
+ b('crtr.dashboard.pin', g, 'Pin', 'Star or unstar the selected conversation.', ['p'], 'terminal', [ctx]),
185
+ b('crtr.dashboard.rename', g, 'Rename', 'Rename the selected conversation.', ['shift+r'], 'terminal', [ctx]),
186
+ b('crtr.dashboard.close', g, 'Close', 'Finish the selected conversation and remove its row.', ['x'], 'terminal', [ctx]),
187
+ b('crtr.dashboard.confirm-close', g, 'Confirm close', 'Close a conversation that is running.', ['y'], 'terminal', [confirm]),
188
+ b('crtr.dashboard.cancel-close', g, 'Cancel close', 'Keep the running conversation.', ['n', 'escape'], 'terminal', [confirm]),
189
+ b('crtr.dashboard.profile', g, 'Toggle profile', 'Switch between this profile and all profiles.', ['shift+p'], 'terminal', [ctx]),
190
+ b('crtr.dashboard.input', g, 'New conversation', 'Focus the new-conversation input.', ['n'], 'terminal', [ctx]),
191
+ b('crtr.dashboard.input-cancel', g, 'Leave input', 'Leave the input without clearing it.', ['escape'], 'terminal', [input]),
192
+ b('crtr.dashboard.input-submit', g, 'Start conversation', 'Start a root conversation from the input text.', ['enter'], 'terminal', [input]),
193
+ b('crtr.dashboard.directory-next', g, 'Next directory', 'Select the next directory for the new conversation.', ['tab'], 'terminal', [input]),
194
+ b('crtr.dashboard.directory-previous', g, 'Previous directory', 'Select the previous directory for the new conversation.', ['shift+tab'], 'terminal', [input]),
195
+ b('crtr.dashboard.help', g, 'Help', 'Show the dashboard keys.', ['?'], 'terminal', [ctx]),
196
+ ];
197
+ }
169
198
  function profileBindings() {
170
199
  const menu = 'profile.menu';
171
200
  const search = 'profile.search';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@north-light/api",
3
- "version": "0.3.504",
3
+ "version": "0.3.505",
4
4
  "description": "Typed crtrd /v1 API contract — DTOs, route builders, the error contract, the CrtrClient, and the command-plugin manifest format. Zero runtime dependencies.",
5
5
  "type": "module",
6
6
  "main": "./dist/api/index.js",