@songsid/agend 2.3.3-beta.4 → 2.3.3-beta.6

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 (250) hide show
  1. package/dist/agent-cli.js +13 -112
  2. package/dist/agent-cli.js.map +1 -1
  3. package/dist/agent-endpoint.d.ts +0 -1
  4. package/dist/agent-endpoint.js +1 -9
  5. package/dist/agent-endpoint.js.map +1 -1
  6. package/dist/agent-whats-new.d.ts +3 -6
  7. package/dist/agent-whats-new.js +7 -18
  8. package/dist/agent-whats-new.js.map +1 -1
  9. package/dist/auth-api.d.ts +0 -7
  10. package/dist/auth-api.js +1 -15
  11. package/dist/auth-api.js.map +1 -1
  12. package/dist/backend/claude-code.js +4 -2
  13. package/dist/backend/claude-code.js.map +1 -1
  14. package/dist/backend/codex.d.ts +1 -0
  15. package/dist/backend/codex.js +106 -15
  16. package/dist/backend/codex.js.map +1 -1
  17. package/dist/backend/grok.js +57 -11
  18. package/dist/backend/grok.js.map +1 -1
  19. package/dist/backend/types.d.ts +35 -0
  20. package/dist/backend/types.js.map +1 -1
  21. package/dist/bundled-skills.d.ts +4 -6
  22. package/dist/bundled-skills.js +10 -14
  23. package/dist/bundled-skills.js.map +1 -1
  24. package/dist/channel/mcp-server.js +5 -5
  25. package/dist/channel/mcp-server.js.map +1 -1
  26. package/dist/channel/mcp-tools.d.ts +1 -3
  27. package/dist/channel/mcp-tools.js +4 -58
  28. package/dist/channel/mcp-tools.js.map +1 -1
  29. package/dist/cli.js +3 -1
  30. package/dist/cli.js.map +1 -1
  31. package/dist/config-validator.js +6 -3
  32. package/dist/config-validator.js.map +1 -1
  33. package/dist/daemon.d.ts +17 -3
  34. package/dist/daemon.js +76 -107
  35. package/dist/daemon.js.map +1 -1
  36. package/dist/dashboard-live.d.ts +1 -1
  37. package/dist/dashboard-live.js +3 -3
  38. package/dist/dashboard-live.js.map +1 -1
  39. package/dist/dashboard-permissions.d.ts +1 -1
  40. package/dist/dashboard-permissions.js +1 -3
  41. package/dist/dashboard-permissions.js.map +1 -1
  42. package/dist/fleet-manager.d.ts +31 -44
  43. package/dist/fleet-manager.js +94 -227
  44. package/dist/fleet-manager.js.map +1 -1
  45. package/dist/general-knowledge/skills/credential-profiles/SKILL.md +11 -1
  46. package/dist/general-knowledge/skills/session-management/SKILL.md +6 -0
  47. package/dist/general-knowledge/skills/web-appearance/SKILL.md +13 -204
  48. package/dist/general-knowledge/skills/web-dashboard/SKILL.md +26 -63
  49. package/dist/instance-lifecycle.d.ts +6 -0
  50. package/dist/instance-lifecycle.js +20 -4
  51. package/dist/instance-lifecycle.js.map +1 -1
  52. package/dist/locale.js +14 -4
  53. package/dist/locale.js.map +1 -1
  54. package/dist/outbound-handlers.js +19 -7
  55. package/dist/outbound-handlers.js.map +1 -1
  56. package/dist/outbound-schemas.d.ts +0 -62
  57. package/dist/outbound-schemas.js +3 -42
  58. package/dist/outbound-schemas.js.map +1 -1
  59. package/dist/public-web-gateway.js +0 -9
  60. package/dist/public-web-gateway.js.map +1 -1
  61. package/dist/public-web-link.d.ts +2 -0
  62. package/dist/public-web-link.js +5 -0
  63. package/dist/public-web-link.js.map +1 -1
  64. package/dist/search/search-docs.d.ts +1 -1
  65. package/dist/search/search-docs.js +2 -2
  66. package/dist/search/search-docs.js.map +1 -1
  67. package/dist/settings-api.d.ts +6 -0
  68. package/dist/settings-api.js +14 -2
  69. package/dist/settings-api.js.map +1 -1
  70. package/dist/settings-change.js +3 -1
  71. package/dist/settings-change.js.map +1 -1
  72. package/dist/settings-confirmation.d.ts +17 -3
  73. package/dist/settings-confirmation.js +8 -5
  74. package/dist/settings-confirmation.js.map +1 -1
  75. package/dist/settings-http-confirmation.js +31 -1
  76. package/dist/settings-http-confirmation.js.map +1 -1
  77. package/dist/tool-permissions.js +3 -10
  78. package/dist/tool-permissions.js.map +1 -1
  79. package/dist/topic-commands.d.ts +27 -7
  80. package/dist/topic-commands.js +94 -36
  81. package/dist/topic-commands.js.map +1 -1
  82. package/dist/types.d.ts +2 -1
  83. package/dist/ui/chat-ambient.js +4 -4
  84. package/dist/ui/chat-commands.js +3 -2
  85. package/dist/ui/chat-store.js +4 -1
  86. package/dist/ui/chat-strings.js +12 -46
  87. package/dist/ui/chat-thread.js +51 -59
  88. package/dist/ui/fleet-office-skin.js +37 -14
  89. package/dist/ui/fleet-office.js +31 -7
  90. package/dist/ui/html-attachment.js +22 -8
  91. package/dist/ui/panel-chat.js +21 -50
  92. package/dist/ui/preview-panel.js +12 -21
  93. package/dist/ui/preview.js +10 -3
  94. package/dist/ui/search-dialog.js +30 -14
  95. package/dist/ui/settings-appearance.js +1 -3
  96. package/dist/ui/settings-confirm.js +18 -0
  97. package/dist/ui/settings-guests.js +13 -4
  98. package/dist/ui/settings-learn.js +1 -1
  99. package/dist/ui/settings-mods.js +5 -12
  100. package/dist/ui/settings-registry.js +0 -1
  101. package/dist/ui/settings-strings.js +6 -6
  102. package/dist/ui/shared/app-i18n.js +13 -2
  103. package/dist/ui/shared/app-prefs.js +17 -17
  104. package/dist/ui/shared/app-shell.js +47 -9
  105. package/dist/ui/shared/app-store.js +6 -2
  106. package/dist/ui/shared/app.css +19 -36
  107. package/dist/ui/shared/app.js +5 -4
  108. package/dist/ui/shared/instance-nav.js +9 -9
  109. package/dist/ui/shared/instance-switch.js +8 -2
  110. package/dist/ui/shared/panel-view.js +22 -8
  111. package/dist/ui/shared/view-strings.js +6 -0
  112. package/dist/usage/usage-api.d.ts +3 -0
  113. package/dist/usage/usage-api.js +5 -1
  114. package/dist/usage/usage-api.js.map +1 -1
  115. package/dist/view-api.d.ts +2 -0
  116. package/dist/view-api.js +64 -0
  117. package/dist/view-api.js.map +1 -1
  118. package/dist/web-api.d.ts +9 -17
  119. package/dist/web-api.js +255 -371
  120. package/dist/web-api.js.map +1 -1
  121. package/dist/web-appearance-tools.d.ts +0 -2
  122. package/dist/web-appearance-tools.js +2 -5
  123. package/dist/web-appearance-tools.js.map +1 -1
  124. package/dist/web-appearance-view.d.ts +0 -6
  125. package/dist/web-appearance-view.js +0 -1
  126. package/dist/web-appearance-view.js.map +1 -1
  127. package/dist/web-appearance.d.ts +14 -7
  128. package/dist/web-appearance.js +5 -6
  129. package/dist/web-appearance.js.map +1 -1
  130. package/dist/web-asset-parts.d.ts +1 -17
  131. package/dist/web-asset-parts.js +1 -15
  132. package/dist/web-asset-parts.js.map +1 -1
  133. package/dist/web-auth.js +1 -7
  134. package/dist/web-auth.js.map +1 -1
  135. package/dist/web-chat-history.d.ts +3 -7
  136. package/dist/web-chat-history.js +10 -17
  137. package/dist/web-chat-history.js.map +1 -1
  138. package/dist/web-commands.d.ts +9 -1
  139. package/dist/web-commands.js +13 -0
  140. package/dist/web-commands.js.map +1 -1
  141. package/dist/web-experimental.d.ts +2 -11
  142. package/dist/web-experimental.js +8 -36
  143. package/dist/web-experimental.js.map +1 -1
  144. package/dist/web-guest-access.d.ts +40 -2
  145. package/dist/web-guest-access.js +50 -14
  146. package/dist/web-guest-access.js.map +1 -1
  147. package/dist/web-mod-bundle.d.ts +2 -45
  148. package/dist/web-mod-bundle.js +15 -63
  149. package/dist/web-mod-bundle.js.map +1 -1
  150. package/dist/web-mod-store.d.ts +3 -48
  151. package/dist/web-mod-store.js +30 -97
  152. package/dist/web-mod-store.js.map +1 -1
  153. package/dist/web-prefs.d.ts +13 -0
  154. package/dist/web-prefs.js +38 -0
  155. package/dist/web-prefs.js.map +1 -1
  156. package/dist/web-preview.d.ts +6 -13
  157. package/dist/web-preview.js +12 -23
  158. package/dist/web-preview.js.map +1 -1
  159. package/dist/web-session.d.ts +11 -3
  160. package/dist/web-session.js +22 -11
  161. package/dist/web-session.js.map +1 -1
  162. package/dist/web-settings-patch.d.ts +1 -0
  163. package/dist/web-settings-patch.js +6 -3
  164. package/dist/web-settings-patch.js.map +1 -1
  165. package/dist/web-settings-tools.d.ts +0 -13
  166. package/dist/web-settings-tools.js +12 -84
  167. package/dist/web-settings-tools.js.map +1 -1
  168. package/package.json +1 -1
  169. package/dist/general-knowledge/skills/web-appearance/SKILL.canvas-worker-off.md +0 -376
  170. package/dist/general-knowledge/skills/web-dashboard/SKILL.canvas-worker-off.md +0 -672
  171. package/dist/ui/app-effects.js +0 -251
  172. package/dist/ui/chat-effect-posters.js +0 -42
  173. package/dist/ui/chat-effects.js +0 -167
  174. package/dist/ui/effect-trial-controller.js +0 -124
  175. package/dist/ui/effect-trial-offer.js +0 -2
  176. package/dist/ui/effect-trial-panel.js +0 -40
  177. package/dist/ui/effects-waker.js +0 -2
  178. package/dist/ui/settings-effects.js +0 -202
  179. package/dist/ui/settings-owner-effects.js +0 -82
  180. package/dist/ui/shared/effect-app-runtime.js +0 -299
  181. package/dist/ui/shared/effect-baseline.js +0 -64
  182. package/dist/ui/shared/effect-chat-runtime.js +0 -162
  183. package/dist/ui/shared/effect-cursor.js +0 -126
  184. package/dist/ui/shared/effect-display-metadata.js +0 -39
  185. package/dist/ui/shared/effect-frame.js +0 -146
  186. package/dist/ui/shared/effect-geometry.js +0 -137
  187. package/dist/ui/shared/effect-host-style.js +0 -10
  188. package/dist/ui/shared/effect-owner-regions.js +0 -74
  189. package/dist/ui/shared/effect-owner-source.js +0 -122
  190. package/dist/ui/shared/effect-policy.js +0 -151
  191. package/dist/ui/shared/effect-poster-reader.js +0 -98
  192. package/dist/ui/shared/effect-posters.js +0 -117
  193. package/dist/ui/shared/effect-profiler.js +0 -184
  194. package/dist/ui/shared/effect-profiles.js +0 -65
  195. package/dist/ui/shared/effect-registry.js +0 -545
  196. package/dist/ui/shared/effect-runtime-loader.js +0 -236
  197. package/dist/ui/shared/effect-safety.js +0 -153
  198. package/dist/ui/shared/effect-stock-snapshot.js +0 -43
  199. package/dist/ui/shared/effect-stock-trust.js +0 -217
  200. package/dist/ui/shared/effect-trial-shadow.js +0 -62
  201. package/dist/ui/shared/effect-trial-source.js +0 -103
  202. package/dist/ui/shared/effect-trial-stage.js +0 -170
  203. package/dist/ui/shared/effect-trial.css +0 -40
  204. package/dist/ui/shared/feature-flags.js +0 -127
  205. package/dist/ui/shared/owner-effect-prefs.js +0 -117
  206. package/dist/web-effect-bootstrap.d.ts +0 -12
  207. package/dist/web-effect-bootstrap.js +0 -49
  208. package/dist/web-effect-bootstrap.js.map +0 -1
  209. package/dist/web-effect-bundle.d.ts +0 -28
  210. package/dist/web-effect-bundle.js +0 -171
  211. package/dist/web-effect-bundle.js.map +0 -1
  212. package/dist/web-effect-canonical.d.ts +0 -8
  213. package/dist/web-effect-canonical.js +0 -27
  214. package/dist/web-effect-canonical.js.map +0 -1
  215. package/dist/web-effect-library.d.ts +0 -114
  216. package/dist/web-effect-library.js +0 -530
  217. package/dist/web-effect-library.js.map +0 -1
  218. package/dist/web-effect-playback.d.ts +0 -30
  219. package/dist/web-effect-playback.js +0 -71
  220. package/dist/web-effect-playback.js.map +0 -1
  221. package/dist/web-effect-poster.d.ts +0 -8
  222. package/dist/web-effect-poster.js +0 -52
  223. package/dist/web-effect-poster.js.map +0 -1
  224. package/dist/web-effect-profiles.d.ts +0 -118
  225. package/dist/web-effect-profiles.js +0 -181
  226. package/dist/web-effect-profiles.js.map +0 -1
  227. package/dist/web-effect-service.d.ts +0 -93
  228. package/dist/web-effect-service.js +0 -335
  229. package/dist/web-effect-service.js.map +0 -1
  230. package/dist/web-effect-tools.d.ts +0 -48
  231. package/dist/web-effect-tools.js +0 -129
  232. package/dist/web-effect-tools.js.map +0 -1
  233. package/dist/web-effect-trials.d.ts +0 -86
  234. package/dist/web-effect-trials.js +0 -204
  235. package/dist/web-effect-trials.js.map +0 -1
  236. package/dist/web-effect-upload.d.ts +0 -27
  237. package/dist/web-effect-upload.js +0 -185
  238. package/dist/web-effect-upload.js.map +0 -1
  239. package/dist/web-effect-worker.d.ts +0 -8
  240. package/dist/web-effect-worker.js +0 -170
  241. package/dist/web-effect-worker.js.map +0 -1
  242. package/dist/web-effect.d.ts +0 -103
  243. package/dist/web-effect.js +0 -153
  244. package/dist/web-effect.js.map +0 -1
  245. package/dist/web-experimental-http.d.ts +0 -2
  246. package/dist/web-experimental-http.js +0 -12
  247. package/dist/web-experimental-http.js.map +0 -1
  248. package/dist/web-mod-agent.d.ts +0 -50
  249. package/dist/web-mod-agent.js +0 -207
  250. package/dist/web-mod-agent.js.map +0 -1
@@ -1,93 +0,0 @@
1
- import { WebEffectLibrary } from "./web-effect-library.js";
2
- import { ThemeStore } from "./web-theme-store.js";
3
- import type { WebEffectProfiles } from "./web-effect-profiles.js";
4
- import type { WebEffectTrials } from "./web-effect-trials.js";
5
- import { type OwnerEffectKey, type WebPrefsStore } from "./web-prefs.js";
6
- type Answer = Record<string, unknown>;
7
- export interface EffectServiceDeps {
8
- library: WebEffectLibrary;
9
- themes: ThemeStore;
10
- profiles: WebEffectProfiles;
11
- prefs?: WebPrefsStore;
12
- trials?: WebEffectTrials;
13
- known(name: string): boolean;
14
- changed(): void;
15
- monotonic?: () => number;
16
- }
17
- /** Host routes provide the authenticated human key. Neither a body nor an agent tool supplies it. */
18
- export declare class WebEffectService {
19
- private readonly deps;
20
- private readonly reports;
21
- private previous;
22
- private readonly playback;
23
- constructor(deps: EffectServiceDeps);
24
- playbackSummary(instance: string, id: string): {
25
- status: "reported_blocked" | "unknown";
26
- reasons: import("./web-effect-playback.js").EffectBlockReason[];
27
- } | {
28
- status: string;
29
- reasons: never[];
30
- };
31
- private principal;
32
- private validPerson;
33
- private readable;
34
- list(person: string): Answer;
35
- profileSummaries(ids: readonly string[]): Record<string, Answer>;
36
- profileSummary(id: string): Answer;
37
- profile(person: string, id: string): Answer;
38
- upload(person: string, bytes: Uint8Array): Answer;
39
- apply(person: string, args: unknown): Answer;
40
- remove(person: string, args: unknown): Answer;
41
- share(person: string, args: unknown): Answer;
42
- delete(person: string, id: string): Answer;
43
- /** A selection never acquires a claim or borrows chat retention. Null clears need no library read. */
44
- validateOwnerSelection(person: string, key: OwnerEffectKey, id: string): string | null;
45
- private ownerCompatible;
46
- collectOwnerReplaced(ids: string[]): void;
47
- ownerSelections(person: string): Answer;
48
- private ownerSelected;
49
- /** Personal runtime authorizations always recheck current own/shared ACL. Cursor selection grants no code read. */
50
- ownerResource(person: string, id: string, slot: unknown): Answer;
51
- ownerImage(person: string, id: string, kind: "poster" | "cursor", slot: unknown): {
52
- ok: true;
53
- bytes: Uint8Array;
54
- } | {
55
- ok: false;
56
- error: "not_found";
57
- };
58
- private resourceAnswer;
59
- /** Host-only trial routes supply a fresh verified actor, never a JSON body actor. No placement/claim writes. */
60
- trialStart(offer: string, instance: string, viewer: unknown): Answer;
61
- trialStop(trial: string, viewer: unknown): Answer;
62
- trialResource(trial: string, instance: string, viewer: unknown): Answer;
63
- trialPoster(trial: string, instance: string, viewer: unknown): {
64
- ok: true;
65
- bytes: Uint8Array;
66
- } | {
67
- ok: false;
68
- };
69
- trialProfile(trial: string, instance: string, viewer: unknown): Answer;
70
- /** A runtime resource is not an export grant. An exact currently retained placement is independently required. */
71
- private retained;
72
- /** Public/local visual projection: current chat placements only, no principal, code, params or claim grant. */
73
- posterPlacements(instance: string): Answer;
74
- placedPoster(id: string, instance: string): {
75
- ok: true;
76
- bytes: Uint8Array;
77
- } | {
78
- ok: false;
79
- error: "not_found";
80
- };
81
- resource(person: string, id: string, instance?: string, chatOnly?: boolean): Answer;
82
- image(person: string, id: string, kind: "poster" | "cursor", instance?: string): {
83
- ok: true;
84
- bytes: Uint8Array;
85
- } | {
86
- ok: false;
87
- error: "not_found";
88
- };
89
- placements(person: string, instance: string, chatOnly?: boolean): Answer;
90
- /** Diagnostic writes only: a validated report never changes safety, admission or a placement. */
91
- report(person: string, id: string, input: unknown, instance?: string, sessionEpoch?: string): Answer;
92
- }
93
- export {};
@@ -1,335 +0,0 @@
1
- /** #1629: human-session effects and retained-placement runtime reads. No page is mounted here. */
2
- import { createHash } from "node:crypto";
3
- import { WebEffectPlayback } from "./web-effect-playback.js";
4
- import { EFFECT_REGION, WEB_EFFECT_ID, chatCompatible, resolveEffectParams } from "./web-effect.js";
5
- import { effectRasterAssets } from "./web-effect-bundle.js";
6
- import { staticEffectPoster, staticEffectCursor } from "./web-effect-poster.js";
7
- import { decodeEffectFiles } from "./web-effect-upload.js";
8
- import { isOwnerEffectKey, OWNER_EFFECT_KEYS } from "./web-prefs.js";
9
- const fail = (error) => ({ error });
10
- const plain = (x) => !!x && typeof x === "object" && Object.getPrototypeOf(x) === Object.prototype;
11
- const fields = (x, allowed) => plain(x) && Object.keys(x).every(k => allowed.includes(k));
12
- /** Host routes provide the authenticated human key. Neither a body nor an agent tool supplies it. */
13
- export class WebEffectService {
14
- deps;
15
- reports = new Map();
16
- previous = null;
17
- playback;
18
- constructor(deps) {
19
- this.deps = deps;
20
- this.playback = new WebEffectPlayback(deps.monotonic);
21
- }
22
- playbackSummary(instance, id) {
23
- if (!this.deps.known(instance) || !this.deps.themes.readable() || !this.deps.themes.get(instance).placements.effects.some(p => p.id === id))
24
- return { status: "unknown", reasons: [] };
25
- return this.playback.summary(instance, id);
26
- }
27
- principal(person) { return { kind: "human", id: person }; }
28
- validPerson(person) { return typeof person === "string" && person.length > 0 && person.length <= 256; }
29
- readable(person, id) {
30
- return this.validPerson(person) && typeof id === "string" && WEB_EFFECT_ID.test(id) ? this.deps.library.read(id, this.principal(person)) : { ok: false, error: "not_found" };
31
- }
32
- list(person) {
33
- if (!this.validPerson(person))
34
- return fail("not_found");
35
- const result = this.deps.library.managementList(this.principal(person));
36
- if (!result.ok)
37
- return fail(result.error);
38
- const profiles = this.profileSummaries(result.entries.map(e => e.id));
39
- return { effects: result.entries.map(e => ({ ...e, profiles: profiles[e.id] })) };
40
- }
41
- profileSummaries(ids) {
42
- if (!ids.length)
43
- return {};
44
- const r = this.deps.profiles.readSummaries();
45
- return Object.fromEntries(ids.map(id => {
46
- if (!r.ok)
47
- return [id, fail(r.error)];
48
- const summary = r.summaries[id];
49
- return [id, { status: summary?.status ?? "unmeasured", records: summary?.records ?? [] }];
50
- }));
51
- }
52
- profileSummary(id) {
53
- const r = this.deps.profiles.read(id);
54
- if (!r.ok)
55
- return fail(r.error);
56
- return { status: r.status, records: [r.records.filter(p => p.device === "standard").at(-1), r.records.filter(p => p.device === "constrained").at(-1)].filter(Boolean) };
57
- }
58
- profile(person, id) {
59
- return this.readable(person, id).ok ? this.deps.profiles.read(id) : fail("not_found");
60
- }
61
- upload(person, bytes) {
62
- if (!this.validPerson(person))
63
- return fail("not_found");
64
- const files = decodeEffectFiles(bytes);
65
- if (!files)
66
- return fail("invalid_effect");
67
- const staged = this.deps.library.stage(files, this.principal(person));
68
- if (!staged.ok)
69
- return fail(staged.error);
70
- const committed = this.deps.library.commit(staged.stageId);
71
- if (!committed.ok) {
72
- this.deps.library.abort(staged.stageId);
73
- return fail(committed.error);
74
- }
75
- this.deps.changed();
76
- return { id: committed.ids[0], warnings: staged.entries[0].warnings };
77
- }
78
- apply(person, args) {
79
- if (!fields(args, ["instance", "id", "params"]) || typeof args.instance !== "string" || !this.deps.known(args.instance) || typeof args.id !== "string")
80
- return fail("effect_args");
81
- const r = this.readable(person, args.id);
82
- if (!r.ok)
83
- return fail("not_found");
84
- if (!chatCompatible(r.entry.manifest))
85
- return { ...EFFECT_REGION }; // #2017: the agent's rule, before any write
86
- const params = resolveEffectParams(r.entry.manifest, args.params === undefined ? {} : args.params);
87
- if (!params.ok)
88
- return fail("effect_params");
89
- if (!this.deps.themes.readable())
90
- return fail("themes_unreadable");
91
- const before = this.deps.themes.get(args.instance).placements.effects;
92
- const target = { id: args.id, ...(Object.keys(params.overrides).length ? { params: params.overrides } : {}) };
93
- const next = before.map(p => p.id === args.id ? target : p.id);
94
- if (!before.some(p => p.id === args.id))
95
- next.push(target);
96
- const written = this.deps.themes.setPlacements(args.instance, { effects: next }, "human", what => {
97
- const entry = what.id === args.id ? r : this.deps.library.readReferenced(what.id, `instance:${args.instance}`);
98
- if (!entry.ok)
99
- return entry.error;
100
- return resolveEffectParams(entry.entry.manifest, what.id === args.id ? params.overrides : before.find(p => p.id === what.id)?.params ?? {}).ok ? null : "effect_params";
101
- });
102
- if (!written.ok)
103
- return fail(written.error);
104
- this.deps.changed();
105
- return { id: args.id, rev: written.rev, params: params.overrides };
106
- }
107
- remove(person, args) {
108
- if (!this.validPerson(person) || !fields(args, ["instance", "id"]) || typeof args.instance !== "string" || !this.deps.known(args.instance) || args.id !== undefined && (typeof args.id !== "string" || !WEB_EFFECT_ID.test(args.id)))
109
- return fail("effect_args");
110
- if (!this.deps.themes.readable())
111
- return fail("themes_unreadable");
112
- const before = this.deps.themes.get(args.instance).placements.effects, removed = before.filter(p => args.id === undefined || p.id === args.id).map(p => p.id);
113
- if (!removed.length)
114
- return { removed: [] };
115
- const result = this.deps.themes.setPlacements(args.instance, { effects: before.filter(p => !removed.includes(p.id)).map(p => p.id) }, "human", what => this.deps.library.readReferenced(what.id, `instance:${args.instance}`).ok ? null : "not_found");
116
- if (!result.ok)
117
- return fail(result.error);
118
- this.deps.library.collectUnreferenced(removed);
119
- this.deps.changed();
120
- return { removed, rev: result.rev };
121
- }
122
- share(person, args) {
123
- if (!fields(args, ["id", "shared"]) || typeof args.id !== "string" || typeof args.shared !== "boolean" || !this.validPerson(person))
124
- return fail("effect_args");
125
- const r = this.deps.library.setShared(args.id, this.principal(person), args.shared);
126
- if (!r.ok)
127
- return fail(r.error);
128
- this.deps.changed();
129
- return { id: args.id, shared: args.shared };
130
- }
131
- delete(person, id) {
132
- if (!this.validPerson(person))
133
- return fail("not_found");
134
- const r = this.deps.library.deleteClaim(id, this.principal(person));
135
- if (!r.ok)
136
- return fail(r.error);
137
- this.deps.changed();
138
- return { deleted: id };
139
- }
140
- /** A selection never acquires a claim or borrows chat retention. Null clears need no library read. */
141
- validateOwnerSelection(person, key, id) {
142
- const r = this.readable(person, id);
143
- return r.ok && this.ownerCompatible(r.entry, key) ? null : "not_found";
144
- }
145
- ownerCompatible(entry, key) {
146
- if (!isOwnerEffectKey(key))
147
- return false;
148
- if (key === "fx.cursor")
149
- return !!entry.manifest.cursor && entry.files.has("cursor.png");
150
- const region = key.slice(3);
151
- return entry.manifest.regions.includes(region) && (region !== "box" || !!entry.manifest.box);
152
- }
153
- collectOwnerReplaced(ids) { this.deps.library.collectUnreferenced(ids); }
154
- ownerSelections(person) {
155
- if (!this.validPerson(person))
156
- return fail("not_found");
157
- const view = this.deps.prefs?.readForViewer(person);
158
- if (!view || view.unreadable)
159
- return fail("prefs_unreadable");
160
- return { rev: view.rev, slots: Object.fromEntries(OWNER_EFFECT_KEYS.map(key => {
161
- const id = view.values[key];
162
- if (id === undefined)
163
- return [key, { status: "none", id: null }];
164
- const r = this.readable(person, id);
165
- return [key, r.ok && this.ownerCompatible(r.entry, key) ? { status: "available", id, manifest: r.entry.manifest } : { status: "unavailable", id }];
166
- })) };
167
- }
168
- ownerSelected(person, id, slot) {
169
- if (!this.validPerson(person) || typeof slot !== "string" || !isOwnerEffectKey(slot))
170
- return { ok: false, error: "not_found" };
171
- const view = this.deps.prefs?.readForViewer(person);
172
- if (!view || view.unreadable || view.values[slot] !== id)
173
- return { ok: false, error: "not_found" };
174
- const r = this.readable(person, id);
175
- return r.ok && this.ownerCompatible(r.entry, slot) ? r : { ok: false, error: "not_found" };
176
- }
177
- /** Personal runtime authorizations always recheck current own/shared ACL. Cursor selection grants no code read. */
178
- ownerResource(person, id, slot) {
179
- if (slot === "fx.cursor")
180
- return fail("not_found");
181
- const r = this.ownerSelected(person, id, slot);
182
- if (!r.ok)
183
- return fail("not_found");
184
- const params = resolveEffectParams(r.entry.manifest);
185
- if (!params.ok)
186
- return fail("not_found");
187
- return this.resourceAnswer(id, r.entry, params.values);
188
- }
189
- ownerImage(person, id, kind, slot) {
190
- const r = this.ownerSelected(person, id, slot), bytes = r.ok ? r.entry.files.get(`${kind}.png`) : undefined;
191
- // Runtime images are output copies; stripping animation must not rewrite the stored content id.
192
- const image = bytes && (kind === "cursor" ? staticEffectCursor(bytes) : bytes);
193
- return image ? { ok: true, bytes: image } : { ok: false, error: "not_found" };
194
- }
195
- resourceAnswer(id, entry, params) {
196
- return { id, manifest: entry.manifest, params, wants: entry.manifest.wants, code: new TextDecoder("utf-8", { fatal: true }).decode(entry.files.get("worker.js")),
197
- assets: effectRasterAssets(entry).map(({ name, mime, bytes }) => ({ name, mime, data_b64: Buffer.from(bytes).toString("base64") })) };
198
- }
199
- /** Host-only trial routes supply a fresh verified actor, never a JSON body actor. No placement/claim writes. */
200
- trialStart(offer, instance, viewer) {
201
- const t = this.deps.trials?.start(offer, instance, viewer);
202
- if (!t?.ok)
203
- return fail("not_found");
204
- const r = this.deps.trials.read(t.trial, instance, viewer);
205
- const params = r.ok ? resolveEffectParams(r.entry.manifest) : null;
206
- if (!r.ok || !params?.ok) {
207
- this.deps.trials.stop(t.trial, viewer);
208
- return fail("not_found");
209
- }
210
- return { trial: t.trial, offer: t.offer, remainingMs: t.remainingMs, manifest: r.entry.manifest, params: params.values };
211
- }
212
- trialStop(trial, viewer) {
213
- return this.deps.trials?.stop(trial, viewer).ok ? { ok: true } : fail("not_found");
214
- }
215
- trialResource(trial, instance, viewer) {
216
- const r = this.deps.trials?.read(trial, instance, viewer);
217
- if (!r?.ok)
218
- return fail("not_found");
219
- const params = resolveEffectParams(r.entry.manifest);
220
- if (!params.ok)
221
- return fail("not_found");
222
- return this.resourceAnswer(r.id, r.entry, params.values);
223
- }
224
- trialPoster(trial, instance, viewer) {
225
- const r = this.deps.trials?.read(trial, instance, viewer), source = r?.ok ? r.entry.files.get("poster.png") : undefined;
226
- const bytes = source ? staticEffectPoster(source) : null;
227
- return bytes ? { ok: true, bytes } : { ok: false };
228
- }
229
- trialProfile(trial, instance, viewer) {
230
- const r = this.deps.trials?.read(trial, instance, viewer);
231
- return r?.ok ? this.deps.profiles.read(r.id) : fail("not_found");
232
- }
233
- /** A runtime resource is not an export grant. An exact currently retained placement is independently required. */
234
- retained(id, instance) {
235
- if (!this.deps.known(instance) || !WEB_EFFECT_ID.test(id) || !this.deps.themes.readable())
236
- return { ok: false, error: "not_found" };
237
- const placement = this.deps.themes.get(instance).placements.effects.find(p => p.id === id);
238
- if (!placement)
239
- return { ok: false, error: "not_found" };
240
- const r = this.deps.library.readReferenced(id, `instance:${instance}`);
241
- if (!r.ok)
242
- return r;
243
- const params = resolveEffectParams(r.entry.manifest, placement.params ?? {});
244
- if (!params.ok)
245
- return { ok: false, error: "effect_params" };
246
- return { ...r, placement, params: params.values };
247
- }
248
- /** Public/local visual projection: current chat placements only, no principal, code, params or claim grant. */
249
- posterPlacements(instance) {
250
- if (!this.deps.known(instance))
251
- return fail("not_found");
252
- if (!this.deps.themes.readable())
253
- return fail("themes_unreadable");
254
- return { rev: this.deps.themes.rev(), posters: this.deps.themes.get(instance).placements.effects.flatMap(p => {
255
- const r = this.retained(p.id, instance), bytes = r.ok ? r.entry.files.get("poster.png") : undefined;
256
- return r.ok && r.entry.manifest.regions.includes("chat") && bytes && staticEffectPoster(bytes)
257
- ? [{ id: p.id, title: r.entry.manifest.title }] : [];
258
- }) };
259
- }
260
- placedPoster(id, instance) {
261
- const r = this.retained(id, instance);
262
- const source = r.ok && r.entry.manifest.regions.includes("chat") ? r.entry.files.get("poster.png") : undefined;
263
- const bytes = source ? staticEffectPoster(source) : null;
264
- return bytes ? { ok: true, bytes } : { ok: false, error: "not_found" };
265
- }
266
- resource(person, id, instance, chatOnly = false) {
267
- if (!this.validPerson(person))
268
- return fail("not_found");
269
- const binding = instance === undefined ? null : this.retained(id, instance);
270
- // A public/guest read never falls back to a library claim, even for the same caller/id.
271
- if (chatOnly && (!binding?.ok || !binding.entry.manifest.regions.includes("chat")))
272
- return fail("not_found");
273
- const r = binding ?? this.readable(person, id);
274
- if (!r.ok)
275
- return fail("not_found");
276
- const defaults = resolveEffectParams(r.entry.manifest);
277
- if (!defaults.ok)
278
- return fail("not_found");
279
- return this.resourceAnswer(id, r.entry, binding?.ok ? binding.params : defaults.values);
280
- }
281
- image(person, id, kind, instance) {
282
- if (!this.validPerson(person))
283
- return { ok: false, error: "not_found" };
284
- const r = instance === undefined ? this.readable(person, id) : this.retained(id, instance);
285
- const bytes = r.ok ? r.entry.files.get(`${kind}.png`) : undefined;
286
- return bytes ? { ok: true, bytes } : { ok: false, error: "not_found" };
287
- }
288
- placements(person, instance, chatOnly = false) {
289
- if (!this.validPerson(person) || !this.deps.known(instance))
290
- return fail("not_found");
291
- if (!this.deps.themes.readable())
292
- return fail("themes_unreadable");
293
- return { rev: this.deps.themes.rev(), effects: this.deps.themes.get(instance).placements.effects.flatMap(p => {
294
- const r = this.retained(p.id, instance);
295
- return r.ok && (!chatOnly || r.entry.manifest.regions.includes("chat")) ? [{ ...p, manifest: r.entry.manifest, params: r.params }] : [];
296
- }) };
297
- }
298
- /** Diagnostic writes only: a validated report never changes safety, admission or a placement. */
299
- report(person, id, input, instance, sessionEpoch) {
300
- if (!this.validPerson(person) || !(instance === undefined ? this.readable(person, id) : this.retained(id, instance)).ok)
301
- return fail("not_found");
302
- // A separately tagged variant: strict schema, current chat reference and a route-issued session key.
303
- // It never enters the measured profile store or the safety ledger.
304
- if (plain(input) && Object.getOwnPropertyDescriptor(input, "kind")?.value === "playback") {
305
- if (instance === undefined || typeof sessionEpoch !== "string" || !/^[a-f0-9]{16}$/.test(sessionEpoch))
306
- return fail("playback_report");
307
- const reporter = createHash("sha256").update(JSON.stringify([person, sessionEpoch])).digest("hex");
308
- return this.playback.record(reporter, instance, id, input);
309
- }
310
- let now;
311
- try {
312
- now = (this.deps.monotonic ?? (() => performance.now()))();
313
- }
314
- catch {
315
- return fail("profile_clock");
316
- }
317
- if (!Number.isFinite(now) || now < 0 || this.previous !== null && now < this.previous)
318
- return fail("profile_clock");
319
- this.previous = now;
320
- for (const [key, t] of this.reports)
321
- if (now - t >= 60_000)
322
- this.reports.delete(key);
323
- const key = JSON.stringify([person, id]), last = this.reports.get(key);
324
- if (last !== undefined && now - last < 10_000)
325
- return fail("profile_rate_limited");
326
- if (last === undefined && this.reports.size >= 1024)
327
- return fail("profile_rate_limited");
328
- const result = this.deps.profiles.record(id, input);
329
- if (!result.ok)
330
- return fail(result.error);
331
- this.reports.set(key, now);
332
- return { ok: true };
333
- }
334
- }
335
- //# sourceMappingURL=web-effect-service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"web-effect-service.js","sourceRoot":"","sources":["../src/web-effect-service.ts"],"names":[],"mappings":"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"}
@@ -1,48 +0,0 @@
1
- import { WebEffectLibrary } from "./web-effect-library.js";
2
- import type { AppearanceBucket, AppearanceLimiter } from "./web-appearance-policy.js";
3
- type Answer = Record<string, unknown>;
4
- export interface EffectPlacementInput {
5
- id: string;
6
- params?: Record<string, unknown>;
7
- }
8
- export interface EffectToolDeps {
9
- library: WebEffectLibrary;
10
- limiter: AppearanceLimiter;
11
- /** The SAME switch/lock/limiter helper used by theme writes, run synchronously. */
12
- authorize(instance: string, buckets: readonly AppearanceBucket[]): Answer | null;
13
- placed(instance: string): Array<{
14
- id: string;
15
- params?: Record<string, unknown>;
16
- }>;
17
- place(instance: string, effects: Array<string | EffectPlacementInput>): {
18
- ok: true;
19
- rev: number;
20
- } | {
21
- ok: false;
22
- error: string;
23
- };
24
- changed(): void;
25
- preview(instance: string, id: string, title: string): Promise<Answer>;
26
- profiles(id: string): Answer;
27
- profileSummary?(id: string): Answer;
28
- playbackSummary?(instance: string, id: string): Answer;
29
- profileSummaries?(ids: readonly string[]): Record<string, Answer>;
30
- clock?: () => number;
31
- }
32
- export declare const WEB_EFFECT_TOOLS: ReadonlySet<string>;
33
- export declare class WebEffectTools {
34
- private readonly deps;
35
- private readonly uploads;
36
- constructor(deps: EffectToolDeps);
37
- private principal;
38
- upload(instance: string, args: Answer): Answer;
39
- list(instance: string): Answer;
40
- apply(instance: string, args: Answer): Answer;
41
- remove(instance: string, args: Answer): Answer;
42
- delete(instance: string, args: Answer): Answer;
43
- profile(instance: string, args: Answer): Answer;
44
- preview(instance: string, args: Answer): Promise<Answer>;
45
- handle(instance: string, tool: string, args: Answer): Answer | Promise<Answer>;
46
- forget(instance: string): void;
47
- }
48
- export {};
@@ -1,129 +0,0 @@
1
- /** #1629: caller-scoped effect operations. Host ingress supplies identity; no tool takes a target or holder. */
2
- import { EFFECT_REGION, chatCompatible, resolveEffectParams } from "./web-effect.js";
3
- import { EffectUploads } from "./web-effect-upload.js";
4
- export const WEB_EFFECT_TOOLS = new Set(["upload_web_effect", "list_web_effects", "preview_web_effect", "profile_web_effect", "apply_web_effect", "remove_web_effect", "delete_web_effect"]);
5
- const ID = /^[0-9a-f]{32}$/;
6
- export class WebEffectTools {
7
- deps;
8
- uploads;
9
- constructor(deps) {
10
- this.deps = deps;
11
- this.uploads = new EffectUploads(deps.clock);
12
- }
13
- principal(instance) { return { kind: "agent", id: instance }; }
14
- upload(instance, args) {
15
- const refused = this.deps.authorize(instance, []); // the switch and the lock; uploads are not counted (the user's decision)
16
- if (refused) {
17
- this.uploads.forget(instance);
18
- return refused;
19
- }
20
- return this.uploads.accept(instance, args, files => {
21
- const last = this.deps.authorize(instance, []);
22
- if (last)
23
- return last;
24
- const stage = this.deps.library.stage(files, this.principal(instance));
25
- if (!stage.ok)
26
- return { error: stage.error };
27
- const committed = this.deps.library.commit(stage.stageId);
28
- if (!committed.ok) {
29
- this.deps.library.abort(stage.stageId);
30
- return { error: committed.error };
31
- }
32
- this.deps.changed();
33
- return { id: committed.ids[0], warnings: stage.entries[0].warnings };
34
- });
35
- }
36
- list(instance) {
37
- const result = this.deps.library.list(this.principal(instance));
38
- if (!result.ok)
39
- return { error: result.error };
40
- const profiles = this.deps.profileSummaries?.(result.entries.map(e => e.id));
41
- const placed = new Set(this.deps.placed(instance).map(e => e.id));
42
- return { effects: result.entries.map(e => ({ id: e.id, name: e.manifest.name, title: e.manifest.title, regions: e.manifest.regions, layer: e.manifest.layer, bytes: e.bytes, ...(placed.has(e.id) && this.deps.playbackSummary ? { playback: this.deps.playbackSummary(instance, e.id) } : {}), latest_profile: profiles ? profiles[e.id] : this.deps.profileSummary ? this.deps.profileSummary(e.id) : this.deps.profiles(e.id) })) };
43
- }
44
- apply(instance, args) {
45
- const refused = this.deps.authorize(instance, ["change"]);
46
- if (refused)
47
- return refused;
48
- if (Object.keys(args).some(k => k !== "id" && k !== "params") || typeof args.id !== "string" || !ID.test(args.id))
49
- return { error: "effect_args" };
50
- const entry = this.deps.library.read(args.id, this.principal(instance));
51
- if (!entry.ok)
52
- return { error: entry.error };
53
- // #2017: a chat placement needs an effect that plays in chat — refused before anything is placed, written or counted.
54
- if (!chatCompatible(entry.entry.manifest))
55
- return { ...EFFECT_REGION };
56
- const params = resolveEffectParams(entry.entry.manifest, args.params === undefined ? {} : args.params);
57
- if (!params.ok)
58
- return { error: "effect_params" };
59
- const previous = this.deps.placed(instance);
60
- const target = { id: args.id, ...(Object.keys(params.overrides).length ? { params: params.overrides } : {}) };
61
- const next = previous.map(e => e.id === args.id ? target : e.id);
62
- if (!previous.some(e => e.id === args.id))
63
- next.push(target);
64
- if (next.length > 2)
65
- return { error: "effects", message: "At most two effects in your own chat; remove one first." };
66
- // Retained string entries keep the host's provenance; the explicit target is always restamped agent-side.
67
- const result = this.deps.place(instance, next);
68
- if (!result.ok)
69
- return { error: result.error };
70
- this.deps.limiter.record(instance, ["change"]);
71
- this.deps.changed();
72
- return { id: args.id, region: "chat", params: params.overrides, rev: result.rev };
73
- }
74
- remove(instance, args) {
75
- const refused = this.deps.authorize(instance, ["change"]);
76
- if (refused)
77
- return refused;
78
- if (Object.keys(args).some(k => k !== "id") || args.id !== undefined && (typeof args.id !== "string" || !ID.test(args.id)))
79
- return { error: "effect_args" };
80
- const before = this.deps.placed(instance), removed = before.filter(e => args.id === undefined || e.id === args.id).map(e => e.id);
81
- if (!removed.length)
82
- return { removed: [] };
83
- const result = this.deps.place(instance, before.filter(e => !removed.includes(e.id)).map(e => e.id));
84
- if (!result.ok)
85
- return { error: result.error };
86
- this.deps.limiter.record(instance, ["change"]);
87
- this.deps.library.collectUnreferenced(removed);
88
- this.deps.changed();
89
- return { removed, rev: result.rev };
90
- }
91
- delete(instance, args) {
92
- const refused = this.deps.authorize(instance, []);
93
- if (refused)
94
- return refused;
95
- if (Object.keys(args).some(k => k !== "id") || typeof args.id !== "string" || !ID.test(args.id))
96
- return { error: "effect_args" };
97
- const result = this.deps.library.deleteClaim(args.id, this.principal(instance));
98
- return result.ok ? { deleted: args.id } : { error: result.error };
99
- }
100
- profile(instance, args) {
101
- if (Object.keys(args).some(k => k !== "id") || typeof args.id !== "string" || !ID.test(args.id) || !this.deps.library.read(args.id, this.principal(instance)).ok)
102
- return { error: "not_found" };
103
- return this.deps.profiles(args.id);
104
- }
105
- async preview(instance, args) {
106
- if (Object.keys(args).some(k => k !== "id") || typeof args.id !== "string" || !ID.test(args.id))
107
- return { error: "effect_args" };
108
- const entry = this.deps.library.read(args.id, this.principal(instance));
109
- if (!entry.ok)
110
- return { error: "not_found" };
111
- return this.deps.preview(instance, args.id, entry.entry.manifest.title);
112
- }
113
- handle(instance, tool, args) {
114
- if (!args || typeof args !== "object" || Array.isArray(args))
115
- return { error: "effect_args" };
116
- switch (tool) {
117
- case "upload_web_effect": return this.upload(instance, args);
118
- case "list_web_effects": return Object.keys(args).length ? { error: "effect_args" } : this.list(instance);
119
- case "apply_web_effect": return this.apply(instance, args);
120
- case "remove_web_effect": return this.remove(instance, args);
121
- case "delete_web_effect": return this.delete(instance, args);
122
- case "profile_web_effect": return this.profile(instance, args);
123
- case "preview_web_effect": return this.preview(instance, args);
124
- default: return { error: "unknown_tool" };
125
- }
126
- }
127
- forget(instance) { this.uploads.forget(instance); }
128
- }
129
- //# sourceMappingURL=web-effect-tools.js.map