@vibes.diy/api-svc 4.4.5 → 4.5.4

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 (52) hide show
  1. package/intern/prompt-assembly.d.ts +1 -0
  2. package/intern/prompt-assembly.js +11 -7
  3. package/intern/prompt-assembly.js.map +1 -1
  4. package/package.json +12 -15
  5. package/public/access-function.js +73 -15
  6. package/public/access-function.js.map +1 -1
  7. package/public/app-documents-broadcast.d.ts +36 -0
  8. package/public/app-documents-broadcast.js +99 -0
  9. package/public/app-documents-broadcast.js.map +1 -0
  10. package/public/app-documents-grant-delta.d.ts +13 -0
  11. package/public/app-documents-grant-delta.js +76 -0
  12. package/public/app-documents-grant-delta.js.map +1 -0
  13. package/public/app-documents-put-persist.d.ts +28 -0
  14. package/public/app-documents-put-persist.js +106 -0
  15. package/public/app-documents-put-persist.js.map +1 -0
  16. package/public/app-documents-write-eventos.js +70 -279
  17. package/public/app-documents-write-eventos.js.map +1 -1
  18. package/public/app-settings-icon-gen.d.ts +8 -0
  19. package/public/app-settings-icon-gen.js +29 -0
  20. package/public/app-settings-icon-gen.js.map +1 -0
  21. package/public/app-settings-secrets.d.ts +5 -0
  22. package/public/app-settings-secrets.js +92 -0
  23. package/public/app-settings-secrets.js.map +1 -0
  24. package/public/app-settings-sql-upsert.d.ts +5 -0
  25. package/public/app-settings-sql-upsert.js +139 -0
  26. package/public/app-settings-sql-upsert.js.map +1 -0
  27. package/public/app-settings-suggestion-bless.d.ts +4 -0
  28. package/public/app-settings-suggestion-bless.js +88 -0
  29. package/public/app-settings-suggestion-bless.js.map +1 -0
  30. package/public/ensure-app-settings.d.ts +5 -5
  31. package/public/ensure-app-settings.js +6 -337
  32. package/public/ensure-app-settings.js.map +1 -1
  33. package/public/fs-prompt.d.ts +16 -0
  34. package/public/fs-prompt.js +173 -0
  35. package/public/fs-prompt.js.map +1 -0
  36. package/public/image-gen.d.ts +15 -0
  37. package/public/image-gen.js +222 -0
  38. package/public/image-gen.js.map +1 -0
  39. package/public/llm-dispatch.d.ts +113 -0
  40. package/public/llm-dispatch.js +621 -0
  41. package/public/llm-dispatch.js.map +1 -0
  42. package/public/prompt-chat-section.d.ts +5 -41
  43. package/public/prompt-chat-section.js +10 -1607
  44. package/public/prompt-chat-section.js.map +1 -1
  45. package/public/provider-errors.d.ts +55 -0
  46. package/public/provider-errors.js +150 -0
  47. package/public/provider-errors.js.map +1 -0
  48. package/public/set-mode-fsid.js +2 -2
  49. package/public/set-mode-fsid.js.map +1 -1
  50. package/public/stream-assembly.d.ts +38 -0
  51. package/public/stream-assembly.js +470 -0
  52. package/public/stream-assembly.js.map +1 -0
@@ -0,0 +1,29 @@
1
+ import { isActiveIcon } from "@vibes.diy/api-types";
2
+ export async function postIconGen(vctx, args) {
3
+ await vctx.postQueue({
4
+ payload: {
5
+ type: "vibes.diy.evt-icon-gen",
6
+ ownerHandle: args.ownerHandle,
7
+ appSlug: args.appSlug,
8
+ ...(args.force ? { force: true } : {}),
9
+ },
10
+ tid: "queue-event",
11
+ src: "ensureAppSettings",
12
+ dst: "vibes-service",
13
+ ttl: 1,
14
+ });
15
+ }
16
+ const ICON_REGEN_MIN_INTERVAL_MS = 10_000;
17
+ export function recentlyRegenerated(entries) {
18
+ const icon = entries.find(isActiveIcon);
19
+ if (!icon)
20
+ return false;
21
+ const head = icon.versions.find((v) => v.cid === icon.currentCid);
22
+ if (!head)
23
+ return false;
24
+ const headCreated = Date.parse(head.created);
25
+ if (Number.isNaN(headCreated))
26
+ return false;
27
+ return Date.now() - headCreated < ICON_REGEN_MIN_INTERVAL_MS;
28
+ }
29
+ //# sourceMappingURL=app-settings-icon-gen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-settings-icon-gen.js","sourceRoot":"","sources":["../../jsr/public/app-settings-icon-gen.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,YAAY,EAAW,MAAM,sBAAsB,CAAC;AAGtF,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAAoB,EACpB,IAA8D;IAE9D,MAAM,IAAI,CAAC,SAAS,CAAC;QACnB,OAAO,EAAE;YACP,IAAI,EAAE,wBAAwB;YAC9B,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACvC;QACD,GAAG,EAAE,aAAa;QAClB,GAAG,EAAE,mBAAmB;QACxB,GAAG,EAAE,eAAe;QACpB,GAAG,EAAE,CAAC;KACuB,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,0BAA0B,GAAG,MAAM,CAAC;AAI1C,MAAM,UAAU,mBAAmB,CAAC,OAAsB;IACxD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACxC,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC;IAClE,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7C,IAAI,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5C,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,GAAG,0BAA0B,CAAC;AAC/D,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { ActiveEntry, AppSettings, ReqEnsureAppSettingsSecretRemove, ReqEnsureAppSettingsSecretSet, ResEnsureAppSettings } from "@vibes.diy/api-types";
2
+ import type { VibesApiSQLCtx } from "../types.js";
3
+ export declare function redactSecretEntries(s: AppSettings): AppSettings;
4
+ export declare function redactModelApiKeys(s: AppSettings): AppSettings;
5
+ export declare function applySecretOp(vctx: VibesApiSQLCtx, req: ReqEnsureAppSettingsSecretSet | ReqEnsureAppSettingsSecretRemove, res: ResEnsureAppSettings, settings: ActiveEntry[], setBy: string): Promise<[AppSettings, string?]>;
@@ -0,0 +1,92 @@
1
+ import { isActiveModelSetting, isActiveSecret, isReqEnsureAppSettingsSecretRemove, } from "@vibes.diy/api-types";
2
+ import { buildEnsureEntryResult, sqlRemove, sqlUpsert } from "./app-settings-sql-upsert.js";
3
+ const SECRET_KEY_RE = /^[A-Za-z_][A-Za-z0-9_]{0,63}$/;
4
+ const SECRET_VALUE_MAX = 8192;
5
+ const SECRET_COUNT_MAX = 32;
6
+ const SECRET_LAST4_MIN = 8;
7
+ function secretMeta(e) {
8
+ return {
9
+ key: e.key,
10
+ ...(e.value.length >= SECRET_LAST4_MIN ? { last4: e.value.slice(-4) } : {}),
11
+ updatedAt: e.updatedAt,
12
+ ...(e.setBy ? { setBy: e.setBy } : {}),
13
+ };
14
+ }
15
+ export function redactSecretEntries(s) {
16
+ const secrets = s.entries.filter((e) => isActiveSecret(e));
17
+ return {
18
+ ...s,
19
+ entries: s.entries.filter((e) => !isActiveSecret(e)),
20
+ entry: {
21
+ ...s.entry,
22
+ settings: {
23
+ ...s.entry.settings,
24
+ secrets: secrets.map((e) => secretMeta(e)).sort((a, b) => (a.key < b.key ? -1 : 1)),
25
+ },
26
+ },
27
+ };
28
+ }
29
+ export function redactModelApiKeys(s) {
30
+ const strip = (p) => {
31
+ if (!p || p.apiKey === undefined)
32
+ return p;
33
+ const { apiKey: _apiKey, ...rest } = p;
34
+ return rest;
35
+ };
36
+ return {
37
+ ...s,
38
+ entries: s.entries.map((e) => (isActiveModelSetting(e) ? { ...e, param: strip(e.param) } : e)),
39
+ entry: {
40
+ ...s.entry,
41
+ settings: {
42
+ ...s.entry.settings,
43
+ codegen: strip(s.entry.settings.codegen),
44
+ runtime: strip(s.entry.settings.runtime),
45
+ img: strip(s.entry.settings.img),
46
+ },
47
+ },
48
+ };
49
+ }
50
+ const OTHER_OP_FIELDS = [
51
+ "publicAccess",
52
+ "request",
53
+ "title",
54
+ "skills",
55
+ "theme",
56
+ "colorTheme",
57
+ "iconDescription",
58
+ "iconRegen",
59
+ "runtime",
60
+ "codegen",
61
+ "img",
62
+ "env",
63
+ "dbAcl",
64
+ "dbAclRemove",
65
+ "cachedSuggestion",
66
+ "cachedSuggestionBless",
67
+ ];
68
+ export async function applySecretOp(vctx, req, res, settings, setBy) {
69
+ if (OTHER_OP_FIELDS.some((f) => f in req)) {
70
+ return [buildEnsureEntryResult(settings), "secret-op-not-exclusive"];
71
+ }
72
+ if (isReqEnsureAppSettingsSecretRemove(req)) {
73
+ const key = req.secretRemove.key;
74
+ return await sqlRemove(vctx, res, settings, (e) => isActiveSecret(e) && e.key === key);
75
+ }
76
+ const { key, value } = req.secretSet;
77
+ if (!SECRET_KEY_RE.test(key)) {
78
+ return [
79
+ buildEnsureEntryResult(settings),
80
+ `secret key must match [A-Za-z_][A-Za-z0-9_]* (max 64 chars), got ${JSON.stringify(key)}`,
81
+ ];
82
+ }
83
+ if (value.length > SECRET_VALUE_MAX) {
84
+ return [buildEnsureEntryResult(settings), `secret value exceeds ${SECRET_VALUE_MAX} bytes`];
85
+ }
86
+ const existingKeys = new Set(settings.filter((e) => isActiveSecret(e)).map((e) => e.key));
87
+ if (!existingKeys.has(key) && existingKeys.size >= SECRET_COUNT_MAX) {
88
+ return [buildEnsureEntryResult(settings), `secret cap reached (${SECRET_COUNT_MAX} per vibe)`];
89
+ }
90
+ return await sqlUpsert(vctx, res, settings, (e) => isActiveSecret(e) && e.key === key, () => ({ type: "active.secret", key, value, updatedAt: Date.now(), setBy }));
91
+ }
92
+ //# sourceMappingURL=app-settings-secrets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-settings-secrets.js","sourceRoot":"","sources":["../../jsr/public/app-settings-secrets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { ActiveEntry, AppSettings, ResEnsureAppSettings } from "@vibes.diy/api-types";
2
+ import type { VibesApiSQLCtx } from "../types.js";
3
+ export declare function buildEnsureEntryResult(entries: ActiveEntry[]): AppSettings;
4
+ export declare function sqlUpsert<T extends ActiveEntry, R extends ActiveEntry>(vctx: VibesApiSQLCtx, res: ResEnsureAppSettings, settings: T[], match: (e: unknown) => boolean, fn: (prev: R) => R): Promise<[AppSettings, string?]>;
5
+ export declare function sqlRemove<T extends ActiveEntry>(vctx: VibesApiSQLCtx, res: ResEnsureAppSettings, settings: T[], match: (e: unknown) => boolean): Promise<[AppSettings, string?]>;
@@ -0,0 +1,139 @@
1
+ import { exception2Result } from "@adviser/cement";
2
+ import { isActiveCachedSuggestion, isActiveCachedSuggestionBless, isActiveColorTheme, isActiveDbAcl, isActiveEnv, isActiveIcon, isActiveIconDescription, isActiveModelSettingCodegen, isActiveModelSettingImg, isActiveModelSettingRuntime, isActiveSkills, isActiveTheme, isActiveTitle, isEnablePublicAccess, isEnableRequest, } from "@vibes.diy/api-types";
3
+ export function buildEnsureEntryResult(entries) {
4
+ const result = {
5
+ entries,
6
+ entry: {
7
+ settings: {
8
+ env: [],
9
+ },
10
+ },
11
+ };
12
+ entries.forEach((e) => {
13
+ switch (true) {
14
+ case isEnablePublicAccess(e):
15
+ result.entry.publicAccess = e;
16
+ break;
17
+ case isEnableRequest(e):
18
+ result.entry.enableRequest = e;
19
+ break;
20
+ case isActiveTitle(e):
21
+ result.entry.settings.title = e.title;
22
+ break;
23
+ case isActiveSkills(e):
24
+ result.entry.settings.skills = e.skills;
25
+ break;
26
+ case isActiveTheme(e):
27
+ result.entry.settings.theme = e.theme;
28
+ break;
29
+ case isActiveColorTheme(e):
30
+ result.entry.settings.colorTheme = e.colorTheme;
31
+ break;
32
+ case isActiveIconDescription(e):
33
+ result.entry.settings.iconDescription = e.description;
34
+ break;
35
+ case isActiveIcon(e): {
36
+ const head = e.versions.find((v) => v.cid === e.currentCid);
37
+ if (head && head.cid.length > 0) {
38
+ result.entry.settings.icon = { cid: head.cid, mime: head.mime };
39
+ }
40
+ break;
41
+ }
42
+ case isActiveModelSettingCodegen(e):
43
+ result.entry.settings.codegen = e.param;
44
+ break;
45
+ case isActiveModelSettingRuntime(e):
46
+ result.entry.settings.runtime = e.param;
47
+ break;
48
+ case isActiveModelSettingImg(e):
49
+ result.entry.settings.img = e.param;
50
+ break;
51
+ case isActiveEnv(e):
52
+ result.entry.settings.env.push(...e.env);
53
+ break;
54
+ case isActiveCachedSuggestion(e):
55
+ result.entry.cachedSuggestions = result.entry.cachedSuggestions ?? {};
56
+ result.entry.cachedSuggestions[e.key] = { fsId: e.fsId, sourceFsId: e.sourceFsId };
57
+ break;
58
+ case isActiveCachedSuggestionBless(e):
59
+ result.entry.cachedSuggestionBlesses = result.entry.cachedSuggestionBlesses ?? {};
60
+ result.entry.cachedSuggestionBlesses[e.key] = {
61
+ ...(e.fsId ? { fsId: e.fsId } : {}),
62
+ ...(e.sourceFsId ? { sourceFsId: e.sourceFsId } : {}),
63
+ ...(e.targetOwnerHandle ? { targetOwnerHandle: e.targetOwnerHandle } : {}),
64
+ ...(e.targetAppSlug ? { targetAppSlug: e.targetAppSlug } : {}),
65
+ approvedBy: e.approvedBy,
66
+ approvedAt: e.approvedAt,
67
+ };
68
+ break;
69
+ case isActiveDbAcl(e):
70
+ result.entry.dbAcls = result.entry.dbAcls ?? {};
71
+ result.entry.dbAcls[e.dbName] = e.acl;
72
+ break;
73
+ }
74
+ });
75
+ return result;
76
+ }
77
+ function upsert(settings, match, fn) {
78
+ const prev = settings.findLast(match);
79
+ for (let i = settings.length - 1; i >= 0; i--) {
80
+ if (match(settings[i]))
81
+ settings.splice(i, 1);
82
+ }
83
+ settings.push(fn(prev ?? {}));
84
+ return buildEnsureEntryResult(settings);
85
+ }
86
+ export async function sqlUpsert(vctx, res, settings, match, fn) {
87
+ const entry = upsert(settings, match, fn);
88
+ const ret = await sqlUpdateSettings(vctx, res, entry.entries);
89
+ if (ret.isErr()) {
90
+ return [entry, ret.Err().message];
91
+ }
92
+ return [entry];
93
+ }
94
+ export async function sqlRemove(vctx, res, settings, match) {
95
+ for (let i = settings.length - 1; i >= 0; i--) {
96
+ if (match(settings[i]))
97
+ settings.splice(i, 1);
98
+ }
99
+ const entry = buildEnsureEntryResult(settings);
100
+ const ret = await sqlUpdateSettings(vctx, res, entry.entries);
101
+ if (ret.isErr()) {
102
+ return [entry, ret.Err().message];
103
+ }
104
+ return [entry];
105
+ }
106
+ async function sqlUpdateSettings(vctx, res, settings) {
107
+ const now = new Date().toISOString();
108
+ const rIns = await exception2Result(() => vctx.sql.db
109
+ .insert(vctx.sql.tables.appSettings)
110
+ .values({
111
+ userId: res.userId,
112
+ appSlug: res.appSlug,
113
+ ownerHandle: res.ownerHandle,
114
+ settings,
115
+ updated: now,
116
+ created: res.created,
117
+ })
118
+ .onConflictDoUpdate({
119
+ target: [vctx.sql.tables.appSettings.userId, vctx.sql.tables.appSettings.ownerHandle, vctx.sql.tables.appSettings.appSlug],
120
+ set: {
121
+ settings: res.settings.entries,
122
+ updated: now,
123
+ },
124
+ }));
125
+ await vctx.postQueue({
126
+ payload: {
127
+ type: "vibes.diy.evt-app-setting",
128
+ ownerHandle: res.ownerHandle,
129
+ appSlug: res.appSlug,
130
+ settings,
131
+ },
132
+ tid: "queue-event",
133
+ src: "ensureAppSettings",
134
+ dst: "vibes-service",
135
+ ttl: 1,
136
+ });
137
+ return rIns;
138
+ }
139
+ //# sourceMappingURL=app-settings-sql-upsert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-settings-sql-upsert.js","sourceRoot":"","sources":["../../jsr/public/app-settings-sql-upsert.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { ActiveEntry, AppSettings, ReqEnsureAppSettings, ResEnsureAppSettings } from "@vibes.diy/api-types";
2
+ import type { VibesApiSQLCtx } from "../types.js";
3
+ export declare function adminUserIdSet(vctx: VibesApiSQLCtx): Set<string>;
4
+ export declare function applyCachedSuggestionBless(vctx: VibesApiSQLCtx, req: ReqEnsureAppSettings, res: ResEnsureAppSettings, settings: ActiveEntry[], approverUserId: string, ownerUserId: string, now: string): Promise<[AppSettings, string?]>;
@@ -0,0 +1,88 @@
1
+ import { isActiveCachedSuggestion, isActiveCachedSuggestionBless, isReqEnsureAppSettingsCachedSuggestionBless, } from "@vibes.diy/api-types";
2
+ import { ensureLogger } from "@vibes.diy/identity";
3
+ import { sqlRemove, sqlUpsert } from "./app-settings-sql-upsert.js";
4
+ export function adminUserIdSet(vctx) {
5
+ const raw = vctx.sthis.env.get("VIBES_ADMIN_USER_IDS");
6
+ if (!raw)
7
+ return new Set();
8
+ return new Set(raw
9
+ .split(",")
10
+ .map((s) => s.trim())
11
+ .filter((s) => s.length > 0));
12
+ }
13
+ export async function applyCachedSuggestionBless(vctx, req, res, settings, approverUserId, ownerUserId, now) {
14
+ if (!isReqEnsureAppSettingsCachedSuggestionBless(req)) {
15
+ return [res.settings, "expected a cached-suggestion bless request"];
16
+ }
17
+ const b = req.cachedSuggestionBless;
18
+ const isVibeLink = typeof b.targetAppSlug === "string" && b.targetAppSlug.length > 0;
19
+ const hasTargetOwner = typeof b.targetOwnerHandle === "string" && b.targetOwnerHandle.length > 0;
20
+ const hasTargetSlug = typeof b.targetAppSlug === "string" && b.targetAppSlug.length > 0;
21
+ const hasStay = (b.fsId?.length ?? 0) > 0 || (b.sourceFsId?.length ?? 0) > 0;
22
+ if (hasTargetOwner !== hasTargetSlug) {
23
+ return [res.settings, "a cross-slug bless requires both targetOwnerHandle and targetAppSlug"];
24
+ }
25
+ if (isVibeLink && hasStay) {
26
+ return [res.settings, "a bless is either a stay (fsId+sourceFsId) or a cross-slug link (target*), not both"];
27
+ }
28
+ if (isVibeLink && b.op === "bless" && b.targetOwnerHandle !== req.ownerHandle) {
29
+ ensureLogger(vctx.sthis, "ensureAppSettings")
30
+ .Info()
31
+ .Str("reason", "crossOwnerCuratedLink")
32
+ .Str("sourceOwnerHandle", req.ownerHandle)
33
+ .Str("sourceAppSlug", req.appSlug)
34
+ .Str("targetOwnerHandle", b.targetOwnerHandle ?? "")
35
+ .Str("targetAppSlug", b.targetAppSlug ?? "")
36
+ .Str("approvedBy", approverUserId)
37
+ .Msg("cross-owner curated cross-slug link blessed");
38
+ }
39
+ if (approverUserId !== ownerUserId) {
40
+ ensureLogger(vctx.sthis, "ensureAppSettings")
41
+ .Info()
42
+ .Str("reason", "adminOnBehalfBless")
43
+ .Str("op", b.op)
44
+ .Str("approvedBy", approverUserId)
45
+ .Str("ownerHandle", req.ownerHandle)
46
+ .Str("appSlug", req.appSlug)
47
+ .Str("key", b.key)
48
+ .Str("fsId", b.fsId ?? (isVibeLink ? `vibe:${b.targetOwnerHandle}/${b.targetAppSlug}` : ""))
49
+ .Msg("admin on-behalf cached-suggestion bless/revoke (allowlisted)");
50
+ }
51
+ if (isVibeLink) {
52
+ if (b.op === "revoke") {
53
+ return await sqlRemove(vctx, res, settings, (e) => isActiveCachedSuggestionBless(e) &&
54
+ e.key === b.key &&
55
+ e.targetOwnerHandle === b.targetOwnerHandle &&
56
+ e.targetAppSlug === b.targetAppSlug);
57
+ }
58
+ return await sqlUpsert(vctx, res, settings, (e) => isActiveCachedSuggestionBless(e) && e.key === b.key, () => ({
59
+ type: "active.cached-suggestion-bless",
60
+ key: b.key,
61
+ targetOwnerHandle: b.targetOwnerHandle,
62
+ targetAppSlug: b.targetAppSlug,
63
+ approvedBy: approverUserId,
64
+ approvedAt: now,
65
+ }));
66
+ }
67
+ if (!b.fsId || !b.sourceFsId) {
68
+ return [res.settings, "a stay bless requires fsId and sourceFsId (or a target vibe for a cross-slug link)"];
69
+ }
70
+ const blessFsId = b.fsId;
71
+ const blessSourceFsId = b.sourceFsId;
72
+ if (b.op === "revoke") {
73
+ return await sqlRemove(vctx, res, settings, (e) => isActiveCachedSuggestionBless(e) && e.key === b.key && e.fsId === blessFsId && e.sourceFsId === blessSourceFsId);
74
+ }
75
+ const produced = settings.find((e) => isActiveCachedSuggestion(e) && e.key === b.key && e.fsId === blessFsId && e.sourceFsId === blessSourceFsId);
76
+ if (!produced) {
77
+ return [res.settings, "cannot bless a cached suggestion with no matching produced entry"];
78
+ }
79
+ return await sqlUpsert(vctx, res, settings, (e) => isActiveCachedSuggestionBless(e) && e.key === b.key, () => ({
80
+ type: "active.cached-suggestion-bless",
81
+ key: b.key,
82
+ fsId: blessFsId,
83
+ sourceFsId: blessSourceFsId,
84
+ approvedBy: approverUserId,
85
+ approvedAt: now,
86
+ }));
87
+ }
88
+ //# sourceMappingURL=app-settings-suggestion-bless.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-settings-suggestion-bless.js","sourceRoot":"","sources":["../../jsr/public/app-settings-suggestion-bless.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  import { EventoHandler, Result } from "@adviser/cement";
2
- import { ActiveEntry, AppSettings, MsgBase, ReqEnsureAppSettings, ResEnsureAppSettings, VibesDiyError, W3CWebSocketEvent } from "@vibes.diy/api-types";
2
+ import { MsgBase, ReqEnsureAppSettings, ResEnsureAppSettings, VibesDiyError, W3CWebSocketEvent } from "@vibes.diy/api-types";
3
3
  import { VibesApiSQLCtx } from "../types.js";
4
- export declare function buildEnsureEntryResult(entries: ActiveEntry[]): AppSettings;
5
- export declare function redactSecretEntries(s: AppSettings): AppSettings;
6
- export declare function redactModelApiKeys(s: AppSettings): AppSettings;
7
- export declare function adminUserIdSet(vctx: VibesApiSQLCtx): Set<string>;
4
+ import { buildEnsureEntryResult } from "./app-settings-sql-upsert.js";
5
+ import { redactModelApiKeys, redactSecretEntries } from "./app-settings-secrets.js";
6
+ import { adminUserIdSet } from "./app-settings-suggestion-bless.js";
7
+ export { buildEnsureEntryResult, redactSecretEntries, redactModelApiKeys, adminUserIdSet };
8
8
  export declare function ensureAppSettings(vctx: VibesApiSQLCtx, req: ReqEnsureAppSettings, userId?: string): Promise<Result<ResEnsureAppSettings>>;
9
9
  export declare const ensureAppSettingsEvento: EventoHandler<W3CWebSocketEvent, MsgBase<ReqEnsureAppSettings>, ResEnsureAppSettings | VibesDiyError>;