@vibes.diy/api-svc 14.3.76 → 14.3.78

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 (141) hide show
  1. package/index.d.ts +2 -0
  2. package/index.js +2 -0
  3. package/index.js.map +1 -1
  4. package/intern/agent-account-tools.d.ts +62 -0
  5. package/intern/agent-account-tools.js +536 -0
  6. package/intern/agent-account-tools.js.map +1 -0
  7. package/intern/agent-assembly.d.ts +6 -0
  8. package/intern/agent-assembly.js +43 -21
  9. package/intern/agent-assembly.js.map +1 -1
  10. package/intern/agent-belt.d.ts +8 -0
  11. package/intern/agent-belt.js +122 -124
  12. package/intern/agent-belt.js.map +1 -1
  13. package/intern/agent-build-tools.d.ts +5 -0
  14. package/intern/agent-build-tools.js +18 -2
  15. package/intern/agent-build-tools.js.map +1 -1
  16. package/intern/agent-debug-tools.d.ts +0 -1
  17. package/intern/agent-debug-tools.js +2 -59
  18. package/intern/agent-debug-tools.js.map +1 -1
  19. package/intern/agent-design-check.d.ts +25 -0
  20. package/intern/agent-design-check.js +77 -0
  21. package/intern/agent-design-check.js.map +1 -0
  22. package/intern/agent-dispatcher.d.ts +5 -0
  23. package/intern/agent-dispatcher.js +38 -4
  24. package/intern/agent-dispatcher.js.map +1 -1
  25. package/intern/agent-file-tools.js +10 -3
  26. package/intern/agent-file-tools.js.map +1 -1
  27. package/intern/agent-options-tool.d.ts +22 -0
  28. package/intern/agent-options-tool.js +142 -0
  29. package/intern/agent-options-tool.js.map +1 -0
  30. package/intern/agent-read-tools.d.ts +1 -0
  31. package/intern/agent-read-tools.js +49 -10
  32. package/intern/agent-read-tools.js.map +1 -1
  33. package/intern/agent-router.d.ts +1 -0
  34. package/intern/agent-router.js +2 -0
  35. package/intern/agent-router.js.map +1 -1
  36. package/intern/agent-seed-tools.d.ts +16 -0
  37. package/intern/agent-seed-tools.js +152 -0
  38. package/intern/agent-seed-tools.js.map +1 -0
  39. package/intern/agent-session-instruction.d.ts +2 -2
  40. package/intern/agent-session-instruction.js +51 -38
  41. package/intern/agent-session-instruction.js.map +1 -1
  42. package/intern/agent-session-runtime.d.ts +4 -0
  43. package/intern/agent-session-runtime.js +39 -95
  44. package/intern/agent-session-runtime.js.map +1 -1
  45. package/intern/agent-session.d.ts +2 -0
  46. package/intern/agent-session.js +1 -0
  47. package/intern/agent-session.js.map +1 -1
  48. package/intern/agent-top-level-instruction.d.ts +9 -0
  49. package/intern/agent-top-level-instruction.js +27 -0
  50. package/intern/agent-top-level-instruction.js.map +1 -0
  51. package/intern/agent-with-vibe.d.ts +72 -0
  52. package/intern/agent-with-vibe.js +174 -0
  53. package/intern/agent-with-vibe.js.map +1 -0
  54. package/intern/apply-seed.d.ts +8 -0
  55. package/intern/apply-seed.js +29 -4
  56. package/intern/apply-seed.js.map +1 -1
  57. package/intern/attach-draft-handle.js +0 -13
  58. package/intern/attach-draft-handle.js.map +1 -1
  59. package/intern/draft-chat-store.d.ts +0 -10
  60. package/intern/draft-chat-store.js +0 -4
  61. package/intern/draft-chat-store.js.map +1 -1
  62. package/intern/ensure-app-metadata.js +2 -2
  63. package/intern/ensure-app-metadata.js.map +1 -1
  64. package/intern/ensure-chat-id.d.ts +2 -2
  65. package/intern/ensure-chat-id.js +59 -14
  66. package/intern/ensure-chat-id.js.map +1 -1
  67. package/intern/get-vibe-route-hints.d.ts +0 -2
  68. package/intern/get-vibe-route-hints.js +1 -5
  69. package/intern/get-vibe-route-hints.js.map +1 -1
  70. package/intern/instruction-variant.d.ts +1 -1
  71. package/intern/instruction-variant.js +3 -2
  72. package/intern/instruction-variant.js.map +1 -1
  73. package/intern/llm-tool-loop.d.ts +2 -1
  74. package/intern/llm-tool-loop.js +58 -4
  75. package/intern/llm-tool-loop.js.map +1 -1
  76. package/intern/mint-decision.d.ts +0 -12
  77. package/intern/mint-decision.js +3 -17
  78. package/intern/mint-decision.js.map +1 -1
  79. package/intern/mint-fire-core.d.ts +1 -0
  80. package/intern/mint-fire-core.js +1 -1
  81. package/intern/mint-fire-core.js.map +1 -1
  82. package/intern/pre-allocate.d.ts +0 -1
  83. package/intern/pre-allocate.js +0 -5
  84. package/intern/pre-allocate.js.map +1 -1
  85. package/intern/prompt-step.d.ts +1 -2
  86. package/intern/prompt-step.js +0 -5
  87. package/intern/prompt-step.js.map +1 -1
  88. package/intern/settings-carry-policy.js +1 -1
  89. package/intern/settings-carry-policy.js.map +1 -1
  90. package/intern/subagent-model.d.ts +1 -1
  91. package/intern/subagent-model.js +0 -2
  92. package/intern/subagent-model.js.map +1 -1
  93. package/intern/turn-reach.d.ts +0 -2
  94. package/intern/turn-reach.js +0 -6
  95. package/intern/turn-reach.js.map +1 -1
  96. package/package.json +13 -13
  97. package/public/agent-turn-action.js +97 -65
  98. package/public/agent-turn-action.js.map +1 -1
  99. package/public/agent-turn-assembly.js +14 -1
  100. package/public/agent-turn-assembly.js.map +1 -1
  101. package/public/chip-projection.d.ts +2 -1
  102. package/public/chip-projection.js +2 -2
  103. package/public/chip-projection.js.map +1 -1
  104. package/public/chip-stamp.d.ts +3 -1
  105. package/public/chip-stamp.js +6 -7
  106. package/public/chip-stamp.js.map +1 -1
  107. package/public/cid-asset-access.js +7 -4
  108. package/public/cid-asset-access.js.map +1 -1
  109. package/public/codegen-turn-route.js +11 -4
  110. package/public/codegen-turn-route.js.map +1 -1
  111. package/public/ensure-app-slug-item.js +1 -0
  112. package/public/ensure-app-slug-item.js.map +1 -1
  113. package/public/fs-prompt.d.ts +2 -1
  114. package/public/fs-prompt.js +5 -1
  115. package/public/fs-prompt.js.map +1 -1
  116. package/public/get-vibe-chips.js +13 -7
  117. package/public/get-vibe-chips.js.map +1 -1
  118. package/public/list-models.js +5 -1
  119. package/public/list-models.js.map +1 -1
  120. package/public/lookup-handles.d.ts +10 -0
  121. package/public/lookup-handles.js +9 -1
  122. package/public/lookup-handles.js.map +1 -1
  123. package/public/prompt-chat-section.js +4 -1
  124. package/public/prompt-chat-section.js.map +1 -1
  125. package/public/prompt-section-actions.js +0 -1
  126. package/public/prompt-section-actions.js.map +1 -1
  127. package/public/publish-app.js +1 -0
  128. package/public/publish-app.js.map +1 -1
  129. package/public/recapture-screenshot.js +1 -0
  130. package/public/recapture-screenshot.js.map +1 -1
  131. package/public/seed-owner-controls.js +30 -2
  132. package/public/seed-owner-controls.js.map +1 -1
  133. package/public/set-mode-fsid.js +1 -0
  134. package/public/set-mode-fsid.js.map +1 -1
  135. package/public/set-vibe-chips.js +4 -3
  136. package/public/set-vibe-chips.js.map +1 -1
  137. package/public/stream-assembly.js +2 -10
  138. package/public/stream-assembly.js.map +1 -1
  139. package/intern/agent-deferred-access.d.ts +0 -24
  140. package/intern/agent-deferred-access.js +0 -194
  141. package/intern/agent-deferred-access.js.map +0 -1
package/index.d.ts CHANGED
@@ -54,6 +54,8 @@ export * from "./intern/backend-do-control-plane.js";
54
54
  export * from "./intern/ensure-chat-id.js";
55
55
  export * from "./intern/agent-build-tools.js";
56
56
  export * from "./intern/agent-debug-tools.js";
57
+ export * from "./intern/agent-seed-tools.js";
58
+ export * from "./intern/agent-options-tool.js";
57
59
  export * from "./intern/agent-read-tools.js";
58
60
  export * from "./intern/agent-belt.js";
59
61
  export * from "./intern/agent-style-tools.js";
package/index.js CHANGED
@@ -54,6 +54,8 @@ export * from "./intern/backend-do-control-plane.js";
54
54
  export * from "./intern/ensure-chat-id.js";
55
55
  export * from "./intern/agent-build-tools.js";
56
56
  export * from "./intern/agent-debug-tools.js";
57
+ export * from "./intern/agent-seed-tools.js";
58
+ export * from "./intern/agent-options-tool.js";
57
59
  export * from "./intern/agent-read-tools.js";
58
60
  export * from "./intern/agent-belt.js";
59
61
  export * from "./intern/agent-style-tools.js";
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../jsr/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../jsr/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import { Result } from "@adviser/cement";
2
+ import { type ClerkClaim, type ReqOpenChat, type ReqWithVerifiedAuth } from "@vibes.diy/api-types";
3
+ import { VibesApiSQLCtx } from "../types.js";
4
+ import { type AgentActor } from "./agent-actor.js";
5
+ import { type AgentBuildDispatcher } from "./agent-build-tools.js";
6
+ import { type AgentBelt } from "./agent-belt.js";
7
+ import { type FetchUrlToolContext } from "./fetch-url-tool.js";
8
+ import type { TopLevelAgentBrief } from "./agent-assembly.js";
9
+ export declare const LIST_VIBES_TOOL_NAME = "list_vibes";
10
+ export declare const EDIT_VIBE_AT_TOOL_NAME = "edit_vibe_at";
11
+ export declare const TOP_LEVEL_MAX_BUILDS_PER_TURN = 5;
12
+ export declare const LIST_VIBES_LIMIT = 50;
13
+ export interface AccountVibe {
14
+ readonly ownerHandle: string;
15
+ readonly appSlug: string;
16
+ readonly title?: string;
17
+ readonly updated: string;
18
+ readonly published: boolean;
19
+ readonly unpublished?: true;
20
+ readonly link: string;
21
+ }
22
+ declare const listVibesCursorShape: import("arktype/internal/variants/object.ts").ObjectType<{
23
+ updated: string;
24
+ ownerHandle: string;
25
+ appSlug: string;
26
+ }, {}>;
27
+ type ListVibesCursor = typeof listVibesCursorShape.infer;
28
+ export declare function encodeListVibesCursor(c: ListVibesCursor): string;
29
+ export declare function decodeListVibesCursor(raw: string): Result<ListVibesCursor>;
30
+ export declare class InvalidListVibesCursorError extends Error {
31
+ readonly invalidListVibesCursor: true;
32
+ constructor(detail: string);
33
+ }
34
+ export declare function listAccountVibes(vctx: VibesApiSQLCtx, args: {
35
+ readonly userId: string;
36
+ readonly limit?: number;
37
+ readonly cursor?: string;
38
+ }): Promise<Result<{
39
+ readonly vibes: AccountVibe[];
40
+ readonly more: boolean;
41
+ readonly nextCursor?: string;
42
+ }>>;
43
+ export declare function briefDisplayName(claims: Pick<ClerkClaim, "params"> | undefined): string | undefined;
44
+ export declare function loadTopLevelAgentBrief(vctx: VibesApiSQLCtx, args: {
45
+ readonly userId: string;
46
+ readonly claims?: Pick<ClerkClaim, "params">;
47
+ }): Promise<Result<TopLevelAgentBrief>>;
48
+ export interface AccountAgentBeltArgs {
49
+ readonly actor: AgentActor;
50
+ readonly chatId: string;
51
+ readonly openAuth: Pick<ReqWithVerifiedAuth<ReqOpenChat>, "auth" | "_auth">;
52
+ readonly dispatcher: AgentBuildDispatcher;
53
+ readonly mintDispatcherFor: (chatId: string) => AgentBuildDispatcher;
54
+ readonly fetchUrl?: FetchUrlToolContext;
55
+ readonly onDispatch: (dispatched: {
56
+ readonly chatId: string;
57
+ readonly ownerHandle: string;
58
+ readonly appSlug: string;
59
+ }) => void;
60
+ }
61
+ export declare function createAccountAgentBelt(vctx: VibesApiSQLCtx, args: AccountAgentBeltArgs): AgentBelt;
62
+ export {};
@@ -0,0 +1,536 @@
1
+ import { JSONEnDecoderSingleton, Result, exception2Result } from "@adviser/cement";
2
+ import { type } from "arktype";
3
+ import { and, desc, eq, inArray, lt, or } from "drizzle-orm/sql/expressions";
4
+ import { base58btc } from "multiformats/bases/base58";
5
+ import { createVibeToolInput, editVibeAtToolInput, isActiveTitle, isAgentChatAppSlug, listVibesToolInput, withVibeToolInput, } from "@vibes.diy/api-types";
6
+ import { assertInScope, resolveAgentActor, resolveChatApp } from "./agent-actor.js";
7
+ import { runCreateVibeTool, runEditVibeTool } from "./agent-build-tools.js";
8
+ import { createVibeToolDefinition, CREATE_VIBE_TOOL_NAME } from "./agent-belt.js";
9
+ import { createAgentReadTools, LOOKUP_HANDLE_TOOL_NAME } from "./agent-read-tools.js";
10
+ import { createWorkToolBelt, loadWorkVfs } from "./work-tools.js";
11
+ import { AGENT_DEBUG_TOOL_NAMES, createAgentDebugTools } from "./agent-debug-tools.js";
12
+ import { peekBuildLockEntry } from "./codegen-build-lock.js";
13
+ import { fitWithVibeAnswer, runWithVibeCalls, withVibeToolDefinition, WITH_VIBE_FILE_TOOLS, WITH_VIBE_MAX_CALLS, WITH_VIBE_BUILD_NOTE, WITH_VIBE_TOOL_NAME, } from "./agent-with-vibe.js";
14
+ import { FETCH_URL_TOOL_NAME } from "./fetch-url-tool.js";
15
+ import { ensureChatId } from "./ensure-chat-id.js";
16
+ import { claimFirstTurnMint, claimMintJob } from "./mint-job-store.js";
17
+ import { poufLookFor } from "./pouf-look-flag.js";
18
+ import { resolveActiveHandle } from "../public/resolve-active-handle.js";
19
+ import { composeSettingsRows } from "../public/app-setting-items.js";
20
+ export const LIST_VIBES_TOOL_NAME = "list_vibes";
21
+ export const EDIT_VIBE_AT_TOOL_NAME = "edit_vibe_at";
22
+ export const TOP_LEVEL_MAX_BUILDS_PER_TURN = 5;
23
+ export const LIST_VIBES_LIMIT = 50;
24
+ const listVibesCursorShape = type({ updated: "string", ownerHandle: "string", appSlug: "string" });
25
+ const cursorJson = JSONEnDecoderSingleton();
26
+ export function encodeListVibesCursor(c) {
27
+ return base58btc.encode(cursorJson.uint8ify({ updated: c.updated, ownerHandle: c.ownerHandle, appSlug: c.appSlug }));
28
+ }
29
+ export function decodeListVibesCursor(raw) {
30
+ const rBytes = exception2Result(() => base58btc.decode(raw));
31
+ if (rBytes.isErr())
32
+ return Result.Err(rBytes.Err());
33
+ const rParsed = cursorJson.parse(rBytes.Ok());
34
+ if (rParsed.isErr())
35
+ return Result.Err(rParsed.Err());
36
+ const checked = listVibesCursorShape(rParsed.Ok());
37
+ if (checked instanceof type.errors)
38
+ return Result.Err(`invalid cursor: ${checked.summary}`);
39
+ return Result.Ok(checked);
40
+ }
41
+ export class InvalidListVibesCursorError extends Error {
42
+ invalidListVibesCursor = true;
43
+ constructor(detail) {
44
+ super(`invalid list_vibes cursor: ${detail}`);
45
+ this.name = "InvalidListVibesCursorError";
46
+ }
47
+ }
48
+ function isInvalidListVibesCursor(err) {
49
+ return typeof err === "object" && err !== null && err.invalidListVibesCursor === true;
50
+ }
51
+ export async function listAccountVibes(vctx, args) {
52
+ const limit = args.limit ?? LIST_VIBES_LIMIT;
53
+ let after;
54
+ if (args.cursor !== undefined) {
55
+ const rCursor = decodeListVibesCursor(args.cursor);
56
+ if (rCursor.isErr())
57
+ return Result.Err(new InvalidListVibesCursorError(rCursor.Err().message));
58
+ after = rCursor.Ok();
59
+ }
60
+ const asb = vctx.sql.tables.appSlugBinding;
61
+ const usb = vctx.sql.tables.handleBinding;
62
+ const settings = vctx.sql.tables.appSettings;
63
+ const rRows = await exception2Result(() => vctx.sql.db
64
+ .select({
65
+ ownerHandle: asb.ownerHandle,
66
+ appSlug: asb.appSlug,
67
+ updated: asb.updated,
68
+ unpublishedAt: asb.unpublishedAt,
69
+ settings: settings.settings,
70
+ settingsItemizedAt: settings.settingsItemizedAt,
71
+ })
72
+ .from(usb)
73
+ .innerJoin(asb, eq(asb.ownerHandle, usb.handle))
74
+ .leftJoin(settings, and(eq(settings.userId, usb.userId), eq(settings.ownerHandle, usb.handle), eq(settings.appSlug, asb.appSlug)))
75
+ .where(and(eq(usb.userId, args.userId), after === undefined
76
+ ? undefined
77
+ : or(lt(asb.updated, after.updated), and(eq(asb.updated, after.updated), lt(asb.ownerHandle, after.ownerHandle)), and(eq(asb.updated, after.updated), eq(asb.ownerHandle, after.ownerHandle), lt(asb.appSlug, after.appSlug)))))
78
+ .orderBy(desc(asb.updated), desc(asb.ownerHandle), desc(asb.appSlug))
79
+ .limit(limit + 1));
80
+ if (rRows.isErr())
81
+ return Result.Err(rRows);
82
+ const rows = rRows.Ok().filter((row) => isAgentChatAppSlug(row.appSlug) === false);
83
+ const page = rows.slice(0, limit);
84
+ const published = new Set();
85
+ if (page.length > 0) {
86
+ const tApps = vctx.sql.tables.apps;
87
+ const rProd = await exception2Result(() => vctx.sql.db
88
+ .select({ ownerHandle: tApps.ownerHandle, appSlug: tApps.appSlug })
89
+ .from(tApps)
90
+ .where(and(eq(tApps.mode, "production"), inArray(tApps.ownerHandle, [...new Set(page.map((r) => r.ownerHandle))]), inArray(tApps.appSlug, [...new Set(page.map((r) => r.appSlug))]))));
91
+ if (rProd.isErr())
92
+ return Result.Err(rProd);
93
+ for (const row of rProd.Ok())
94
+ published.add(`${row.ownerHandle}/${row.appSlug}`);
95
+ }
96
+ const composed = await composeSettingsRows(vctx, page.map((row) => ({
97
+ userId: args.userId,
98
+ ownerHandle: row.ownerHandle,
99
+ appSlug: row.appSlug,
100
+ settings: row.settings,
101
+ settingsItemizedAt: row.settingsItemizedAt ?? null,
102
+ })));
103
+ const vibes = page.map((row) => {
104
+ const key = `${row.ownerHandle}/${row.appSlug}`;
105
+ const title = (composed.get(key) ?? []).find(isActiveTitle)?.title;
106
+ const takenDown = row.unpublishedAt.length > 0;
107
+ return {
108
+ ownerHandle: row.ownerHandle,
109
+ appSlug: row.appSlug,
110
+ ...(title === undefined ? {} : { title }),
111
+ updated: row.updated,
112
+ published: published.has(key) && takenDown === false,
113
+ ...(takenDown ? { unpublished: true } : {}),
114
+ link: `/vibe/${row.ownerHandle}/${row.appSlug}`,
115
+ };
116
+ });
117
+ const more = rows.length > limit;
118
+ const last = page[page.length - 1];
119
+ return Result.Ok({
120
+ vibes,
121
+ more,
122
+ ...(more && last !== undefined
123
+ ? { nextCursor: encodeListVibesCursor({ updated: last.updated, ownerHandle: last.ownerHandle, appSlug: last.appSlug }) }
124
+ : {}),
125
+ });
126
+ }
127
+ export function briefDisplayName(claims) {
128
+ const p = claims?.params;
129
+ if (p === undefined)
130
+ return undefined;
131
+ if (typeof p.nick === "string" && p.nick.trim() !== "")
132
+ return p.nick.trim();
133
+ if (typeof p.name === "string" && p.name.trim() !== "")
134
+ return p.name.trim();
135
+ const composed = `${typeof p.first === "string" ? p.first : ""} ${typeof p.last === "string" ? p.last : ""}`.trim();
136
+ return composed === "" ? undefined : composed;
137
+ }
138
+ export async function loadTopLevelAgentBrief(vctx, args) {
139
+ const hb = vctx.sql.tables.handleBinding;
140
+ const rHandles = await exception2Result(() => vctx.sql.db.select({ handle: hb.handle }).from(hb).where(eq(hb.userId, args.userId)).orderBy(hb.created, hb.handle));
141
+ if (rHandles.isErr())
142
+ return Result.Err(rHandles);
143
+ const rActive = await exception2Result(() => resolveActiveHandle(vctx, args.userId));
144
+ if (rActive.isErr())
145
+ return Result.Err(rActive);
146
+ const displayName = briefDisplayName(args.claims);
147
+ const activeHandle = rActive.Ok();
148
+ return Result.Ok({
149
+ ...(displayName === undefined ? {} : { displayName }),
150
+ ...(activeHandle === undefined ? {} : { activeHandle }),
151
+ handles: rHandles.Ok().map((r) => r.handle),
152
+ });
153
+ }
154
+ function toolJson(payload) {
155
+ return Result.Ok(JSON.stringify(payload));
156
+ }
157
+ function parseArgs(raw) {
158
+ return exception2Result(() => JSON.parse(raw));
159
+ }
160
+ export function createAccountAgentBelt(vctx, args) {
161
+ const reads = createAgentReadTools(vctx, { actor: args.actor, vfs: new Map() });
162
+ const lookupDefinitions = reads.definitions.filter((d) => d.function.name === LOOKUP_HANDLE_TOOL_NAME);
163
+ const urlBelt = args.fetchUrl === undefined || args.fetchUrl.activatedUrls.length === 0
164
+ ? undefined
165
+ : createWorkToolBelt(new Map(), { fetchUrl: args.fetchUrl });
166
+ const urlDefinitions = (urlBelt?.definitions ?? []).filter((d) => d.function.name === FETCH_URL_TOOL_NAME);
167
+ const definitions = [
168
+ {
169
+ type: "function",
170
+ function: {
171
+ name: LIST_VIBES_TOOL_NAME,
172
+ description: "List the person's vibes across every handle they hold, newest first: each one's ownerHandle, appSlug, " +
173
+ "title, when it last changed, whether it is published, and its link. Call it whenever the person refers to " +
174
+ "their apps, and before any change that spans several vibes — edit_vibe_at takes the address exactly as this reports it. " +
175
+ `One answer carries up to ${LIST_VIBES_LIMIT} vibes; when there are more it says \`more: true\` and carries a ` +
176
+ "`nextCursor` — call list_vibes again with that value as `cursor` for the next, older page.",
177
+ parameters: {
178
+ type: "object",
179
+ properties: {
180
+ cursor: {
181
+ type: "string",
182
+ description: "The nextCursor from a previous list_vibes answer, to continue with older vibes. Omit for the newest.",
183
+ },
184
+ },
185
+ required: [],
186
+ additionalProperties: false,
187
+ },
188
+ },
189
+ },
190
+ createVibeToolDefinition(vctx, { actor: args.actor, poufForActor: poufLookFor(vctx, args.actor.userId) }),
191
+ {
192
+ type: "function",
193
+ function: {
194
+ name: EDIT_VIBE_AT_TOOL_NAME,
195
+ description: "Change one of the person's existing vibes, named by its ownerHandle and appSlug from list_vibes. Pass the " +
196
+ "change as an instruction in plain language, written for that vibe. To make the same kind of change across " +
197
+ `several vibes, call this once per vibe; at most ${TOP_LEVEL_MAX_BUILDS_PER_TURN} builds start in one turn. ` +
198
+ "It answers `building` the moment that vibe's build STARTS — one build runs per vibe at a time, and a call while " +
199
+ "that vibe is already building is refused, not queued. The word `ok` belongs to a finished result. Its [build " +
200
+ "result] arrives in this conversation by itself, names the vibe it belongs to, the files it changed and the " +
201
+ "version it saved; no lookup is needed.",
202
+ parameters: {
203
+ type: "object",
204
+ properties: {
205
+ ownerHandle: { type: "string", description: "The vibe's handle, exactly as list_vibes reported it." },
206
+ appSlug: { type: "string", description: "The vibe's address, exactly as list_vibes reported it." },
207
+ instruction: { type: "string", description: "The change to make to this vibe, in plain language." },
208
+ focusPath: { type: "string", description: "The file the change is mostly about, e.g. App.jsx." },
209
+ skills: {
210
+ type: "array",
211
+ items: { type: "string" },
212
+ description: 'Capability names the build should load: "callai" for any text the page asks the model for itself; ' +
213
+ '"backend" for schedules, fetching, notifications and server work; "access" for who can see or change what.',
214
+ },
215
+ },
216
+ required: ["ownerHandle", "appSlug", "instruction"],
217
+ additionalProperties: false,
218
+ },
219
+ },
220
+ },
221
+ withVibeToolDefinition(),
222
+ ...lookupDefinitions,
223
+ ...urlDefinitions,
224
+ ];
225
+ const offeredToolNames = () => definitions.map((d) => d.function.name);
226
+ function refused(toolName, refusal) {
227
+ vctx.logger
228
+ .Info()
229
+ .Any("event", { tool: toolName, chatId: args.chatId, topLevel: true, reason: refusal.reason })
230
+ .Msg("agent-tool-refused");
231
+ return toolJson(refusal);
232
+ }
233
+ let buildsStarted = 0;
234
+ let addressRetryOffered = false;
235
+ let pendingMintChatId;
236
+ function capReached(toolName) {
237
+ if (buildsStarted < TOP_LEVEL_MAX_BUILDS_PER_TURN)
238
+ return undefined;
239
+ return refused(toolName, {
240
+ ok: false,
241
+ reason: "busy",
242
+ message: `${buildsStarted} builds have started in this turn, which is as many as one turn starts. Tell the person which ` +
243
+ "vibes are building, and offer to carry on with the rest once these land.",
244
+ });
245
+ }
246
+ async function openAppChat(target) {
247
+ const openReq = {
248
+ type: "vibes.diy.req-open-chat",
249
+ mode: "codegen",
250
+ auth: args.openAuth.auth,
251
+ _auth: args.openAuth._auth,
252
+ ownerHandle: target.ownerHandle,
253
+ appSlug: target.appSlug,
254
+ };
255
+ const rChat = await ensureChatId(vctx, openReq);
256
+ if (rChat.isErr())
257
+ return Result.Err(rChat);
258
+ return Result.Ok({ chatId: rChat.Ok().chatId });
259
+ }
260
+ async function lightMintChat(prompt) {
261
+ const openReq = {
262
+ type: "vibes.diy.req-open-chat",
263
+ mode: "codegen",
264
+ auth: args.openAuth.auth,
265
+ _auth: args.openAuth._auth,
266
+ ownerHandle: args.actor.ownerHandle,
267
+ prompt,
268
+ };
269
+ const rChat = await ensureChatId(vctx, openReq, { lightMint: true });
270
+ if (rChat.isErr())
271
+ return Result.Err(rChat);
272
+ const minted = rChat.Ok();
273
+ if (minted.mintJobOrder !== undefined) {
274
+ const rJob = await minted.mintJobOrder;
275
+ if (rJob.isErr())
276
+ return Result.Err(rJob);
277
+ }
278
+ if (minted.lightMinted !== true)
279
+ return Result.Err(`expected a light mint for the new vibe's chat, got ${minted.chatId}`);
280
+ return Result.Ok({ chatId: minted.chatId });
281
+ }
282
+ async function runCreate(input) {
283
+ const capped = capReached(CREATE_VIBE_TOOL_NAME);
284
+ if (capped !== undefined)
285
+ return capped;
286
+ const parsed = createVibeToolInput(input);
287
+ if (parsed instanceof type.errors) {
288
+ return refused(CREATE_VIBE_TOOL_NAME, { ok: false, reason: "invalid-input", message: parsed.summary });
289
+ }
290
+ let chatId = pendingMintChatId;
291
+ if (chatId === undefined) {
292
+ const rChat = await lightMintChat(parsed.prompt);
293
+ if (rChat.isErr()) {
294
+ vctx.logger.Warn().Err(rChat).Str("chatId", args.chatId).Msg("top-level-create-light-mint-failed");
295
+ return refused(CREATE_VIBE_TOOL_NAME, { ok: false, reason: "failed", message: "Could not start a new vibe just now." });
296
+ }
297
+ chatId = rChat.Ok().chatId;
298
+ pendingMintChatId = chatId;
299
+ }
300
+ const mintChatId = chatId;
301
+ const firstTurn = {
302
+ chatId: mintChatId,
303
+ claim: () => claimFirstTurnMint(vctx, mintChatId),
304
+ release: async () => {
305
+ await claimMintJob(vctx, mintChatId, ["pending"], "agent");
306
+ },
307
+ };
308
+ const r = await runCreateVibeTool(vctx, {
309
+ actor: args.actor,
310
+ input: parsed,
311
+ dispatcher: args.mintDispatcherFor(mintChatId),
312
+ toolsOffered: offeredToolNames(),
313
+ firstTurn,
314
+ ...(addressRetryOffered ? {} : { offerAddressRetry: true }),
315
+ });
316
+ if (r.isErr()) {
317
+ const refusal = r.Err().refusal;
318
+ if (refusal.reason === "address-taken")
319
+ addressRetryOffered = true;
320
+ if (refusal.reason === "busy" || refusal.reason === "already-created")
321
+ pendingMintChatId = undefined;
322
+ return refused(CREATE_VIBE_TOOL_NAME, refusal);
323
+ }
324
+ pendingMintChatId = undefined;
325
+ buildsStarted += 1;
326
+ args.onDispatch({ chatId: r.Ok().chatId, ownerHandle: r.Ok().ownerHandle, appSlug: r.Ok().appSlug });
327
+ return toolJson({ ...r.Ok(), link: `/vibe/${r.Ok().ownerHandle}/${r.Ok().appSlug}` });
328
+ }
329
+ async function resolveVibeAddress(toolName, target) {
330
+ const { ownerHandle, appSlug } = target;
331
+ const logKind = toolName === EDIT_VIBE_AT_TOOL_NAME ? "edit" : "with-vibe";
332
+ if (isAgentChatAppSlug(appSlug)) {
333
+ return {
334
+ ok: false,
335
+ refusal: refused(toolName, {
336
+ ok: false,
337
+ reason: "no-app-in-scope",
338
+ message: "That is this conversation, not a vibe. Call list_vibes for the vibes this account holds.",
339
+ }),
340
+ };
341
+ }
342
+ const rTargetActor = ownerHandle === args.actor.ownerHandle
343
+ ? Result.Ok(args.actor)
344
+ : await resolveAgentActor(vctx, { userId: args.actor.userId, scope: { ownerHandle } });
345
+ if (rTargetActor.isErr()) {
346
+ return {
347
+ ok: false,
348
+ refusal: refused(toolName, {
349
+ ...rTargetActor.Err().refusal,
350
+ message: `@${ownerHandle} is not one of this account's handles. Call list_vibes for the vibes you can reach.`,
351
+ }),
352
+ };
353
+ }
354
+ const targetActor = rTargetActor.Ok();
355
+ const rScope = assertInScope(targetActor, { ownerHandle, appSlug });
356
+ if (rScope.isErr())
357
+ return { ok: false, refusal: refused(toolName, rScope.Err().refusal) };
358
+ const asb = vctx.sql.tables.appSlugBinding;
359
+ const rBound = await exception2Result(() => vctx.sql.db
360
+ .select({ appSlug: asb.appSlug })
361
+ .from(asb)
362
+ .where(and(eq(asb.ownerHandle, ownerHandle), eq(asb.appSlug, appSlug)))
363
+ .limit(1));
364
+ if (rBound.isErr()) {
365
+ vctx.logger.Warn().Err(rBound).Str("chatId", args.chatId).Msg(`top-level-${logKind}-binding-read-failed`);
366
+ return {
367
+ ok: false,
368
+ refusal: refused(toolName, { ok: false, reason: "failed", message: "Could not read that vibe just now." }),
369
+ };
370
+ }
371
+ if (rBound.Ok().length === 0) {
372
+ return {
373
+ ok: false,
374
+ refusal: refused(toolName, {
375
+ ok: false,
376
+ reason: "no-app-in-scope",
377
+ message: `No vibe lives at ${ownerHandle}/${appSlug}. Call list_vibes for the addresses this account holds.`,
378
+ }),
379
+ };
380
+ }
381
+ const rChat = await openAppChat({ ownerHandle, appSlug });
382
+ if (rChat.isErr()) {
383
+ vctx.logger.Warn().Err(rChat).Str("chatId", args.chatId).Msg(`top-level-${logKind}-open-chat-failed`);
384
+ return {
385
+ ok: false,
386
+ refusal: refused(toolName, { ok: false, reason: "failed", message: "Could not open that vibe just now." }),
387
+ };
388
+ }
389
+ return { ok: true, actor: targetActor, chatId: rChat.Ok().chatId };
390
+ }
391
+ async function runEditAt(input) {
392
+ const capped = capReached(EDIT_VIBE_AT_TOOL_NAME);
393
+ if (capped !== undefined)
394
+ return capped;
395
+ const parsed = editVibeAtToolInput(input);
396
+ if (parsed instanceof type.errors) {
397
+ return refused(EDIT_VIBE_AT_TOOL_NAME, { ok: false, reason: "invalid-input", message: parsed.summary });
398
+ }
399
+ const { ownerHandle, appSlug, ...edit } = parsed;
400
+ const address = await resolveVibeAddress(EDIT_VIBE_AT_TOOL_NAME, { ownerHandle, appSlug });
401
+ if (address.ok === false)
402
+ return address.refusal;
403
+ const r = await runEditVibeTool(vctx, {
404
+ actor: address.actor,
405
+ chatId: address.chatId,
406
+ input: edit,
407
+ dispatcher: args.dispatcher,
408
+ toolsOffered: offeredToolNames(),
409
+ });
410
+ if (r.isErr())
411
+ return refused(EDIT_VIBE_AT_TOOL_NAME, r.Err().refusal);
412
+ buildsStarted += 1;
413
+ args.onDispatch({ chatId: r.Ok().chatId, ownerHandle: r.Ok().ownerHandle, appSlug: r.Ok().appSlug });
414
+ return toolJson({ ...r.Ok(), link: `/vibe/${r.Ok().ownerHandle}/${r.Ok().appSlug}` });
415
+ }
416
+ async function runWithVibe(input, raw) {
417
+ const parsed = withVibeToolInput(raw);
418
+ if (parsed instanceof type.errors) {
419
+ return refused(WITH_VIBE_TOOL_NAME, { ok: false, reason: "invalid-input", message: parsed.summary });
420
+ }
421
+ if (parsed.calls.length === 0 || parsed.calls.length > WITH_VIBE_MAX_CALLS) {
422
+ return refused(WITH_VIBE_TOOL_NAME, {
423
+ ok: false,
424
+ reason: "invalid-input",
425
+ message: `with_vibe takes between 1 and ${WITH_VIBE_MAX_CALLS} calls; call it again for more.`,
426
+ });
427
+ }
428
+ const { ownerHandle, appSlug } = parsed;
429
+ const address = await resolveVibeAddress(WITH_VIBE_TOOL_NAME, { ownerHandle, appSlug });
430
+ if (address.ok === false)
431
+ return address.refusal;
432
+ const innerActor = {
433
+ userId: address.actor.userId,
434
+ ownerHandle: address.actor.ownerHandle,
435
+ scope: { ownerHandle, appSlug },
436
+ };
437
+ const rApp = await resolveChatApp(vctx, innerActor, address.chatId);
438
+ if (rApp.isErr())
439
+ return refused(WITH_VIBE_TOOL_NAME, rApp.Err().refusal);
440
+ let vfs = new Map();
441
+ if (parsed.calls.some((c) => WITH_VIBE_FILE_TOOLS.has(c.tool))) {
442
+ const rVfs = await loadWorkVfs(vctx, { chatId: address.chatId, ownerHandle, appSlug, editBaseFsId: undefined });
443
+ if (rVfs.isErr()) {
444
+ vctx.logger.Warn().Err(rVfs).Str("chatId", args.chatId).Msg("top-level-with-vibe-source-read-failed");
445
+ return refused(WITH_VIBE_TOOL_NAME, {
446
+ ok: false,
447
+ reason: "failed",
448
+ message: "Could not read that vibe's source just now.",
449
+ });
450
+ }
451
+ vfs = rVfs.Ok();
452
+ }
453
+ const reads = createAgentReadTools(vctx, { actor: innerActor, chatId: address.chatId, vfs });
454
+ const debug = createAgentDebugTools(vctx, { actor: innerActor, chatId: address.chatId });
455
+ const inner = (innerInput) => AGENT_DEBUG_TOOL_NAMES.has(innerInput.call.name) ? debug.executor(innerInput) : reads.executor(innerInput);
456
+ const buildInProgress = peekBuildLockEntry(vctx.connections, address.chatId) !== undefined;
457
+ const entries = await runWithVibeCalls({
458
+ calls: parsed.calls,
459
+ executor: inner,
460
+ signal: input.signal,
461
+ ...(input.attachImage === undefined ? {} : { attachImage: input.attachImage }),
462
+ callId: input.call.id,
463
+ });
464
+ return Result.Ok(fitWithVibeAnswer({
465
+ ok: true,
466
+ ownerHandle,
467
+ appSlug,
468
+ link: `/vibe/${ownerHandle}/${appSlug}`,
469
+ ...(buildInProgress ? { buildInProgress: true, note: WITH_VIBE_BUILD_NOTE } : {}),
470
+ }, entries));
471
+ }
472
+ const executor = async (input) => {
473
+ switch (input.call.name) {
474
+ case LIST_VIBES_TOOL_NAME: {
475
+ const rArgs = parseArgs(input.call.arguments.trim() === "" ? "{}" : input.call.arguments);
476
+ const parsed = rArgs.isOk() ? listVibesToolInput(rArgs.Ok()) : undefined;
477
+ if (parsed === undefined || parsed instanceof type.errors) {
478
+ return refused(LIST_VIBES_TOOL_NAME, {
479
+ ok: false,
480
+ reason: "invalid-input",
481
+ message: parsed === undefined ? "list_vibes takes a JSON object." : parsed.summary,
482
+ });
483
+ }
484
+ const rList = await listAccountVibes(vctx, {
485
+ userId: args.actor.userId,
486
+ ...(parsed.cursor === undefined ? {} : { cursor: parsed.cursor }),
487
+ });
488
+ if (rList.isErr() && isInvalidListVibesCursor(rList.Err())) {
489
+ return refused(LIST_VIBES_TOOL_NAME, {
490
+ ok: false,
491
+ reason: "invalid-input",
492
+ message: "That cursor is not one list_vibes gave out. Call list_vibes with no cursor to start from the newest.",
493
+ });
494
+ }
495
+ if (rList.isErr()) {
496
+ vctx.logger.Warn().Err(rList).Str("chatId", args.chatId).Msg("top-level-list-vibes-failed");
497
+ return refused(LIST_VIBES_TOOL_NAME, {
498
+ ok: false,
499
+ reason: "failed",
500
+ message: "Could not read the list of vibes just now.",
501
+ });
502
+ }
503
+ return toolJson({ ok: true, ...rList.Ok() });
504
+ }
505
+ case CREATE_VIBE_TOOL_NAME:
506
+ case EDIT_VIBE_AT_TOOL_NAME: {
507
+ const rArgs = parseArgs(input.call.arguments);
508
+ if (rArgs.isErr()) {
509
+ return refused(input.call.name, { ok: false, reason: "invalid-input", message: rArgs.Err().message });
510
+ }
511
+ return input.call.name === CREATE_VIBE_TOOL_NAME ? runCreate(rArgs.Ok()) : runEditAt(rArgs.Ok());
512
+ }
513
+ case WITH_VIBE_TOOL_NAME: {
514
+ const rArgs = parseArgs(input.call.arguments);
515
+ if (rArgs.isErr()) {
516
+ return refused(WITH_VIBE_TOOL_NAME, { ok: false, reason: "invalid-input", message: rArgs.Err().message });
517
+ }
518
+ return runWithVibe(input, rArgs.Ok());
519
+ }
520
+ case LOOKUP_HANDLE_TOOL_NAME:
521
+ return reads.executor(input);
522
+ case FETCH_URL_TOOL_NAME:
523
+ if (urlBelt !== undefined)
524
+ return urlBelt.executor(input);
525
+ break;
526
+ }
527
+ return refused(input.call.name, {
528
+ ok: false,
529
+ reason: "no-app-in-scope",
530
+ message: "This is the top-level conversation, which is about the person's whole account rather than one app. " +
531
+ "Use list_vibes, create_vibe, edit_vibe_at or with_vibe here.",
532
+ });
533
+ };
534
+ return { definitions, executor };
535
+ }
536
+ //# sourceMappingURL=agent-account-tools.js.map