mirror of
https://gh-proxy.org/https://github.com/klinsmaya/multica.git
synced 2026-11-08 17:36:45 +08:00
* perf(db): mint UUIDv7 primary keys for the append-heavy tables
Random v4 primary keys scatter every insert across the whole primary-key
B-tree, so each row dirties a different page. On the tables that grow
continuously — the task queue, messages, comments, activity and audit rows —
that is pure write amplification. UUIDv7 puts a big-endian millisecond
timestamp in the leading 48 bits, so consecutive inserts share a page.
The 12 tables converted here are the append-only hot paths:
agent_task_queue, activity_log, inbox_item, comment, issue, chat_session,
chat_message, autopilot_run, webhook_delivery, task_token,
channel_inbound_audit, sys_cron_executions
Ids come from the new pkg/dbid, which returns a pgtype.UUID ready to assign to
a sqlc params struct. Upsert-dominated tables (task_usage, agent_runtime, ...)
are deliberately left alone: v7 only buys locality for rows that are actually
inserted. Lease and claim tokens keep gen_random_uuid() — they must stay
unpredictable and carry no timestamp.
No migration, and no backfill. Every converted INSERT binds its id as
COALESCE(sqlc.narg('id')::uuid, gen_random_uuid()), so the column default stays
reachable: a caller that passes no id inserts exactly as it does today. Tables
will hold a mix of v4 and v7 ids permanently, which the uuid type and every
parser in the repo already accept.
Verification: - pkg/dbid: version/variant, uniqueness, and a non-decreasing timestamp
prefix; a shape test asserting every converted query keeps the COALESCE
fallback; and a source scan asserting every production params literal mints
an id, so a call site added later cannot silently fall back to v4.
- internal/handler: round-trips issue, comment, activity_log, inbox_item,
chat_session, chat_message, agent_task_queue, task_token and
channel_inbound_audit against Postgres and asserts the stored id is v7,
plus one case proving an unset id still inserts (as v4).
- internal/scheduler: covers the one hand-written INSERT, asserting the
execution id is v7 while lease_token stays v4.
Co-authored-by: multica-agent <[email protected]>
* fix(db): address UUIDv7 review feedback
Co-authored-by: multica-agent <[email protected]>
* fix(db): cover Telegram audit UUIDv7
Co-authored-by: multica-agent <[email protected]>
---------
Co-authored-by: Sol-Boy <[email protected]>
Co-authored-by: multica-agent <[email protected]>
57 lines
2.3 KiB
Go
57 lines
2.3 KiB
Go
package handler
|
|
|
|
import (
|
|
"context"
|
|
"log/slog"
|
|
|
|
"github.com/jackc/pgx/v5/pgtype"
|
|
"github.com/multica-ai/multica/server/internal/service"
|
|
db "github.com/multica-ai/multica/server/pkg/db/generated"
|
|
"github.com/multica-ai/multica/server/pkg/dbid"
|
|
"github.com/multica-ai/multica/server/pkg/protocol"
|
|
)
|
|
|
|
// noteRuntimeUnusable records, on the issue itself, that a trigger was refused
|
|
// because the target's agent CLI cannot run on its machine.
|
|
//
|
|
// Written for EVERY author, not only the unattended ones. The composer chip and
|
|
// the post-send toast do reach whoever was typing, but they carry the reason
|
|
// code alone — the repair command is too long for a chip and too important to
|
|
// put in something that disappears. An agent-authored @mention has nobody
|
|
// watching a response at all. So both get the same durable record, and the
|
|
// transient surfaces stay a preview of it rather than the only copy (MUL-6164).
|
|
//
|
|
// Best-effort by construction: the refusal already happened and is correct
|
|
// whether or not this note lands, so a failure here is logged, never returned.
|
|
func (h *Handler) noteRuntimeUnusable(ctx context.Context, issue db.Issue, agent db.Agent, verdict service.AgentVerdict) {
|
|
content := service.RuntimeUnusableNotice(agent.Name, verdict)
|
|
// author_type='system', author_id=zero UUID — same shape as the sub-issue
|
|
// completion notice; clients branch on author_type, not the UUID value.
|
|
created, err := h.Queries.CreateComment(ctx, db.CreateCommentParams{
|
|
ID: dbid.NewV7(),
|
|
IssueID: issue.ID,
|
|
WorkspaceID: issue.WorkspaceID,
|
|
AuthorType: "system",
|
|
AuthorID: pgtype.UUID{Valid: true},
|
|
Content: content,
|
|
Type: "system",
|
|
ParentID: pgtype.UUID{Valid: false},
|
|
})
|
|
if err != nil {
|
|
slog.Warn("runtime unusable notice: create system comment failed",
|
|
"error", err,
|
|
"issue_id", uuidToString(issue.ID),
|
|
"agent_id", uuidToString(agent.ID))
|
|
return
|
|
}
|
|
comment := created.Comment()
|
|
h.publish(protocol.EventCommentCreated, uuidToString(issue.WorkspaceID), "system", "", map[string]any{
|
|
"comment": commentToResponse(comment, nil, nil),
|
|
"issue_title": issue.Title,
|
|
"issue_assignee_type": textToPtr(issue.AssigneeType),
|
|
"issue_assignee_id": uuidToPtr(issue.AssigneeID),
|
|
"issue_status": issue.Status,
|
|
"issue_revision": created.IssueRevision,
|
|
})
|
|
}
|