@atolis-hq/wake 0.3.85 → 0.3.87
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/src/bootstrap/board-projection.js +42 -25
- package/dist/src/bootstrap/version.js +1 -1
- package/dist/src/integrations/github/application/intake-policy.js +23 -0
- package/dist/src/integrations/github/contracts/issue-query.js +1 -0
- package/dist/src/integrations/github/index.js +1 -0
- package/dist/src/integrations/github/infrastructure/client-reads.js +5 -2
- package/dist/src/integrations/github/infrastructure/client.js +4 -1
- package/dist/src/integrations/github/infrastructure/source.js +29 -17
- package/dist/src/surfaces/api/contracts/transport-values.js +8 -0
- package/dist/src/surfaces/api/presenters/orchestration.js +4 -1
- package/dist/src/surfaces/web-assets/assets/index-BoJ0Mr2V.css +1 -0
- package/dist/src/surfaces/web-assets/assets/index-BuyqbjAi.js +1156 -0
- package/dist/src/surfaces/web-assets/index.html +2 -2
- package/package.json +1 -1
- package/dist/src/surfaces/web-assets/assets/index-Ck6q_lgp.js +0 -1090
- package/dist/src/surfaces/web-assets/assets/index-DowyiaO5.css +0 -1
|
@@ -93,33 +93,38 @@ function projectWork(view, event, occurredAt) {
|
|
|
93
93
|
return view;
|
|
94
94
|
}
|
|
95
95
|
function projectWorkflow(view, event, occurredAt) {
|
|
96
|
-
if (event.eventType === OrchestrationEventType.InstanceStarted)
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
};
|
|
96
|
+
if (event.eventType === OrchestrationEventType.InstanceStarted)
|
|
97
|
+
return projectWorkflowStarted(view, event, occurredAt);
|
|
98
|
+
return projectWorkflowUpdate(view, event, occurredAt);
|
|
99
|
+
}
|
|
100
|
+
function projectWorkflowStarted(view, event, occurredAt) {
|
|
101
|
+
const workId = event.payload.workItemId;
|
|
102
|
+
const card = view.cards[workId];
|
|
103
|
+
if (card === undefined)
|
|
104
|
+
return view;
|
|
105
|
+
const workflows = { ...view.workflows, [event.stream.id]: workId };
|
|
106
|
+
if ('parentWorkflowInstanceId' in event.payload)
|
|
108
107
|
return {
|
|
109
108
|
...view,
|
|
110
|
-
cards: {
|
|
111
|
-
...view.cards,
|
|
112
|
-
[workId]: {
|
|
113
|
-
...card,
|
|
114
|
-
workflowName: event.payload.workflowName,
|
|
115
|
-
stage: event.payload.entry,
|
|
116
|
-
dwellSince: occurredAt,
|
|
117
|
-
condition: BoardCondition.Ready,
|
|
118
|
-
},
|
|
119
|
-
},
|
|
120
109
|
workflows,
|
|
110
|
+
children: { ...view.children, [event.stream.id]: event.payload.entry },
|
|
121
111
|
};
|
|
122
|
-
|
|
112
|
+
return {
|
|
113
|
+
...view,
|
|
114
|
+
cards: {
|
|
115
|
+
...view.cards,
|
|
116
|
+
[workId]: {
|
|
117
|
+
...card,
|
|
118
|
+
workflowName: event.payload.workflowName,
|
|
119
|
+
stage: event.payload.entry,
|
|
120
|
+
dwellSince: occurredAt,
|
|
121
|
+
condition: BoardCondition.Ready,
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
workflows,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
function projectWorkflowUpdate(view, event, occurredAt) {
|
|
123
128
|
if (view.children?.[event.stream.id] !== undefined)
|
|
124
129
|
return view;
|
|
125
130
|
const located = lookupWorkflowCard(view, event.stream.id);
|
|
@@ -142,7 +147,7 @@ function projectWorkflow(view, event, occurredAt) {
|
|
|
142
147
|
cards: {
|
|
143
148
|
...view.cards,
|
|
144
149
|
[workId]: {
|
|
145
|
-
...card,
|
|
150
|
+
...withoutBlockReason(card),
|
|
146
151
|
stage: event.payload.stage,
|
|
147
152
|
dwellSince: occurredAt,
|
|
148
153
|
condition: BoardCondition.Ready,
|
|
@@ -158,7 +163,15 @@ function projectWorkflow(view, event, occurredAt) {
|
|
|
158
163
|
const status = orchestrationStatusTransitions[event.eventType];
|
|
159
164
|
if (status === undefined)
|
|
160
165
|
return view;
|
|
161
|
-
const withCondition = {
|
|
166
|
+
const withCondition = {
|
|
167
|
+
...(event.eventType === OrchestrationEventType.InstanceBlocked
|
|
168
|
+
? card
|
|
169
|
+
: withoutBlockReason(card)),
|
|
170
|
+
condition: boardConditionForStatus(status),
|
|
171
|
+
...(event.eventType === OrchestrationEventType.InstanceBlocked
|
|
172
|
+
? { blockReason: event.payload.reason }
|
|
173
|
+
: {}),
|
|
174
|
+
};
|
|
162
175
|
if (event.eventType === OrchestrationEventType.SignalWaitStarted)
|
|
163
176
|
return {
|
|
164
177
|
...view,
|
|
@@ -196,6 +209,10 @@ function lookupWorkflowCard(view, streamId) {
|
|
|
196
209
|
function awaitingApprovalField(signalKind) {
|
|
197
210
|
return isApprovalAwaitingSignalKind(signalKind) ? { awaitingApproval: true } : {};
|
|
198
211
|
}
|
|
212
|
+
function withoutBlockReason(card) {
|
|
213
|
+
const { blockReason: _blockReason, ...withoutReason } = card;
|
|
214
|
+
return withoutReason;
|
|
215
|
+
}
|
|
199
216
|
const runTerminalEventTypes = new Set([
|
|
200
217
|
ExecutionEventType.RunSucceeded,
|
|
201
218
|
ExecutionEventType.RunFailed,
|
|
@@ -14,6 +14,29 @@ export function gitHubIntakeRules(configured) {
|
|
|
14
14
|
tags: rule.tags,
|
|
15
15
|
}));
|
|
16
16
|
}
|
|
17
|
+
// Rules are OR-composed. A native facet filter is safe only when every rule
|
|
18
|
+
// requires the same single value; otherwise it could hide an item another rule admits.
|
|
19
|
+
export function gitHubIssueQueryFilters(configured) {
|
|
20
|
+
const assignee = sharedRequiredValue(configured, (rule) => rule.where.requiredAssignees);
|
|
21
|
+
const labels = sharedRequiredValue(configured, (rule) => rule.where.labels);
|
|
22
|
+
return {
|
|
23
|
+
...(assignee === undefined ? {} : { assignee }),
|
|
24
|
+
...(labels === undefined ? {} : { labels }),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function sharedRequiredValue(configured, values) {
|
|
28
|
+
if (configured.length === 0)
|
|
29
|
+
return undefined;
|
|
30
|
+
const candidate = [...new Set(values(configured[0]))];
|
|
31
|
+
if (candidate.length !== 1)
|
|
32
|
+
return undefined;
|
|
33
|
+
return configured.every((rule) => {
|
|
34
|
+
const required = new Set(values(rule));
|
|
35
|
+
return required.size === 1 && required.has(candidate[0]);
|
|
36
|
+
})
|
|
37
|
+
? candidate[0]
|
|
38
|
+
: undefined;
|
|
39
|
+
}
|
|
17
40
|
export function gitHubIntakeFacts(payload) {
|
|
18
41
|
return {
|
|
19
42
|
[GitHubIntakeFacet.Kind]: [payload.kind],
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -19,6 +19,7 @@ export * from './application/review-command-translator.js';
|
|
|
19
19
|
export * from './application/wake-labels.js';
|
|
20
20
|
export * from './contracts/config.js';
|
|
21
21
|
export * from './contracts/events.js';
|
|
22
|
+
export * from './contracts/issue-query.js';
|
|
22
23
|
export * from './contracts/payloads.js';
|
|
23
24
|
export * from './contracts/vocabulary.js';
|
|
24
25
|
export * from './infrastructure/client.js';
|
|
@@ -2,10 +2,11 @@
|
|
|
2
2
|
import { PullRequestState } from '../../../activities/index.js';
|
|
3
3
|
import { GitHubListState } from '../contracts/vocabulary.js';
|
|
4
4
|
import { fetchPaginatedWithEtag, fetchWithEtag } from './etag-cache.js';
|
|
5
|
-
export function listIssues(octokit, cache, owner, repo, maxResults,
|
|
5
|
+
export function listIssues(octokit, cache, owner, repo, maxResults, options = {}) {
|
|
6
|
+
const { since, filters = {} } = options;
|
|
6
7
|
return fetchPaginatedWithEtag({
|
|
7
8
|
cache,
|
|
8
|
-
key: `issues:${owner
|
|
9
|
+
key: `issues:${JSON.stringify([owner, repo, since ?? null, filters.assignee ?? null, filters.labels ?? null])}`,
|
|
9
10
|
maxResults,
|
|
10
11
|
pages: (headers) => octokit.paginate.iterator(octokit.rest.issues.listForRepo, {
|
|
11
12
|
owner,
|
|
@@ -15,6 +16,8 @@ export function listIssues(octokit, cache, owner, repo, maxResults, since) {
|
|
|
15
16
|
direction: 'desc',
|
|
16
17
|
per_page: Math.min(maxResults, 100),
|
|
17
18
|
...(since === undefined ? {} : { since }),
|
|
19
|
+
...(filters.assignee === undefined ? {} : { assignee: filters.assignee }),
|
|
20
|
+
...(filters.labels === undefined ? {} : { labels: filters.labels }),
|
|
18
21
|
...(headers === undefined ? {} : { headers }),
|
|
19
22
|
}),
|
|
20
23
|
}).then((items) => items.map(normalizeIssue));
|
|
@@ -66,7 +66,10 @@ export function createGitHubClient(token) {
|
|
|
66
66
|
}
|
|
67
67
|
function createGitHubReadClient(octokit, cache) {
|
|
68
68
|
return {
|
|
69
|
-
listIssues: (owner, repo, maxResults, since) => listIssues(octokit, cache, owner, repo, maxResults,
|
|
69
|
+
listIssues: (owner, repo, maxResults, since, filters) => listIssues(octokit, cache, owner, repo, maxResults, {
|
|
70
|
+
...(since === undefined ? {} : { since }),
|
|
71
|
+
...(filters === undefined ? {} : { filters }),
|
|
72
|
+
}),
|
|
70
73
|
listPullRequests: (owner, repo, maxResults) => listPullRequests(octokit, cache, owner, repo, maxResults),
|
|
71
74
|
listIssueComments: (owner, repo, issueNumber, pageSize, since, maxResults) => listIssueComments(octokit, cache, owner, repo, issueNumber, {
|
|
72
75
|
pageSize,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { gitHubIssueQueryFilters } from '../application/intake-policy.js';
|
|
1
2
|
import { GitHubEventType } from '../contracts/events.js';
|
|
2
3
|
import { createGitHubAdapterHealthRegistry, } from './adapter-health-registry.js';
|
|
3
4
|
import { issueCommentEventsFor, reviewCommentEventsFor, reviewEventsFor, } from './comment-source.js';
|
|
@@ -65,7 +66,7 @@ export function createGitHubSource(config, client, adapter, requests = createGit
|
|
|
65
66
|
function limitGitHubSourceClient(client, requests) {
|
|
66
67
|
return {
|
|
67
68
|
...client,
|
|
68
|
-
listIssues: (owner, repo, maxResults, since) => requests.run(() => client.listIssues(owner, repo, maxResults, since)),
|
|
69
|
+
listIssues: (owner, repo, maxResults, since, filters) => requests.run(() => client.listIssues(owner, repo, maxResults, since, filters)),
|
|
69
70
|
listPullRequests: (owner, repo, maxResults) => requests.run(() => client.listPullRequests(owner, repo, maxResults)),
|
|
70
71
|
listCheckRunsForRef: (owner, repo, ref, maxResults) => requests.run(() => client.listCheckRunsForRef(owner, repo, ref, maxResults)),
|
|
71
72
|
getCombinedStatusForRef: (owner, repo, ref, maxResults) => requests.run(() => client.getCombinedStatusForRef(owner, repo, ref, maxResults)),
|
|
@@ -96,22 +97,14 @@ async function pollRepository(input) {
|
|
|
96
97
|
repository: `${owner}/${repo}`,
|
|
97
98
|
};
|
|
98
99
|
const since = overlapSince(input.watermark, config.polling.lookbackMs);
|
|
99
|
-
const [issuesResult, pullRequestsResult] = await
|
|
100
|
-
client
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
health.recordFailure(context.repository, 'poll', issuesResult.reason);
|
|
108
|
-
}
|
|
109
|
-
if (isFulfilled(pullRequestsResult))
|
|
110
|
-
health.recordSuccess(context.repository, 'poll');
|
|
111
|
-
else {
|
|
112
|
-
reportPartialPollFailure(context.repository, 'pull requests');
|
|
113
|
-
health.recordFailure(context.repository, 'poll', pullRequestsResult.reason);
|
|
114
|
-
}
|
|
100
|
+
const [issuesResult, pullRequestsResult] = await fetchRepositoryItems({
|
|
101
|
+
client,
|
|
102
|
+
config,
|
|
103
|
+
owner,
|
|
104
|
+
repo,
|
|
105
|
+
since,
|
|
106
|
+
});
|
|
107
|
+
reportRepositoryReadResults(context, health, issuesResult, pullRequestsResult);
|
|
115
108
|
const issues = isFulfilled(issuesResult) ? issuesResult.value : [];
|
|
116
109
|
const pullRequestPayloads = isFulfilled(pullRequestsResult)
|
|
117
110
|
? pullRequestsResult.value.filter((pullRequest) => since === undefined || pullRequest.updated_at >= since)
|
|
@@ -150,6 +143,25 @@ async function pollRepository(input) {
|
|
|
150
143
|
],
|
|
151
144
|
};
|
|
152
145
|
}
|
|
146
|
+
function fetchRepositoryItems(input) {
|
|
147
|
+
const { client, config, owner, repo, since } = input;
|
|
148
|
+
return Promise.allSettled([
|
|
149
|
+
client.listIssues(owner, repo, config.polling.maxPerRepo, since, gitHubIssueQueryFilters(config.intake)),
|
|
150
|
+
client.listPullRequests(owner, repo, config.polling.maxPerRepo),
|
|
151
|
+
]);
|
|
152
|
+
}
|
|
153
|
+
function reportRepositoryReadResults(context, health, issuesResult, pullRequestsResult) {
|
|
154
|
+
reportRepositoryReadResult(context.repository, health, 'issues', issuesResult);
|
|
155
|
+
reportRepositoryReadResult(context.repository, health, 'pull requests', pullRequestsResult);
|
|
156
|
+
}
|
|
157
|
+
function reportRepositoryReadResult(repository, health, read, result) {
|
|
158
|
+
if (isFulfilled(result)) {
|
|
159
|
+
health.recordSuccess(repository, 'poll');
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
reportPartialPollFailure(repository, read);
|
|
163
|
+
health.recordFailure(repository, 'poll', result.reason);
|
|
164
|
+
}
|
|
153
165
|
function isFulfilled(result) {
|
|
154
166
|
return 'value' in result;
|
|
155
167
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ActivityOutcomeKind } from '../../../activities/index.js';
|
|
1
2
|
const commandStatusShape = { accepted: true, completed: true };
|
|
2
3
|
const commandStatuses = Object.keys(commandStatusShape);
|
|
3
4
|
export const AcceptedCommandStatusValue = {
|
|
@@ -8,6 +9,13 @@ const runResponseShape = { active: true };
|
|
|
8
9
|
export const RunResponseField = { Active: Object.keys(runResponseShape)[0] };
|
|
9
10
|
const resourceItemFieldShape = { adapter: true };
|
|
10
11
|
export const ResourceItemField = { Adapter: Object.keys(resourceItemFieldShape)[0] };
|
|
12
|
+
const runResolutionStatusShape = { failed: true, succeeded: true };
|
|
13
|
+
const runResolutionStatuses = Object.keys(runResolutionStatusShape);
|
|
14
|
+
export const RunResolutionStatusValue = {
|
|
15
|
+
Failed: runResolutionStatuses[0],
|
|
16
|
+
Succeeded: runResolutionStatuses[1],
|
|
17
|
+
};
|
|
18
|
+
export const ActivityOutcomeKindValue = ActivityOutcomeKind;
|
|
11
19
|
const boardConditionShape = {
|
|
12
20
|
ready: true,
|
|
13
21
|
active: true,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { isOperatorRetryEligible, } from '../../../orchestration/index.js';
|
|
1
|
+
import { isOperatorRetryEligible, WorkflowStatus, } from '../../../orchestration/index.js';
|
|
2
2
|
import { toWorkItemKey } from '../contracts/work.js';
|
|
3
3
|
export function presentWorkflowInstance(value) {
|
|
4
4
|
return {
|
|
@@ -11,6 +11,9 @@ export function presentWorkflowInstance(value) {
|
|
|
11
11
|
: { parentWorkflowInstanceId: value.parentWorkflowInstanceId }),
|
|
12
12
|
status: value.status,
|
|
13
13
|
currentStage: value.currentStage,
|
|
14
|
+
...(value.status === WorkflowStatus.Blocked && value.blockReason !== undefined
|
|
15
|
+
? { blockReason: value.blockReason }
|
|
16
|
+
: {}),
|
|
14
17
|
...(isOperatorRetryEligible(value) ? { retryEligible: true } : {}),
|
|
15
18
|
...(value.waitingFor === undefined
|
|
16
19
|
? {}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
._shell_1rpcj_1{grid-template-rows:auto auto auto 1fr;min-height:100vh;display:grid}._header_1rpcj_6{align-items:center;gap:var(--space-2);padding:.55rem var(--space-4);background:var(--brand);color:var(--ink-inverse);display:flex}._brand_1rpcj_14{align-items:center;gap:var(--space-2);color:var(--ink-inverse);font-family:-apple-system,Segoe UI,Roboto,sans-serif;font-weight:700;font-size:var(--text-lg);letter-spacing:.01em;text-decoration:none;display:inline-flex}._brandLogo_1rpcj_25{width:1.75rem;height:1.75rem}._brandVersion_1rpcj_29{color:#ffffffb3;font-family:-apple-system,Segoe UI,Roboto,sans-serif;font-size:.78rem;font-weight:400}._statusBand_1rpcj_35{align-items:center;gap:var(--space-4);padding:.45rem var(--space-4);background:var(--brand-dark);font-size:var(--text-sm);color:var(--ink-inverse);border-top:1px solid #0000002e;flex-wrap:wrap;display:flex}._nav_1rpcj_46{padding:.4rem var(--space-4) 0;background:var(--brand-darker);scrollbar-width:none;-ms-overflow-style:none;border-bottom:1px solid var(--border);gap:.25rem;display:flex;overflow-x:auto}._nav_1rpcj_46::-webkit-scrollbar{display:none}._nav_1rpcj_46 a{color:var(--nav-ink-idle);white-space:nowrap;transition:color var(--motion-fast) ease;border-bottom:2px solid #0000;margin-bottom:-1px;padding:.4rem .7rem .45rem;text-decoration:none}._nav_1rpcj_46 a:hover{color:var(--ink-inverse);text-decoration:none}._nav_1rpcj_46 a[aria-current=page]{color:var(--accent-light);border-bottom-color:var(--accent);font-weight:700}._main_1rpcj_77{width:100%;padding:var(--space-6) var(--space-4);margin:0}._pageHeader_1rpcj_82{justify-content:space-between;align-items:end;gap:var(--space-4);margin-bottom:var(--space-5);display:flex}._pageHeader_1rpcj_82 h1{margin:0}._panel_1rpcj_92{background:var(--surface-panel);border:1px solid var(--border);border-radius:var(--radius);padding:var(--space-4);box-shadow:var(--shadow)}._badge_1rpcj_99{background:var(--surface-card);color:var(--ink);border-radius:999px;align-items:center;gap:.4rem;padding:.2rem .55rem;font-size:.85rem;font-weight:700;display:inline-flex}._badge_1rpcj_99:before{content:"";background:currentColor;border-radius:50%;flex:none;width:.55rem;height:.55rem}._badge_1rpcj_99>span{align-items:center;gap:.3rem;display:inline-flex}._good_1rpcj_123{color:var(--good)}._warning_1rpcj_126{color:var(--warning)}._bad_1rpcj_99{color:var(--bad)}._cold_1rpcj_132{color:#7dd3fc;background:#0e74902e;box-shadow:inset 0 0 0 1px #7dd3fc59}._button_1rpcj_137{appearance:none;border:1px solid var(--border-strong);border-radius:var(--radius-sm);background:var(--surface-card);color:var(--ink);font:inherit;font-size:var(--text-sm);cursor:pointer;padding:.22rem .55rem;font-weight:600}._button_1rpcj_137:hover:not(:disabled){border-color:var(--accent-light);color:var(--accent-light)}._button_1rpcj_137:disabled{opacity:.62;cursor:wait}._secondary_1rpcj_157{background:0 0}._tableWrap_1rpcj_160{overflow-x:auto}._table_1rpcj_160{border-collapse:collapse;width:100%;font-size:var(--text-sm)}._table_1rpcj_160 caption{text-align:left;font-weight:700;font-size:var(--text-sm);padding-bottom:.5rem}._table_1rpcj_160 th,._table_1rpcj_160 td{text-align:left;border-bottom:1px solid var(--border);vertical-align:top;padding:.25rem .45rem;line-height:1.3}._table_1rpcj_160 th{color:var(--ink-muted);font-weight:600;font-size:var(--text-xs);text-transform:uppercase;letter-spacing:.03em}._state_1rpcj_189{border:1px dashed var(--border);border-radius:var(--radius);padding:var(--space-5);color:var(--ink-muted)}._error_1rpcj_195{border-color:var(--bad);color:var(--bad)}._stale_1rpcj_199{color:var(--warning);font-size:.85rem}._statusActions_1rpcj_203{align-items:center;gap:.6rem;display:flex}._tickButton_1rpcj_208{border:1px solid var(--accent);color:var(--accent-light);background:#2dd4bf24;font-weight:700}._tickButton_1rpcj_208:hover:not(:disabled){border-color:var(--accent-light);background:#2dd4bf3d}._pauseControl_1rpcj_218{border:1px solid var(--bad);color:var(--warning);border-radius:var(--radius-sm);font-size:var(--text-sm);background:#dc262629;align-items:center;gap:.4rem;padding:.2rem .55rem;font-weight:700;display:inline-flex}._pauseControl_1rpcj_218 button{appearance:none;border:1px solid var(--bad);border-radius:var(--radius-sm);color:inherit;font:inherit;font-size:var(--text-xs);cursor:pointer;background:0 0;padding:.1rem .4rem;font-weight:700}._pauseControl_1rpcj_218 button:hover:not(:disabled){background:#dc26263d}._pauseControl_1rpcj_218 button:disabled{opacity:.62;cursor:wait}._pagination_1rpcj_249{justify-content:flex-end;gap:.6rem;margin-block:1rem;display:flex}._live_1rpcj_255{min-height:1.4rem}._header_1rpcj_6 ._live_1rpcj_255{color:var(--warning)}._json_1rpcj_261{background:var(--surface-inset);color:var(--ink);padding:var(--space-3);border-radius:var(--radius-sm);font-family:var(--font-mono);font-size:.75rem;overflow:auto}._chip_1rpcj_270{background:var(--border);color:var(--ink);border-radius:var(--radius-sm);font-size:var(--text-xs);align-items:center;gap:.25rem;margin-right:.2rem;padding:.05rem .35rem;display:inline-flex}._chipOutline_1rpcj_281{border:1px solid var(--border-strong);color:var(--ink-muted);background:0 0}._chipOutline_1rpcj_281._good_1rpcj_123{color:var(--good)}._chipOutline_1rpcj_281._warning_1rpcj_126{color:var(--warning)}._chipOutline_1rpcj_281._bad_1rpcj_99{color:var(--bad)}._chipOutline_1rpcj_281._cold_1rpcj_132{color:#7dd3fc}._tile_1rpcj_298{background:var(--surface-panel);border-radius:var(--radius);min-width:120px;padding:.6rem .9rem}._tileValue_1rpcj_304{font-size:1.3rem;font-weight:700}._tileLabel_1rpcj_308{color:var(--ink-muted);font-size:var(--text-xs);text-transform:uppercase}@media (width<=42rem){._header_1rpcj_6{padding-inline:var(--space-3)}._nav_1rpcj_46{padding-inline:var(--space-2)}._main_1rpcj_77{width:100%;padding:var(--space-4) var(--space-2) 0}._pageHeader_1rpcj_82{flex-direction:column;align-items:start}}._boardControls_a415m_1{justify-content:flex-end;margin-bottom:.75rem;display:flex}._boardControls_a415m_1 label{color:var(--ink-muted);font-size:var(--text-sm);align-items:center;gap:.4rem;font-weight:600;display:flex}._boardControls_a415m_1 select{background:var(--surface-panel);border:1px solid var(--border);border-radius:var(--radius-sm);min-height:2.1rem;color:var(--ink);font:inherit;padding-inline:.5rem}._boardControls_a415m_1 select:focus{border-color:var(--accent);outline:none;box-shadow:0 0 0 3px #2dd4bf26}._swimlanes_a415m_28{gap:1rem;display:grid}._swimlaneHeader_a415m_32{font-size:var(--text-sm);text-transform:uppercase;letter-spacing:.04em;color:var(--ink-muted);margin:0 0 .4rem;font-weight:700}._swimlaneToggle_a415m_40{justify-content:space-between;align-items:center;gap:var(--space-2);width:100%;color:inherit;cursor:pointer;font:inherit;text-align:left;background:0 0;border:0;padding:0;display:flex}._swimlaneToggle_a415m_40:hover,._swimlaneToggle_a415m_40:focus-visible{color:var(--accent-light)}._swimlaneToggle_a415m_40:focus-visible{outline:2px solid var(--focus-ring);outline-offset:2px}._board_a415m_1{grid-template-columns:repeat(5,minmax(0,1fr));align-items:stretch;gap:.6rem;display:grid;overflow-x:auto}._column_a415m_69{background:var(--surface-panel);border-radius:var(--radius);flex-direction:column;min-height:200px;padding:.5rem;display:flex}._columnHeader_a415m_77{justify-content:space-between;align-items:center;gap:var(--space-2);margin:.2rem .4rem .5rem;display:flex}._column_a415m_69 h2{font-size:var(--text-xs);text-transform:uppercase;letter-spacing:.04em;color:var(--ink-muted);margin:0}._cards_a415m_91{gap:.5rem;margin:0;padding:0;list-style:none;display:grid}._card_a415m_91{background:var(--surface-card);border:1px solid var(--border);border-left:3px solid var(--border-strong);font-size:var(--text-sm);border-radius:.5rem;overflow:hidden}._card_a415m_91:hover,._card_a415m_91:focus-within{border-color:var(--accent)}._cardLink_a415m_110{min-height:100%;color:var(--ink);transition:background var(--motion-fast) ease;padding:.5rem;text-decoration:none;display:block}._cardLink_a415m_110:hover{background:var(--surface-inset);text-decoration:none}._cardLink_a415m_110:focus-visible{outline:2px solid var(--focus-ring);outline-offset:-2px}._cardRef_a415m_126{color:var(--ink-muted);font-family:var(--font-mono);font-size:var(--text-xs);margin-bottom:.15rem;display:block}._cardTitle_a415m_133{color:var(--ink);margin-bottom:.25rem;font-weight:600;display:block}._cardMeta_a415m_139{flex-wrap:wrap;align-items:center;gap:.3rem;margin-top:.2rem;display:flex}._metaIcon_a415m_146{flex:none;width:.75rem;height:.75rem}._cardStats_a415m_151{color:var(--ink-muted);margin-top:.3rem;font-size:.7rem}._childRun_a415m_156{border-radius:var(--radius-sm);background:var(--surface-inset);border:1px solid var(--border);color:var(--ink-muted);font-size:var(--text-xs);grid-template-columns:auto 1fr;align-items:center;gap:.25rem .45rem;margin-top:.45rem;padding:.4rem;display:grid}._childRunDot_a415m_169{background:var(--accent);border-radius:50%;width:.48rem;height:.48rem;box-shadow:0 0 0 3px #2dd4bf24}._childRunTitle_a415m_176{color:var(--ink);font-weight:650}._childRunMeta_a415m_180{color:var(--ink-muted)}._columnToggle_a415m_183{border:1px solid var(--border-strong);border-radius:var(--radius-sm);width:1.65rem;height:1.65rem;color:var(--ink-muted);cursor:pointer;font-size:var(--text-base);background:0 0;flex:none;justify-content:center;align-items:center;line-height:1;display:none}._finishedColumnToggle_a415m_198{display:inline-flex}._columnToggle_a415m_183:hover{border-color:var(--accent);color:var(--accent-light)}._filters_a415m_205{flex-wrap:wrap;align-items:end;gap:.6rem;margin-bottom:1rem;display:flex}._filters_a415m_205 label{color:var(--ink-muted);font-weight:600;font-size:var(--text-sm);gap:.25rem;display:grid}._filters_a415m_205 input,._filters_a415m_205 select{background:var(--surface-panel);border:1px solid var(--border);border-radius:var(--radius-sm);min-height:2.35rem;color:var(--ink);font:inherit;padding-inline:.55rem}._filters_a415m_205 input:focus,._filters_a415m_205 select:focus{border-color:var(--accent);outline:none;box-shadow:0 0 0 3px #2dd4bf26}._detail_a415m_235{gap:var(--space-3);display:grid}._detail_a415m_235>h2{margin:0}._summary_a415m_242{font-size:var(--text-sm);grid-template-columns:max-content 1fr;align-items:baseline;gap:.35rem .7rem;margin:0;display:grid}._summary_a415m_242 dt{color:var(--ink-muted);margin:0}._summary_a415m_242 dd{overflow-wrap:anywhere;min-width:0;margin:0}._overviewLayout_a415m_259{gap:var(--space-5);grid-template-columns:minmax(0,2fr) minmax(0,1fr);align-items:start;display:grid}._overviewSidebar_a415m_265{gap:var(--space-3);grid-column:2;min-width:0;display:grid}._overviewMain_a415m_271{grid-area:1/1;min-width:0}._sidebarSectionTitle_a415m_276{font-size:var(--text-sm)}._resourceList_a415m_279{margin:0 0 var(--space-4);gap:var(--space-2);flex-direction:column;padding:0;list-style:none;display:flex}._resourceCard_a415m_287{padding:var(--space-2) var(--space-3);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface-card);color:inherit;flex-direction:column;gap:.35rem;text-decoration:none;display:flex}a._resourceCard_a415m_287:hover{border-color:var(--accent);text-decoration:none}._resourceCardTop_a415m_302{align-items:center;gap:var(--space-2);display:flex}._resourceCardIcon_a415m_307{color:var(--ink-muted);flex:none}._resourceCardTitle_a415m_311{min-width:0;font-weight:600;font-size:var(--text-sm);text-overflow:ellipsis;white-space:nowrap;flex:auto;overflow:hidden}._resourceCardExt_a415m_320{color:var(--ink-muted);opacity:0;flex:none}._resourceCard_a415m_287:hover ._resourceCardExt_a415m_320{opacity:1}._resourceCardMeta_a415m_328{font-size:var(--text-sm);padding-left:calc(18px + var(--space-2));flex-wrap:wrap;align-items:baseline;gap:.4rem;display:flex}._resourceId_a415m_336{color:var(--ink-muted);font-family:var(--font-mono);font-size:var(--text-xs);overflow-wrap:anywhere}._eventList_a415m_342{flex-direction:column;gap:.45rem;margin:1rem 0;padding:0;list-style:none;display:flex}._event_a415m_342{background:var(--surface-card);border:1px solid var(--border);border-radius:var(--radius-sm);min-height:2.25rem;overflow:hidden}._event_a415m_342:hover{border-color:var(--border-strong)}._event_a415m_342 time{color:var(--ink-muted);font-family:var(--font-mono);font-size:var(--text-xs)}._eventType_a415m_365{font-weight:650;font-size:var(--text-sm);text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}._eventId_a415m_373{color:var(--ink-muted);font-family:var(--font-mono);font-size:var(--text-xs);text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}._toolbar_a415m_382{flex-wrap:wrap;align-items:center;gap:.7rem;display:flex}._modalBackdrop_a415m_388{background:var(--brand-darker);padding:var(--space-4);z-index:10;place-items:center;display:grid;position:fixed;inset:0}._modal_a415m_388{background:var(--surface-panel);border:1px solid var(--border-strong);box-shadow:var(--shadow);color:var(--ink);border-radius:var(--radius);width:100%;max-width:none;height:100%;max-height:none;padding:var(--space-4);overflow:auto}._modalHeader_a415m_411{justify-content:space-between;align-items:center;gap:var(--space-3);margin-bottom:var(--space-3);display:flex}._modalRef_a415m_418{color:var(--ink-muted);font-family:var(--font-mono);font-size:var(--text-sm)}._modalClose_a415m_423{appearance:none;border:1px solid var(--border-strong);border-radius:var(--radius-sm);background:var(--surface-card);color:var(--ink);cursor:pointer;font:inherit;font-size:var(--text-sm);padding:.35rem .7rem;font-weight:700}._modalClose_a415m_423:hover{border-color:var(--accent-light);color:var(--accent-light)}._tiles_a415m_439{margin-bottom:var(--space-4);flex-wrap:wrap;gap:.6rem;display:flex}@media (width<=42rem){._overviewLayout_a415m_259{grid-template-columns:minmax(0,1fr)}._overviewSidebar_a415m_265,._overviewMain_a415m_271{grid-area:auto/1}._board_a415m_1{display:block;overflow:visible}._column_a415m_69{min-height:unset;margin-bottom:.75rem}._columnToggle_a415m_183{display:inline-flex}._eventId_a415m_373{display:none}._modalBackdrop_a415m_388{background:0 0;padding:0;display:block;position:static}._modal_a415m_388{box-shadow:none;border:0;width:auto;height:auto;max-height:none;padding:0}}@media (prefers-reduced-motion:reduce){*{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important}}._transcript_a415m_490{margin:var(--space-3) 0 0;padding:0;list-style:none}._transcriptEntry_a415m_495{background:var(--surface-inset);border:1px solid var(--border);border-radius:var(--radius-sm);margin-bottom:.75rem;overflow:hidden}._transcriptHead_a415m_502{gap:var(--space-3);color:var(--ink-muted);background:var(--surface-panel);border-bottom:1px solid var(--border);font-family:var(--font-mono);font-size:var(--text-xs);padding:.45rem .6rem;display:flex}._transcriptText_a415m_512{white-space:pre-wrap;font-family:var(--font-mono);background:0 0;margin:0;padding:.6rem;font-size:.76rem;overflow-x:auto}._transcriptLayout_a415m_521{gap:var(--space-4);margin-top:var(--space-3);grid-template-columns:minmax(15rem,22rem) minmax(0,1fr);display:grid}._transcriptGroups_a415m_527{align-content:start;align-self:start;gap:var(--space-2);margin:0;padding:0;list-style:none;display:grid}._transcriptGroup_a415m_527{width:100%;padding:var(--space-2);color:var(--ink);text-align:left;background:var(--surface-card);border:1px solid var(--border);border-radius:var(--radius-sm);cursor:pointer;font:inherit;font-size:var(--text-xs);overflow-wrap:anywhere;gap:.2rem;display:grid}._transcriptGroup_a415m_527:hover,._transcriptGroup_a415m_527[aria-pressed=true]{border-color:var(--accent);background:var(--surface-inset)}._transcriptConversation_a415m_556{min-width:0}._transcriptFilters_a415m_559{align-items:center;gap:var(--space-3);flex-wrap:wrap;display:flex}._transcriptFilters_a415m_559 label{align-items:center;gap:var(--space-2);color:var(--ink-muted);font-size:var(--text-sm);display:flex}._transcriptFilters_a415m_559 select{color:var(--ink);background:var(--surface-panel);border:1px solid var(--border);border-radius:var(--radius-sm);font:inherit}._transcriptInput_a415m_579,._transcriptAgent_a415m_580{border:1px solid var(--border);border-radius:var(--radius-sm);overflow:hidden}._transcriptInput_a415m_579{background:var(--surface-inset);border-left:3px solid var(--accent);margin-left:12%}._transcriptAgent_a415m_580{background:var(--surface-card);border-left:3px solid var(--border-strong);margin-right:12%}._transcriptRunSeparator_a415m_595{align-items:center;gap:var(--space-2);margin:var(--space-3) 0;color:var(--ink-muted);font-family:var(--font-mono);font-size:var(--text-xs);display:flex}._transcriptRunSeparator_a415m_595:before,._transcriptRunSeparator_a415m_595:after{content:"";background:var(--border);flex:1;height:1px}._eventButton_a415m_612{width:100%;color:inherit;text-align:left;cursor:pointer;background:0 0;border:0;grid-template-columns:minmax(11rem,14rem) minmax(0,1fr) minmax(8rem,18rem) 2.4rem;align-items:center;gap:.65rem;padding:.45rem .65rem;display:grid}._eventType_a415m_365{text-overflow:clip;white-space:normal;overflow-wrap:anywhere;overflow:visible}@media (width<=42rem){._transcriptLayout_a415m_521{grid-template-columns:minmax(0,1fr)}._transcriptInput_a415m_579,._transcriptAgent_a415m_580{margin-inline:0}._eventButton_a415m_612{grid-template-rows:auto auto;grid-template-columns:minmax(0,1fr) 2.2rem}._eventType_a415m_365{text-overflow:ellipsis;white-space:nowrap;overflow-wrap:normal;grid-area:2/1/auto/-1;overflow:hidden}}._eventChevron_a415m_652{color:var(--ink-muted);justify-self:end}._eventPayload_a415m_656{border-top:1px solid var(--border);overflow-x:auto}._eventPayload_a415m_656 pre{padding:var(--space-3);white-space:pre;margin:0}._tabs_a415m_665{padding:.4rem var(--space-4) 0;border-bottom:1px solid var(--border);background:0 0;gap:.25rem;margin:0;display:flex}._tabs_a415m_665 button{color:var(--nav-ink-idle);font:inherit;white-space:nowrap;cursor:pointer;transition:color var(--motion-fast) ease;background:0 0;border:0;border-bottom:2px solid #0000;margin-bottom:-1px;padding:.4rem .7rem .45rem}._tabs_a415m_665 button:hover{color:var(--ink-inverse)}._tabs_a415m_665 button[aria-selected=true]{color:var(--accent-light);border-bottom-color:var(--accent);font-weight:700}._actionBar_a415m_694{gap:var(--space-2);flex-wrap:wrap;align-items:center;display:flex}._dangerButton_a415m_700{border-color:var(--bad);color:var(--bad)}:root{--wake-ink-950:#14161a;--wake-ink-900:#1a1d23;--wake-ink-850:#22262e;--wake-ink-800:#101216;--wake-ink-700:#2c313a;--wake-ink-600:#3a4150;--wake-grey-300:#cbd5e1;--wake-grey-400:#9aa2ad;--wake-grey-100:#e8e8e8;--wake-white:#fff;--wake-teal-700:#103a37;--wake-teal-650:#134e4a;--wake-teal-600:#0f766e;--wake-mint-400:#2dd4bf;--wake-mint-300:#5eead4;--wake-green-300:#7fe3a3;--wake-green-900:#1f3d2c;--wake-blue-300:#7fb3ff;--wake-blue-900:#1f3350;--wake-purple-300:#c79bff;--wake-purple-900:#2d1f50;--wake-amber-300:#ffcf7f;--wake-amber-900:#4a3510;--wake-red-300:#ff8f7f;--wake-red-900:#3d1f1f;--wake-slate-400:#9aa2ad;--wake-slate-900:#252830;--surface:var(--wake-ink-950);--surface-panel:var(--wake-ink-900);--surface-card:var(--wake-ink-850);--surface-inset:var(--wake-ink-800);--border:var(--wake-ink-700);--border-strong:var(--wake-ink-600);--ink:var(--wake-grey-100);--ink-muted:var(--wake-grey-400);--ink-inverse:var(--wake-white);--brand:var(--wake-teal-600);--brand-dark:var(--wake-teal-650);--brand-darker:var(--wake-teal-700);--nav-ink-idle:var(--wake-grey-300);--accent:var(--wake-mint-400);--accent-light:var(--wake-mint-300);--good:var(--wake-green-300);--warning:var(--wake-amber-300);--bad:var(--wake-red-300);--cond-ready-fg:var(--wake-green-300);--cond-ready-bg:var(--wake-green-900);--cond-scheduled-fg:var(--wake-blue-300);--cond-scheduled-bg:var(--wake-blue-900);--cond-active-fg:var(--wake-purple-300);--cond-active-bg:var(--wake-purple-900);--cond-needs-input-fg:var(--wake-amber-300);--cond-needs-input-bg:var(--wake-amber-900);--cond-error-fg:var(--wake-red-300);--cond-error-bg:var(--wake-red-900);--cond-finished-fg:var(--wake-slate-400);--cond-finished-bg:var(--wake-slate-900);--space-2:.5rem;--space-3:.75rem;--space-4:1rem;--space-5:1.5rem;--space-6:2rem;--radius:.65rem;--radius-sm:.4rem;--shadow:0 1px 3px #00000059;--focus-ring:var(--wake-mint-300);--font-sans:Inter, ui-sans-serif, system-ui, sans-serif;--font-mono:ui-monospace, SFMono-Regular, Consolas, monospace;--text-xs:.72rem;--text-sm:.8rem;--text-base:1rem;--text-lg:1.15rem;--content-width:76rem;--motion-fast:.12s}*{box-sizing:border-box}html{color:var(--ink);background:var(--surface);font-family:var(--font-sans);line-height:1.5}body{margin:0}a{color:var(--accent-light);text-underline-offset:.18em;text-decoration:none}a:hover{text-decoration:underline}button,input,select{font:inherit}:focus-visible{outline:3px solid var(--focus-ring);outline-offset:3px}@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}}
|