Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
63 commits
Select commit Hold shift + click to select a range
f6e439e
feat(gitlab): add review workflow foundation
LegendPei May 2, 2026
ce7d02d
feat(gitlab): add review webhook entry
LegendPei May 2, 2026
8043ed9
feat(gitlab): run review workflow from webhook
LegendPei May 2, 2026
7e4aa9d
feat(gitlab): publish review results
LegendPei May 2, 2026
afda183
feat(gitlab): expose review run publish api
LegendPei May 2, 2026
37da37c
docs(gitlab): record review implementation state
LegendPei May 2, 2026
8f5ae3d
docs(gitlab): translate implementation state plan
LegendPei May 2, 2026
f05fef4
feat(gitlab): capture runtime review results
LegendPei May 2, 2026
e9b2c90
feat(gitlab): adapt review agents for runtime
LegendPei May 2, 2026
e6bda1d
feat(gitlab): support commit review summaries
LegendPei May 2, 2026
eb6dba8
feat(gitlab): persist review runs
LegendPei May 2, 2026
811e2e3
feat(gitlab): expand review dry run harness
LegendPei May 2, 2026
727b5f3
feat(gitlab): show review runs in platform UI
LegendPei May 2, 2026
f8cab3f
feat(gitlab): bound review run history
LegendPei May 2, 2026
b87cad1
feat(gitlab): fail runs missing review output
LegendPei May 2, 2026
53c4df3
feat(gitlab): add review setup guidance
LegendPei May 2, 2026
1f4062a
feat(gitlab): add review subagent agents
LegendPei May 2, 2026
3012e59
feat(gitlab): retry review runs from UI
LegendPei May 2, 2026
acfcd80
docs(gitlab): update review implementation plan
LegendPei May 2, 2026
fec9a9b
feat(gitlab): compile review subagent results
LegendPei May 2, 2026
c4b82cd
feat(gitlab): dry run subagent outputs
LegendPei May 2, 2026
c1ed3c0
feat(gitlab): validate review token scope
LegendPei May 2, 2026
4ca842b
feat(gitlab): track review retry attempts
LegendPei May 2, 2026
0b8da45
docs(gitlab): update remaining review gaps
LegendPei May 2, 2026
d9cc75e
docs(gitlab): freeze review progress
LegendPei May 2, 2026
97be64d
fix(gitlab): align review guards with design
LegendPei May 2, 2026
e1cc6a6
feat(gitlab): improve review run diagnostics
LegendPei May 2, 2026
e385340
fix(gitlab): handle api failures in review runs
LegendPei May 2, 2026
8c872a2
feat: improve gitlab review workflow integration
LegendPei May 4, 2026
c082e6f
feat: align gitlab platform settings with main
LegendPei May 5, 2026
e96bd25
feat: clarify gitlab platform setup
LegendPei May 5, 2026
6389cfe
feat: support gitlab mention review instructions
LegendPei May 5, 2026
266943c
fix: guard gitlab mention instructions in prompt
LegendPei May 5, 2026
d16dde2
feat: guard gitlab mention intent
LegendPei May 5, 2026
ec1c024
fix: comment on rejected gitlab mention requests
LegendPei May 5, 2026
cdfcb36
fix: deduplicate rejected gitlab mention comments
LegendPei May 5, 2026
aef7a70
fix: prefer lan url for webhook status
LegendPei May 6, 2026
0ed66a0
fix: include gitlab diff evidence in review prompt
LegendPei May 6, 2026
b56c9a4
fix: register gitlab runtime sources for webhooks
LegendPei May 6, 2026
54377d6
feat: enrich gitlab review summary comments
LegendPei May 6, 2026
ac3895a
feat: add gitlab review suggestions
LegendPei May 6, 2026
21dc07f
fix: post gitlab inline positions as nested form fields
LegendPei May 6, 2026
e22270d
fix: stabilize gitlab inline line mapping
LegendPei May 6, 2026
ecff0b2
fix: avoid duplicating inline findings in gitlab summary
LegendPei May 6, 2026
be8f009
fix: publish gitlab review summary before inline notes
LegendPei May 6, 2026
f282933
feat: sync gitlab webhook hooks from platform settings
LegendPei May 6, 2026
ec15995
feat: add gitlab review project scope controls
LegendPei May 6, 2026
6ee430d
feat: add gitlab group hook management
LegendPei May 6, 2026
15c4640
feat: show ignored gitlab review events
LegendPei May 6, 2026
532ab06
feat: simplify gitlab mvp settings
LegendPei May 6, 2026
ef3ee18
fix: detect stale gitlab hook urls before testing
LegendPei May 6, 2026
77c1a0b
fix: keep gitlab summary comments concise
LegendPei May 6, 2026
f072bed
fix: refresh stale gitlab webhook host
LegendPei May 7, 2026
094a244
fix: auto-create gitlab webhook secret
LegendPei May 7, 2026
bb6380b
docs: summarize gitlab review engineering
LegendPei May 8, 2026
4393f04
Merge branch 'main' into feat/gitlab-review-workflow
LegendPei May 8, 2026
fba9eae
fix: address gitlab review copilot feedback
LegendPei May 9, 2026
a86a73c
Merge remote-tracking branch 'origin/feat/gitlab-review-workflow' int…
LegendPei May 9, 2026
f444908
fix: address gitlab review boundary feedback
LegendPei May 9, 2026
921b432
fix: refine gitlab review feedback handling
LegendPei May 9, 2026
29a159a
fix: harden gitlab review retry and status
LegendPei May 10, 2026
d1594c7
fix: handle gitlab review publish edge cases
LegendPei May 10, 2026
2cb3ea4
fix: tighten gitlab review final feedback
LegendPei May 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,13 @@ export type AutomatedControllerResponse = {
response: RuntimeControllerProtocol.MessageSendResponse
}

export type AutomatedRuntimeOutput = {
kind: "message" | "part"
sessionID: string
payload: unknown
text?: string
}

export type AutomatedControllerInput = {
title: string
directory: string
Expand All @@ -35,10 +42,12 @@ export type AutomatedControllerInput = {
entry: RuntimeControllerProtocol.Entry
clientCapabilities: RuntimeControllerProtocol.ClientCapabilities
parts: RuntimeControllerProtocol.MessageSendRequest["parts"]
context?: RuntimeControllerProtocol.MessageSendRequest["context"]
interactionPolicy: AutomatedInteractionPolicy
timeoutMs: number
timeoutMessage?: string
onControllerResponse?: (response: AutomatedControllerResponse) => Promise<void>
onRuntimeOutput?: (output: AutomatedRuntimeOutput) => Promise<void>
onFinished?: (result: { status: AutomatedRunStatus; error?: string }) => Promise<void>
onInteraction?: (interaction: {
kind: "permission" | "question"
Expand All @@ -65,6 +74,7 @@ export async function runAutomatedControllerSession(input: AutomatedControllerIn
})
const messageResponse = await sendControllerMessage(sessionResponse.sessionId, {
parts: input.parts,
context: input.context,
entry: input.entry,
clientCapabilities: input.clientCapabilities,
})
Expand All @@ -91,6 +101,7 @@ export async function runAutomatedControllerSession(input: AutomatedControllerIn
timeoutMs: input.timeoutMs,
timeoutMessage: input.timeoutMessage,
interactionPolicy: input.interactionPolicy,
onRuntimeOutput: input.onRuntimeOutput,
onFinished: input.onFinished,
onInteraction: input.onInteraction,
})
Expand All @@ -106,6 +117,7 @@ export function startAutomatedRunMonitor(input: {
timeoutMessage?: string
interactionPolicy: AutomatedInteractionPolicy
onFinished?: (result: { status: AutomatedRunStatus; error?: string }) => Promise<void>
onRuntimeOutput?: AutomatedControllerInput["onRuntimeOutput"]
onInteraction?: AutomatedControllerInput["onInteraction"]
}) {
let finished = false
Expand All @@ -122,7 +134,8 @@ export function startAutomatedRunMonitor(input: {

unsubscribe = Bus.subscribeAll(async (event) => {
const properties = event.properties as Record<string, any> | undefined
const eventSessionID = properties?.sessionID || properties?.info?.id
const eventSessionID =
properties?.sessionID || properties?.info?.sessionID || properties?.part?.sessionID || properties?.info?.id
if (eventSessionID !== input.sessionID) return

if (event.type === "permission.asked") {
Expand Down Expand Up @@ -161,6 +174,27 @@ export function startAutomatedRunMonitor(input: {
return
}

if (event.type === "message.updated") {
const info = properties?.info
await input.onRuntimeOutput?.({
kind: "message",
sessionID: input.sessionID,
payload: info,
}).catch(() => undefined)
return
}

if (event.type === "message.part.updated") {
const part = properties?.part
await input.onRuntimeOutput?.({
kind: "part",
sessionID: input.sessionID,
payload: part,
text: extractTextPart(part),
}).catch(() => undefined)
return
}

if (event.type === "session.idle") {
await finish("succeeded")
return
Expand Down Expand Up @@ -191,3 +225,9 @@ function formatSessionError(error: unknown) {
if (typeof error === "string") return error
return JSON.stringify(error)
}

function extractTextPart(part: unknown) {
if (!part || typeof part !== "object") return undefined
const record = part as Record<string, unknown>
return record.type === "text" && typeof record.text === "string" ? record.text : undefined
}
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ export const Nine1BotPlatformRoutes = () =>
new Hono()
.get("/", async (c) => {
try {
const manager = getBuiltinPlatformManager()
const manager = await syncManagerFromConfig()
return c.json({
platforms: manager.listSummaries(),
})
Expand All @@ -90,7 +90,9 @@ export const Nine1BotPlatformRoutes = () =>
})
.get("/:id", async (c) => {
try {
const detail = await getBuiltinPlatformManager().getDetail(c.req.param("id"))
const manager = await syncManagerFromConfig()
await manager.refreshStatus(c.req.param("id"))
const detail = await manager.getDetail(c.req.param("id"))
if (!detail) throw new PlatformNotFoundError(c.req.param("id"))
return c.json(detail)
} catch (error) {
Expand Down
Loading
Loading