@qontinui/shared-types 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/runner.d.cts CHANGED
@@ -31,6 +31,73 @@ interface RunnerCrash {
31
31
  thread: string;
32
32
  }
33
33
 
34
+ /* eslint-disable */
35
+ /**
36
+ * This file was automatically generated.
37
+ * DO NOT MODIFY IT BY HAND. Regenerate with `just generate-types` or
38
+ * `qontinui-runner/src-tauri/scripts/generate_types.sh`.
39
+ */
40
+
41
+ /**
42
+ * Which role a runner instance plays on its machine.
43
+ *
44
+ * Every runner instance on one box presents the SAME machine `device_id`, so
45
+ * the role is what separates the canonical instance from the supervisor-spawned
46
+ * ones sharing its row. Reported by the runner in `runner_info` as the
47
+ * top-level `instanceRole`.
48
+ */
49
+ type RunnerInstanceRole = "primary" | "secondary";
50
+
51
+ /* eslint-disable */
52
+ /**
53
+ * This file was automatically generated.
54
+ * DO NOT MODIFY IT BY HAND. Regenerate with `just generate-types` or
55
+ * `qontinui-runner/src-tauri/scripts/generate_types.sh`.
56
+ */
57
+
58
+
59
+
60
+ /**
61
+ * One live runner instance under a [`Runner`] (machine) row.
62
+ *
63
+ * A machine can host several runner instances at once — the primary on
64
+ * `:9876` and supervisor-spawned secondaries on `:9877-9899` — all presenting
65
+ * the one machine `device_id`, so they share a single [`Runner`] row. One
66
+ * entry per currently connected instance lets a consumer address `:9876` and
67
+ * `:9877` on the same box separately rather than seeing only whichever
68
+ * instance wrote the row's `port` last (plan
69
+ * `2026-09-20-runner-selector-drives-a-transport-not-a-target`, reading A0.2
70
+ * and Phase 6).
71
+ */
72
+ interface RunnerInstance {
73
+ /**
74
+ * ISO 8601 timestamp when this instance's current WebSocket connection
75
+ * was established.
76
+ */
77
+ connectedAt: string;
78
+ /**
79
+ * Per-instance key, reported by the runner as `instanceKey`. Built from
80
+ * namespaced sources so no source can spell another's key: `"primary"`
81
+ * for the primary; `"runner:<id>"` for a supervisor-spawned secondary
82
+ * (supervisor-assigned ids are unique, and a named runner's id is reused
83
+ * across its restarts); `"name:<name>"` for a secondary carrying only an
84
+ * instance name; `"port:<port>"` for a nameless one (stable only while it
85
+ * keeps that port). NOT guaranteed unique: two processes that each believe
86
+ * themselves the primary both report `"primary"`, so a consumer must treat
87
+ * two live instances with the same key as a conflict, never as one
88
+ * overwriting the other.
89
+ */
90
+ instanceKey: string;
91
+ /**
92
+ * Whether this instance is the machine's primary or a secondary.
93
+ */
94
+ instanceRole: RunnerInstanceRole;
95
+ /**
96
+ * Port this instance's HTTP API is listening on, if reported.
97
+ */
98
+ port?: number | null;
99
+ }
100
+
34
101
  /* eslint-disable */
35
102
  /**
36
103
  * This file was automatically generated.
@@ -115,6 +182,13 @@ interface Runner {
115
182
  * Runner identifier (UUID as a string).
116
183
  */
117
184
  id: string;
185
+ /**
186
+ * Currently connected runner instances on this machine, one entry per
187
+ * instance (see [`RunnerInstance`]). Empty when none is connected — and
188
+ * when the serving backend predates per-instance rows and omits the
189
+ * field, so absence deserializes to an empty list rather than failing.
190
+ */
191
+ instances: RunnerInstance[];
118
192
  /**
119
193
  * Reported network address the runner is reachable on.
120
194
  */
package/dist/runner.d.ts CHANGED
@@ -31,6 +31,73 @@ interface RunnerCrash {
31
31
  thread: string;
32
32
  }
33
33
 
34
+ /* eslint-disable */
35
+ /**
36
+ * This file was automatically generated.
37
+ * DO NOT MODIFY IT BY HAND. Regenerate with `just generate-types` or
38
+ * `qontinui-runner/src-tauri/scripts/generate_types.sh`.
39
+ */
40
+
41
+ /**
42
+ * Which role a runner instance plays on its machine.
43
+ *
44
+ * Every runner instance on one box presents the SAME machine `device_id`, so
45
+ * the role is what separates the canonical instance from the supervisor-spawned
46
+ * ones sharing its row. Reported by the runner in `runner_info` as the
47
+ * top-level `instanceRole`.
48
+ */
49
+ type RunnerInstanceRole = "primary" | "secondary";
50
+
51
+ /* eslint-disable */
52
+ /**
53
+ * This file was automatically generated.
54
+ * DO NOT MODIFY IT BY HAND. Regenerate with `just generate-types` or
55
+ * `qontinui-runner/src-tauri/scripts/generate_types.sh`.
56
+ */
57
+
58
+
59
+
60
+ /**
61
+ * One live runner instance under a [`Runner`] (machine) row.
62
+ *
63
+ * A machine can host several runner instances at once — the primary on
64
+ * `:9876` and supervisor-spawned secondaries on `:9877-9899` — all presenting
65
+ * the one machine `device_id`, so they share a single [`Runner`] row. One
66
+ * entry per currently connected instance lets a consumer address `:9876` and
67
+ * `:9877` on the same box separately rather than seeing only whichever
68
+ * instance wrote the row's `port` last (plan
69
+ * `2026-09-20-runner-selector-drives-a-transport-not-a-target`, reading A0.2
70
+ * and Phase 6).
71
+ */
72
+ interface RunnerInstance {
73
+ /**
74
+ * ISO 8601 timestamp when this instance's current WebSocket connection
75
+ * was established.
76
+ */
77
+ connectedAt: string;
78
+ /**
79
+ * Per-instance key, reported by the runner as `instanceKey`. Built from
80
+ * namespaced sources so no source can spell another's key: `"primary"`
81
+ * for the primary; `"runner:<id>"` for a supervisor-spawned secondary
82
+ * (supervisor-assigned ids are unique, and a named runner's id is reused
83
+ * across its restarts); `"name:<name>"` for a secondary carrying only an
84
+ * instance name; `"port:<port>"` for a nameless one (stable only while it
85
+ * keeps that port). NOT guaranteed unique: two processes that each believe
86
+ * themselves the primary both report `"primary"`, so a consumer must treat
87
+ * two live instances with the same key as a conflict, never as one
88
+ * overwriting the other.
89
+ */
90
+ instanceKey: string;
91
+ /**
92
+ * Whether this instance is the machine's primary or a secondary.
93
+ */
94
+ instanceRole: RunnerInstanceRole;
95
+ /**
96
+ * Port this instance's HTTP API is listening on, if reported.
97
+ */
98
+ port?: number | null;
99
+ }
100
+
34
101
  /* eslint-disable */
35
102
  /**
36
103
  * This file was automatically generated.
@@ -115,6 +182,13 @@ interface Runner {
115
182
  * Runner identifier (UUID as a string).
116
183
  */
117
184
  id: string;
185
+ /**
186
+ * Currently connected runner instances on this machine, one entry per
187
+ * instance (see [`RunnerInstance`]). Empty when none is connected — and
188
+ * when the serving backend predates per-instance rows and omits the
189
+ * field, so absence deserializes to an empty list rather than failing.
190
+ */
191
+ instances: RunnerInstance[];
118
192
  /**
119
193
  * Reported network address the runner is reachable on.
120
194
  */
@@ -1132,31 +1132,6 @@ interface DevSeedFindingPayload {
1132
1132
  [k: string]: unknown;
1133
1133
  }
1134
1134
 
1135
- /* eslint-disable */
1136
- /**
1137
- * This file was automatically generated.
1138
- * DO NOT MODIFY IT BY HAND. Regenerate with `just generate-types` or
1139
- * `qontinui-runner/src-tauri/scripts/generate_types.sh`.
1140
- */
1141
-
1142
- /**
1143
- * Payload shape for the `review-approved` and `review-rejected` Tauri events
1144
- * emitted by `commands::productivity::approve_recommendation` /
1145
- * `reject_recommendation` after a user resolves a medium-confidence
1146
- * recommendation card. Field names are explicit camelCase to match the
1147
- * `serde_json::json!()` literal previously used at the emit site.
1148
- *
1149
- * Single struct shared by both channels: only `user_decision` differs
1150
- * (`"approved"` vs `"rejected"`), so a tagged enum would inflate the wire
1151
- * format without payoff.
1152
- */
1153
- interface RecommendationReviewDecisionPayload {
1154
- reviewId: string;
1155
- taskId: string;
1156
- userDecision: string;
1157
- [k: string]: unknown;
1158
- }
1159
-
1160
1135
  /* eslint-disable */
1161
1136
  /**
1162
1137
  * This file was automatically generated.
@@ -1270,4 +1245,4 @@ interface UiBridgeResponseEnvelope {
1270
1245
  [k: string]: unknown;
1271
1246
  }
1272
1247
 
1273
- export type { AppEvent, CanvasPanel as CanvasUpdatePanel, DevSeedFindingPayload, RecommendationReviewDecisionPayload, RunnerConnectedConnection, RunnerFinding, RunnerFindingCodeContext, RunnerFindingUserInput, RunnerRelayMessage, RunnerStatusEvent, TerminalExitEvent, TerminalInfo, TerminalOutputEvent, UiBridgeRequestEnvelope, UiBridgeResponseEnvelope };
1248
+ export type { AppEvent, CanvasPanel as CanvasUpdatePanel, DevSeedFindingPayload, RunnerConnectedConnection, RunnerFinding, RunnerFindingCodeContext, RunnerFindingUserInput, RunnerRelayMessage, RunnerStatusEvent, TerminalExitEvent, TerminalInfo, TerminalOutputEvent, UiBridgeRequestEnvelope, UiBridgeResponseEnvelope };
@@ -1132,31 +1132,6 @@ interface DevSeedFindingPayload {
1132
1132
  [k: string]: unknown;
1133
1133
  }
1134
1134
 
1135
- /* eslint-disable */
1136
- /**
1137
- * This file was automatically generated.
1138
- * DO NOT MODIFY IT BY HAND. Regenerate with `just generate-types` or
1139
- * `qontinui-runner/src-tauri/scripts/generate_types.sh`.
1140
- */
1141
-
1142
- /**
1143
- * Payload shape for the `review-approved` and `review-rejected` Tauri events
1144
- * emitted by `commands::productivity::approve_recommendation` /
1145
- * `reject_recommendation` after a user resolves a medium-confidence
1146
- * recommendation card. Field names are explicit camelCase to match the
1147
- * `serde_json::json!()` literal previously used at the emit site.
1148
- *
1149
- * Single struct shared by both channels: only `user_decision` differs
1150
- * (`"approved"` vs `"rejected"`), so a tagged enum would inflate the wire
1151
- * format without payoff.
1152
- */
1153
- interface RecommendationReviewDecisionPayload {
1154
- reviewId: string;
1155
- taskId: string;
1156
- userDecision: string;
1157
- [k: string]: unknown;
1158
- }
1159
-
1160
1135
  /* eslint-disable */
1161
1136
  /**
1162
1137
  * This file was automatically generated.
@@ -1270,4 +1245,4 @@ interface UiBridgeResponseEnvelope {
1270
1245
  [k: string]: unknown;
1271
1246
  }
1272
1247
 
1273
- export type { AppEvent, CanvasPanel as CanvasUpdatePanel, DevSeedFindingPayload, RecommendationReviewDecisionPayload, RunnerConnectedConnection, RunnerFinding, RunnerFindingCodeContext, RunnerFindingUserInput, RunnerRelayMessage, RunnerStatusEvent, TerminalExitEvent, TerminalInfo, TerminalOutputEvent, UiBridgeRequestEnvelope, UiBridgeResponseEnvelope };
1248
+ export type { AppEvent, CanvasPanel as CanvasUpdatePanel, DevSeedFindingPayload, RunnerConnectedConnection, RunnerFinding, RunnerFindingCodeContext, RunnerFindingUserInput, RunnerRelayMessage, RunnerStatusEvent, TerminalExitEvent, TerminalInfo, TerminalOutputEvent, UiBridgeRequestEnvelope, UiBridgeResponseEnvelope };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qontinui/shared-types",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "Shared TypeScript types for the Qontinui ecosystem",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -6,6 +6,8 @@
6
6
  */
7
7
 
8
8
  import type { RunnerCrash } from "./RunnerCrash";
9
+ import type { RunnerInstance } from "./RunnerInstance";
10
+ import type { RunnerInstanceRole } from "./RunnerInstanceRole";
9
11
  import type { RunnerStatus } from "./RunnerStatus";
10
12
  import type { RunnerUiError } from "./RunnerUiError";
11
13
 
@@ -41,6 +43,13 @@ export interface Runner {
41
43
  * Runner identifier (UUID as a string).
42
44
  */
43
45
  id: string;
46
+ /**
47
+ * Currently connected runner instances on this machine, one entry per
48
+ * instance (see [`RunnerInstance`]). Empty when none is connected — and
49
+ * when the serving backend predates per-instance rows and omits the
50
+ * field, so absence deserializes to an empty list rather than failing.
51
+ */
52
+ instances: RunnerInstance[];
44
53
  /**
45
54
  * Reported network address the runner is reachable on.
46
55
  */
@@ -0,0 +1,49 @@
1
+ /* eslint-disable */
2
+ /**
3
+ * This file was automatically generated.
4
+ * DO NOT MODIFY IT BY HAND. Regenerate with `just generate-types` or
5
+ * `qontinui-runner/src-tauri/scripts/generate_types.sh`.
6
+ */
7
+
8
+ import type { RunnerInstanceRole } from "./RunnerInstanceRole";
9
+
10
+ /**
11
+ * One live runner instance under a [`Runner`] (machine) row.
12
+ *
13
+ * A machine can host several runner instances at once — the primary on
14
+ * `:9876` and supervisor-spawned secondaries on `:9877-9899` — all presenting
15
+ * the one machine `device_id`, so they share a single [`Runner`] row. One
16
+ * entry per currently connected instance lets a consumer address `:9876` and
17
+ * `:9877` on the same box separately rather than seeing only whichever
18
+ * instance wrote the row's `port` last (plan
19
+ * `2026-09-20-runner-selector-drives-a-transport-not-a-target`, reading A0.2
20
+ * and Phase 6).
21
+ */
22
+ export interface RunnerInstance {
23
+ /**
24
+ * ISO 8601 timestamp when this instance's current WebSocket connection
25
+ * was established.
26
+ */
27
+ connectedAt: string;
28
+ /**
29
+ * Per-instance key, reported by the runner as `instanceKey`. Built from
30
+ * namespaced sources so no source can spell another's key: `"primary"`
31
+ * for the primary; `"runner:<id>"` for a supervisor-spawned secondary
32
+ * (supervisor-assigned ids are unique, and a named runner's id is reused
33
+ * across its restarts); `"name:<name>"` for a secondary carrying only an
34
+ * instance name; `"port:<port>"` for a nameless one (stable only while it
35
+ * keeps that port). NOT guaranteed unique: two processes that each believe
36
+ * themselves the primary both report `"primary"`, so a consumer must treat
37
+ * two live instances with the same key as a conflict, never as one
38
+ * overwriting the other.
39
+ */
40
+ instanceKey: string;
41
+ /**
42
+ * Whether this instance is the machine's primary or a secondary.
43
+ */
44
+ instanceRole: RunnerInstanceRole;
45
+ /**
46
+ * Port this instance's HTTP API is listening on, if reported.
47
+ */
48
+ port?: number | null;
49
+ }
@@ -0,0 +1,16 @@
1
+ /* eslint-disable */
2
+ /**
3
+ * This file was automatically generated.
4
+ * DO NOT MODIFY IT BY HAND. Regenerate with `just generate-types` or
5
+ * `qontinui-runner/src-tauri/scripts/generate_types.sh`.
6
+ */
7
+
8
+ /**
9
+ * Which role a runner instance plays on its machine.
10
+ *
11
+ * Every runner instance on one box presents the SAME machine `device_id`, so
12
+ * the role is what separates the canonical instance from the supervisor-spawned
13
+ * ones sharing its row. Reported by the runner in `runner_info` as the
14
+ * top-level `instanceRole`.
15
+ */
16
+ export type RunnerInstanceRole = "primary" | "secondary";
@@ -51,43 +51,30 @@ export interface UIBridgeElement {
51
51
  *
52
52
  * Absent (`None`) means the element declares none. That is deliberately
53
53
  * distinct from an empty list, which would mean "declared, and empty".
54
- * ---
55
54
  *
56
- * **TRANSITIONAL: this field also accepts the legacy bare-NAME form on the
57
- * way in.** `["sendKeys"]` deserializes as
58
- * `[ElementActionInfo { id: "sendKeys", .. }]`, with every other field —
59
- * `effect` included — left `None`, i.e. UNCLASSIFIED. See
60
- * [`deserialize_custom_actions`].
61
- *
62
- * **Why a shim exists at all**, when this workspace's rule is
63
- * delete-over-deprecate. The shape change spans three repos that cannot
64
- * land atomically — this crate owns the type, `ui-bridge` emits, and
65
- * `qontinui-runner` parses live SDK snapshots strictly
66
- * (`spec-check/src/fetch.rs`, `spec_api/spec_check.rs`) while pinning a
67
- * PUBLISHED SDK. Both two-party orderings leave a window in which the
68
- * fleet is broken: land this crate first and the runner rejects the names
69
- * the published SDK still emits; land the SDK first and it emits objects
70
- * at a runner whose type is still `Vec<String>`. Only a tolerant READER
71
- * removes the window, and there is one reader against nine emitters.
72
- *
73
- * This is NOT here to spare a caller a breaking change — that is never a
74
- * reason in this workspace.
75
- *
76
- * **DELETE ME, and the trigger is observable rather than intentional:**
77
- * once no emitter produces names — `ui-bridge`'s eight element
78
- * projections plus `qontinui-runner`'s
79
- * `src/services/background-observer-service.ts` — and the runner's SDK pin
80
- * has moved past that release, remove [`deserialize_custom_actions`] and
81
- * this attribute, and flip
82
- * `ui_bridge_element_tolerates_legacy_name_custom_actions` into a test
83
- * that asserts a bare string is REJECTED. Plan
55
+ * **The bare-NAME form is REJECTED.** A transitional shim accepted
56
+ * `["sendKeys"]` here while the shape change rolled across three repos
57
+ * that cannot land atomically. It was deleted once its own observable
58
+ * trigger was met: no emitter produces names (every `ui-bridge` element
59
+ * projection routes through `serializeElementCustomActions`, and
60
+ * `qontinui-runner`'s `src/services/background-observer-service.ts` --
61
+ * the ninth emitter -- does too), and the runner's SDK pin moved to
62
+ * `@qontinui/ui-bridge` `^0.27.0`. Plan
84
63
  * `2026-09-04-effect-calculus-joins-the-component-action-registry`,
85
64
  * Design decision 4, step 5.
86
65
  *
87
- * The published SCHEMA is deliberately not widened to advertise the name
88
- * form: the schema states the target contract, while the reader is
89
- * transitionally lenient. A producer validating against the schema is
90
- * correctly told that names are not the shape to emit.
66
+ * The shim's deletion also required retiring the two recorded fixtures
67
+ * that still carried names. That was admissible because the UI Bridge has
68
+ * exactly one consumer -- Qontinui itself -- so "deployed apps still
69
+ * emitting the old wire", the reason the wire gate keeps fixtures
70
+ * append-only, has no instances. Both were REPLACED by captures from
71
+ * 0.27.0 rather than merely dropped, so the gate still parses genuine SDK
72
+ * output; it now parses the object form instead of the name form.
73
+ *
74
+ * Rejecting is the point, not a side effect: a name carries no `effect`,
75
+ * so anything still emitting one would be shipping UNCLASSIFIED actions
76
+ * to a consumer that must treat unclassified as unsafe. A hard parse
77
+ * error names that producer; silent tolerance hid it.
91
78
  */
92
79
  customActions?: ElementActionInfo[] | null;
93
80
  /**
@@ -332,7 +332,6 @@ export type { RagCompletionEvent } from './RagCompletionEvent';
332
332
  export type { RagProcessingStatus } from './RagProcessingStatus';
333
333
  export type { RagProgressEvent } from './RagProgressEvent';
334
334
  export type { ReadConfigResponse } from './ReadConfigResponse';
335
- export type { RecommendationReviewDecisionPayload } from './RecommendationReviewDecisionPayload';
336
335
  export type { RecommendedState } from './RecommendedState';
337
336
  export type { RecordGitOpRequest } from './RecordGitOpRequest';
338
337
  export type { ReflectionFixOutput } from './ReflectionFixOutput';
@@ -361,6 +360,8 @@ export type { RunnerCrash } from './RunnerCrash';
361
360
  export type { RunnerFinding } from './RunnerFinding';
362
361
  export type { RunnerFindingCodeContext } from './RunnerFindingCodeContext';
363
362
  export type { RunnerFindingUserInput } from './RunnerFindingUserInput';
363
+ export type { RunnerInstance } from './RunnerInstance';
364
+ export type { RunnerInstanceRole } from './RunnerInstanceRole';
364
365
  export type { RunnerMetadata } from './RunnerMetadata';
365
366
  export type { RunnerRelayMessage } from './RunnerRelayMessage';
366
367
  export type { RunnerStatus } from './RunnerStatus';
@@ -63,11 +63,6 @@ export type { RunnerConnectedConnection } from "../generated/RunnerConnectedConn
63
63
  // fields so the TS listener can spread them straight into a Finding. ──
64
64
  export type { DevSeedFindingPayload } from "../generated/DevSeedFindingPayload";
65
65
 
66
- // ── Recommendation review decision payloads (`review-approved` /
67
- // `review-rejected` from `commands/productivity.rs`). One struct
68
- // covers both channels — only `userDecision` differs. ──
69
- export type { RecommendationReviewDecisionPayload } from "../generated/RecommendationReviewDecisionPayload";
70
-
71
66
  // ── Canvas panel payload carried inside AppEvent::CanvasUpdate's
72
67
  // `data.panel` field. Wire-format mirror of the runner's `StoredPanel`
73
68
  // (`mcp/canvas.rs`). The hand-written `CanvasPanel` in `../canvas/index.ts`
@@ -1,24 +0,0 @@
1
- /* eslint-disable */
2
- /**
3
- * This file was automatically generated.
4
- * DO NOT MODIFY IT BY HAND. Regenerate with `just generate-types` or
5
- * `qontinui-runner/src-tauri/scripts/generate_types.sh`.
6
- */
7
-
8
- /**
9
- * Payload shape for the `review-approved` and `review-rejected` Tauri events
10
- * emitted by `commands::productivity::approve_recommendation` /
11
- * `reject_recommendation` after a user resolves a medium-confidence
12
- * recommendation card. Field names are explicit camelCase to match the
13
- * `serde_json::json!()` literal previously used at the emit site.
14
- *
15
- * Single struct shared by both channels: only `user_decision` differs
16
- * (`"approved"` vs `"rejected"`), so a tagged enum would inflate the wire
17
- * format without payoff.
18
- */
19
- export interface RecommendationReviewDecisionPayload {
20
- reviewId: string;
21
- taskId: string;
22
- userDecision: string;
23
- [k: string]: unknown;
24
- }