@vibes.diy/api-svc 14.3.21 → 14.3.23

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.
Files changed (133) hide show
  1. package/create-handler.d.ts +2 -0
  2. package/create-handler.js +1 -0
  3. package/create-handler.js.map +1 -1
  4. package/index.d.ts +2 -0
  5. package/index.js +2 -0
  6. package/index.js.map +1 -1
  7. package/intern/accepted-aliases.d.ts +31 -0
  8. package/intern/accepted-aliases.js +151 -0
  9. package/intern/accepted-aliases.js.map +1 -0
  10. package/intern/agent-assembly.d.ts +2 -0
  11. package/intern/agent-assembly.js +2 -2
  12. package/intern/agent-assembly.js.map +1 -1
  13. package/intern/agent-build-tools.d.ts +7 -0
  14. package/intern/agent-build-tools.js +14 -3
  15. package/intern/agent-build-tools.js.map +1 -1
  16. package/intern/agent-dispatcher.js +66 -25
  17. package/intern/agent-dispatcher.js.map +1 -1
  18. package/intern/agent-request-frame.d.ts +10 -0
  19. package/intern/agent-request-frame.js +16 -0
  20. package/intern/agent-request-frame.js.map +1 -1
  21. package/intern/agent-router.js +1 -1
  22. package/intern/agent-router.js.map +1 -1
  23. package/intern/agent-session.d.ts +1 -1
  24. package/intern/agent-session.js +1 -1
  25. package/intern/agent-session.js.map +1 -1
  26. package/intern/agent-wake.d.ts +1 -0
  27. package/intern/agent-wake.js +2 -0
  28. package/intern/agent-wake.js.map +1 -1
  29. package/intern/attach-draft-handle.js +51 -8
  30. package/intern/attach-draft-handle.js.map +1 -1
  31. package/intern/code-view.d.ts +1 -0
  32. package/intern/code-view.js +79 -0
  33. package/intern/code-view.js.map +1 -0
  34. package/intern/draft-lane-autofix.d.ts +8 -0
  35. package/intern/draft-lane-autofix.js +8 -0
  36. package/intern/draft-lane-autofix.js.map +1 -0
  37. package/intern/draft-lane-classify.d.ts +55 -0
  38. package/intern/draft-lane-classify.js +168 -0
  39. package/intern/draft-lane-classify.js.map +1 -0
  40. package/intern/draft-lane-config.d.ts +18 -0
  41. package/intern/draft-lane-config.js +35 -0
  42. package/intern/draft-lane-config.js.map +1 -0
  43. package/intern/draft-lane-exports.d.ts +7 -0
  44. package/intern/draft-lane-exports.js +104 -0
  45. package/intern/draft-lane-exports.js.map +1 -0
  46. package/intern/draft-lane-imports.d.ts +6 -0
  47. package/intern/draft-lane-imports.js +180 -0
  48. package/intern/draft-lane-imports.js.map +1 -0
  49. package/intern/draft-lane-opens.d.ts +6 -0
  50. package/intern/draft-lane-opens.js +173 -0
  51. package/intern/draft-lane-opens.js.map +1 -0
  52. package/intern/draft-lane-parse.d.ts +17 -0
  53. package/intern/draft-lane-parse.js +107 -0
  54. package/intern/draft-lane-parse.js.map +1 -0
  55. package/intern/draft-lane-persist.d.ts +26 -0
  56. package/intern/draft-lane-persist.js +94 -0
  57. package/intern/draft-lane-persist.js.map +1 -0
  58. package/intern/draft-lane-prompt.d.ts +16 -0
  59. package/intern/draft-lane-prompt.js +59 -0
  60. package/intern/draft-lane-prompt.js.map +1 -0
  61. package/intern/draft-lane-store.d.ts +37 -0
  62. package/intern/draft-lane-store.js +5 -0
  63. package/intern/draft-lane-store.js.map +1 -0
  64. package/intern/draft-lane-transport.d.ts +11 -0
  65. package/intern/draft-lane-transport.js +61 -0
  66. package/intern/draft-lane-transport.js.map +1 -0
  67. package/intern/draft-lane-worker.d.ts +38 -0
  68. package/intern/draft-lane-worker.js +173 -0
  69. package/intern/draft-lane-worker.js.map +1 -0
  70. package/intern/draft-lane.d.ts +63 -0
  71. package/intern/draft-lane.js +167 -0
  72. package/intern/draft-lane.js.map +1 -0
  73. package/intern/draft-note.d.ts +1 -0
  74. package/intern/draft-note.js +13 -0
  75. package/intern/draft-note.js.map +1 -0
  76. package/intern/draft-ready-frame.d.ts +50 -0
  77. package/intern/draft-ready-frame.js +102 -0
  78. package/intern/draft-ready-frame.js.map +1 -0
  79. package/intern/eval-handles.d.ts +2 -1
  80. package/intern/eval-handles.js +2 -1
  81. package/intern/eval-handles.js.map +1 -1
  82. package/intern/first-build-request.js +5 -1
  83. package/intern/first-build-request.js.map +1 -1
  84. package/intern/import-synth.d.ts +29 -0
  85. package/intern/import-synth.js +607 -0
  86. package/intern/import-synth.js.map +1 -0
  87. package/intern/inline-build-pass.d.ts +26 -0
  88. package/intern/inline-build-pass.js +54 -0
  89. package/intern/inline-build-pass.js.map +1 -0
  90. package/intern/look-lint-engine.d.ts +9 -0
  91. package/intern/look-lint-engine.js +22 -0
  92. package/intern/look-lint-engine.js.map +1 -1
  93. package/intern/look-lint.d.ts +12 -1
  94. package/intern/look-lint.js +40 -1
  95. package/intern/look-lint.js.map +1 -1
  96. package/intern/mint-job-store.d.ts +53 -2
  97. package/intern/mint-job-store.js +153 -4
  98. package/intern/mint-job-store.js.map +1 -1
  99. package/intern/opens-check.d.ts +14 -0
  100. package/intern/opens-check.js +1046 -0
  101. package/intern/opens-check.js.map +1 -0
  102. package/intern/prompt-assembly.d.ts +19 -0
  103. package/intern/prompt-assembly.js +5 -2
  104. package/intern/prompt-assembly.js.map +1 -1
  105. package/intern/save-build-pass.d.ts +15 -0
  106. package/intern/save-build-pass.js +65 -0
  107. package/intern/save-build-pass.js.map +1 -0
  108. package/intern/section-fan-out.d.ts +9 -0
  109. package/intern/section-fan-out.js +22 -0
  110. package/intern/section-fan-out.js.map +1 -1
  111. package/package.json +13 -12
  112. package/public/agent-turn-assembly.js +17 -0
  113. package/public/agent-turn-assembly.js.map +1 -1
  114. package/public/handle-prompt-context.d.ts +5 -1
  115. package/public/handle-prompt-context.js +56 -6
  116. package/public/handle-prompt-context.js.map +1 -1
  117. package/public/home-feed-common.js +2 -2
  118. package/public/home-feed-common.js.map +1 -1
  119. package/public/open-chat.d.ts +19 -3
  120. package/public/open-chat.js +219 -22
  121. package/public/open-chat.js.map +1 -1
  122. package/public/prompt-turn-settled.js +1 -0
  123. package/public/prompt-turn-settled.js.map +1 -1
  124. package/public/related-vibes.js +9 -3
  125. package/public/related-vibes.js.map +1 -1
  126. package/public/shared-mint.d.ts +5 -0
  127. package/public/shared-mint.js +15 -0
  128. package/public/shared-mint.js.map +1 -1
  129. package/public/stream-assembly.d.ts +1 -0
  130. package/public/stream-assembly.js +3 -0
  131. package/public/stream-assembly.js.map +1 -1
  132. package/types.d.ts +2 -0
  133. package/types.js.map +1 -1
@@ -0,0 +1,61 @@
1
+ import { Result, exception2Result } from "@adviser/cement";
2
+ import { type } from "arktype";
3
+ import { draftReasoningEffortFor } from "./draft-lane-config.js";
4
+ const completion = type({
5
+ "model?": "string",
6
+ choices: type({ message: { content: "string | null" }, "finish_reason?": "string | null" }).array(),
7
+ "usage?": {
8
+ "prompt_tokens?": "number >= 0",
9
+ "completion_tokens?": "number >= 0",
10
+ "total_tokens?": "number >= 0",
11
+ "cost?": "number >= 0",
12
+ },
13
+ });
14
+ function toChatMessages(req) {
15
+ return req.messages.map((message) => ({ role: message.role, content: [{ type: "text", text: message.content }] }));
16
+ }
17
+ export function draftModelCallFor(vctx) {
18
+ return async function callDraftModel(req) {
19
+ const effort = draftReasoningEffortFor(req.model);
20
+ const response = await exception2Result(() => vctx.llmRequest({
21
+ model: req.model,
22
+ messages: toChatMessages(req),
23
+ stream: false,
24
+ max_tokens: req.maxTokens,
25
+ ...(effort === undefined ? {} : { reasoning: { effort } }),
26
+ headers: vctx.params.llm.headers,
27
+ }, req.signal === undefined ? undefined : { signal: req.signal }));
28
+ if (response.isErr())
29
+ return Result.Err(response.Err());
30
+ const res = response.Ok();
31
+ if (res.ok === false) {
32
+ await exception2Result(() => res.body?.cancel());
33
+ return Result.Err(`draft-model-status-${res.status}`);
34
+ }
35
+ const json = await exception2Result(() => res.json());
36
+ if (json.isErr())
37
+ return Result.Err(json.Err());
38
+ const parsed = completion(json.Ok());
39
+ if (parsed instanceof type.errors)
40
+ return Result.Err(`draft-model-contract: ${parsed.summary}`);
41
+ const content = parsed.choices[0]?.message.content;
42
+ if (content === undefined || content === null || content.length === 0)
43
+ return Result.Err("draft-model-empty-reply");
44
+ const usage = parsed.usage;
45
+ return Result.Ok({
46
+ text: content,
47
+ ...(parsed.model === undefined ? {} : { model: parsed.model }),
48
+ ...(usage === undefined
49
+ ? {}
50
+ : {
51
+ usage: {
52
+ prompt_tokens: usage.prompt_tokens ?? 0,
53
+ completion_tokens: usage.completion_tokens ?? 0,
54
+ total_tokens: usage.total_tokens ?? (usage.prompt_tokens ?? 0) + (usage.completion_tokens ?? 0),
55
+ ...(usage.cost === undefined ? {} : { cost: usage.cost }),
56
+ },
57
+ }),
58
+ });
59
+ };
60
+ }
61
+ //# sourceMappingURL=draft-lane-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draft-lane-transport.js","sourceRoot":"","sources":["../../jsr/intern/draft-lane-transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { Result } from "@adviser/cement";
2
+ import type { DashAuthType } from "@vibes.diy/identity";
3
+ import type { VibesApiSQLCtx } from "../types.js";
4
+ import type { DraftJobStore } from "./draft-lane-store.js";
5
+ export declare const DRAFT_LANE_PATH = "/internal/draft-lane";
6
+ export declare const DRAFT_LANE_AUTH_HEADER = "x-vibes-draft-lane-auth";
7
+ export declare const draftLaneJob: import("arktype/internal/variants/object.ts").ObjectType<{
8
+ chatId: string;
9
+ leaseToken: string;
10
+ sentence: string;
11
+ auth: {
12
+ type: "clerk" | "device-id" | "ucan";
13
+ token: string;
14
+ };
15
+ }, {}>;
16
+ export type DraftLaneJob = typeof draftLaneJob.infer;
17
+ export type DispatchDraftLane = (job: DraftLaneJob) => Promise<Result<void>>;
18
+ export declare function draftLaneDispatcher(args: {
19
+ readonly baseUrl: string | undefined;
20
+ readonly internalSecret: string | undefined;
21
+ readonly fetch: (request: Request) => Promise<Response>;
22
+ }): DispatchDraftLane | undefined;
23
+ export declare function isDraftLaneCallAuthorized(secret: string | undefined, provided: string | null): boolean;
24
+ export type DraftLaneSkipReason = "disabled" | "no-dispatcher" | "no-build-intent" | "job-order-error" | "claim-miss" | "claim-error";
25
+ export declare function startDraftLane(vctx: VibesApiSQLCtx, args: {
26
+ readonly chatId: string;
27
+ readonly prompt: string;
28
+ readonly auth: DashAuthType;
29
+ readonly jobOrder?: Promise<unknown>;
30
+ readonly store: DraftJobStore;
31
+ readonly dispatch: DispatchDraftLane | undefined;
32
+ }): Promise<boolean>;
33
+ export declare function handleDraftLaneRequest(args: {
34
+ readonly request: Request;
35
+ readonly vctx: VibesApiSQLCtx;
36
+ readonly internalSecret: string | undefined;
37
+ readonly store: DraftJobStore;
38
+ }): Promise<Response>;
@@ -0,0 +1,173 @@
1
+ import { Result, exception2Result } from "@adviser/cement";
2
+ import { type } from "arktype";
3
+ import { and, eq } from "drizzle-orm/sql/expressions";
4
+ import { dashAuthType } from "@vibes.diy/api-types";
5
+ import { verifyAuth } from "../check-auth.js";
6
+ import { readDraftLaneConfig } from "./draft-lane-config.js";
7
+ import { looksLikeBuildIntent } from "./draft-lane-classify.js";
8
+ import { autofixAndCheck } from "./draft-lane-autofix.js";
9
+ import { loadDraftSystemPrompt } from "./draft-lane-prompt.js";
10
+ import { draftModelCallFor } from "./draft-lane-transport.js";
11
+ import { persistDraftBuild } from "./draft-lane-persist.js";
12
+ import { validateAgentFiles } from "./agent-file-validation.js";
13
+ import { runDraftLane } from "./draft-lane.js";
14
+ export const DRAFT_LANE_PATH = "/internal/draft-lane";
15
+ export const DRAFT_LANE_AUTH_HEADER = "x-vibes-draft-lane-auth";
16
+ export const draftLaneJob = type({
17
+ chatId: "0 < string <= 128",
18
+ leaseToken: "0 < string <= 256",
19
+ sentence: "0 < string <= 16000",
20
+ auth: dashAuthType,
21
+ });
22
+ export function draftLaneDispatcher(args) {
23
+ const { baseUrl, internalSecret } = args;
24
+ if (baseUrl === undefined || baseUrl.length === 0 || internalSecret === undefined || internalSecret.length === 0)
25
+ return undefined;
26
+ const send = args.fetch;
27
+ return async function dispatchDraftLane(job) {
28
+ const request = new Request(`${baseUrl.replace(/\/+$/, "")}${DRAFT_LANE_PATH}`, {
29
+ method: "POST",
30
+ headers: { "Content-Type": "application/json", [DRAFT_LANE_AUTH_HEADER]: internalSecret },
31
+ body: JSON.stringify(job),
32
+ });
33
+ const response = await exception2Result(() => send(request));
34
+ if (response.isErr())
35
+ return Result.Err(response.Err());
36
+ const res = response.Ok();
37
+ await exception2Result(() => res.body?.cancel());
38
+ return res.ok ? Result.Ok(undefined) : Result.Err(`draft-lane-route-status-${res.status}`);
39
+ };
40
+ }
41
+ export function isDraftLaneCallAuthorized(secret, provided) {
42
+ if (secret === undefined || secret.length === 0)
43
+ return false;
44
+ return provided !== null && provided === secret;
45
+ }
46
+ export async function startDraftLane(vctx, args) {
47
+ const skipped = (reason, error) => {
48
+ const line = reason === "no-dispatcher" || reason === "job-order-error" || reason === "claim-error"
49
+ ? vctx.logger.Warn()
50
+ : vctx.logger.Info();
51
+ const withError = error === undefined ? line : line.Err(error);
52
+ withError.Str("chatId", args.chatId).Str("reason", reason).Msg("draft-lane-skipped");
53
+ return false;
54
+ };
55
+ const config = readDraftLaneConfig(vctx.sthis.env);
56
+ if (config.enabled === false)
57
+ return skipped("disabled");
58
+ if (args.dispatch === undefined)
59
+ return skipped("no-dispatcher");
60
+ if (looksLikeBuildIntent(args.prompt) === false)
61
+ return skipped("no-build-intent");
62
+ if (args.jobOrder !== undefined) {
63
+ const jobOrder = args.jobOrder;
64
+ const ordered = await exception2Result(() => jobOrder);
65
+ if (ordered.isErr())
66
+ return skipped("job-order-error", ordered.Err());
67
+ const inserted = ordered.Ok();
68
+ if (Result.Is(inserted) && inserted.isErr())
69
+ return skipped("job-order-error", inserted.Err());
70
+ }
71
+ const claimed = await args.store.claimDraft(vctx.sql, args.chatId, config.leaseMs);
72
+ if (claimed.isErr())
73
+ return skipped("claim-error", claimed.Err());
74
+ const leaseToken = claimed.Ok();
75
+ if (leaseToken === null)
76
+ return skipped("claim-miss");
77
+ const dispatch = args.dispatch;
78
+ const kicked = exception2Result(() => dispatch({ chatId: args.chatId, leaseToken, sentence: args.prompt, auth: args.auth })).then(async (sent) => {
79
+ const failed = sent.isErr() ? sent.Err() : undefined;
80
+ if (failed === undefined)
81
+ return;
82
+ vctx.logger.Warn().Err(failed).Str("chatId", args.chatId).Msg("draft-lane-dispatch-failed");
83
+ await args.store.abandonDraft(vctx.sql, args.chatId, leaseToken);
84
+ });
85
+ const waitUntil = vctx.waitUntil;
86
+ if (waitUntil !== undefined) {
87
+ const registered = exception2Result(() => waitUntil(kicked));
88
+ if (registered.isErr())
89
+ vctx.logger.Warn().Err(registered).Str("chatId", args.chatId).Msg("draft-lane-wait-until-failed");
90
+ }
91
+ else {
92
+ await kicked;
93
+ }
94
+ return true;
95
+ }
96
+ function json(status, body) {
97
+ return new Response(JSON.stringify(body), {
98
+ status,
99
+ headers: { "Content-Type": "application/json", "Cache-Control": "no-store" },
100
+ });
101
+ }
102
+ export async function handleDraftLaneRequest(args) {
103
+ const { request, vctx } = args;
104
+ if (request.method !== "POST")
105
+ return json(405, { error: "method" });
106
+ const config = readDraftLaneConfig(vctx.sthis.env);
107
+ if (config.enabled === false)
108
+ return json(404, { error: "draft lane off" });
109
+ if (isDraftLaneCallAuthorized(args.internalSecret, request.headers.get(DRAFT_LANE_AUTH_HEADER)) === false) {
110
+ return json(403, { error: "forbidden" });
111
+ }
112
+ const body = await exception2Result(() => request.json());
113
+ if (body.isErr())
114
+ return json(400, { error: "invalid body" });
115
+ const job = draftLaneJob(body.Ok());
116
+ if (job instanceof type.errors)
117
+ return json(400, { error: "invalid job" });
118
+ const verified = await verifyAuth(vctx, { auth: job.auth });
119
+ if (verified.isErr())
120
+ return json(401, { error: "unverified" });
121
+ const identity = verified.Ok();
122
+ if (identity.type !== "VerifiedAuthResult")
123
+ return json(401, { error: "unverified" });
124
+ const userId = identity.verifiedAuth.claims.userId;
125
+ const t = vctx.sql.tables.chatContexts;
126
+ const chat = await exception2Result(() => vctx.sql.db
127
+ .select({ ownerHandle: t.ownerHandle, appSlug: t.appSlug })
128
+ .from(t)
129
+ .where(and(eq(t.chatId, job.chatId), eq(t.userId, userId)))
130
+ .limit(1)
131
+ .then((rows) => rows[0]));
132
+ if (chat.isErr())
133
+ return json(503, { error: "store unavailable" });
134
+ const row = chat.Ok();
135
+ if (row === undefined)
136
+ return json(404, { error: "chat not found" });
137
+ const outcome = await runDraftLane({
138
+ chatId: job.chatId,
139
+ leaseToken: job.leaseToken,
140
+ sentence: job.sentence,
141
+ userHandle: row.ownerHandle,
142
+ config,
143
+ deps: {
144
+ store: args.store,
145
+ sql: vctx.sql,
146
+ callModel: draftModelCallFor(vctx),
147
+ systemPrompt: (classification) => loadDraftSystemPrompt(vctx, {
148
+ chatId: job.chatId,
149
+ ownerHandle: row.ownerHandle,
150
+ model: config.builderModel,
151
+ classification,
152
+ }),
153
+ autofixAndCheck,
154
+ saveCheck: async (vfs) => {
155
+ const changes = [...vfs].map(([path, contents]) => ({ path, contents }));
156
+ const checked = await validateAgentFiles(vctx, { vfs, changes, ownerHandle: row.ownerHandle });
157
+ return checked.isErr() ? Result.Err(checked.Err()) : Result.Ok(undefined);
158
+ },
159
+ persist: (draft) => persistDraftBuild(vctx, {
160
+ chatId: job.chatId,
161
+ ownerHandle: row.ownerHandle,
162
+ appSlug: row.appSlug,
163
+ auth: job.auth,
164
+ verified: identity,
165
+ draft,
166
+ }),
167
+ now: () => Date.now(),
168
+ log: (event) => vctx.logger.Info().Any("draftLane", event).Msg(`draft-lane-${event.step}`),
169
+ },
170
+ });
171
+ return json(200, { ...outcome });
172
+ }
173
+ //# sourceMappingURL=draft-lane-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draft-lane-worker.js","sourceRoot":"","sources":["../../jsr/intern/draft-lane-worker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import { Result } from "@adviser/cement";
2
+ import { type DraftLaneConfig, type DraftReasoningEffort } from "./draft-lane-config.js";
3
+ import { type DraftClassification, type DraftModelCall, type DraftModelUsage } from "./draft-lane-classify.js";
4
+ import type { AutofixAndCheck } from "./draft-lane-autofix.js";
5
+ import type { DraftJobSql, DraftJobStore, DraftOpensVerdict } from "./draft-lane-store.js";
6
+ export declare const DRAFT_MAX_OUTPUT_TOKENS = 32000;
7
+ export interface DraftCallLedgerEntry extends DraftModelUsage {
8
+ readonly reasoningEffort?: DraftReasoningEffort;
9
+ }
10
+ export interface DraftToPersist {
11
+ readonly chatId: string;
12
+ readonly sentence: string;
13
+ readonly text: string;
14
+ readonly vfs: ReadonlyMap<string, string>;
15
+ readonly draftNote: string;
16
+ readonly model: string;
17
+ readonly usage: readonly DraftCallLedgerEntry[];
18
+ readonly classification: DraftClassification;
19
+ }
20
+ export interface DraftLaneDeps {
21
+ readonly store: DraftJobStore;
22
+ readonly sql: DraftJobSql;
23
+ readonly callModel: DraftModelCall;
24
+ readonly systemPrompt: (classification: DraftClassification) => Promise<Result<string>>;
25
+ readonly autofixAndCheck: AutofixAndCheck;
26
+ readonly saveCheck: (vfs: ReadonlyMap<string, string>) => Promise<Result<void>>;
27
+ readonly persist: (draft: DraftToPersist) => Promise<Result<{
28
+ readonly appSlug: string;
29
+ readonly buildId: string;
30
+ }>>;
31
+ readonly now: () => number;
32
+ readonly log?: (event: DraftLaneEvent) => void;
33
+ }
34
+ export type DraftAbandonReason = "not-a-build" | "store-error" | "prompt-unavailable" | "builder-error" | "unparseable" | "does-not-open" | "persist-failed" | "complete-refused";
35
+ export type DraftLaneOutcome = {
36
+ readonly kind: "drafted";
37
+ readonly appSlug: string;
38
+ readonly buildId: string;
39
+ readonly draftNote: string;
40
+ readonly verdict: DraftOpensVerdict;
41
+ } | {
42
+ readonly kind: "abandoned";
43
+ readonly reason: DraftAbandonReason;
44
+ readonly detail?: string;
45
+ readonly verdict?: DraftOpensVerdict;
46
+ } | {
47
+ readonly kind: "lease-lost";
48
+ readonly before: "classifier" | "builder" | "persist";
49
+ };
50
+ export interface DraftLaneEvent {
51
+ readonly chatId: string;
52
+ readonly step: "classified" | "attempt" | "settled";
53
+ readonly data: Readonly<Record<string, unknown>>;
54
+ }
55
+ export interface RunDraftLaneArgs {
56
+ readonly chatId: string;
57
+ readonly leaseToken: string;
58
+ readonly sentence: string;
59
+ readonly userHandle: string;
60
+ readonly config: DraftLaneConfig;
61
+ readonly deps: DraftLaneDeps;
62
+ }
63
+ export declare function runDraftLane(args: RunDraftLaneArgs): Promise<DraftLaneOutcome>;
@@ -0,0 +1,167 @@
1
+ import { draftReasoningEffortFor } from "./draft-lane-config.js";
2
+ import { classifyDraft, looksLikeBuildIntent, } from "./draft-lane-classify.js";
3
+ import { composeDraftBrief, composeRepairAsk } from "./draft-lane-prompt.js";
4
+ import { parseDraftText, renderDraftText } from "./draft-lane-parse.js";
5
+ import { detectAcceptedAliases } from "./accepted-aliases.js";
6
+ export const DRAFT_MAX_OUTPUT_TOKENS = 32_000;
7
+ function ledgerEntry(usage, model) {
8
+ const effort = draftReasoningEffortFor(model);
9
+ return effort === undefined ? usage : { ...usage, reasoningEffort: effort };
10
+ }
11
+ async function renew(args) {
12
+ const renewed = await args.deps.store.renewDraft(args.deps.sql, args.chatId, args.leaseToken, args.config.leaseMs);
13
+ if (renewed.isErr())
14
+ return "error";
15
+ return renewed.Ok() ? "held" : "lost";
16
+ }
17
+ async function abandon(args, outcome) {
18
+ await args.deps.store.abandonDraft(args.deps.sql, args.chatId, args.leaseToken);
19
+ const settled = { kind: "abandoned", ...outcome };
20
+ args.deps.log?.({ chatId: args.chatId, step: "settled", data: { ...outcome } });
21
+ return settled;
22
+ }
23
+ export async function runDraftLane(args) {
24
+ const { deps, config } = args;
25
+ if (looksLikeBuildIntent(args.sentence) === false)
26
+ return abandon(args, { reason: "not-a-build" });
27
+ const beforeClassifier = await renew(args);
28
+ if (beforeClassifier === "lost")
29
+ return { kind: "lease-lost", before: "classifier" };
30
+ if (beforeClassifier === "error")
31
+ return abandon(args, { reason: "store-error" });
32
+ const classified = await classifyDraft({
33
+ sentence: args.sentence,
34
+ model: config.classifierModel,
35
+ timeoutMs: config.classifierTimeoutMs,
36
+ call: deps.callModel,
37
+ now: deps.now,
38
+ });
39
+ const classification = classified.classification;
40
+ deps.log?.({
41
+ chatId: args.chatId,
42
+ step: "classified",
43
+ data: {
44
+ classifierMs: classified.classifierMs,
45
+ source: classification.source,
46
+ fallback: classified.fallback,
47
+ build: classification.build,
48
+ skills: classification.skills,
49
+ deferred: Object.keys(classification.deferred),
50
+ slug: classification.slug,
51
+ },
52
+ });
53
+ if (classification.build === false)
54
+ return abandon(args, { reason: "not-a-build", detail: classification.source });
55
+ const system = await deps.systemPrompt(classification);
56
+ if (system.isErr())
57
+ return abandon(args, { reason: "prompt-unavailable", detail: system.Err().message });
58
+ const messages = [
59
+ { role: "system", content: system.Ok() },
60
+ { role: "user", content: composeDraftBrief(args.sentence) },
61
+ ];
62
+ const usage = classified.usage === undefined ? [] : [ledgerEntry(classified.usage, config.classifierModel)];
63
+ const autofixNotes = [];
64
+ let draftMs = 0;
65
+ let retries = 0;
66
+ function verdictOf(opens, findings) {
67
+ return {
68
+ opens,
69
+ findings,
70
+ retries,
71
+ classifierMs: classified.classifierMs,
72
+ draftMs,
73
+ classifierSource: classification.source,
74
+ autofixNotes,
75
+ };
76
+ }
77
+ for (let attempt = 0; attempt <= config.maxRetries; attempt++) {
78
+ const lease = await renew(args);
79
+ if (lease === "lost")
80
+ return { kind: "lease-lost", before: "builder" };
81
+ if (lease === "error")
82
+ return abandon(args, { reason: "store-error", verdict: verdictOf(false, []) });
83
+ const started = deps.now();
84
+ const reply = await deps.callModel({ model: config.builderModel, messages, maxTokens: DRAFT_MAX_OUTPUT_TOKENS });
85
+ draftMs += deps.now() - started;
86
+ if (reply.isErr())
87
+ return abandon(args, { reason: "builder-error", detail: reply.Err().message, verdict: verdictOf(false, []) });
88
+ const replyUsage = reply.Ok().usage;
89
+ if (replyUsage !== undefined)
90
+ usage.push(ledgerEntry(replyUsage, config.builderModel));
91
+ const parsed = await parseDraftText(reply.Ok().text);
92
+ if (parsed.isErr())
93
+ return abandon(args, { reason: "unparseable", detail: parsed.Err().message, verdict: verdictOf(false, []) });
94
+ const checked = deps.autofixAndCheck(parsed.Ok().vfs);
95
+ autofixNotes.push(...checked.notes);
96
+ deps.log?.({
97
+ chatId: args.chatId,
98
+ step: "attempt",
99
+ data: {
100
+ attempt,
101
+ opens: checked.opens,
102
+ findings: checked.findings.length,
103
+ fixes: checked.notes.length,
104
+ draftMs,
105
+ reasoningEffort: draftReasoningEffortFor(config.builderModel) ?? "default",
106
+ },
107
+ });
108
+ const lastAttempt = attempt === config.maxRetries;
109
+ let accept = checked.opens;
110
+ if (accept === false && lastAttempt) {
111
+ const saved = await deps.saveCheck(checked.vfs);
112
+ accept = saved.isOk();
113
+ }
114
+ if (accept) {
115
+ const beforePersist = await renew(args);
116
+ if (beforePersist === "lost")
117
+ return { kind: "lease-lost", before: "persist" };
118
+ if (beforePersist === "error")
119
+ return abandon(args, { reason: "store-error", verdict: verdictOf(checked.opens, checked.findings) });
120
+ const final = { vfs: checked.vfs, intro: parsed.Ok().intro, tail: parsed.Ok().tail, draftNote: parsed.Ok().draftNote };
121
+ const verdict = verdictOf(checked.opens, checked.findings);
122
+ const aliasesUsed = detectAcceptedAliases(checked.vfs).map((use) => use.note);
123
+ const persisted = await deps.persist({
124
+ chatId: args.chatId,
125
+ sentence: args.sentence,
126
+ text: renderDraftText(final),
127
+ vfs: checked.vfs,
128
+ draftNote: final.draftNote,
129
+ model: config.builderModel,
130
+ usage,
131
+ classification,
132
+ });
133
+ if (persisted.isErr())
134
+ return abandon(args, { reason: "persist-failed", detail: persisted.Err().message, verdict });
135
+ const completed = await deps.store.completeDraft(deps.sql, args.chatId, args.leaseToken, {
136
+ appSlug: persisted.Ok().appSlug,
137
+ buildId: persisted.Ok().buildId,
138
+ draftNote: final.draftNote,
139
+ opensVerdict: { opens: verdict.opens, findings: [...verdict.findings] },
140
+ ...(aliasesUsed.length > 0 ? { aliasesUsed } : {}),
141
+ });
142
+ if (completed.isErr() || completed.Ok() === false) {
143
+ const detail = completed.isErr() ? completed.Err().message : "row was no longer drafting";
144
+ return abandon(args, { reason: "complete-refused", detail, verdict });
145
+ }
146
+ const outcome = {
147
+ kind: "drafted",
148
+ appSlug: persisted.Ok().appSlug,
149
+ buildId: persisted.Ok().buildId,
150
+ draftNote: final.draftNote,
151
+ verdict,
152
+ };
153
+ deps.log?.({
154
+ chatId: args.chatId,
155
+ step: "settled",
156
+ data: { kind: "drafted", ...verdict, ...(aliasesUsed.length > 0 ? { aliasesUsed } : {}) },
157
+ });
158
+ return outcome;
159
+ }
160
+ if (lastAttempt)
161
+ return abandon(args, { reason: "does-not-open", verdict: verdictOf(false, checked.findings) });
162
+ retries += 1;
163
+ messages.push({ role: "assistant", content: reply.Ok().text }, { role: "user", content: composeRepairAsk(checked.findings) });
164
+ }
165
+ return abandon(args, { reason: "does-not-open", verdict: verdictOf(false, []) });
166
+ }
167
+ //# sourceMappingURL=draft-lane.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draft-lane.js","sourceRoot":"","sources":["../../jsr/intern/draft-lane.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function draftNoteOf(tail: string): string;
@@ -0,0 +1,13 @@
1
+ const DRAFT_NOTE_LINE = /^\s*(?:\*\*)?draft note(?:\*\*)?\s*:\s*(?:\*\*)?\s*(.*?)\s*$/i;
2
+ const STAND_INS_HEAD = /^(?:#+\s*)?(?:\*\*)?stand-ins(?:\*\*)?\s*:?\s*(?:\*\*)?$/i;
3
+ export function draftNoteOf(tail) {
4
+ for (const line of tail.split("\n")) {
5
+ const hit = DRAFT_NOTE_LINE.exec(line);
6
+ if (hit !== null)
7
+ return hit[1] ?? "";
8
+ }
9
+ const trimmed = tail.trim();
10
+ const firstLine = trimmed.split("\n")[0] ?? "";
11
+ return STAND_INS_HEAD.test(firstLine.trim()) ? "" : trimmed;
12
+ }
13
+ //# sourceMappingURL=draft-note.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draft-note.js","sourceRoot":"","sources":["../../jsr/intern/draft-note.ts"],"names":[],"mappings":"AAcA,MAAM,eAAe,GAAG,+DAA+D,CAAC;AAOxF,MAAM,cAAc,GAAG,2DAA2D,CAAC;AAOnF,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,GAAG,KAAK,IAAI;YAAE,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACxC,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/C,OAAO,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,50 @@
1
+ import { Result } from "@adviser/cement";
2
+ import { type EvtDraftReady } from "@vibes.diy/api-types";
3
+ import type { VibesApiSQLCtx } from "../types.js";
4
+ import { type MintJobRow } from "./mint-job-store.js";
5
+ import { type SectionFanOutConnection } from "./section-fan-out.js";
6
+ export type DraftReadySkip = "disabled" | "no-draft" | "does-not-open" | "no-files" | "too-large";
7
+ export declare const DRAFT_READY_MAX_TEXT_BYTES: number;
8
+ export type DraftReadyDecision = {
9
+ readonly kind: "announce";
10
+ readonly ownerHandle: string;
11
+ readonly appSlug: string;
12
+ readonly buildId: string;
13
+ readonly draftNote?: string;
14
+ } | {
15
+ readonly kind: "skip";
16
+ readonly reason: Exclude<DraftReadySkip, "no-files" | "too-large">;
17
+ };
18
+ export declare function draftReadyDecision(args: {
19
+ readonly enabled: boolean;
20
+ readonly job: Pick<MintJobRow, "ownerHandle" | "firstDraft">;
21
+ }): DraftReadyDecision;
22
+ export interface DraftFiles {
23
+ readonly fsId: string;
24
+ readonly files: EvtDraftReady["files"];
25
+ }
26
+ export declare function loadDraftFiles(vctx: VibesApiSQLCtx, key: {
27
+ readonly ownerHandle: string;
28
+ readonly appSlug: string;
29
+ readonly fsId: string;
30
+ }): Promise<Result<DraftFiles | undefined>>;
31
+ export declare function draftFrameFiles(vfs: ReadonlyMap<string, string>): EvtDraftReady["files"];
32
+ export type DraftReadyOutcome = {
33
+ readonly kind: "announced";
34
+ readonly delivered: number;
35
+ readonly files: number;
36
+ } | {
37
+ readonly kind: "skipped";
38
+ readonly reason: DraftReadySkip;
39
+ } | {
40
+ readonly kind: "failed";
41
+ readonly error: Error;
42
+ };
43
+ export declare function announceDraftReady(vctx: VibesApiSQLCtx, args: {
44
+ readonly job: Pick<MintJobRow, "chatId" | "ownerHandle" | "firstDraft">;
45
+ readonly sendCtx: unknown;
46
+ readonly validated: object;
47
+ readonly connections?: Iterable<SectionFanOutConnection>;
48
+ readonly enabled?: boolean;
49
+ readonly maxTextBytes?: number;
50
+ }): Promise<DraftReadyOutcome>;