@uchibeke/gallivant 0.0.0-stage → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CONTRIBUTING.md +26 -0
- package/LICENSE +204 -0
- package/README.md +239 -2
- package/SECURITY.md +19 -0
- package/bin/gallivant.mjs +261 -0
- package/bin/package-plugin.mjs +16 -0
- package/bin/release-live.mjs +29 -0
- package/bin/release-package.mjs +23 -0
- package/bin/session-runtime.mjs +13 -0
- package/bin/task-delivery-state.mjs +12 -0
- package/docs/README.md +72 -0
- package/docs/agent-setup.md +228 -0
- package/docs/app.md +111 -0
- package/docs/architecture.md +265 -0
- package/docs/chains.md +102 -0
- package/docs/codex-cloud.md +284 -0
- package/docs/commands.md +649 -0
- package/docs/config.md +437 -0
- package/docs/execution.md +796 -0
- package/docs/guardrails.md +311 -0
- package/docs/install.md +398 -0
- package/docs/launch.md +45 -0
- package/docs/learning.md +369 -0
- package/docs/network-recovery.md +101 -0
- package/docs/openai-agents.md +457 -0
- package/docs/prd.md +246 -0
- package/docs/preparation.md +110 -0
- package/docs/release-qualification.md +196 -0
- package/docs/releasing.md +149 -0
- package/docs/runtime-environment.md +113 -0
- package/docs/task-delivery.md +476 -0
- package/docs/tasks.md +739 -0
- package/lib/aport.mjs +95 -0
- package/lib/attribution.mjs +95 -0
- package/lib/block.mjs +89 -0
- package/lib/capabilities.mjs +3 -0
- package/lib/chains.mjs +222 -0
- package/lib/codex_cloud.mjs +160 -0
- package/lib/codex_cloud_config.mjs +20 -0
- package/lib/codex_cloud_input.mjs +49 -0
- package/lib/codex_cloud_result.mjs +74 -0
- package/lib/commands/doctor.mjs +466 -0
- package/lib/commands/init.mjs +245 -0
- package/lib/commands/learn.mjs +54 -0
- package/lib/commands/new.mjs +47 -0
- package/lib/commands/ready.mjs +45 -0
- package/lib/commands/register.mjs +249 -0
- package/lib/commands/resume.mjs +224 -0
- package/lib/commands/serve.mjs +349 -0
- package/lib/commands/start.mjs +247 -0
- package/lib/commands/start_services.mjs +22 -0
- package/lib/commands/status.mjs +150 -0
- package/lib/commands/task.mjs +73 -0
- package/lib/commands/up.mjs +228 -0
- package/lib/commands/why.mjs +143 -0
- package/lib/config.mjs +461 -0
- package/lib/context.mjs +102 -0
- package/lib/control.mjs +202 -0
- package/lib/control_contract.mjs +16 -0
- package/lib/coordinator.mjs +19 -0
- package/lib/credential.mjs +161 -0
- package/lib/daemon.mjs +156 -0
- package/lib/deliverable.mjs +357 -0
- package/lib/events.mjs +261 -0
- package/lib/executable.mjs +31 -0
- package/lib/execution.mjs +707 -0
- package/lib/execution_contract.mjs +15 -0
- package/lib/execution_input.mjs +4 -0
- package/lib/execution_io.mjs +94 -0
- package/lib/execution_journal.mjs +69 -0
- package/lib/execution_preparation.mjs +29 -0
- package/lib/execution_result.mjs +266 -0
- package/lib/fs.mjs +140 -0
- package/lib/gh.mjs +289 -0
- package/lib/git.mjs +434 -0
- package/lib/harness.mjs +521 -0
- package/lib/harness_log.mjs +432 -0
- package/lib/hash.mjs +16 -0
- package/lib/identity.mjs +98 -0
- package/lib/learning.mjs +654 -0
- package/lib/learning_contract.mjs +2 -0
- package/lib/learning_data.mjs +135 -0
- package/lib/learning_input.mjs +111 -0
- package/lib/learning_qualification.mjs +67 -0
- package/lib/learning_signer.mjs +151 -0
- package/lib/learning_store.mjs +88 -0
- package/lib/log.mjs +53 -0
- package/lib/network_diagnostics.mjs +64 -0
- package/lib/network_recovery.mjs +42 -0
- package/lib/notify.mjs +58 -0
- package/lib/openai_agents.mjs +373 -0
- package/lib/openai_agents_config.mjs +14 -0
- package/lib/openai_agents_http.mjs +87 -0
- package/lib/openai_agents_input.mjs +15 -0
- package/lib/openai_agents_sources.mjs +112 -0
- package/lib/owner_delivery.mjs +443 -0
- package/lib/plugin_package.mjs +340 -0
- package/lib/prd.mjs +635 -0
- package/lib/preparation_agents.mjs +33 -0
- package/lib/preparation_codex.mjs +212 -0
- package/lib/probe.mjs +126 -0
- package/lib/prompt.mjs +238 -0
- package/lib/provider_health.mjs +55 -0
- package/lib/public-format.mjs +31 -0
- package/lib/public_output.mjs +49 -0
- package/lib/release_package.mjs +154 -0
- package/lib/repository_files.mjs +86 -0
- package/lib/run.mjs +385 -0
- package/lib/run_log.mjs +94 -0
- package/lib/runtime-environment.mjs +87 -0
- package/lib/runtime_dependencies.mjs +15 -0
- package/lib/runtime_node.mjs +107 -0
- package/lib/runtime_state.mjs +174 -0
- package/lib/sources/index.mjs +27 -0
- package/lib/sources/prd.mjs +50 -0
- package/lib/start_contract.mjs +37 -0
- package/lib/state.mjs +246 -0
- package/lib/task_allowance.mjs +31 -0
- package/lib/task_completion.mjs +61 -0
- package/lib/task_contract.mjs +450 -0
- package/lib/task_delivery.mjs +219 -0
- package/lib/task_delivery_cancel.mjs +34 -0
- package/lib/task_delivery_contract.mjs +61 -0
- package/lib/task_delivery_mcp.mjs +40 -0
- package/lib/task_delivery_store.mjs +43 -0
- package/lib/task_delivery_view.mjs +88 -0
- package/lib/task_environment.mjs +281 -0
- package/lib/task_prepare.mjs +224 -0
- package/lib/task_store.mjs +38 -0
- package/lib/tasks.mjs +513 -0
- package/lib/tick.mjs +1654 -0
- package/lib/time.mjs +36 -0
- package/lib/tracker/assets.mjs +43 -0
- package/lib/tracker/pages.mjs +320 -0
- package/lib/tracker/runs.mjs +102 -0
- package/lib/tracker/stream.mjs +74 -0
- package/lib/tracker_process.mjs +107 -0
- package/lib/verification_sandbox.mjs +181 -0
- package/node_modules/smol-toml/LICENSE +24 -0
- package/node_modules/smol-toml/README.md +605 -0
- package/node_modules/smol-toml/dist/date.d.ts +41 -0
- package/node_modules/smol-toml/dist/date.js +156 -0
- package/node_modules/smol-toml/dist/error.d.ts +37 -0
- package/node_modules/smol-toml/dist/error.js +67 -0
- package/node_modules/smol-toml/dist/extract.js +289 -0
- package/node_modules/smol-toml/dist/index.cjs +770 -0
- package/node_modules/smol-toml/dist/index.d.ts +44 -0
- package/node_modules/smol-toml/dist/index.js +34 -0
- package/node_modules/smol-toml/dist/parse.d.ts +73 -0
- package/node_modules/smol-toml/dist/parse.js +164 -0
- package/node_modules/smol-toml/dist/primitive.js +151 -0
- package/node_modules/smol-toml/dist/stringify.d.ts +32 -0
- package/node_modules/smol-toml/dist/stringify.js +219 -0
- package/node_modules/smol-toml/dist/struct.js +156 -0
- package/node_modules/smol-toml/dist/util.d.ts +43 -0
- package/node_modules/smol-toml/dist/util.js +57 -0
- package/node_modules/smol-toml/package.json +68 -0
- package/npm-shrinkwrap.json +1823 -0
- package/package.json +105 -4
- package/templates/claude-settings.json +18 -0
- package/templates/passport.gallivant.json +83 -0
- package/templates/plugin/bundled-runtime.json +26 -0
- package/templates/plugin/schemas/mcp.schema.json +120 -0
- package/templates/plugin/schemas/plugin.schema.json +65 -0
- package/templates/plugin/task-delivery.SKILL.md +60 -0
- package/templates/prd.md +32 -0
- package/templates/tracker/tracker.css +301 -0
- package/templates/tracker/tracker.js +721 -0
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
/* The tracker's one stylesheet, served as a file so the CSP needs no 'unsafe-inline' for styles either.
|
|
2
|
+
*
|
|
3
|
+
* The values match command-center's design system (public/app.css): the same canvas, surface, accent, radii, pill
|
|
4
|
+
* buttons and Inter/JetBrains Mono pairing, so a tracker mounted inside it reads as part of the same tool rather
|
|
5
|
+
* than as a foreign page in a frame. They are duplicated rather than imported because Gallivant has no dependency
|
|
6
|
+
* on command-center and must look right standalone too; the custom properties below are how a host overrides them.
|
|
7
|
+
*
|
|
8
|
+
* Every colour, font and spacing value is a custom property with a default. How far a host's override reaches
|
|
9
|
+
* depends on the origin:
|
|
10
|
+
*
|
|
11
|
+
* Same origin (mounted on the host's own server, which is the arrangement to prefer):
|
|
12
|
+
* setting these properties on :root restyles everything here.
|
|
13
|
+
* Cross origin (a separate port is a separate origin):
|
|
14
|
+
* the parent cannot touch this document at all. CSS does not cross an origin boundary, and no amount of custom
|
|
15
|
+
* properties changes that. The mechanism for that case is ?theme=dark|light on the URL.
|
|
16
|
+
*/
|
|
17
|
+
:root {
|
|
18
|
+
color-scheme: dark;
|
|
19
|
+
|
|
20
|
+
--gv-canvas: #06090f;
|
|
21
|
+
--gv-surface: #0d1117;
|
|
22
|
+
--gv-bench: #0b1120;
|
|
23
|
+
--gv-text: #e8ecf1;
|
|
24
|
+
--gv-muted: #7a8ba3;
|
|
25
|
+
--gv-subtle: #64748b;
|
|
26
|
+
--gv-line: rgba(255, 255, 255, .08);
|
|
27
|
+
--gv-line-strong: rgba(255, 255, 255, .2);
|
|
28
|
+
--gv-hover: rgba(255, 255, 255, .04);
|
|
29
|
+
--gv-accent: #22d3ee;
|
|
30
|
+
--gv-accent-soft: rgba(34, 211, 238, .1);
|
|
31
|
+
--gv-success: #10b981;
|
|
32
|
+
--gv-warning: #f59e0b;
|
|
33
|
+
--gv-danger: #ef4444;
|
|
34
|
+
|
|
35
|
+
--gv-font: Inter, -apple-system, system-ui, "Segoe UI", sans-serif;
|
|
36
|
+
--gv-mono: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, monospace;
|
|
37
|
+
--gv-size: 14px;
|
|
38
|
+
|
|
39
|
+
--gv-r: 12px;
|
|
40
|
+
--gv-pad: 20px;
|
|
41
|
+
--gv-sidebar: 300px;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/* The light palette is opt-in, because the host this is built to sit inside is dark. `?theme=light` asks for it. */
|
|
45
|
+
:root[data-theme="light"] {
|
|
46
|
+
color-scheme: light;
|
|
47
|
+
--gv-canvas: #f7f8fa; --gv-surface: #fff; --gv-bench: #f0f2f5; --gv-text: #10151c; --gv-muted: #5b6b80;
|
|
48
|
+
--gv-subtle: #7d8a9b; --gv-line: rgba(0, 0, 0, .1); --gv-line-strong: rgba(0, 0, 0, .22);
|
|
49
|
+
--gv-hover: rgba(0, 0, 0, .04); --gv-accent: #0891b2; --gv-accent-soft: rgba(8, 145, 178, .1);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
* { box-sizing: border-box; }
|
|
53
|
+
[hidden] { display: none !important; }
|
|
54
|
+
|
|
55
|
+
body {
|
|
56
|
+
margin: 0;
|
|
57
|
+
background: var(--gv-canvas);
|
|
58
|
+
color: var(--gv-text);
|
|
59
|
+
font-family: var(--gv-font);
|
|
60
|
+
font-size: var(--gv-size);
|
|
61
|
+
line-height: 1.5;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
a { color: var(--gv-accent); }
|
|
65
|
+
.dim { color: var(--gv-subtle); }
|
|
66
|
+
.warn { color: var(--gv-warning); }
|
|
67
|
+
.live { color: var(--gv-success); }
|
|
68
|
+
code, .mono { font-family: var(--gv-mono); font-size: .86em; }
|
|
69
|
+
|
|
70
|
+
/* No fixed viewport assumption: this is often a frame, so the layout is a grid that collapses to one column. */
|
|
71
|
+
header.top {
|
|
72
|
+
display: flex; flex-wrap: wrap; gap: 10px; align-items: center;
|
|
73
|
+
padding: 14px var(--gv-pad); border-bottom: 1px solid var(--gv-line); background: var(--gv-surface);
|
|
74
|
+
}
|
|
75
|
+
header.top h1 { font-size: var(--gv-size); margin: 0; font-weight: 600; letter-spacing: -.01em; }
|
|
76
|
+
nav.views { display: flex; gap: 6px; align-items: center; margin-left: auto; }
|
|
77
|
+
nav.views a {
|
|
78
|
+
color: var(--gv-muted); text-decoration: none; font-size: 13px;
|
|
79
|
+
padding: 5px 12px; border-radius: 999px; border: 1px solid transparent;
|
|
80
|
+
}
|
|
81
|
+
nav.views a:hover { color: var(--gv-text); background: var(--gv-hover); }
|
|
82
|
+
nav.views a[aria-current] { color: var(--gv-accent); border-color: var(--gv-accent); }
|
|
83
|
+
/* The way back out to a host that mounted this. Set apart, since it leaves the tracker. */
|
|
84
|
+
nav.views a.home { color: var(--gv-subtle); margin-right: 4px; padding-right: 14px; border-right: 1px solid var(--gv-line); border-radius: 0; }
|
|
85
|
+
nav.views a.home:hover { color: var(--gv-text); background: none; }
|
|
86
|
+
nav.views a.home::before { content: "\2190"; margin-right: 6px; }
|
|
87
|
+
|
|
88
|
+
.layout { display: grid; grid-template-columns: var(--gv-sidebar) minmax(0, 1fr); align-items: start; }
|
|
89
|
+
@media (max-width: 46rem) { .layout { grid-template-columns: minmax(0, 1fr); } }
|
|
90
|
+
|
|
91
|
+
aside {
|
|
92
|
+
background: var(--gv-surface); border-right: 1px solid var(--gv-line);
|
|
93
|
+
padding: 12px 8px var(--gv-pad); position: sticky; top: 0; max-height: 100vh; overflow: auto;
|
|
94
|
+
}
|
|
95
|
+
@media (max-width: 46rem) { aside { border-right: 0; position: static; max-height: none; overflow: visible; } }
|
|
96
|
+
section.main { padding: var(--gv-pad); min-width: 0; }
|
|
97
|
+
.run-controls { border: 1px solid var(--gv-line); border-radius: 10px; padding: 16px; margin: 18px 0; }
|
|
98
|
+
.run-controls h2 { margin-top: 0; }
|
|
99
|
+
.run-controls label { display: block; margin: 0 0 8px; font-weight: 600; }
|
|
100
|
+
.run-controls textarea { box-sizing: border-box; width: 100%; max-width: 100%; resize: vertical; padding: 10px; background: var(--gv-bench); color: var(--gv-text); border: 1px solid var(--gv-line); border-radius: 6px; font: inherit; }
|
|
101
|
+
.run-actions { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 20px; }
|
|
102
|
+
.run-controls .note { font: inherit; font-size: 12px; color: var(--gv-muted); }
|
|
103
|
+
.run-actions .note { margin: 8px 0 0; }
|
|
104
|
+
.message-composer { margin-top: 18px; padding-top: 18px; border-top: 1px solid var(--gv-line); }
|
|
105
|
+
.run-controls .interrupt-option { display: flex; align-items: center; gap: 10px; min-height: 44px; margin: 8px 0 0; font-weight: 400; cursor: pointer; }
|
|
106
|
+
.interrupt-option input { width: 18px; height: 18px; flex-shrink: 0; accent-color: var(--gv-accent); }
|
|
107
|
+
#interrupt-help { margin: 0 0 10px 28px; }
|
|
108
|
+
.message-footer { display: flex; align-items: center; justify-content: space-between; gap: 16px; margin-top: 10px; }
|
|
109
|
+
.message-footer .note { margin: 0; max-width: 50ch; }
|
|
110
|
+
.run-controls button { min-height: 44px; padding: 8px 14px; border: 1px solid var(--gv-line-strong); border-radius: 6px; background: var(--gv-surface); color: var(--gv-text); font: inherit; cursor: pointer; }
|
|
111
|
+
.run-controls button:hover:not(:disabled) { background: var(--gv-hover); }
|
|
112
|
+
.run-controls button[data-action="message"] { flex-shrink: 0; background: var(--gv-text); color: var(--gv-surface); border-color: var(--gv-text); font-weight: 600; }
|
|
113
|
+
.run-controls button[data-action="message"]:hover:not(:disabled) { opacity: .85; }
|
|
114
|
+
.run-controls button:disabled { opacity: .55; cursor: default; }
|
|
115
|
+
.run-controls :focus-visible { outline: 2px solid var(--gv-accent); outline-offset: 3px; }
|
|
116
|
+
.run-controls pre, #control-status { white-space: pre-wrap; overflow-wrap: anywhere; }
|
|
117
|
+
.run-controls .control-help { margin: 16px 0 0; }
|
|
118
|
+
#control-status:empty { display: none; }
|
|
119
|
+
#last-message { margin-top: 12px; }
|
|
120
|
+
@media (max-width: 30rem) {
|
|
121
|
+
.run-actions { gap: 12px; }
|
|
122
|
+
.message-footer { align-items: stretch; flex-direction: column; gap: 10px; }
|
|
123
|
+
}
|
|
124
|
+
@media (max-width: 22rem) { .run-actions { grid-template-columns: minmax(0, 1fr); } }
|
|
125
|
+
|
|
126
|
+
/* controls */
|
|
127
|
+
.controls { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; margin: 0 4px 10px; }
|
|
128
|
+
input[type="search"], select {
|
|
129
|
+
background: var(--gv-bench); border: 1px solid var(--gv-line); border-radius: 10px;
|
|
130
|
+
padding: 8px 12px; color: inherit; font: inherit; outline: none; min-width: 0;
|
|
131
|
+
}
|
|
132
|
+
input[type="search"] { flex: 1 1 8rem; }
|
|
133
|
+
input[type="search"]:focus, select:focus { border-color: rgba(34, 211, 238, .5); }
|
|
134
|
+
.controls label { font-size: 11px; text-transform: uppercase; letter-spacing: .14em; color: var(--gv-subtle); }
|
|
135
|
+
|
|
136
|
+
/* A sidebar group: a heading that toggles, then its rows. Same caret and type scale as the host's explorer. */
|
|
137
|
+
.group > h3 {
|
|
138
|
+
margin: 14px 4px 4px; padding: 2px 8px; font-size: 11px; text-transform: uppercase; letter-spacing: .14em;
|
|
139
|
+
color: var(--gv-subtle); font-weight: 600; display: flex; align-items: center; gap: 6px;
|
|
140
|
+
border-radius: 8px; cursor: pointer; user-select: none;
|
|
141
|
+
}
|
|
142
|
+
.group > h3:hover { color: var(--gv-muted); }
|
|
143
|
+
.group > h3 .n { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
144
|
+
.group > h3 small { text-transform: none; letter-spacing: 0; font-weight: 400; font-family: var(--gv-mono); font-size: 10.5px; color: var(--gv-subtle); }
|
|
145
|
+
.caret { width: 0; height: 0; border: 4px solid transparent; border-left: 5px solid var(--gv-subtle); flex: none; transform: rotate(90deg); transition: transform .12s; }
|
|
146
|
+
.group.closed .caret { transform: none; }
|
|
147
|
+
.group.closed .rows { display: none; }
|
|
148
|
+
|
|
149
|
+
.rows { display: flex; flex-direction: column; }
|
|
150
|
+
a.row {
|
|
151
|
+
display: flex; align-items: center; gap: 10px; padding: 9px 12px; border-radius: 10px;
|
|
152
|
+
color: var(--gv-muted); text-decoration: none; min-height: 38px; min-width: 0;
|
|
153
|
+
}
|
|
154
|
+
a.row:hover { background: var(--gv-hover); color: var(--gv-text); }
|
|
155
|
+
a.row[aria-current] { background: var(--gv-accent-soft); color: var(--gv-text); box-shadow: inset 0 0 0 1px rgba(34, 211, 238, .5); }
|
|
156
|
+
a.row .n { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
157
|
+
a.row small { font-family: var(--gv-mono); font-size: 10px; color: var(--gv-subtle); white-space: nowrap; }
|
|
158
|
+
.dot { width: 8px; height: 8px; border-radius: 50%; flex: none; background: var(--gv-subtle); }
|
|
159
|
+
.dot.running { background: var(--gv-success); }
|
|
160
|
+
.dot.failed, .dot.needs { background: var(--gv-danger); }
|
|
161
|
+
.empty, .hint { color: var(--gv-subtle); padding: 8px 12px; font-size: 13px; }
|
|
162
|
+
|
|
163
|
+
h2 { font-size: 11px; text-transform: uppercase; letter-spacing: .14em; color: var(--gv-subtle); margin: 28px 0 8px; font-weight: 600; }
|
|
164
|
+
h2:first-of-type { margin-top: 0; }
|
|
165
|
+
|
|
166
|
+
/* A table is a card on the canvas, like the host's .doc */
|
|
167
|
+
table { width: 100%; border-collapse: collapse; font-size: 13.5px; background: var(--gv-surface); border: 1px solid var(--gv-line); border-radius: var(--gv-r); overflow: hidden; }
|
|
168
|
+
th { text-align: left; font-size: 11px; text-transform: uppercase; letter-spacing: .14em; color: var(--gv-subtle); font-weight: 600; padding: 10px 12px; }
|
|
169
|
+
td { padding: 9px 12px; border-top: 1px solid var(--gv-line); vertical-align: top; }
|
|
170
|
+
tbody tr:hover td { background: var(--gv-hover); }
|
|
171
|
+
td.num { text-align: right; font-variant-numeric: tabular-nums; font-family: var(--gv-mono); font-size: 12px; }
|
|
172
|
+
.tag { display: inline-flex; align-items: center; gap: 6px; padding: 3px 10px; border-radius: 999px; font-size: 12px; border: 1px solid var(--gv-line); color: var(--gv-muted); white-space: nowrap; }
|
|
173
|
+
.tag.live { color: var(--gv-success); border-color: rgba(16, 185, 129, .35); }
|
|
174
|
+
.tag.bad { color: var(--gv-danger); border-color: rgba(239, 68, 68, .35); }
|
|
175
|
+
|
|
176
|
+
dl.facts {
|
|
177
|
+
display: grid; grid-template-columns: max-content minmax(0, 1fr); gap: 8px 20px; margin: 0 0 24px;
|
|
178
|
+
background: var(--gv-surface); border: 1px solid var(--gv-line); border-radius: var(--gv-r); padding: 16px 18px;
|
|
179
|
+
}
|
|
180
|
+
dl.facts dt { color: var(--gv-subtle); font-size: 11px; text-transform: uppercase; letter-spacing: .14em; padding-top: 2px; }
|
|
181
|
+
dl.facts dd { margin: 0; min-width: 0; overflow-wrap: anywhere; }
|
|
182
|
+
dl.facts code { background: var(--gv-bench); padding: 1px 6px; border-radius: 6px; }
|
|
183
|
+
|
|
184
|
+
/* The control that reaches back into the log, above the pane, because that is the direction it loads in. */
|
|
185
|
+
.loadmore { display: flex; align-items: baseline; gap: 10px; margin: 0 0 6px; flex-wrap: wrap; }
|
|
186
|
+
.loadmore button {
|
|
187
|
+
font: inherit; font-size: 12px; font-family: var(--gv-mono); color: var(--gv-text);
|
|
188
|
+
background: var(--gv-bench); border: 1px solid var(--gv-line); border-radius: var(--gv-r);
|
|
189
|
+
padding: 4px 10px; cursor: pointer;
|
|
190
|
+
}
|
|
191
|
+
.loadmore button:hover:not(:disabled) { background: var(--gv-hover); border-color: var(--gv-accent); }
|
|
192
|
+
.loadmore button:disabled { opacity: .5; cursor: default; }
|
|
193
|
+
.loadmore .hint { margin: 0; padding: 0; font-size: 11px; color: var(--gv-subtle); font-family: var(--gv-mono); }
|
|
194
|
+
|
|
195
|
+
#log {
|
|
196
|
+
background: var(--gv-bench); border: 1px solid var(--gv-line); border-radius: var(--gv-r);
|
|
197
|
+
padding: 14px 16px; height: 58vh; min-height: 12rem; overflow: auto;
|
|
198
|
+
white-space: pre-wrap; overflow-wrap: anywhere; font-family: var(--gv-mono); font-size: 12px; line-height: 1.6;
|
|
199
|
+
color: var(--gv-text);
|
|
200
|
+
}
|
|
201
|
+
/* Log lines, matching command-center's .ll rules (public/app.css) since the renderer is the same one. */
|
|
202
|
+
.ll { padding: 1px 0; word-break: break-word; }
|
|
203
|
+
.ll + .ll { margin-top: 1px; }
|
|
204
|
+
.ll a { color: var(--gv-accent); text-decoration: none; border-bottom: 1px solid rgba(34, 211, 238, .28); }
|
|
205
|
+
.ll a:hover { border-bottom-color: var(--gv-accent); }
|
|
206
|
+
.ll a.fl { color: var(--gv-success); border-bottom-color: rgba(16, 185, 129, .3); }
|
|
207
|
+
/* The markdown a model writes in its prose. Inline only: the reader has already put a heading or a list item on its
|
|
208
|
+
own row, so what is left inside a row is emphasis, code and links. */
|
|
209
|
+
.ll b { font-weight: 600; color: var(--gv-text); }
|
|
210
|
+
.ll i { font-style: italic; }
|
|
211
|
+
.ll code { font-family: var(--gv-mono); font-size: .92em; background: var(--gv-hover); padding: 1px 5px; border-radius: 4px; }
|
|
212
|
+
.ll:not(.t):not(.d):not(.skip):not(.raw) { color: var(--gv-text); margin: 6px 0 2px; font-family: var(--gv-font); font-size: 12.5px; }
|
|
213
|
+
|
|
214
|
+
/* The block level of a model's markdown: a list, a table, a blockquote, a fence, a rule. `report` in
|
|
215
|
+
* lib/harness_log.mjs scans them out of the prose and the renderer draws each as one row, so everything the pane
|
|
216
|
+
* already does per row (the cap, the trim, the heartbeat lookup by data-id) is unchanged.
|
|
217
|
+
*
|
|
218
|
+
* `#log` sets `white-space: pre-wrap`, which is right for a log line and wrong inside a block: the markup already
|
|
219
|
+
* carries the structure, so a newline between two <li> would otherwise draw as a blank line. Every block resets it,
|
|
220
|
+
* and the fence sets it back, because inside a <pre> the whitespace IS the content. */
|
|
221
|
+
.ll.blk { white-space: normal; }
|
|
222
|
+
.ll.blk ul.md, .ll.blk ol.md { margin: 2px 0; padding-left: 1.4em; }
|
|
223
|
+
.ll.blk li { margin: 1px 0; }
|
|
224
|
+
/* Nesting is an indent class rather than a nested list: `report` measured the indent and a flat list with a margin
|
|
225
|
+
reads the same at the two or three levels a log pane ever shows, without a tree built from agent output. */
|
|
226
|
+
.ll.blk li.d1 { margin-left: 1.2em; } .ll.blk li.d2 { margin-left: 2.4em; } .ll.blk li.d3 { margin-left: 3.6em; }
|
|
227
|
+
/* ::marker is left to the browser, which already numbers an <ol> and bullets a <ul> in the reader's own locale. */
|
|
228
|
+
.ll.blk li::marker { color: var(--gv-subtle); }
|
|
229
|
+
|
|
230
|
+
/* A fenced block. Nothing inside it is markdown and nothing inside it is a link: it is the characters the model typed
|
|
231
|
+
between the fences, escaped and shown. It scrolls sideways on its own rather than wrapping, because a wrapped line
|
|
232
|
+
of code reads as two statements. */
|
|
233
|
+
.ll.fence { white-space: normal; margin: 8px 0; }
|
|
234
|
+
.ll.fence pre {
|
|
235
|
+
margin: 0; padding: 10px 12px; overflow-x: auto;
|
|
236
|
+
background: var(--gv-surface); border: 1px solid var(--gv-line); border-radius: 8px;
|
|
237
|
+
font-family: var(--gv-mono); font-size: 11.5px; line-height: 1.55; color: var(--gv-text);
|
|
238
|
+
white-space: pre; tab-size: 2;
|
|
239
|
+
}
|
|
240
|
+
/* The language off the fence line, shown as a label and used for nothing else: no highlighter is loaded, because the
|
|
241
|
+
CSP is `script-src 'self'` and a highlighter would be a fetch this page is not allowed to make. */
|
|
242
|
+
.ll.fence[data-lang] pre { padding-top: 22px; }
|
|
243
|
+
.ll.fence[data-lang]::before {
|
|
244
|
+
content: attr(data-lang); display: block; position: relative; top: 16px; left: 12px; height: 0;
|
|
245
|
+
font-family: var(--gv-mono); font-size: 10px; letter-spacing: .08em; text-transform: uppercase; color: var(--gv-subtle);
|
|
246
|
+
}
|
|
247
|
+
/* A fence whose closer has not arrived yet: half the block is on screen and the rest is still streaming. Saying so is
|
|
248
|
+
better than letting it look like a finished block that happens to end mid-statement. */
|
|
249
|
+
.ll.fence.open pre { border-style: dashed; border-color: var(--gv-line-strong); }
|
|
250
|
+
|
|
251
|
+
/* A pipe table. The wrapper is what scrolls: the pane sits in the layout grid, so a table wide enough to push it out
|
|
252
|
+
would move the whole column instead of scrolling inside it. */
|
|
253
|
+
.ll.blk .tw { overflow-x: auto; margin: 6px 0; }
|
|
254
|
+
.ll.blk table.md {
|
|
255
|
+
width: auto; min-width: 100%; border-collapse: collapse; font-size: 11.5px;
|
|
256
|
+
background: var(--gv-surface); border: 1px solid var(--gv-line); border-radius: 8px; overflow: hidden;
|
|
257
|
+
}
|
|
258
|
+
.ll.blk table.md th, .ll.blk table.md td { padding: 5px 10px; text-align: left; vertical-align: top; }
|
|
259
|
+
.ll.blk table.md th {
|
|
260
|
+
font-size: 10px; text-transform: uppercase; letter-spacing: .1em; color: var(--gv-subtle); font-weight: 600;
|
|
261
|
+
border-bottom: 1px solid var(--gv-line); white-space: nowrap;
|
|
262
|
+
}
|
|
263
|
+
.ll.blk table.md td { border-top: 1px solid var(--gv-line); }
|
|
264
|
+
.ll.blk table.md tbody tr:first-child td { border-top: 0; }
|
|
265
|
+
|
|
266
|
+
/* A blockquote, as the one block a run of `>` lines is. The marker used to be stripped per line, which left the rows
|
|
267
|
+
apart and nothing on the page saying they were a quote at all. */
|
|
268
|
+
.ll.blk blockquote {
|
|
269
|
+
margin: 6px 0; padding: 2px 0 2px 12px; border-left: 2px solid var(--gv-line-strong); color: var(--gv-muted);
|
|
270
|
+
}
|
|
271
|
+
.ll.blk blockquote p { margin: 4px 0; }
|
|
272
|
+
|
|
273
|
+
/* A horizontal rule. Its own row, so it separates the rows around it the way the model meant it to. */
|
|
274
|
+
.ll.hr { height: 0; margin: 10px 0; border-top: 1px solid var(--gv-line); padding: 0; }
|
|
275
|
+
/* A line no reader claimed: the harness's own stderr, a truncated write, a runner line. It keeps the monospace of the
|
|
276
|
+
file it came out of rather than borrowing the prose font, because it is not prose and reading it as a sentence the
|
|
277
|
+
model wrote is misleading. The rule marks it too: this is what the harness printed, verbatim. */
|
|
278
|
+
.ll.raw { color: var(--gv-warning); border-left: 2px solid var(--gv-line); padding-left: 8px; }
|
|
279
|
+
.ll.t { display: grid; grid-template-columns: 96px 1fr; gap: 10px; align-items: baseline; color: var(--gv-muted); }
|
|
280
|
+
.ll.t .n { font-size: 10.5px; letter-spacing: .04em; text-transform: uppercase; color: var(--gv-subtle); text-align: right; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
281
|
+
.ll.t .a { overflow-wrap: anywhere; }
|
|
282
|
+
/* How long a call has been running, written onto the call's own row by its heartbeats rather than added as a row of
|
|
283
|
+
its own. Twenty-one heartbeats for one `npm ci` would be twenty-one identical lines; this is one line counting up. */
|
|
284
|
+
.ll.t .e { margin-left: 8px; font-size: 10.5px; color: var(--gv-warning); white-space: nowrap; }
|
|
285
|
+
/* A call with no argument has no `.a` cell for the timer to sit in, so it becomes a direct child of the grid. Put it
|
|
286
|
+
in the second column rather than letting it start a row of its own under the tool name. */
|
|
287
|
+
.ll.t > .e { grid-column: 2; margin-left: 0; }
|
|
288
|
+
.ll.t.search .n { color: var(--gv-accent); } .ll.t.fetch .n { color: #8b9fd4; }
|
|
289
|
+
.ll.t.write .n { color: var(--gv-success); } .ll.t.shell .n { color: var(--gv-warning); }
|
|
290
|
+
.ll.t.agent .n { color: #c084fc; } .ll.t.meta .n { color: var(--gv-subtle); opacity: .7; }
|
|
291
|
+
/* A failing tool result. Not in command-center's set: its reducer never put one on screen, and here an error coming
|
|
292
|
+
back from a tool is the thing an operator is scanning the pane for. */
|
|
293
|
+
.ll.t.bad .n { color: var(--gv-danger); } .ll.t.bad .a { color: var(--gv-muted); }
|
|
294
|
+
.ll.d { margin-top: 8px; padding-top: 8px; border-top: 1px solid var(--gv-line); font-weight: 600; }
|
|
295
|
+
.ll.d.ok { color: var(--gv-success); } .ll.d.bad { color: var(--gv-danger); }
|
|
296
|
+
/* A guardrail denial reuses the closing line, because it is the same weight of news, and marks the label so it does
|
|
297
|
+
not read as the run having ended. */
|
|
298
|
+
.ll.d .n { font-family: var(--gv-mono); letter-spacing: .06em; }
|
|
299
|
+
.ll.h, .ll.skip { color: var(--gv-subtle); font-size: 11px; padding-bottom: 8px; margin-bottom: 6px; border-bottom: 1px dashed var(--gv-line); }
|
|
300
|
+
@media (max-width: 700px) { .ll.t { grid-template-columns: 1fr; gap: 0; } .ll.t .n { text-align: left; } }
|
|
301
|
+
.note { font-size: 12px; color: var(--gv-subtle); margin: 8px 0 0; font-family: var(--gv-mono); }
|