@qontinui/shared-types 2.1.0 → 2.3.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/refusal.d.cts +17 -0
- package/dist/refusal.d.ts +17 -0
- package/package.json +1 -1
- package/src/generated/BoundKind.d.ts +11 -0
- package/src/generated/BoundedReadMeta.d.ts +95 -0
- package/src/generated/CapabilityState.d.ts +25 -0
- package/src/generated/CliProfile.d.ts +492 -0
- package/src/generated/FilterNarrowing.d.ts +35 -0
- package/src/generated/FrontierEntry.d.ts +62 -0
- package/src/generated/JourneyEdgeObservation.d.ts +91 -0
- package/src/generated/JourneyLedgerHealth.d.ts +21 -0
- package/src/generated/JourneyNode.d.ts +72 -0
- package/src/generated/JourneyTrigger.d.ts +47 -0
- package/src/generated/NextAction.d.ts +4 -0
- package/src/generated/RefusalCode.d.ts +13 -0
- package/src/generated/SessionFailure.d.ts +129 -0
- package/src/generated/index.ts +11 -0
package/dist/refusal.d.cts
CHANGED
|
@@ -50,6 +50,10 @@ interface NextAction {
|
|
|
50
50
|
/**
|
|
51
51
|
* What the action applies to: the command to run, the page to open, the
|
|
52
52
|
* setting to set, the gate to wait for. Its meaning is fixed by `kind`.
|
|
53
|
+
* On [`NextActionKind::RetryLater`] it is what to re-check BEFORE
|
|
54
|
+
* retrying, because the earlier attempt may already have taken effect (a
|
|
55
|
+
* [`RefusalCode::UpstreamTimeout`] write); [`NextAction::render`] then
|
|
56
|
+
* says so. Omit it on a retry that is safe to repeat blindly.
|
|
53
57
|
*/
|
|
54
58
|
target?: string | null;
|
|
55
59
|
/**
|
|
@@ -80,6 +84,19 @@ type RefusalCode =
|
|
|
80
84
|
| "sibling_checkout_absent"
|
|
81
85
|
| "endpoint_unresolved"
|
|
82
86
|
| "glossary_term_unknown"
|
|
87
|
+
| "authentication_required"
|
|
88
|
+
| "credential_rejected"
|
|
89
|
+
| "permission_denied"
|
|
90
|
+
| "not_found"
|
|
91
|
+
| "conflict"
|
|
92
|
+
| "invalid_request"
|
|
93
|
+
| "rate_limited"
|
|
94
|
+
| "quota_exceeded"
|
|
95
|
+
| "upstream_unavailable"
|
|
96
|
+
| "upstream_timeout"
|
|
97
|
+
| "device_not_connected"
|
|
98
|
+
| "service_unavailable"
|
|
99
|
+
| "internal_error"
|
|
83
100
|
| "unknown";
|
|
84
101
|
|
|
85
102
|
/* eslint-disable */
|
package/dist/refusal.d.ts
CHANGED
|
@@ -50,6 +50,10 @@ interface NextAction {
|
|
|
50
50
|
/**
|
|
51
51
|
* What the action applies to: the command to run, the page to open, the
|
|
52
52
|
* setting to set, the gate to wait for. Its meaning is fixed by `kind`.
|
|
53
|
+
* On [`NextActionKind::RetryLater`] it is what to re-check BEFORE
|
|
54
|
+
* retrying, because the earlier attempt may already have taken effect (a
|
|
55
|
+
* [`RefusalCode::UpstreamTimeout`] write); [`NextAction::render`] then
|
|
56
|
+
* says so. Omit it on a retry that is safe to repeat blindly.
|
|
53
57
|
*/
|
|
54
58
|
target?: string | null;
|
|
55
59
|
/**
|
|
@@ -80,6 +84,19 @@ type RefusalCode =
|
|
|
80
84
|
| "sibling_checkout_absent"
|
|
81
85
|
| "endpoint_unresolved"
|
|
82
86
|
| "glossary_term_unknown"
|
|
87
|
+
| "authentication_required"
|
|
88
|
+
| "credential_rejected"
|
|
89
|
+
| "permission_denied"
|
|
90
|
+
| "not_found"
|
|
91
|
+
| "conflict"
|
|
92
|
+
| "invalid_request"
|
|
93
|
+
| "rate_limited"
|
|
94
|
+
| "quota_exceeded"
|
|
95
|
+
| "upstream_unavailable"
|
|
96
|
+
| "upstream_timeout"
|
|
97
|
+
| "device_not_connected"
|
|
98
|
+
| "service_unavailable"
|
|
99
|
+
| "internal_error"
|
|
83
100
|
| "unknown";
|
|
84
101
|
|
|
85
102
|
/* eslint-disable */
|
package/package.json
CHANGED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/* eslint-disable */
|
|
2
|
+
/**
|
|
3
|
+
* This file was automatically generated.
|
|
4
|
+
* DO NOT MODIFY IT BY HAND. Regenerate with
|
|
5
|
+
* `qontinui-runner/src-tauri/scripts/generate_types.sh`.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* The wire discriminant of a [`Bound`].
|
|
10
|
+
*/
|
|
11
|
+
export type BoundKind = "exact" | "at_least" | "complete" | "unknown";
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/* eslint-disable */
|
|
2
|
+
/**
|
|
3
|
+
* This file was automatically generated.
|
|
4
|
+
* DO NOT MODIFY IT BY HAND. Regenerate with
|
|
5
|
+
* `qontinui-runner/src-tauri/scripts/generate_types.sh`.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { BoundKind } from "./BoundKind";
|
|
9
|
+
import type { FilterNarrowing } from "./FilterNarrowing";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* The envelope keys every bounded read serves beside its own collection key
|
|
13
|
+
* (plan `2026-09-05-every-bounded-read-is-a-page-that-reads-as-a-corpus`,
|
|
14
|
+
* §3 Layer 2).
|
|
15
|
+
*
|
|
16
|
+
* **Every key is ALWAYS present, and `null` is a value here, not an
|
|
17
|
+
* absence.** This deliberately departs from the crate's
|
|
18
|
+
* `skip_serializing_if = "Option::is_none"` convention: `total: null` says "no
|
|
19
|
+
* count ran", `truncated: null` says "unknown", and `next_cursor: null` says
|
|
20
|
+
* "there is no next page" — each a positive statement a reader must be able
|
|
21
|
+
* to see, not a key it might be missing because of an older server.
|
|
22
|
+
*
|
|
23
|
+
* Enforced on all three sides, because an absent key that silently reads as
|
|
24
|
+
* `null` is exactly the "absent is UNKNOWN, never a default" defect:
|
|
25
|
+
* serialization never skips a field; every `Option` field carries
|
|
26
|
+
* `#[schemars(required, schema_with = "nullable::<T>")]` — `required` because
|
|
27
|
+
* schemars 1 otherwise omits an `Option` from `required` (the generated
|
|
28
|
+
* Pydantic model would then default a missing key to `None`), and
|
|
29
|
+
* `schema_with` because `required` alone makes schemars emit the INNER type's
|
|
30
|
+
* schema, dropping `null` so generated models reject the value this wire
|
|
31
|
+
* sends; and deserialization uses `Option::deserialize`, which refuses a
|
|
32
|
+
* MISSING key instead of defaulting it (serde's derive otherwise treats an
|
|
33
|
+
* absent `Option` as `None`). Pinning tests assert, structurally, that
|
|
34
|
+
* `required` is exactly the field set and that every nullable key admits
|
|
35
|
+
* `null`.
|
|
36
|
+
*
|
|
37
|
+
* `count` and `limit` keep the spellings list doors already serve (coord
|
|
38
|
+
* #1897 put `count` on every agent list door; web proxies and runner pollers
|
|
39
|
+
* read both), so merging this into an existing response rewrites them with
|
|
40
|
+
* the same values rather than moving them.
|
|
41
|
+
*/
|
|
42
|
+
export interface BoundedReadMeta {
|
|
43
|
+
/**
|
|
44
|
+
* `false` ONLY when the store is unprovisioned: an empty page with
|
|
45
|
+
* `available: false` is UNKNOWN, not "nothing matched".
|
|
46
|
+
*/
|
|
47
|
+
available: boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Which kind of bound produced `total` / `truncated`.
|
|
50
|
+
*/
|
|
51
|
+
bound_kind: BoundKind;
|
|
52
|
+
/**
|
|
53
|
+
* Rows in this page (the legacy spelling of `shown`).
|
|
54
|
+
*/
|
|
55
|
+
count: number;
|
|
56
|
+
/**
|
|
57
|
+
* For a relevance-RANKED read, which can never hand out a cursor: the
|
|
58
|
+
* door that enumerates the same corpus by an immutable sort key (plan
|
|
59
|
+
* `2026-09-05-every-bounded-read-is-a-page-that-reads-as-a-corpus` D8), so
|
|
60
|
+
* a `truncated: true, next_cursor: null` answer still says how to reach
|
|
61
|
+
* the rest. `null` on a keyset walk, whose `next_cursor` is the way on.
|
|
62
|
+
*/
|
|
63
|
+
enumerate_via: string | null;
|
|
64
|
+
/**
|
|
65
|
+
* A FILTER the surface narrowed before the read ran, or `null`.
|
|
66
|
+
*/
|
|
67
|
+
filter_narrowed: FilterNarrowing | null;
|
|
68
|
+
/**
|
|
69
|
+
* The cap actually applied to this page.
|
|
70
|
+
*/
|
|
71
|
+
limit: number;
|
|
72
|
+
/**
|
|
73
|
+
* The opaque token for the next page — pass it back verbatim as
|
|
74
|
+
* `cursor`. `null` iff `truncated` is not `true`, OR the read is a
|
|
75
|
+
* RANKING that cannot be paged — then `truncated` may be `true` with
|
|
76
|
+
* `next_cursor: null`, and `enumerate_via` names the door that walks the
|
|
77
|
+
* corpus by an immutable key.
|
|
78
|
+
*/
|
|
79
|
+
next_cursor: string | null;
|
|
80
|
+
/**
|
|
81
|
+
* Rows in this page.
|
|
82
|
+
*/
|
|
83
|
+
shown: number;
|
|
84
|
+
/**
|
|
85
|
+
* The exact match count from this page's start position — a number only
|
|
86
|
+
* when `bound_kind` is `exact`, else `null`.
|
|
87
|
+
*/
|
|
88
|
+
total: number | null;
|
|
89
|
+
/**
|
|
90
|
+
* Whether matching rows exist beyond this page; `null` when
|
|
91
|
+
* `bound_kind` is `unknown`.
|
|
92
|
+
*/
|
|
93
|
+
truncated: boolean | null;
|
|
94
|
+
[k: string]: unknown;
|
|
95
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/* eslint-disable */
|
|
2
|
+
/**
|
|
3
|
+
* This file was automatically generated.
|
|
4
|
+
* DO NOT MODIFY IT BY HAND. Regenerate with
|
|
5
|
+
* `qontinui-runner/src-tauri/scripts/generate_types.sh`.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Three-valued capability fact.
|
|
10
|
+
*
|
|
11
|
+
* `Unknown` is the default for anything a profile or catalog does not state.
|
|
12
|
+
* It is a distinct value from `Unsupported` on purpose: a boolean cannot
|
|
13
|
+
* represent "we never asked", and coercing that to "no" silently disables
|
|
14
|
+
* working capabilities.
|
|
15
|
+
*
|
|
16
|
+
* Moved here from qontinui-runner `src-tauri/src/model_catalog.rs` so the
|
|
17
|
+
* model/API layer (`ModelFacts`) and the CLI-session layer ([`CliProfile`])
|
|
18
|
+
* speak one tri-state; `model_catalog` re-exports it. Serialized as
|
|
19
|
+
* `"supported"` / `"unsupported"` / `"unknown"`.
|
|
20
|
+
*
|
|
21
|
+
* [`CapabilityState::Unknown`] must never be a reason to strip content or
|
|
22
|
+
* refuse a route. Callers that must act on an unknown fact should attempt the
|
|
23
|
+
* capability and let the backend be the authority.
|
|
24
|
+
*/
|
|
25
|
+
export type CapabilityState = "supported" | "unsupported" | "unknown";
|
|
@@ -0,0 +1,492 @@
|
|
|
1
|
+
/* eslint-disable */
|
|
2
|
+
/**
|
|
3
|
+
* This file was automatically generated.
|
|
4
|
+
* DO NOT MODIFY IT BY HAND. Regenerate with
|
|
5
|
+
* `qontinui-runner/src-tauri/scripts/generate_types.sh`.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { CapabilityState } from "./CapabilityState";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* How one account's CLI state is kept apart from another's.
|
|
12
|
+
*
|
|
13
|
+
* Wire shape (internally tagged with `"kind"`):
|
|
14
|
+
* - `{ "kind": "env_var", "name": "CLAUDE_CONFIG_DIR" }`
|
|
15
|
+
* - `{ "kind": "home_dir" }` / `{ "kind": "none" }` / `{ "kind": "unknown" }`
|
|
16
|
+
*/
|
|
17
|
+
export type AccountIsolation =
|
|
18
|
+
| {
|
|
19
|
+
kind: "env_var";
|
|
20
|
+
/**
|
|
21
|
+
* The variable's name (`"CLAUDE_CONFIG_DIR"`).
|
|
22
|
+
*/
|
|
23
|
+
name: string;
|
|
24
|
+
[k: string]: unknown;
|
|
25
|
+
}
|
|
26
|
+
| {
|
|
27
|
+
kind: "home_dir";
|
|
28
|
+
[k: string]: unknown;
|
|
29
|
+
}
|
|
30
|
+
| {
|
|
31
|
+
kind: "none";
|
|
32
|
+
[k: string]: unknown;
|
|
33
|
+
}
|
|
34
|
+
| {
|
|
35
|
+
kind: "unknown";
|
|
36
|
+
[k: string]: unknown;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* One way a CLI can be authenticated.
|
|
40
|
+
*
|
|
41
|
+
* Wire shape (internally tagged with `"kind"`):
|
|
42
|
+
* - `{ "kind": "cli_login", "args": ["login"] }`
|
|
43
|
+
* - `{ "kind": "api_key_env", "vars": ["OPENAI_API_KEY"] }`
|
|
44
|
+
*
|
|
45
|
+
* No `unknown` arm: an unknown auth story is an empty
|
|
46
|
+
* [`CliProfile::auth`] list.
|
|
47
|
+
*/
|
|
48
|
+
export type AuthMethod =
|
|
49
|
+
| {
|
|
50
|
+
/**
|
|
51
|
+
* Arguments after the program (`["login"]`, or `["/login"]` typed in
|
|
52
|
+
* the TUI).
|
|
53
|
+
*/
|
|
54
|
+
args: string[];
|
|
55
|
+
kind: "cli_login";
|
|
56
|
+
[k: string]: unknown;
|
|
57
|
+
}
|
|
58
|
+
| {
|
|
59
|
+
kind: "api_key_env";
|
|
60
|
+
/**
|
|
61
|
+
* Variable names, in the CLI's precedence order.
|
|
62
|
+
*/
|
|
63
|
+
vars: string[];
|
|
64
|
+
[k: string]: unknown;
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* How the CLI is launched without per-tool approval prompts.
|
|
68
|
+
*
|
|
69
|
+
* Wire shape (internally tagged with `"kind"`):
|
|
70
|
+
* - `{ "kind": "flags", "argv": ["--permission-mode", "bypassPermissions"],
|
|
71
|
+
* "detect": ["--dangerously-skip-permissions", "bypassPermissions"] }`
|
|
72
|
+
* - `{ "kind": "none" }` / `{ "kind": "unknown" }`
|
|
73
|
+
*/
|
|
74
|
+
export type AutoApprove =
|
|
75
|
+
| {
|
|
76
|
+
/**
|
|
77
|
+
* The flags the runner appends to enable auto-approval.
|
|
78
|
+
*/
|
|
79
|
+
argv: string[];
|
|
80
|
+
/**
|
|
81
|
+
* Tokens whose presence on an existing argv means auto-approval is
|
|
82
|
+
* already on — every spelling the CLI accepts, not only the one the
|
|
83
|
+
* runner writes.
|
|
84
|
+
*/
|
|
85
|
+
detect: string[];
|
|
86
|
+
kind: "flags";
|
|
87
|
+
[k: string]: unknown;
|
|
88
|
+
}
|
|
89
|
+
| {
|
|
90
|
+
kind: "none";
|
|
91
|
+
[k: string]: unknown;
|
|
92
|
+
}
|
|
93
|
+
| {
|
|
94
|
+
kind: "unknown";
|
|
95
|
+
[k: string]: unknown;
|
|
96
|
+
};
|
|
97
|
+
/**
|
|
98
|
+
* How the runner asks a live session to exit cleanly.
|
|
99
|
+
*
|
|
100
|
+
* Wire shape (internally tagged with `"kind"`):
|
|
101
|
+
* - `{ "kind": "typed_command", "text": "/exit" }`
|
|
102
|
+
* - `{ "kind": "signal" }` / `{ "kind": "unknown" }`
|
|
103
|
+
*
|
|
104
|
+
* `Unknown` means the runner must type nothing and report that it could not
|
|
105
|
+
* exit the session gracefully.
|
|
106
|
+
*/
|
|
107
|
+
export type GracefulExit =
|
|
108
|
+
| {
|
|
109
|
+
kind: "typed_command";
|
|
110
|
+
/**
|
|
111
|
+
* The command text (`"/exit"`).
|
|
112
|
+
*/
|
|
113
|
+
text: string;
|
|
114
|
+
[k: string]: unknown;
|
|
115
|
+
}
|
|
116
|
+
| {
|
|
117
|
+
kind: "signal";
|
|
118
|
+
[k: string]: unknown;
|
|
119
|
+
}
|
|
120
|
+
| {
|
|
121
|
+
kind: "unknown";
|
|
122
|
+
[k: string]: unknown;
|
|
123
|
+
};
|
|
124
|
+
/**
|
|
125
|
+
* How the runner learns a CLI session's id.
|
|
126
|
+
*
|
|
127
|
+
* Wire shape (internally tagged with `"kind"`):
|
|
128
|
+
* - `{ "kind": "pinned", "flag": "--session-id" }`
|
|
129
|
+
* - `{ "kind": "read_back", "capture": "codex_session_file" }`
|
|
130
|
+
* - `{ "kind": "unknown" }`
|
|
131
|
+
*/
|
|
132
|
+
export type IdentitySource =
|
|
133
|
+
| {
|
|
134
|
+
/**
|
|
135
|
+
* The flag that takes the id (`"--session-id"`).
|
|
136
|
+
*/
|
|
137
|
+
flag: string;
|
|
138
|
+
kind: "pinned";
|
|
139
|
+
[k: string]: unknown;
|
|
140
|
+
}
|
|
141
|
+
| {
|
|
142
|
+
/**
|
|
143
|
+
* Name of the runner capture mechanism that recovers the id
|
|
144
|
+
* (`"codex_session_file"`). The mechanism itself is runner behaviour.
|
|
145
|
+
*/
|
|
146
|
+
capture: string;
|
|
147
|
+
kind: "read_back";
|
|
148
|
+
[k: string]: unknown;
|
|
149
|
+
}
|
|
150
|
+
| {
|
|
151
|
+
kind: "unknown";
|
|
152
|
+
[k: string]: unknown;
|
|
153
|
+
};
|
|
154
|
+
/**
|
|
155
|
+
* What a restore of a CLI's session can honestly bring back.
|
|
156
|
+
*
|
|
157
|
+
* Serialized in the coord wire spelling the runner's `RestoreTier::wire_str`
|
|
158
|
+
* already uses: `"full"` / `"terminal_only"`.
|
|
159
|
+
*
|
|
160
|
+
* Defaults to `TerminalOnly` — the conservative claim: a profile that has not
|
|
161
|
+
* established resume must not promise the conversation back.
|
|
162
|
+
*/
|
|
163
|
+
export type RestoreTier = "full" | "terminal_only";
|
|
164
|
+
/**
|
|
165
|
+
* How a session is resumed by id.
|
|
166
|
+
*
|
|
167
|
+
* Wire shape (internally tagged with `"kind"`):
|
|
168
|
+
* - `{ "kind": "by_id_argv", "template": ["claude", "--resume", "{id}"] }`
|
|
169
|
+
* - `{ "kind": "none" }` / `{ "kind": "unknown" }`
|
|
170
|
+
*/
|
|
171
|
+
export type ResumeSpec =
|
|
172
|
+
| {
|
|
173
|
+
kind: "by_id_argv";
|
|
174
|
+
/**
|
|
175
|
+
* The argv template (`["codex", "resume", "{id}"]`).
|
|
176
|
+
*/
|
|
177
|
+
template: string[];
|
|
178
|
+
[k: string]: unknown;
|
|
179
|
+
}
|
|
180
|
+
| {
|
|
181
|
+
kind: "none";
|
|
182
|
+
[k: string]: unknown;
|
|
183
|
+
}
|
|
184
|
+
| {
|
|
185
|
+
kind: "unknown";
|
|
186
|
+
[k: string]: unknown;
|
|
187
|
+
};
|
|
188
|
+
/**
|
|
189
|
+
* The machine-readable protocol a CLI offers besides its TUI.
|
|
190
|
+
*
|
|
191
|
+
* Wire shape (internally tagged with `"kind"` so an arm can gain data, e.g.
|
|
192
|
+
* an adapter command for `acp`, without a breaking change):
|
|
193
|
+
* `{ "kind": "claude_stream_json" }`, `{ "kind": "codex_app_server" }`,
|
|
194
|
+
* `{ "kind": "acp" }`, `{ "kind": "none" }`, `{ "kind": "unknown" }`.
|
|
195
|
+
*/
|
|
196
|
+
export type StructuredLane =
|
|
197
|
+
| {
|
|
198
|
+
kind: "claude_stream_json";
|
|
199
|
+
[k: string]: unknown;
|
|
200
|
+
}
|
|
201
|
+
| {
|
|
202
|
+
kind: "codex_app_server";
|
|
203
|
+
[k: string]: unknown;
|
|
204
|
+
}
|
|
205
|
+
| {
|
|
206
|
+
kind: "acp";
|
|
207
|
+
[k: string]: unknown;
|
|
208
|
+
}
|
|
209
|
+
| {
|
|
210
|
+
kind: "none";
|
|
211
|
+
[k: string]: unknown;
|
|
212
|
+
}
|
|
213
|
+
| {
|
|
214
|
+
kind: "unknown";
|
|
215
|
+
[k: string]: unknown;
|
|
216
|
+
};
|
|
217
|
+
/**
|
|
218
|
+
* Where the CLI writes its conversation transcript.
|
|
219
|
+
*
|
|
220
|
+
* Wire shape (internally tagged with `"kind"`):
|
|
221
|
+
* - `{ "kind": "jsonl_under_config_dir", "subdir": "projects" }`
|
|
222
|
+
* - `{ "kind": "session_file_glob", "glob": ".codex/sessions/** /rollout-*.jsonl" }`
|
|
223
|
+
* - `{ "kind": "none" }` / `{ "kind": "unknown" }`
|
|
224
|
+
*/
|
|
225
|
+
export type TranscriptSpec =
|
|
226
|
+
| {
|
|
227
|
+
kind: "jsonl_under_config_dir";
|
|
228
|
+
/**
|
|
229
|
+
* Subdirectory of the config dir holding transcripts (`"projects"`).
|
|
230
|
+
*/
|
|
231
|
+
subdir: string;
|
|
232
|
+
[k: string]: unknown;
|
|
233
|
+
}
|
|
234
|
+
| {
|
|
235
|
+
/**
|
|
236
|
+
* The glob (`".codex/sessions/** /rollout-*.jsonl"`).
|
|
237
|
+
*/
|
|
238
|
+
glob: string;
|
|
239
|
+
kind: "session_file_glob";
|
|
240
|
+
[k: string]: unknown;
|
|
241
|
+
}
|
|
242
|
+
| {
|
|
243
|
+
kind: "none";
|
|
244
|
+
[k: string]: unknown;
|
|
245
|
+
}
|
|
246
|
+
| {
|
|
247
|
+
kind: "unknown";
|
|
248
|
+
[k: string]: unknown;
|
|
249
|
+
};
|
|
250
|
+
/**
|
|
251
|
+
* Whether the CLI stops on a folder-trust prompt at first launch in a
|
|
252
|
+
* directory.
|
|
253
|
+
*
|
|
254
|
+
* Wire shape (internally tagged with `"kind"`):
|
|
255
|
+
* - `{ "kind": "prompt", "markers": ["Do you trust the files in this folder?"], "accept": "1" }`
|
|
256
|
+
* - `{ "kind": "none" }` / `{ "kind": "unknown" }`
|
|
257
|
+
*/
|
|
258
|
+
export type TrustDialog =
|
|
259
|
+
| {
|
|
260
|
+
/**
|
|
261
|
+
* The keystroke text that accepts it (sent followed by Enter).
|
|
262
|
+
*/
|
|
263
|
+
accept: string;
|
|
264
|
+
kind: "prompt";
|
|
265
|
+
/**
|
|
266
|
+
* Case-insensitive substrings that identify the prompt on the
|
|
267
|
+
* ANSI-stripped screen.
|
|
268
|
+
*/
|
|
269
|
+
markers: string[];
|
|
270
|
+
[k: string]: unknown;
|
|
271
|
+
}
|
|
272
|
+
| {
|
|
273
|
+
kind: "none";
|
|
274
|
+
[k: string]: unknown;
|
|
275
|
+
}
|
|
276
|
+
| {
|
|
277
|
+
kind: "unknown";
|
|
278
|
+
[k: string]: unknown;
|
|
279
|
+
};
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* Everything the runner needs to know about one AI CLI's session behaviour.
|
|
283
|
+
*
|
|
284
|
+
* One instance per CLI (`claude`, `codex`, …), built by the runner as static
|
|
285
|
+
* data and served to the frontend (`GET /terminals/cli-profiles`, Tauri
|
|
286
|
+
* command `terminal_cli_profiles`) so no consumer holds a second copy.
|
|
287
|
+
*
|
|
288
|
+
* Every fact that can be unverified defaults to its `Unknown` arm; see the
|
|
289
|
+
* module docs. Scraped facts ([`Self::handshake`], [`Self::usage_limit_phrases`],
|
|
290
|
+
* [`TrustDialog::Prompt`]) break when the CLI changes its screens, which is
|
|
291
|
+
* why [`Self::verified_version`] records the CLI version they were verified
|
|
292
|
+
* against.
|
|
293
|
+
*/
|
|
294
|
+
export interface CliProfile {
|
|
295
|
+
/**
|
|
296
|
+
* How one account's CLI state is kept apart from another's.
|
|
297
|
+
*/
|
|
298
|
+
accountIsolation?: AccountIsolation & {};
|
|
299
|
+
/**
|
|
300
|
+
* The ways the CLI can be authenticated. Empty means none are recorded —
|
|
301
|
+
* UNKNOWN, not "needs no authentication".
|
|
302
|
+
*/
|
|
303
|
+
auth: AuthMethod[];
|
|
304
|
+
/**
|
|
305
|
+
* How the CLI is launched without per-tool approval prompts, and how an
|
|
306
|
+
* existing argv is recognised as already doing so.
|
|
307
|
+
*/
|
|
308
|
+
autoApprove?: AutoApprove & {};
|
|
309
|
+
/**
|
|
310
|
+
* Human-readable name for launch menus and zone labels (`"Claude Code"`).
|
|
311
|
+
*/
|
|
312
|
+
displayName: string;
|
|
313
|
+
/**
|
|
314
|
+
* How the runner asks a live session to exit cleanly.
|
|
315
|
+
*/
|
|
316
|
+
gracefulExit?: GracefulExit & {};
|
|
317
|
+
/**
|
|
318
|
+
* On-screen markers that decide whether a resume succeeded or failed.
|
|
319
|
+
*/
|
|
320
|
+
handshake?: HandshakePatterns & {};
|
|
321
|
+
/**
|
|
322
|
+
* Stable provider id (`"claude"`, `"codex"`). The same string the runner
|
|
323
|
+
* stores as a terminal session record's `provider`.
|
|
324
|
+
*/
|
|
325
|
+
id: string;
|
|
326
|
+
/**
|
|
327
|
+
* How the runner learns the CLI's session id.
|
|
328
|
+
*/
|
|
329
|
+
identity?: IdentitySource & {};
|
|
330
|
+
/**
|
|
331
|
+
* Per-OS install commands, shown beside a disabled launch entry when the
|
|
332
|
+
* CLI's binary is absent.
|
|
333
|
+
*/
|
|
334
|
+
install?: InstallCommands & {};
|
|
335
|
+
/**
|
|
336
|
+
* Free-form caveats a reader should see beside the profile (e.g. "macOS:
|
|
337
|
+
* same code path, unverified on hardware").
|
|
338
|
+
*/
|
|
339
|
+
notes?: string[];
|
|
340
|
+
/**
|
|
341
|
+
* Arguments that make the structured lane hand each tool approval to the
|
|
342
|
+
* runner as a typed permission request instead of deciding it itself
|
|
343
|
+
* (`["--permission-prompt-tool", "stdio"]`), verified against
|
|
344
|
+
* [`Self::verified_version`]. Rendered only for a launch that asks to be
|
|
345
|
+
* prompted, and never beside an auto-approve flag. Empty means no such
|
|
346
|
+
* arguments are known, so a prompted structured launch is not offered.
|
|
347
|
+
*/
|
|
348
|
+
permissionPromptArgs?: string[];
|
|
349
|
+
/**
|
|
350
|
+
* Program stems that identify this CLI on an argv head or in a process
|
|
351
|
+
* census, without directory or extension (`["claude"]`). Matching strips
|
|
352
|
+
* the path and a Windows `.exe`/`.cmd` suffix before comparing.
|
|
353
|
+
*/
|
|
354
|
+
programs: string[];
|
|
355
|
+
/**
|
|
356
|
+
* Arguments the runner appends to every PTY-hosted (interactive TUI)
|
|
357
|
+
* launch of this CLI, verified against [`Self::verified_version`]
|
|
358
|
+
* (`["--teammate-mode", "in-process"]`, which keeps Claude Code agent
|
|
359
|
+
* teams inside the session instead of splitting the caller's tmux window).
|
|
360
|
+
* Empty means none.
|
|
361
|
+
*/
|
|
362
|
+
ptyArgs?: string[];
|
|
363
|
+
/**
|
|
364
|
+
* Whether the structured lane emits a typed rate-limit event.
|
|
365
|
+
*/
|
|
366
|
+
rateLimitEvent?: CapabilityState & string;
|
|
367
|
+
/**
|
|
368
|
+
* What a restore of this CLI's session can honestly bring back.
|
|
369
|
+
*/
|
|
370
|
+
restoreTier?: RestoreTier & string;
|
|
371
|
+
/**
|
|
372
|
+
* How a session is resumed by id.
|
|
373
|
+
*/
|
|
374
|
+
resume?: ResumeSpec & {};
|
|
375
|
+
/**
|
|
376
|
+
* Other spellings the CLI accepts for the resume flag of
|
|
377
|
+
* [`ResumeSpec::ByIdArgv`] (`["-r"]`). Matched only as a whole argv
|
|
378
|
+
* token followed by the id, and only when the argv's program is this
|
|
379
|
+
* CLI: a short flag like `-r` means something else to most programs.
|
|
380
|
+
* Empty means none are known.
|
|
381
|
+
*/
|
|
382
|
+
resumeFlagAliases?: string[];
|
|
383
|
+
/**
|
|
384
|
+
* Argv tokens, besides the identity flag, the resume flag and its
|
|
385
|
+
* aliases, by which the user picks the session themselves
|
|
386
|
+
* (`["--continue", "-c"]` — continue the most recent session). Any of
|
|
387
|
+
* them on a launch means the runner must not pin an id of its own. A token
|
|
388
|
+
* matches a whole argv entry case-insensitively; a `--long` token also
|
|
389
|
+
* matches `--long=…`. Empty means none are known.
|
|
390
|
+
*/
|
|
391
|
+
sessionChoiceArgs?: string[];
|
|
392
|
+
/**
|
|
393
|
+
* The machine-readable protocol the CLI offers besides its TUI.
|
|
394
|
+
*/
|
|
395
|
+
structuredLane?: StructuredLane & {};
|
|
396
|
+
/**
|
|
397
|
+
* Where the CLI writes its conversation transcript.
|
|
398
|
+
*/
|
|
399
|
+
transcript?: TranscriptSpec & {};
|
|
400
|
+
/**
|
|
401
|
+
* Whether the CLI stops on a folder-trust prompt at first launch in a
|
|
402
|
+
* directory, and how to recognise and answer it.
|
|
403
|
+
*/
|
|
404
|
+
trustDialog?: TrustDialog & {};
|
|
405
|
+
/**
|
|
406
|
+
* Whether the structured lane emits an explicit end-of-turn event.
|
|
407
|
+
*/
|
|
408
|
+
turnBoundaryEvent?: CapabilityState & string;
|
|
409
|
+
/**
|
|
410
|
+
* Whether the structured lane delivers a typed permission request (a
|
|
411
|
+
* tool-use approval the runner answers) rather than bypassing approval.
|
|
412
|
+
*/
|
|
413
|
+
typedPermission?: CapabilityState & string;
|
|
414
|
+
/**
|
|
415
|
+
* Case-insensitive phrases the CLI paints when an account's usage limit
|
|
416
|
+
* is reached. A grid match is a `Hint`-confidence
|
|
417
|
+
* [`FailureKind::QuotaExhausted`] signal, never a confirmed one. Empty
|
|
418
|
+
* means no phrases are known.
|
|
419
|
+
*/
|
|
420
|
+
usageLimitPhrases: string[];
|
|
421
|
+
/**
|
|
422
|
+
* CLI version the scraped facts in this profile were verified against
|
|
423
|
+
* (`"2.1.285"`). `None` means no version was recorded — treat every
|
|
424
|
+
* scraped fact as unverified.
|
|
425
|
+
*/
|
|
426
|
+
verifiedVersion?: string | null;
|
|
427
|
+
[k: string]: unknown;
|
|
428
|
+
}
|
|
429
|
+
/**
|
|
430
|
+
* On-screen markers that decide whether a resume succeeded or failed.
|
|
431
|
+
*
|
|
432
|
+
* Substring lists match the ANSI-stripped screen case-insensitively; regex
|
|
433
|
+
* lists are compiled by BOTH the Rust `regex` crate and JavaScript `RegExp`,
|
|
434
|
+
* so a pattern must stay in the syntax both engines accept (no look-around,
|
|
435
|
+
* no backreferences, no named-group syntax that differs between them).
|
|
436
|
+
*
|
|
437
|
+
* Regex sources are ALWAYS matched case-insensitively, like the substrings:
|
|
438
|
+
* each engine compiles them with its own case-insensitive switch (Rust
|
|
439
|
+
* `RegexBuilder::case_insensitive`, the JavaScript `i` flag). A source must
|
|
440
|
+
* therefore not carry inline flags such as `(?i)`, which JavaScript rejects.
|
|
441
|
+
*
|
|
442
|
+
* All body lists empty means no markers are known, and a resume cannot be
|
|
443
|
+
* verified from the screen.
|
|
444
|
+
*/
|
|
445
|
+
export interface HandshakePatterns {
|
|
446
|
+
/**
|
|
447
|
+
* Substrings whose presence means the resume failed.
|
|
448
|
+
*/
|
|
449
|
+
failure: string[];
|
|
450
|
+
/**
|
|
451
|
+
* Regex sources (matched case-insensitively) whose match means the
|
|
452
|
+
* resume failed.
|
|
453
|
+
*/
|
|
454
|
+
failureRegex: string[];
|
|
455
|
+
/**
|
|
456
|
+
* Substrings whose presence means the resumed session came up.
|
|
457
|
+
*/
|
|
458
|
+
success: string[];
|
|
459
|
+
/**
|
|
460
|
+
* Regex sources (matched case-insensitively) whose match means the
|
|
461
|
+
* resumed session came up.
|
|
462
|
+
*/
|
|
463
|
+
successRegex: string[];
|
|
464
|
+
/**
|
|
465
|
+
* Regex sources (matched case-insensitively) matched against the pane's
|
|
466
|
+
* CURRENT window title only, never its body, whose match means the
|
|
467
|
+
* resumed session came up. A title the CLI sets at launch is evidence the
|
|
468
|
+
* body cannot fake, provided the pattern is anchored to the CLI's own
|
|
469
|
+
* title (the shell titles the window too). Empty means none are known.
|
|
470
|
+
*/
|
|
471
|
+
titleRegex?: string[];
|
|
472
|
+
[k: string]: unknown;
|
|
473
|
+
}
|
|
474
|
+
/**
|
|
475
|
+
* Per-OS install commands for a CLI. `None` for an OS means no command is
|
|
476
|
+
* recorded for it.
|
|
477
|
+
*/
|
|
478
|
+
export interface InstallCommands {
|
|
479
|
+
/**
|
|
480
|
+
* Install command on Linux (`"npm i -g @openai/codex"`).
|
|
481
|
+
*/
|
|
482
|
+
linux?: string | null;
|
|
483
|
+
/**
|
|
484
|
+
* Install command on macOS.
|
|
485
|
+
*/
|
|
486
|
+
macos?: string | null;
|
|
487
|
+
/**
|
|
488
|
+
* Install command on Windows.
|
|
489
|
+
*/
|
|
490
|
+
windows?: string | null;
|
|
491
|
+
[k: string]: unknown;
|
|
492
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/* eslint-disable */
|
|
2
|
+
/**
|
|
3
|
+
* This file was automatically generated.
|
|
4
|
+
* DO NOT MODIFY IT BY HAND. Regenerate with
|
|
5
|
+
* `qontinui-runner/src-tauri/scripts/generate_types.sh`.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* A FILTER the surface narrowed before running the read — reported, never
|
|
10
|
+
* applied silently, because a narrowed filter that reads as a complete answer
|
|
11
|
+
* is the same defect class as a silent empty.
|
|
12
|
+
*
|
|
13
|
+
* Promoted from `coord.findings`' `resource_keys_truncated`, the only
|
|
14
|
+
* narrowing any surface reported when this type was written: a list-valued
|
|
15
|
+
* filter truncated at a cap rather than refused (truncating a FILTER only
|
|
16
|
+
* narrows a read). Minimal on purpose — which parameter, how many values
|
|
17
|
+
* were actually applied, and the cap that dropped the rest. A caller seeing
|
|
18
|
+
* it knows a miss is meaningless for the values beyond the cap.
|
|
19
|
+
*/
|
|
20
|
+
export interface FilterNarrowing {
|
|
21
|
+
/**
|
|
22
|
+
* How many values of it the read actually applied.
|
|
23
|
+
*/
|
|
24
|
+
applied: number;
|
|
25
|
+
/**
|
|
26
|
+
* The cap the surface enforces; values past it were dropped.
|
|
27
|
+
*/
|
|
28
|
+
cap: number;
|
|
29
|
+
/**
|
|
30
|
+
* The query parameter that was narrowed, spelled as the caller spelled it
|
|
31
|
+
* on the wire (e.g. `resource_keys`).
|
|
32
|
+
*/
|
|
33
|
+
parameter: string;
|
|
34
|
+
[k: string]: unknown;
|
|
35
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/* eslint-disable */
|
|
2
|
+
/**
|
|
3
|
+
* This file was automatically generated.
|
|
4
|
+
* DO NOT MODIFY IT BY HAND. Regenerate with
|
|
5
|
+
* `qontinui-runner/src-tauri/scripts/generate_types.sh`.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { JourneyNode } from "./JourneyNode";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* An interactive affordance seen at a node and not yet the trigger of an
|
|
12
|
+
* edge from it — a row of `project.journey_frontier`, keyed
|
|
13
|
+
* `(app_id, node_key, affordance_fingerprint)`.
|
|
14
|
+
*/
|
|
15
|
+
export interface FrontierEntry {
|
|
16
|
+
/**
|
|
17
|
+
* Structural fingerprint of the affordance.
|
|
18
|
+
*/
|
|
19
|
+
affordanceFingerprint: string;
|
|
20
|
+
/**
|
|
21
|
+
* ARIA role of the affordance; `None` = not reported.
|
|
22
|
+
*/
|
|
23
|
+
affordanceRole?: string | null;
|
|
24
|
+
/**
|
|
25
|
+
* The registered app id.
|
|
26
|
+
*/
|
|
27
|
+
appId: string;
|
|
28
|
+
/**
|
|
29
|
+
* The affordance's declared effect; `None` = undeclared.
|
|
30
|
+
*/
|
|
31
|
+
declaredEffect?: ("read" | "write" | "destructive") | null;
|
|
32
|
+
/**
|
|
33
|
+
* First time it was seen at this node (ISO 8601).
|
|
34
|
+
*/
|
|
35
|
+
firstSeenAt: string;
|
|
36
|
+
/**
|
|
37
|
+
* Most recent time it was seen at this node (ISO 8601).
|
|
38
|
+
*/
|
|
39
|
+
lastSeenAt: string;
|
|
40
|
+
/**
|
|
41
|
+
* The run that most recently saw it; `None` = not reported.
|
|
42
|
+
*/
|
|
43
|
+
lastSeenRunId?: string | null;
|
|
44
|
+
/**
|
|
45
|
+
* The node the affordance was seen at.
|
|
46
|
+
*/
|
|
47
|
+
node: JourneyNode;
|
|
48
|
+
/**
|
|
49
|
+
* `node.key()` — stored so the primary key is a plain text column.
|
|
50
|
+
*/
|
|
51
|
+
nodeKey: string;
|
|
52
|
+
/**
|
|
53
|
+
* Why it is on the frontier.
|
|
54
|
+
*/
|
|
55
|
+
reason:
|
|
56
|
+
| "not_yet_activated"
|
|
57
|
+
| "effect_undeclared"
|
|
58
|
+
| "effect_write"
|
|
59
|
+
| "effect_destructive"
|
|
60
|
+
| "budget_exhausted"
|
|
61
|
+
| "activation_failed";
|
|
62
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/* eslint-disable */
|
|
2
|
+
/**
|
|
3
|
+
* This file was automatically generated.
|
|
4
|
+
* DO NOT MODIFY IT BY HAND. Regenerate with
|
|
5
|
+
* `qontinui-runner/src-tauri/scripts/generate_types.sh`.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { JourneyNode } from "./JourneyNode";
|
|
9
|
+
import type { JourneyTrigger } from "./JourneyTrigger";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* One observed edge of the journey graph — a row of
|
|
13
|
+
* `project.journey_edge_observations`.
|
|
14
|
+
*
|
|
15
|
+
* Invariants (checked by [`JourneyEdgeObservation::validate`]; the first also
|
|
16
|
+
* by the migration's CHECK): `to_node` is `None` iff `outcome` is
|
|
17
|
+
* [`EdgeOutcome::ToNodeUnobserved`]; `no_change` joins nodes with equal
|
|
18
|
+
* keys (a `changed` edge may also join equal keys).
|
|
19
|
+
*
|
|
20
|
+
* The ledger's `timeline` column is deliberately unrepresented until
|
|
21
|
+
* Phase 4; readers select explicit columns rather than `*`.
|
|
22
|
+
*/
|
|
23
|
+
export interface JourneyEdgeObservation {
|
|
24
|
+
/**
|
|
25
|
+
* The registered app id.
|
|
26
|
+
*/
|
|
27
|
+
appId: string;
|
|
28
|
+
/**
|
|
29
|
+
* The SDK's self-reported version (`SdkAppInfo.version`, semver or git
|
|
30
|
+
* short-SHA); `None` = not reported, never "no version".
|
|
31
|
+
*/
|
|
32
|
+
appVersion?: string | null;
|
|
33
|
+
/**
|
|
34
|
+
* The configuration the action was taken from.
|
|
35
|
+
*/
|
|
36
|
+
fromNode: JourneyNode;
|
|
37
|
+
/**
|
|
38
|
+
* Row id (UUID).
|
|
39
|
+
*/
|
|
40
|
+
id: string;
|
|
41
|
+
/**
|
|
42
|
+
* When the row was withdrawn (ISO 8601); `None` = live.
|
|
43
|
+
*/
|
|
44
|
+
invalidatedAt?: string | null;
|
|
45
|
+
/**
|
|
46
|
+
* Who withdrew the row.
|
|
47
|
+
*/
|
|
48
|
+
invalidatedBy?: string | null;
|
|
49
|
+
/**
|
|
50
|
+
* Why the row was withdrawn.
|
|
51
|
+
*/
|
|
52
|
+
invalidatedReason?: string | null;
|
|
53
|
+
/**
|
|
54
|
+
* Token grouping one bulk withdrawal, as on `co_occurrence_observations`.
|
|
55
|
+
*/
|
|
56
|
+
invalidationToken?: string | null;
|
|
57
|
+
/**
|
|
58
|
+
* When the edge CLOSED (to-snapshot seen, or diff returned), ISO 8601.
|
|
59
|
+
*/
|
|
60
|
+
observedAt: string;
|
|
61
|
+
/**
|
|
62
|
+
* How the edge closed.
|
|
63
|
+
*/
|
|
64
|
+
outcome:
|
|
65
|
+
"changed" | "no_change" | "error" | "settle_timeout" | "to_node_unobserved";
|
|
66
|
+
/**
|
|
67
|
+
* Agent session / task-run / recording-session id; `None` = not reported.
|
|
68
|
+
*/
|
|
69
|
+
runId?: string | null;
|
|
70
|
+
/**
|
|
71
|
+
* Who produced the edge.
|
|
72
|
+
*/
|
|
73
|
+
runKind: "agent_action" | "explorer" | "passive_session";
|
|
74
|
+
/**
|
|
75
|
+
* The runner's own `buildId`.
|
|
76
|
+
*/
|
|
77
|
+
runnerBuildId: string;
|
|
78
|
+
/**
|
|
79
|
+
* Same meaning as `co_occurrence_observations.runner_instance`.
|
|
80
|
+
*/
|
|
81
|
+
runnerInstance: string;
|
|
82
|
+
/**
|
|
83
|
+
* The configuration observed after it; `None` iff
|
|
84
|
+
* `outcome == to_node_unobserved`.
|
|
85
|
+
*/
|
|
86
|
+
toNode?: JourneyNode | null;
|
|
87
|
+
/**
|
|
88
|
+
* What caused the edge.
|
|
89
|
+
*/
|
|
90
|
+
trigger: JourneyTrigger;
|
|
91
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/* eslint-disable */
|
|
2
|
+
/**
|
|
3
|
+
* This file was automatically generated.
|
|
4
|
+
* DO NOT MODIFY IT BY HAND. Regenerate with
|
|
5
|
+
* `qontinui-runner/src-tauri/scripts/generate_types.sh`.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Body of `GET /apps/{app_id}/journey/health`, and the ledger block every
|
|
10
|
+
* journey query response repeats.
|
|
11
|
+
*/
|
|
12
|
+
export interface JourneyLedgerHealth {
|
|
13
|
+
/**
|
|
14
|
+
* Human-readable cause, e.g. `"embedded DB predates the journey tables"`.
|
|
15
|
+
*/
|
|
16
|
+
detail: string;
|
|
17
|
+
/**
|
|
18
|
+
* The ledger's state.
|
|
19
|
+
*/
|
|
20
|
+
state: "writing" | "schema_absent" | "write_failing";
|
|
21
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/* eslint-disable */
|
|
2
|
+
/**
|
|
3
|
+
* This file was automatically generated.
|
|
4
|
+
* DO NOT MODIFY IT BY HAND. Regenerate with
|
|
5
|
+
* `qontinui-runner/src-tauri/scripts/generate_types.sh`.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* A vertex of the journey graph: one observed configuration of one page.
|
|
10
|
+
*
|
|
11
|
+
* Identity is a deterministic predicate, not a judgment: a node is
|
|
12
|
+
* `(spec_id, sorted active IR state ids)` within an app. When the page has
|
|
13
|
+
* no spec, or no state was classified present, the node is UNMODELLED and is
|
|
14
|
+
* identified by its route template (else its page label) — it still takes
|
|
15
|
+
* part in reachability and is counted as unmodelled in coverage.
|
|
16
|
+
*
|
|
17
|
+
* Build one with [`JourneyNode::new`], which sorts and dedups `state_ids`
|
|
18
|
+
* and derives `modelled`; [`JourneyNode::key`] is the canonical string form
|
|
19
|
+
* stored in `journey_frontier.node_key`.
|
|
20
|
+
*
|
|
21
|
+
* Node identity is `key()` / `node_key` — NEVER jsonb equality of the
|
|
22
|
+
* serialized node (which also carries non-identity detail such as
|
|
23
|
+
* `pageLabel` on a modelled node).
|
|
24
|
+
* Unlike the crate's other optional fields, this struct's optional fields
|
|
25
|
+
* always serialize, as `null` when absent, so every stored node has the same
|
|
26
|
+
* key set.
|
|
27
|
+
*/
|
|
28
|
+
export interface JourneyNode {
|
|
29
|
+
/**
|
|
30
|
+
* True iff `spec_id` is present AND `state_ids` is non-empty.
|
|
31
|
+
*/
|
|
32
|
+
modelled: boolean;
|
|
33
|
+
/**
|
|
34
|
+
* An APP-DECLARED page identifier — never a URL path, never user input.
|
|
35
|
+
*
|
|
36
|
+
* PRODUCER OBLIGATION (this is the privacy guarantee): fill it only from
|
|
37
|
+
* the snapshot's `page.pageContext.meta.tabId`, then `activeTab`, then
|
|
38
|
+
* `page.pageContext.name`, and NEVER from `page.pathname` in any form,
|
|
39
|
+
* raw or slugged. (The runner's existing `resolve_page_label` in
|
|
40
|
+
* `state_discovery/capture.rs` has a fourth fallback that slugs
|
|
41
|
+
* `page.pathname`; the journey producer must not use that fallback.)
|
|
42
|
+
* `pageContext.name` is a free-form display name (e.g. `"Import /
|
|
43
|
+
* Export"`), so the producer SLUGS it before storing — which leaves a
|
|
44
|
+
* `/` meaning only one thing: a leaked, unslugged path.
|
|
45
|
+
*
|
|
46
|
+
* [`JourneyNode::validate`] rejects a `/` as a TRIPWIRE for that leak.
|
|
47
|
+
* It is not the guarantee: a slugged path contains no `/` and passes.
|
|
48
|
+
*/
|
|
49
|
+
pageLabel: string | null;
|
|
50
|
+
/**
|
|
51
|
+
* The framework route PATTERN the snapshot's page was served under
|
|
52
|
+
* (e.g. `/admin/coord/runs/[id]`), when known. Never a concrete URL path:
|
|
53
|
+
* a concrete path can embed user input (`/search/<term>`,
|
|
54
|
+
* `/users/<email>`). Not heuristically validated — the producer must
|
|
55
|
+
* fill it from the router's pattern, not from `location.pathname`.
|
|
56
|
+
*/
|
|
57
|
+
pathnameTemplate: string | null;
|
|
58
|
+
/**
|
|
59
|
+
* The page spec the snapshot matched; `None` = no spec for this page.
|
|
60
|
+
* Load-bearing: some state ids are declared on more than one page.
|
|
61
|
+
* Must not contain `#` or start with `unmodelled:` (see [`JourneyNode::key`]).
|
|
62
|
+
*/
|
|
63
|
+
specId: string | null;
|
|
64
|
+
/**
|
|
65
|
+
* Ids of the IR states classified present — deduped, in BYTE-WISE
|
|
66
|
+
* (UTF-8) ascending order, i.e. Rust's `str` ordering. Producers in
|
|
67
|
+
* other languages must sort by UTF-8 bytes (not UTF-16 code units, not
|
|
68
|
+
* a locale collation) or their keys will not match. No id may contain
|
|
69
|
+
* `,` (see [`JourneyNode::key`]).
|
|
70
|
+
*/
|
|
71
|
+
stateIds: string[];
|
|
72
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/* eslint-disable */
|
|
2
|
+
/**
|
|
3
|
+
* This file was automatically generated.
|
|
4
|
+
* DO NOT MODIFY IT BY HAND. Regenerate with
|
|
5
|
+
* `qontinui-runner/src-tauri/scripts/generate_types.sh`.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* What caused an edge — structurally only.
|
|
10
|
+
*
|
|
11
|
+
* `deny_unknown_fields` and the deliberate absence of any text/value field
|
|
12
|
+
* are the privacy control: a caller cannot smuggle a typed value into the
|
|
13
|
+
* ledger, because no such key deserializes and no such field exists to set.
|
|
14
|
+
*/
|
|
15
|
+
export interface JourneyTrigger {
|
|
16
|
+
/**
|
|
17
|
+
* The action verb (`click`, `type`, `select`, a component action id, …).
|
|
18
|
+
*/
|
|
19
|
+
actionType: string;
|
|
20
|
+
/**
|
|
21
|
+
* Which runner choke point captured it.
|
|
22
|
+
*/
|
|
23
|
+
chokePoint:
|
|
24
|
+
| "element_action"
|
|
25
|
+
| "batch_action"
|
|
26
|
+
| "component_action"
|
|
27
|
+
| "sdk_element_action"
|
|
28
|
+
| "execute_with_diff"
|
|
29
|
+
| "navigation";
|
|
30
|
+
/**
|
|
31
|
+
* The affordance's declared effect; `None` = undeclared (NOT "safe").
|
|
32
|
+
*/
|
|
33
|
+
declaredEffect?: ("read" | "write" | "destructive") | null;
|
|
34
|
+
/**
|
|
35
|
+
* How the transition was initiated.
|
|
36
|
+
*/
|
|
37
|
+
navigationTrigger:
|
|
38
|
+
"affordance" | "push" | "replace" | "pop" | "initial" | "hash";
|
|
39
|
+
/**
|
|
40
|
+
* Structural fingerprint of the target element; `None` = not resolved.
|
|
41
|
+
*/
|
|
42
|
+
targetFingerprint?: string | null;
|
|
43
|
+
/**
|
|
44
|
+
* ARIA role of the target; `None` = not reported.
|
|
45
|
+
*/
|
|
46
|
+
targetRole?: string | null;
|
|
47
|
+
}
|
|
@@ -21,6 +21,10 @@ export interface NextAction {
|
|
|
21
21
|
/**
|
|
22
22
|
* What the action applies to: the command to run, the page to open, the
|
|
23
23
|
* setting to set, the gate to wait for. Its meaning is fixed by `kind`.
|
|
24
|
+
* On [`NextActionKind::RetryLater`] it is what to re-check BEFORE
|
|
25
|
+
* retrying, because the earlier attempt may already have taken effect (a
|
|
26
|
+
* [`RefusalCode::UpstreamTimeout`] write); [`NextAction::render`] then
|
|
27
|
+
* says so. Omit it on a retry that is safe to repeat blindly.
|
|
24
28
|
*/
|
|
25
29
|
target?: string | null;
|
|
26
30
|
/**
|
|
@@ -17,4 +17,17 @@ export type RefusalCode =
|
|
|
17
17
|
| "sibling_checkout_absent"
|
|
18
18
|
| "endpoint_unresolved"
|
|
19
19
|
| "glossary_term_unknown"
|
|
20
|
+
| "authentication_required"
|
|
21
|
+
| "credential_rejected"
|
|
22
|
+
| "permission_denied"
|
|
23
|
+
| "not_found"
|
|
24
|
+
| "conflict"
|
|
25
|
+
| "invalid_request"
|
|
26
|
+
| "rate_limited"
|
|
27
|
+
| "quota_exceeded"
|
|
28
|
+
| "upstream_unavailable"
|
|
29
|
+
| "upstream_timeout"
|
|
30
|
+
| "device_not_connected"
|
|
31
|
+
| "service_unavailable"
|
|
32
|
+
| "internal_error"
|
|
20
33
|
| "unknown";
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/* eslint-disable */
|
|
2
|
+
/**
|
|
3
|
+
* This file was automatically generated.
|
|
4
|
+
* DO NOT MODIFY IT BY HAND. Regenerate with
|
|
5
|
+
* `qontinui-runner/src-tauri/scripts/generate_types.sh`.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* An action a surface may offer for a failure. Serialized `snake_case`.
|
|
10
|
+
*/
|
|
11
|
+
export type FailureAction =
|
|
12
|
+
"retry" | "login" | "switch_account" | "new_session" | "resume" | "none";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* One failure of an AI session, whichever lane noticed it.
|
|
16
|
+
*
|
|
17
|
+
* Emitted on the runner's `session-failure` event and readable from its
|
|
18
|
+
* failures route, so a surface can render *why* a session stopped and which
|
|
19
|
+
* actions are available, instead of an exit code or a bare banner. The
|
|
20
|
+
* runner's classifier fills it from a signal and its recovery table chooses
|
|
21
|
+
* [`Self::recovery_policy`]; neither lives in this crate.
|
|
22
|
+
*/
|
|
23
|
+
export interface SessionFailure {
|
|
24
|
+
/**
|
|
25
|
+
* The account the session was running under, when known.
|
|
26
|
+
*/
|
|
27
|
+
account?: string | null;
|
|
28
|
+
/**
|
|
29
|
+
* Actions a surface may offer the user, in display order.
|
|
30
|
+
*/
|
|
31
|
+
actions: FailureAction[];
|
|
32
|
+
/**
|
|
33
|
+
* Coarse grouping of [`Self::kind`] for filtering and styling.
|
|
34
|
+
*/
|
|
35
|
+
category:
|
|
36
|
+
| "limit"
|
|
37
|
+
| "context"
|
|
38
|
+
| "auth"
|
|
39
|
+
| "provider"
|
|
40
|
+
| "process"
|
|
41
|
+
| "session"
|
|
42
|
+
| "request"
|
|
43
|
+
| "unknown";
|
|
44
|
+
/**
|
|
45
|
+
* Longer human-readable explanation.
|
|
46
|
+
*/
|
|
47
|
+
details?: string | null;
|
|
48
|
+
evidence: FailureEvidence;
|
|
49
|
+
/**
|
|
50
|
+
* Unique id of this failure occurrence (UUID minted by the runner).
|
|
51
|
+
*/
|
|
52
|
+
id: string;
|
|
53
|
+
/**
|
|
54
|
+
* What went wrong. [`FailureKind::Unknown`] is a real answer, not "fine".
|
|
55
|
+
*/
|
|
56
|
+
kind:
|
|
57
|
+
| "rate_limited"
|
|
58
|
+
| "quota_exhausted"
|
|
59
|
+
| "budget_exhausted"
|
|
60
|
+
| "context_exhausted"
|
|
61
|
+
| "auth_required"
|
|
62
|
+
| "access_denied"
|
|
63
|
+
| "overloaded"
|
|
64
|
+
| "transport_lost"
|
|
65
|
+
| "resume_failed"
|
|
66
|
+
| "spawn_failed"
|
|
67
|
+
| "process_exited"
|
|
68
|
+
| "bad_request"
|
|
69
|
+
| "internal_error"
|
|
70
|
+
| "unknown";
|
|
71
|
+
/**
|
|
72
|
+
* The [`CliProfile::id`] of the CLI whose session failed.
|
|
73
|
+
*/
|
|
74
|
+
provider: string;
|
|
75
|
+
/**
|
|
76
|
+
* The raw reason the source gave, verbatim (a provider error type, a
|
|
77
|
+
* stderr line, the matched screen phrase), for diagnosis.
|
|
78
|
+
*/
|
|
79
|
+
reason?: string | null;
|
|
80
|
+
/**
|
|
81
|
+
* What the runner does about it automatically.
|
|
82
|
+
*/
|
|
83
|
+
recoveryPolicy:
|
|
84
|
+
| "never"
|
|
85
|
+
| "backoff_then_retry"
|
|
86
|
+
| "wait_until_reset"
|
|
87
|
+
| "migrate_account"
|
|
88
|
+
| "login_then_resume"
|
|
89
|
+
| "resume_same_id"
|
|
90
|
+
| "handoff_new_session";
|
|
91
|
+
/**
|
|
92
|
+
* When a limit resets (RFC 3339), when the source states it.
|
|
93
|
+
*/
|
|
94
|
+
resetAt?: string | null;
|
|
95
|
+
/**
|
|
96
|
+
* How serious the failure is for the session.
|
|
97
|
+
*/
|
|
98
|
+
severity: "info" | "warning" | "error";
|
|
99
|
+
/**
|
|
100
|
+
* One-line human-readable summary.
|
|
101
|
+
*/
|
|
102
|
+
title: string;
|
|
103
|
+
/**
|
|
104
|
+
* The turn that failed, when the source identifies one.
|
|
105
|
+
*/
|
|
106
|
+
turnId?: string | null;
|
|
107
|
+
[k: string]: unknown;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Where the failure was observed and how sure the runner is of it.
|
|
111
|
+
*/
|
|
112
|
+
export interface FailureEvidence {
|
|
113
|
+
/**
|
|
114
|
+
* Whether the source states the failure or merely suggests it.
|
|
115
|
+
*/
|
|
116
|
+
confidence: "confirmed" | "hint";
|
|
117
|
+
/**
|
|
118
|
+
* The signal source.
|
|
119
|
+
*/
|
|
120
|
+
source:
|
|
121
|
+
| "structured_event"
|
|
122
|
+
| "hook"
|
|
123
|
+
| "stderr"
|
|
124
|
+
| "grid_scrape"
|
|
125
|
+
| "exit_status"
|
|
126
|
+
| "transcript"
|
|
127
|
+
| "handshake_timeout";
|
|
128
|
+
[k: string]: unknown;
|
|
129
|
+
}
|
package/src/generated/index.ts
CHANGED
|
@@ -55,6 +55,8 @@ export type { BatchComputeEmbeddingRequest } from './BatchComputeEmbeddingReques
|
|
|
55
55
|
export type { BatchComputeEmbeddingResponse } from './BatchComputeEmbeddingResponse';
|
|
56
56
|
export type { BatchEmbeddingResult } from './BatchEmbeddingResult';
|
|
57
57
|
export type { BetweenIterations } from './BetweenIterations';
|
|
58
|
+
export type { BoundKind } from './BoundKind';
|
|
59
|
+
export type { BoundedReadMeta } from './BoundedReadMeta';
|
|
58
60
|
export type { BoundingBox } from './BoundingBox';
|
|
59
61
|
export type { BridgeFingerprint } from './BridgeFingerprint';
|
|
60
62
|
export type { BuildPhaseConfig } from './BuildPhaseConfig';
|
|
@@ -62,10 +64,12 @@ export type { BuiltinOverrideProposal } from './BuiltinOverrideProposal';
|
|
|
62
64
|
export type { CandidateMiss } from './CandidateMiss';
|
|
63
65
|
export type { CanonicalStep } from './CanonicalStep';
|
|
64
66
|
export type { CanvasPanel } from './CanvasPanel';
|
|
67
|
+
export type { CapabilityState } from './CapabilityState';
|
|
65
68
|
export type { CatchUpPolicy } from './CatchUpPolicy';
|
|
66
69
|
export type { Category } from './Category';
|
|
67
70
|
export type { CheckIssueDetail } from './CheckIssueDetail';
|
|
68
71
|
export type { CheckType } from './CheckType';
|
|
72
|
+
export type { CliProfile } from './CliProfile';
|
|
69
73
|
export type { CodeExecutionStep } from './CodeExecutionStep';
|
|
70
74
|
export type { CommandMode } from './CommandMode';
|
|
71
75
|
export type { CommandStep } from './CommandStep';
|
|
@@ -172,6 +176,7 @@ export type { ExportResult } from './ExportResult';
|
|
|
172
176
|
export type { ExtendIterationsRequest } from './ExtendIterationsRequest';
|
|
173
177
|
export type { FieldDiff } from './FieldDiff';
|
|
174
178
|
export type { FileChange } from './FileChange';
|
|
179
|
+
export type { FilterNarrowing } from './FilterNarrowing';
|
|
175
180
|
export type { Finding } from './Finding';
|
|
176
181
|
export type { FindingActionType } from './FindingActionType';
|
|
177
182
|
export type { FindingBatchCreate } from './FindingBatchCreate';
|
|
@@ -188,6 +193,7 @@ export type { FindingUpdate } from './FindingUpdate';
|
|
|
188
193
|
export type { FindingUserInput } from './FindingUserInput';
|
|
189
194
|
export type { FindingsSummary } from './FindingsSummary';
|
|
190
195
|
export type { FlowEvent } from './FlowEvent';
|
|
196
|
+
export type { FrontierEntry } from './FrontierEntry';
|
|
191
197
|
export type { FullRunnerStep } from './FullRunnerStep';
|
|
192
198
|
export type { FunctionalSpec } from './FunctionalSpec';
|
|
193
199
|
export type { GUIElementChunk } from './GUIElementChunk';
|
|
@@ -241,6 +247,10 @@ export type { JobItem } from './JobItem';
|
|
|
241
247
|
export type { JobListResponse } from './JobListResponse';
|
|
242
248
|
export type { JobStatus } from './JobStatus';
|
|
243
249
|
export type { JobSummary } from './JobSummary';
|
|
250
|
+
export type { JourneyEdgeObservation } from './JourneyEdgeObservation';
|
|
251
|
+
export type { JourneyLedgerHealth } from './JourneyLedgerHealth';
|
|
252
|
+
export type { JourneyNode } from './JourneyNode';
|
|
253
|
+
export type { JourneyTrigger } from './JourneyTrigger';
|
|
244
254
|
export type { LLMCostSummary } from './LLMCostSummary';
|
|
245
255
|
export type { LLMMetrics } from './LLMMetrics';
|
|
246
256
|
export type { LegacyAssertion } from './LegacyAssertion';
|
|
@@ -395,6 +405,7 @@ export type { SearchStrategy } from './SearchStrategy';
|
|
|
395
405
|
export type { SectionVerdict } from './SectionVerdict';
|
|
396
406
|
export type { SemanticSearchRequest } from './SemanticSearchRequest';
|
|
397
407
|
export type { SemanticSearchResponse } from './SemanticSearchResponse';
|
|
408
|
+
export type { SessionFailure } from './SessionFailure';
|
|
398
409
|
export type { SessionLite } from './SessionLite';
|
|
399
410
|
export type { SessionSource } from './SessionSource';
|
|
400
411
|
export type { SpecApiEvent } from './SpecApiEvent';
|