@alecsibilia/luca 14.0.0-alpha.18 → 14.0.0-alpha.19
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/CHANGELOG.md +4 -0
- package/board/client/board-look.ts +27 -1
- package/board/client/board-panel-parts.tsx +150 -0
- package/board/client/board-panel-stages.ts +99 -0
- package/board/client/board-panel-styles.ts +223 -0
- package/board/client/board-panel.tsx +68 -1299
- package/board/client/engine-life.ts +48 -0
- package/board/client/final-review-stack.tsx +144 -0
- package/board/client/heartbeat.tsx +61 -0
- package/board/client/helper-lines.tsx +69 -0
- package/board/client/live-feed.tsx +86 -0
- package/board/client/live-line.ts +73 -0
- package/board/client/model-line.tsx +178 -0
- package/board/client/needs-you-section.tsx +133 -0
- package/board/client/one-line.tsx +193 -0
- package/board/client/repo-wait-banner.tsx +69 -0
- package/board/client/run-footer.tsx +68 -0
- package/board/client/run-header.tsx +189 -0
- package/board/client/run-picker.tsx +98 -0
- package/board/client/status-bar.tsx +131 -0
- package/board/client/step-dots.tsx +127 -0
- package/board/client/ticket-card-view.tsx +238 -0
- package/board/client/ticket-detail.tsx +87 -0
- package/board/client/ticket-stack.tsx +119 -0
- package/board/client/ticket-wait.ts +188 -0
- package/board/client/usage-line.tsx +51 -0
- package/board/client/wait-line.tsx +39 -0
- package/board/package.json +1 -1
- package/board/server/board-panel-state-helpers.ts +67 -0
- package/board/server/board-server-check.ts +294 -0
- package/board/server/board-server-engine.ts +129 -0
- package/board/server/board-server-events.ts +134 -0
- package/board/server/board-server-read.ts +190 -0
- package/board/server/board-server-resume.ts +164 -0
- package/board/server/board-server-start.ts +174 -0
- package/board/server/board-server-store.ts +281 -0
- package/board/server/board-server-types.ts +114 -0
- package/board/server/board-server-util.ts +4 -0
- package/board/server/board-server.ts +49 -1182
- package/board/server/board-vocabulary-engine.ts +6 -2
- package/board/server/board-vocabulary-review.ts +12 -0
- package/board/server/board-vocabulary-run.ts +23 -1
- package/board/server/board-vocabulary-shapes.ts +22 -1
- package/board/server/board-vocabulary.ts +3 -0
- package/board/server/current-step-panel-helpers.ts +108 -0
- package/board/server/describe-record.ts +4 -0
- package/board/server/engine-restart-helpers.ts +105 -0
- package/board/server/journal-rebuild-helpers.ts +169 -0
- package/board/server/live-file.ts +130 -0
- package/board/server/luca-version.ts +1 -1
- package/board/server/reduce-board-agent-start.ts +224 -0
- package/board/server/reduce-board-agents.ts +160 -0
- package/board/server/reduce-board-counters.ts +138 -0
- package/board/server/reduce-board-create.ts +147 -0
- package/board/server/reduce-board-final-review.ts +174 -0
- package/board/server/reduce-board-needs-you.ts +277 -0
- package/board/server/reduce-board-reasons.ts +59 -0
- package/board/server/reduce-board-run.ts +255 -0
- package/board/server/reduce-board-settle.ts +88 -0
- package/board/server/reduce-board-steps.ts +226 -0
- package/board/server/reduce-board-text.ts +139 -0
- package/board/server/reduce-board-ticket-checks.ts +168 -0
- package/board/server/reduce-board-ticket-join.ts +144 -0
- package/board/server/reduce-board-ticket-start.ts +132 -0
- package/board/server/reduce-board-update.ts +117 -0
- package/board/server/reduce-board-usage.ts +247 -0
- package/board/server/reduce-board.ts +99 -2110
- package/board/server/ticket-stages-panel-helpers.ts +296 -0
- package/board/shared/board-state-counts.ts +77 -0
- package/board/shared/board-state-live.ts +99 -0
- package/board/shared/board-state-review.ts +59 -0
- package/board/shared/board-state-run.ts +236 -0
- package/board/shared/board-state-ticket.ts +257 -0
- package/board/shared/board-state-usage.ts +107 -0
- package/board/shared/board-state.ts +81 -596
- package/engine/agents/agent-launcher.ts +13 -0
- package/engine/agents/claude-launcher.ts +23 -273
- package/engine/agents/claude-messages.ts +20 -0
- package/engine/agents/claude-options.ts +7 -0
- package/engine/agents/common-instructions.ts +13 -1
- package/engine/agents/launch-session.ts +227 -0
- package/engine/agents/open-session.ts +12 -0
- package/engine/agents/role-instructions.ts +5 -3
- package/engine/agents/session-pool.ts +124 -0
- package/engine/agents/turn-progress.ts +283 -0
- package/engine/cli/run-modes.ts +4 -1
- package/engine/core/agent-guards-helpers.ts +77 -0
- package/engine/core/decide-build-tickets.ts +110 -45
- package/engine/core/decide-build.ts +43 -19
- package/engine/core/decide-ticket.ts +38 -20
- package/engine/core/decide-waits.ts +47 -0
- package/engine/core/decide.ts +45 -22
- package/engine/core/execute.ts +64 -15
- package/engine/core/live-file.ts +372 -0
- package/engine/gates/gate-runner.ts +22 -345
- package/engine/gates/own-files-check.ts +98 -0
- package/engine/gates/prepare-check.ts +60 -0
- package/engine/gates/prepare-slots.ts +23 -6
- package/engine/gates/shell-check.ts +60 -0
- package/engine/gates/slot-waits.ts +55 -0
- package/engine/gates/slow-test-runner.ts +59 -0
- package/engine/gates/test-checks.ts +161 -0
- package/engine/gates/test-slots.ts +6 -2
- package/engine/guards/guard-hook.ts +60 -12
- package/engine/guards/helper-rules.ts +92 -0
- package/engine/guards/permission-rules.ts +4 -3
- package/engine/guards/role-rules.ts +3 -1
- package/engine/journal/journal-entry-schema.ts +216 -0
- package/engine/journal/journal-kinds.ts +96 -0
- package/engine/journal/journal-record-schema.ts +216 -0
- package/engine/journal/journal-record.ts +17 -390
- package/engine/journal/replay.ts +3 -0
- package/engine/journal/run-entries.ts +17 -0
- package/engine/journal/ticket-replay.ts +1 -0
- package/engine/testing/live-file-fixtures.ts +57 -0
- package/engine/testing/practice-repo.ts +4 -0
- package/engine/testing/sdk-play.ts +177 -0
- package/engine/testing/wait-scenarios.ts +186 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -13,7 +13,8 @@ import type {
|
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
15
|
* Colors and words shared by the side panel and the chat rows, so both views
|
|
16
|
-
* match. Every color comes from the host theme
|
|
16
|
+
* match. Every color comes from the host theme, except the models' own
|
|
17
|
+
* (`MODEL_COLORS`).
|
|
17
18
|
*/
|
|
18
19
|
|
|
19
20
|
export const MONO = Platform.select({ ios: 'Menlo', default: 'monospace' })
|
|
@@ -154,6 +155,31 @@ export const statusColor = ({
|
|
|
154
155
|
}
|
|
155
156
|
}
|
|
156
157
|
|
|
158
|
+
/**
|
|
159
|
+
* The models' colors (#630): Opus purple, Sonnet orange, Haiku blue, and
|
|
160
|
+
* Clef (the decision model) green. Fixed hues that read on light and dark
|
|
161
|
+
* themes alike: the one exception to "every color from the host theme".
|
|
162
|
+
*/
|
|
163
|
+
export const MODEL_COLORS: ReadonlyMap<string, string> = new Map([
|
|
164
|
+
['opus', '#a371f7'],
|
|
165
|
+
['sonnet', '#e8833a'],
|
|
166
|
+
['haiku', '#3b9fe8'],
|
|
167
|
+
['clef', '#3fb950'],
|
|
168
|
+
])
|
|
169
|
+
|
|
170
|
+
/** Clef's confidence bar: green when sharp, orange when split. */
|
|
171
|
+
export const CONFIDENCE_COLORS = { sharp: '#3fb950', split: '#e3a23b' }
|
|
172
|
+
|
|
173
|
+
/** A model's color; the engine, or a model the board doesn't know, is muted. */
|
|
174
|
+
export const modelColor = ({
|
|
175
|
+
model,
|
|
176
|
+
theme,
|
|
177
|
+
}: {
|
|
178
|
+
model: string
|
|
179
|
+
theme: PluginTheme
|
|
180
|
+
}): string =>
|
|
181
|
+
MODEL_COLORS.get(model.toLowerCase()) ?? theme.colors.foregroundMuted
|
|
182
|
+
|
|
157
183
|
/** A run status in words. */
|
|
158
184
|
export const statusText = ({ status }: { status: RunStatus }): string => {
|
|
159
185
|
switch (status) {
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The small pieces the panel's sections share: a fix-loop counter, a running
|
|
3
|
+
* step with its time, a stage header, a banner, and a section.
|
|
4
|
+
*/
|
|
5
|
+
import type { ReactNode } from 'react'
|
|
6
|
+
|
|
7
|
+
import { Icon } from '@getpaseo/plugin/client/react-native'
|
|
8
|
+
import { Pressable, Text, View } from 'react-native'
|
|
9
|
+
|
|
10
|
+
import { useNow } from './board-look'
|
|
11
|
+
import type { Look, Styles } from './board-panel-styles'
|
|
12
|
+
import { CutLine, useCloseBubble } from './one-line'
|
|
13
|
+
|
|
14
|
+
import {
|
|
15
|
+
LOOP_CAP,
|
|
16
|
+
currentStepText,
|
|
17
|
+
type CurrentStep,
|
|
18
|
+
} from '../shared/board-state'
|
|
19
|
+
|
|
20
|
+
export const Counter = ({
|
|
21
|
+
label,
|
|
22
|
+
value,
|
|
23
|
+
theme,
|
|
24
|
+
styles,
|
|
25
|
+
}: { label: string; value: number } & Look) => {
|
|
26
|
+
const color =
|
|
27
|
+
value >= LOOP_CAP
|
|
28
|
+
? theme.colors.statusDanger
|
|
29
|
+
: value > 0
|
|
30
|
+
? theme.colors.statusWarning
|
|
31
|
+
: theme.colors.foregroundMuted
|
|
32
|
+
return (
|
|
33
|
+
<Text
|
|
34
|
+
style={[styles.counter, { color, borderColor: color }]}
|
|
35
|
+
numberOfLines={1}
|
|
36
|
+
>
|
|
37
|
+
{label} {value}/{LOOP_CAP}
|
|
38
|
+
</Text>
|
|
39
|
+
)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** A running step with its time, counting up by itself, on one line. */
|
|
43
|
+
export const StepLine = ({
|
|
44
|
+
step,
|
|
45
|
+
prefix,
|
|
46
|
+
at = null,
|
|
47
|
+
styles,
|
|
48
|
+
}: {
|
|
49
|
+
step: CurrentStep
|
|
50
|
+
prefix: string
|
|
51
|
+
/** A stopped clock (#635), in ms, in place of the ticking one. */
|
|
52
|
+
at?: number | null
|
|
53
|
+
styles: Styles
|
|
54
|
+
}) => {
|
|
55
|
+
const ticking = useNow()
|
|
56
|
+
const now = at ?? ticking
|
|
57
|
+
return (
|
|
58
|
+
<CutLine
|
|
59
|
+
text={`${prefix}${currentStepText({ step, now })}`}
|
|
60
|
+
style={styles.muted}
|
|
61
|
+
styles={styles}
|
|
62
|
+
/>
|
|
63
|
+
)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export const StageHeader = ({
|
|
67
|
+
title,
|
|
68
|
+
hint,
|
|
69
|
+
icon,
|
|
70
|
+
count,
|
|
71
|
+
color,
|
|
72
|
+
folded,
|
|
73
|
+
onPress,
|
|
74
|
+
theme,
|
|
75
|
+
styles,
|
|
76
|
+
}: {
|
|
77
|
+
title: string
|
|
78
|
+
hint: string
|
|
79
|
+
icon: string
|
|
80
|
+
count: number
|
|
81
|
+
color: string
|
|
82
|
+
folded: boolean | null
|
|
83
|
+
onPress: (() => void) | null
|
|
84
|
+
} & Look) => {
|
|
85
|
+
const closeBubble = useCloseBubble()
|
|
86
|
+
const empty = count === 0
|
|
87
|
+
const tint = empty ? theme.colors.foregroundMuted : color
|
|
88
|
+
const content = (
|
|
89
|
+
<>
|
|
90
|
+
<Icon name={icon} size={13} color={tint} />
|
|
91
|
+
<Text style={[styles.stageTitle, { color: tint }]}>
|
|
92
|
+
{title.toUpperCase()}
|
|
93
|
+
</Text>
|
|
94
|
+
<Text style={styles.stageCount}>{count}</Text>
|
|
95
|
+
{empty || hint === '' ? null : (
|
|
96
|
+
<Text style={styles.stageHint} numberOfLines={1}>
|
|
97
|
+
{hint}
|
|
98
|
+
</Text>
|
|
99
|
+
)}
|
|
100
|
+
<View style={styles.spacer} />
|
|
101
|
+
{folded === null || empty ? null : (
|
|
102
|
+
<Icon
|
|
103
|
+
name={folded ? 'ChevronRight' : 'ChevronDown'}
|
|
104
|
+
size={13}
|
|
105
|
+
color={theme.colors.foregroundMuted}
|
|
106
|
+
/>
|
|
107
|
+
)}
|
|
108
|
+
</>
|
|
109
|
+
)
|
|
110
|
+
const style = [styles.stageHeader, empty ? styles.stageHeaderThin : null]
|
|
111
|
+
if (!onPress || empty) return <View style={style}>{content}</View>
|
|
112
|
+
return (
|
|
113
|
+
<Pressable
|
|
114
|
+
accessibilityRole="button"
|
|
115
|
+
accessibilityLabel={`${title}, ${count}. ${folded ? 'Open' : 'Fold'} this stage`}
|
|
116
|
+
onPress={() => {
|
|
117
|
+
closeBubble()
|
|
118
|
+
onPress()
|
|
119
|
+
}}
|
|
120
|
+
style={style}
|
|
121
|
+
>
|
|
122
|
+
{content}
|
|
123
|
+
</Pressable>
|
|
124
|
+
)
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export const Banner = ({
|
|
128
|
+
icon,
|
|
129
|
+
color,
|
|
130
|
+
children,
|
|
131
|
+
styles,
|
|
132
|
+
}: {
|
|
133
|
+
icon: string
|
|
134
|
+
color: string
|
|
135
|
+
children: ReactNode
|
|
136
|
+
styles: Styles
|
|
137
|
+
}) => (
|
|
138
|
+
<View style={[styles.banner, { borderColor: color }]}>
|
|
139
|
+
<Icon name={icon} size={13} color={color} />
|
|
140
|
+
<Text style={[styles.bannerText, { color }]}>{children}</Text>
|
|
141
|
+
</View>
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
export const Section = ({
|
|
145
|
+
children,
|
|
146
|
+
styles,
|
|
147
|
+
}: {
|
|
148
|
+
children: ReactNode
|
|
149
|
+
styles: Styles
|
|
150
|
+
}) => <View style={styles.block}>{children}</View>
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The stages the panel stacks tickets and lenses in, and the keys of the
|
|
3
|
+
* cards and stages a person opens or folds.
|
|
4
|
+
*/
|
|
5
|
+
import type { LensState, TicketStage } from '../shared/board-state'
|
|
6
|
+
|
|
7
|
+
type StackStage = Exclude<TicketStage, 'stuck'>
|
|
8
|
+
|
|
9
|
+
export const TICKET_STAGES: {
|
|
10
|
+
stage: StackStage
|
|
11
|
+
title: string
|
|
12
|
+
hint: string
|
|
13
|
+
icon: string
|
|
14
|
+
folded: boolean
|
|
15
|
+
}[] = [
|
|
16
|
+
{
|
|
17
|
+
stage: 'blocked',
|
|
18
|
+
title: 'Blocked',
|
|
19
|
+
hint: "waits on a ticket that isn't done",
|
|
20
|
+
icon: 'Lock',
|
|
21
|
+
folded: false,
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
stage: 'building',
|
|
25
|
+
title: 'Building',
|
|
26
|
+
hint: 'the first tests and code',
|
|
27
|
+
icon: 'Hammer',
|
|
28
|
+
folded: false,
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
stage: 'reviewing',
|
|
32
|
+
title: 'Reviewing',
|
|
33
|
+
hint: 'a reviewer reads the ticket',
|
|
34
|
+
icon: 'ScanSearch',
|
|
35
|
+
folded: false,
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
stage: 'testing',
|
|
39
|
+
title: 'Testing',
|
|
40
|
+
hint: 'the red check or the checks running',
|
|
41
|
+
icon: 'FlaskConical',
|
|
42
|
+
folded: false,
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
stage: 'fixing',
|
|
46
|
+
title: 'Fixing',
|
|
47
|
+
hint: 'a fix round after the checks, a review or a join',
|
|
48
|
+
icon: 'Wrench',
|
|
49
|
+
folded: false,
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
stage: 'joining',
|
|
53
|
+
title: 'Joining',
|
|
54
|
+
hint: 'joining the run branch and its checks there',
|
|
55
|
+
icon: 'GitMerge',
|
|
56
|
+
folded: false,
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
stage: 'done',
|
|
60
|
+
title: 'Done',
|
|
61
|
+
hint: 'joined the run branch',
|
|
62
|
+
icon: 'CircleCheck',
|
|
63
|
+
folded: true,
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
stage: 'skipped',
|
|
67
|
+
title: 'Skipped',
|
|
68
|
+
hint: 'left out of this run, stays open',
|
|
69
|
+
icon: 'SkipForward',
|
|
70
|
+
folded: true,
|
|
71
|
+
},
|
|
72
|
+
]
|
|
73
|
+
|
|
74
|
+
export const LENS_STAGES: { stage: LensState; title: string; icon: string }[] =
|
|
75
|
+
[
|
|
76
|
+
{ stage: 'waiting', title: 'Waiting', icon: 'Clock' },
|
|
77
|
+
{ stage: 'reviewing', title: 'Reviewing', icon: 'ScanSearch' },
|
|
78
|
+
{ stage: 'fixing', title: 'Fixing', icon: 'Wrench' },
|
|
79
|
+
{ stage: 'clean', title: 'Clean', icon: 'CircleCheck' },
|
|
80
|
+
]
|
|
81
|
+
|
|
82
|
+
/** A card or stage key. */
|
|
83
|
+
export type Key = string
|
|
84
|
+
|
|
85
|
+
/** The key of the fold for tickets left out for a person (#499). */
|
|
86
|
+
export const FOR_A_PERSON: Key = 'for_a_person'
|
|
87
|
+
|
|
88
|
+
export const toggled = ({
|
|
89
|
+
set,
|
|
90
|
+
key,
|
|
91
|
+
}: {
|
|
92
|
+
set: ReadonlySet<Key>
|
|
93
|
+
key: string
|
|
94
|
+
}): Set<Key> => {
|
|
95
|
+
const next = new Set(set)
|
|
96
|
+
if (next.has(key)) next.delete(key)
|
|
97
|
+
else next.add(key)
|
|
98
|
+
return next
|
|
99
|
+
}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The side panel's styles: one `StyleSheet` made from the host theme, and
|
|
3
|
+
* the `Look` (theme and styles) every piece of the panel takes.
|
|
4
|
+
*/
|
|
5
|
+
import type { PluginTheme } from '@getpaseo/plugin'
|
|
6
|
+
import { StyleSheet } from 'react-native'
|
|
7
|
+
|
|
8
|
+
import { DIMMED, MONO } from './board-look'
|
|
9
|
+
|
|
10
|
+
export const makeStyles = ({
|
|
11
|
+
theme,
|
|
12
|
+
compact,
|
|
13
|
+
}: {
|
|
14
|
+
theme: PluginTheme
|
|
15
|
+
compact: boolean
|
|
16
|
+
}) => {
|
|
17
|
+
const { colors } = theme
|
|
18
|
+
return StyleSheet.create({
|
|
19
|
+
screen: { flex: 1, backgroundColor: colors.surface0 },
|
|
20
|
+
content: { padding: compact ? 10 : 16, gap: 8 },
|
|
21
|
+
/** Fills the scroll area, so a tap on its blank part lands too. */
|
|
22
|
+
fill: { flexGrow: 1 },
|
|
23
|
+
/** The cards' scroll area, above the pinned status bar. */
|
|
24
|
+
scroll: { flex: 1 },
|
|
25
|
+
/** The status bar, pinned at the bottom of the panel. */
|
|
26
|
+
statusBar: {
|
|
27
|
+
flexShrink: 0,
|
|
28
|
+
gap: 4,
|
|
29
|
+
borderTopColor: colors.border,
|
|
30
|
+
borderTopWidth: 1,
|
|
31
|
+
backgroundColor: colors.surface1,
|
|
32
|
+
paddingHorizontal: compact ? 10 : 16,
|
|
33
|
+
paddingVertical: 5,
|
|
34
|
+
},
|
|
35
|
+
row: {
|
|
36
|
+
flexDirection: 'row',
|
|
37
|
+
alignItems: 'center',
|
|
38
|
+
flexWrap: 'wrap',
|
|
39
|
+
gap: compact ? 6 : 10,
|
|
40
|
+
},
|
|
41
|
+
/** A row that stays on one line: its cut lines give way. */
|
|
42
|
+
line: {
|
|
43
|
+
flexDirection: 'row',
|
|
44
|
+
alignItems: 'center',
|
|
45
|
+
gap: compact ? 6 : 10,
|
|
46
|
+
},
|
|
47
|
+
/** A part that never shrinks or gets cut: a number, tag or time. */
|
|
48
|
+
fixed: { flexShrink: 0 },
|
|
49
|
+
/** What holds a cut line: it gives way, down to nothing. */
|
|
50
|
+
cut: { flexShrink: 1, minWidth: 0 },
|
|
51
|
+
/** The bubble a tap on a cut line opens, with its full text. */
|
|
52
|
+
bubble: {
|
|
53
|
+
color: colors.foreground,
|
|
54
|
+
backgroundColor: colors.surface2,
|
|
55
|
+
borderColor: colors.border,
|
|
56
|
+
borderWidth: 1,
|
|
57
|
+
borderRadius: 6,
|
|
58
|
+
paddingHorizontal: 8,
|
|
59
|
+
paddingVertical: 5,
|
|
60
|
+
fontSize: 12,
|
|
61
|
+
},
|
|
62
|
+
title: { color: colors.foreground, fontSize: 16, fontWeight: '700' },
|
|
63
|
+
spacer: { flex: 1 },
|
|
64
|
+
text: { color: colors.foreground, fontSize: 13 },
|
|
65
|
+
muted: { color: colors.foregroundMuted, fontSize: 12 },
|
|
66
|
+
mono: { color: colors.foregroundMuted, fontSize: 12, fontFamily: MONO },
|
|
67
|
+
small: { color: colors.foregroundMuted, fontSize: 11 },
|
|
68
|
+
pill: {
|
|
69
|
+
flexShrink: 0,
|
|
70
|
+
borderWidth: 1,
|
|
71
|
+
borderRadius: 999,
|
|
72
|
+
paddingHorizontal: 7,
|
|
73
|
+
paddingVertical: 1,
|
|
74
|
+
fontSize: 11,
|
|
75
|
+
fontWeight: '700',
|
|
76
|
+
},
|
|
77
|
+
chip: {
|
|
78
|
+
borderWidth: 1,
|
|
79
|
+
borderColor: colors.border,
|
|
80
|
+
borderRadius: 6,
|
|
81
|
+
paddingHorizontal: 8,
|
|
82
|
+
paddingVertical: 3,
|
|
83
|
+
},
|
|
84
|
+
chipOn: {
|
|
85
|
+
borderColor: colors.accent,
|
|
86
|
+
backgroundColor: colors.surface2,
|
|
87
|
+
},
|
|
88
|
+
banner: {
|
|
89
|
+
flexDirection: 'row',
|
|
90
|
+
alignItems: 'center',
|
|
91
|
+
gap: 6,
|
|
92
|
+
borderWidth: 1,
|
|
93
|
+
borderRadius: 6,
|
|
94
|
+
paddingHorizontal: 8,
|
|
95
|
+
paddingVertical: 5,
|
|
96
|
+
},
|
|
97
|
+
bannerText: { fontSize: 12, flexShrink: 1 },
|
|
98
|
+
block: { gap: 6 },
|
|
99
|
+
stageHeader: {
|
|
100
|
+
flexDirection: 'row',
|
|
101
|
+
alignItems: 'center',
|
|
102
|
+
gap: 6,
|
|
103
|
+
paddingVertical: 4,
|
|
104
|
+
paddingHorizontal: 6,
|
|
105
|
+
borderRadius: 6,
|
|
106
|
+
},
|
|
107
|
+
stageHeaderThin: { paddingVertical: 1, opacity: DIMMED },
|
|
108
|
+
stageTitle: { fontSize: 12, fontWeight: '700', letterSpacing: 1 },
|
|
109
|
+
stageCount: {
|
|
110
|
+
color: colors.foregroundMuted,
|
|
111
|
+
fontSize: 12,
|
|
112
|
+
fontFamily: MONO,
|
|
113
|
+
},
|
|
114
|
+
stageHint: {
|
|
115
|
+
color: colors.foregroundMuted,
|
|
116
|
+
fontSize: 11,
|
|
117
|
+
flexShrink: 1,
|
|
118
|
+
},
|
|
119
|
+
stageBody: { gap: 6, paddingLeft: compact ? 0 : 8 },
|
|
120
|
+
card: {
|
|
121
|
+
backgroundColor: colors.surface1,
|
|
122
|
+
borderColor: colors.border,
|
|
123
|
+
borderWidth: 1,
|
|
124
|
+
borderRadius: 8,
|
|
125
|
+
paddingHorizontal: compact ? 8 : 10,
|
|
126
|
+
paddingVertical: compact ? 7 : 8,
|
|
127
|
+
gap: 5,
|
|
128
|
+
},
|
|
129
|
+
cardStuck: { borderColor: colors.statusDanger, borderLeftWidth: 4 },
|
|
130
|
+
cardPressed: { backgroundColor: colors.surface2 },
|
|
131
|
+
cardTop: { flexDirection: 'row', alignItems: 'center', gap: 6 },
|
|
132
|
+
number: {
|
|
133
|
+
flexShrink: 0,
|
|
134
|
+
color: colors.foregroundMuted,
|
|
135
|
+
fontSize: 12,
|
|
136
|
+
fontWeight: '700',
|
|
137
|
+
fontFamily: MONO,
|
|
138
|
+
},
|
|
139
|
+
cardTitle: {
|
|
140
|
+
color: colors.foreground,
|
|
141
|
+
fontSize: 13,
|
|
142
|
+
fontWeight: '600',
|
|
143
|
+
flexShrink: 1,
|
|
144
|
+
},
|
|
145
|
+
tag: {
|
|
146
|
+
flexShrink: 0,
|
|
147
|
+
color: colors.foregroundMuted,
|
|
148
|
+
borderColor: colors.border,
|
|
149
|
+
borderWidth: 1,
|
|
150
|
+
borderRadius: 4,
|
|
151
|
+
paddingHorizontal: 4,
|
|
152
|
+
fontSize: 10,
|
|
153
|
+
},
|
|
154
|
+
/** Clef's confidence bar, and its part filled to the confidence. */
|
|
155
|
+
confidence: {
|
|
156
|
+
flexShrink: 0,
|
|
157
|
+
width: 28,
|
|
158
|
+
height: 5,
|
|
159
|
+
borderRadius: 3,
|
|
160
|
+
overflow: 'hidden',
|
|
161
|
+
backgroundColor: colors.surface2,
|
|
162
|
+
},
|
|
163
|
+
confidenceFill: { height: 5 },
|
|
164
|
+
/** A running helper's line (#636), its left edge in its model's colour. */
|
|
165
|
+
helperLine: { borderLeftWidth: 2, paddingLeft: 6 },
|
|
166
|
+
dots: { flexDirection: 'row', alignItems: 'center', flexShrink: 0 },
|
|
167
|
+
dotCell: { flexDirection: 'row', alignItems: 'center' },
|
|
168
|
+
link: { width: compact ? 7 : 10, height: 2 },
|
|
169
|
+
dot: { width: 8, height: 8, borderRadius: 4, borderWidth: 1.5 },
|
|
170
|
+
dotCurrent: { width: 12, height: 12, borderRadius: 6, borderWidth: 2 },
|
|
171
|
+
dotSkip: { borderStyle: 'dashed' },
|
|
172
|
+
stepLabel: { fontSize: 12, fontWeight: '600', marginLeft: 6 },
|
|
173
|
+
/** A waiting card's amber bar, where a heartbeat would be. */
|
|
174
|
+
waitBar: {
|
|
175
|
+
flexShrink: 0,
|
|
176
|
+
width: 28,
|
|
177
|
+
height: 4,
|
|
178
|
+
borderRadius: 2,
|
|
179
|
+
opacity: 0.8,
|
|
180
|
+
},
|
|
181
|
+
/** A busy card's heartbeat, and each of its bars, standing on the bottom. */
|
|
182
|
+
heartbeat: {
|
|
183
|
+
flexDirection: 'row',
|
|
184
|
+
alignItems: 'flex-end',
|
|
185
|
+
flexShrink: 0,
|
|
186
|
+
height: 14,
|
|
187
|
+
gap: 1,
|
|
188
|
+
},
|
|
189
|
+
heartbeatBar: { width: 2, borderRadius: 1 },
|
|
190
|
+
counter: {
|
|
191
|
+
flexShrink: 0,
|
|
192
|
+
borderWidth: 1,
|
|
193
|
+
borderRadius: 5,
|
|
194
|
+
paddingHorizontal: 5,
|
|
195
|
+
fontSize: 11,
|
|
196
|
+
fontFamily: MONO,
|
|
197
|
+
},
|
|
198
|
+
detail: {
|
|
199
|
+
gap: 3,
|
|
200
|
+
borderTopColor: colors.border,
|
|
201
|
+
borderTopWidth: 1,
|
|
202
|
+
paddingTop: 5,
|
|
203
|
+
},
|
|
204
|
+
label: {
|
|
205
|
+
color: colors.foregroundMuted,
|
|
206
|
+
fontSize: 12,
|
|
207
|
+
fontWeight: '700',
|
|
208
|
+
},
|
|
209
|
+
rule: { height: 1, backgroundColor: colors.border, marginVertical: 4 },
|
|
210
|
+
reviewTitle: {
|
|
211
|
+
color: colors.foreground,
|
|
212
|
+
fontSize: 14,
|
|
213
|
+
fontWeight: '700',
|
|
214
|
+
},
|
|
215
|
+
prLink: { color: colors.accent, fontSize: 12 },
|
|
216
|
+
})
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
type MakeStyles = typeof makeStyles
|
|
220
|
+
|
|
221
|
+
export type Styles = ReturnType<MakeStyles>
|
|
222
|
+
|
|
223
|
+
export type Look = { theme: PluginTheme; styles: Styles }
|