@songsid/agend 2.2.0 → 2.3.0-beta.2

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 (298) hide show
  1. package/dist/agent-cli.js +248 -2
  2. package/dist/agent-cli.js.map +1 -1
  3. package/dist/agent-endpoint.d.ts +2 -0
  4. package/dist/agent-endpoint.js +25 -0
  5. package/dist/agent-endpoint.js.map +1 -1
  6. package/dist/agent-file-read.d.ts +35 -0
  7. package/dist/agent-file-read.js +144 -0
  8. package/dist/agent-file-read.js.map +1 -0
  9. package/dist/agent-whats-new.js +8 -0
  10. package/dist/agent-whats-new.js.map +1 -1
  11. package/dist/atomic-write.js +9 -1
  12. package/dist/atomic-write.js.map +1 -1
  13. package/dist/auth-api.js +17 -0
  14. package/dist/auth-api.js.map +1 -1
  15. package/dist/backend/antigravity.js +3 -3
  16. package/dist/backend/antigravity.js.map +1 -1
  17. package/dist/backend/claude-code.js +5 -1
  18. package/dist/backend/claude-code.js.map +1 -1
  19. package/dist/backend/launch-effort.js +1 -1
  20. package/dist/backend/launch-effort.js.map +1 -1
  21. package/dist/backend/muse.js +10 -2
  22. package/dist/backend/muse.js.map +1 -1
  23. package/dist/backend/types.d.ts +8 -0
  24. package/dist/backend/types.js +10 -0
  25. package/dist/backend/types.js.map +1 -1
  26. package/dist/cache-analysis.d.ts +47 -1
  27. package/dist/cache-analysis.js +68 -8
  28. package/dist/cache-analysis.js.map +1 -1
  29. package/dist/cache-report-tool.d.ts +17 -0
  30. package/dist/cache-report-tool.js +40 -0
  31. package/dist/cache-report-tool.js.map +1 -0
  32. package/dist/cache-service.d.ts +15 -0
  33. package/dist/cache-service.js +26 -1
  34. package/dist/cache-service.js.map +1 -1
  35. package/dist/channel/adapters/discord.d.ts +2 -0
  36. package/dist/channel/adapters/discord.js +17 -2
  37. package/dist/channel/adapters/discord.js.map +1 -1
  38. package/dist/channel/adapters/telegram.d.ts +8 -1
  39. package/dist/channel/adapters/telegram.js +74 -4
  40. package/dist/channel/adapters/telegram.js.map +1 -1
  41. package/dist/channel/mcp-tools.js +36 -0
  42. package/dist/channel/mcp-tools.js.map +1 -1
  43. package/dist/channel/types.d.ts +15 -0
  44. package/dist/cli.js +7 -3
  45. package/dist/cli.js.map +1 -1
  46. package/dist/config-validator.js +22 -2
  47. package/dist/config-validator.js.map +1 -1
  48. package/dist/daemon.js +244 -20
  49. package/dist/daemon.js.map +1 -1
  50. package/dist/fleet-context.d.ts +5 -0
  51. package/dist/fleet-manager.d.ts +92 -0
  52. package/dist/fleet-manager.js +410 -29
  53. package/dist/fleet-manager.js.map +1 -1
  54. package/dist/general-knowledge/skills/credential-profiles/SKILL.md +7 -0
  55. package/dist/general-knowledge/skills/web-appearance/SKILL.md +367 -0
  56. package/dist/instance-avatar.js +3 -0
  57. package/dist/instance-avatar.js.map +1 -1
  58. package/dist/instance-config-impact.js +3 -0
  59. package/dist/instance-config-impact.js.map +1 -1
  60. package/dist/instance-lifecycle.js +9 -4
  61. package/dist/instance-lifecycle.js.map +1 -1
  62. package/dist/needs-you-hub.d.ts +4 -0
  63. package/dist/needs-you-hub.js +31 -6
  64. package/dist/needs-you-hub.js.map +1 -1
  65. package/dist/needs-you.d.ts +1 -13
  66. package/dist/needs-you.js +3 -37
  67. package/dist/needs-you.js.map +1 -1
  68. package/dist/outbound-handlers.d.ts +7 -0
  69. package/dist/outbound-handlers.js +65 -10
  70. package/dist/outbound-handlers.js.map +1 -1
  71. package/dist/outbound-schemas.d.ts +74 -0
  72. package/dist/outbound-schemas.js +56 -0
  73. package/dist/outbound-schemas.js.map +1 -1
  74. package/dist/public-web-gateway.js +14 -0
  75. package/dist/public-web-gateway.js.map +1 -1
  76. package/dist/repo-worktree-guard.d.ts +36 -0
  77. package/dist/repo-worktree-guard.js +143 -0
  78. package/dist/repo-worktree-guard.js.map +1 -0
  79. package/dist/scheduler/scheduler.d.ts +70 -1
  80. package/dist/scheduler/scheduler.js +256 -17
  81. package/dist/scheduler/scheduler.js.map +1 -1
  82. package/dist/service-installer.d.ts +2 -1
  83. package/dist/service-installer.js +18 -3
  84. package/dist/service-installer.js.map +1 -1
  85. package/dist/settings-api.js +74 -1
  86. package/dist/settings-api.js.map +1 -1
  87. package/dist/settings-change.js +8 -0
  88. package/dist/settings-change.js.map +1 -1
  89. package/dist/settings-effect.js +16 -2
  90. package/dist/settings-effect.js.map +1 -1
  91. package/dist/settings-http-confirmation.js +5 -0
  92. package/dist/settings-http-confirmation.js.map +1 -1
  93. package/dist/tool-permissions.d.ts +5 -0
  94. package/dist/tool-permissions.js +61 -2
  95. package/dist/tool-permissions.js.map +1 -1
  96. package/dist/topic-commands.d.ts +10 -6
  97. package/dist/topic-commands.js +21 -17
  98. package/dist/topic-commands.js.map +1 -1
  99. package/dist/topic-link.d.ts +128 -0
  100. package/dist/topic-link.js +269 -0
  101. package/dist/topic-link.js.map +1 -0
  102. package/dist/types.d.ts +13 -0
  103. package/dist/ui/app-effects.js +187 -0
  104. package/dist/ui/chat-effect-posters.js +42 -0
  105. package/dist/ui/chat-effects.js +72 -0
  106. package/dist/ui/chat-live-replies.js +58 -0
  107. package/dist/ui/chat-render.js +4 -4
  108. package/dist/ui/chat-store.js +9 -3
  109. package/dist/ui/chat-strings.js +15 -0
  110. package/dist/ui/chat-thread.js +47 -21
  111. package/dist/ui/chat-tour.js +1 -1
  112. package/dist/ui/effect-trial-controller.js +119 -0
  113. package/dist/ui/effect-trial-offer.js +31 -0
  114. package/dist/ui/effect-trial-panel.js +37 -0
  115. package/dist/ui/fleet-cache.js +23 -1
  116. package/dist/ui/image-lightbox.js +1 -1
  117. package/dist/ui/panel-chat.js +85 -17
  118. package/dist/ui/panel-details.js +18 -5
  119. package/dist/ui/panel-fleet.js +3 -3
  120. package/dist/ui/panel-log.js +6 -6
  121. package/dist/ui/panel-needs.js +3 -3
  122. package/dist/ui/panel-settings.js +8 -5
  123. package/dist/ui/preview-panel.js +25 -9
  124. package/dist/ui/settings-appearance.js +325 -0
  125. package/dist/ui/settings-effects.js +201 -0
  126. package/dist/ui/settings-mods.js +257 -0
  127. package/dist/ui/settings-owner-effects.js +80 -0
  128. package/dist/ui/settings-strings.js +245 -0
  129. package/dist/ui/shared/agend-auth.js +27 -3
  130. package/dist/ui/shared/agent-widget.js +248 -0
  131. package/dist/ui/shared/app-i18n.js +2 -0
  132. package/dist/ui/shared/app-prefs.js +30 -10
  133. package/dist/ui/shared/app-route.js +23 -1
  134. package/dist/ui/shared/app-session.js +1 -1
  135. package/dist/ui/shared/app-shell.js +29 -16
  136. package/dist/ui/shared/app-store.js +2 -0
  137. package/dist/ui/shared/app-stream.js +12 -7
  138. package/dist/ui/shared/app-themes.js +188 -0
  139. package/dist/ui/shared/app.css +225 -3
  140. package/dist/ui/shared/app.js +6 -0
  141. package/dist/ui/shared/card-strings.js +28 -0
  142. package/dist/ui/shared/effect-app-runtime.js +248 -0
  143. package/dist/ui/shared/effect-baseline.js +64 -0
  144. package/dist/ui/shared/effect-chat-runtime.js +154 -0
  145. package/dist/ui/shared/effect-cursor.js +125 -0
  146. package/dist/ui/shared/effect-frame.js +127 -0
  147. package/dist/ui/shared/effect-geometry.js +122 -0
  148. package/dist/ui/shared/effect-host-style.js +10 -0
  149. package/dist/ui/shared/effect-owner-regions.js +74 -0
  150. package/dist/ui/shared/effect-owner-source.js +115 -0
  151. package/dist/ui/shared/effect-policy.js +137 -0
  152. package/dist/ui/shared/effect-poster-reader.js +98 -0
  153. package/dist/ui/shared/effect-posters.js +117 -0
  154. package/dist/ui/shared/effect-profiler.js +162 -0
  155. package/dist/ui/shared/effect-profiles.js +65 -0
  156. package/dist/ui/shared/effect-registry.js +496 -0
  157. package/dist/ui/shared/effect-runtime-loader.js +234 -0
  158. package/dist/ui/shared/effect-safety.js +153 -0
  159. package/dist/ui/shared/effect-stock-snapshot.js +34 -0
  160. package/dist/ui/shared/effect-stock-trust.js +165 -0
  161. package/dist/ui/shared/effect-trial-source.js +103 -0
  162. package/dist/ui/shared/effect-trial-stage.js +147 -0
  163. package/dist/ui/shared/header-tools.js +1 -1
  164. package/dist/ui/shared/identity-card.js +202 -0
  165. package/dist/ui/shared/identity-color.js +261 -0
  166. package/dist/ui/shared/instance-nav.js +37 -19
  167. package/dist/ui/shared/owner-css.js +221 -0
  168. package/dist/ui/shared/owner-effect-prefs.js +117 -0
  169. package/dist/ui/shared/panel-view.js +81 -8
  170. package/dist/ui/shared/signin.js +2 -0
  171. package/dist/ui/shared/ui-dialog.js +1 -1
  172. package/dist/ui/shared/ui-icons.js +2 -0
  173. package/dist/ui/shared/ui-menu.js +1 -1
  174. package/dist/ui/shared/ui-toast.js +1 -1
  175. package/dist/ui/shared/usage-dialog.js +14 -2
  176. package/dist/ui/shared/view-strings.js +36 -2
  177. package/dist/ui/signin.html +1 -0
  178. package/dist/usage/providers.d.ts +3 -0
  179. package/dist/usage/providers.js +4 -3
  180. package/dist/usage/providers.js.map +1 -1
  181. package/dist/view-api.d.ts +29 -0
  182. package/dist/view-api.js +188 -8
  183. package/dist/view-api.js.map +1 -1
  184. package/dist/web-api.d.ts +42 -0
  185. package/dist/web-api.js +898 -36
  186. package/dist/web-api.js.map +1 -1
  187. package/dist/web-appearance-limits.d.ts +82 -0
  188. package/dist/web-appearance-limits.js +83 -0
  189. package/dist/web-appearance-limits.js.map +1 -0
  190. package/dist/web-appearance-policy.d.ts +66 -0
  191. package/dist/web-appearance-policy.js +94 -0
  192. package/dist/web-appearance-policy.js.map +1 -0
  193. package/dist/web-appearance-tools.d.ts +50 -0
  194. package/dist/web-appearance-tools.js +105 -0
  195. package/dist/web-appearance-tools.js.map +1 -0
  196. package/dist/web-appearance-view.d.ts +99 -0
  197. package/dist/web-appearance-view.js +163 -0
  198. package/dist/web-appearance-view.js.map +1 -0
  199. package/dist/web-appearance.d.ts +79 -0
  200. package/dist/web-appearance.js +298 -0
  201. package/dist/web-appearance.js.map +1 -0
  202. package/dist/web-asset-parts.d.ts +93 -0
  203. package/dist/web-asset-parts.js +133 -0
  204. package/dist/web-asset-parts.js.map +1 -0
  205. package/dist/web-auth.js +17 -1
  206. package/dist/web-auth.js.map +1 -1
  207. package/dist/web-card.d.ts +96 -0
  208. package/dist/web-card.js +232 -0
  209. package/dist/web-card.js.map +1 -0
  210. package/dist/web-chat-history.d.ts +13 -0
  211. package/dist/web-chat-history.js +23 -2
  212. package/dist/web-chat-history.js.map +1 -1
  213. package/dist/web-effect-bundle.d.ts +28 -0
  214. package/dist/web-effect-bundle.js +126 -0
  215. package/dist/web-effect-bundle.js.map +1 -0
  216. package/dist/web-effect-canonical.d.ts +8 -0
  217. package/dist/web-effect-canonical.js +27 -0
  218. package/dist/web-effect-canonical.js.map +1 -0
  219. package/dist/web-effect-library.d.ts +114 -0
  220. package/dist/web-effect-library.js +530 -0
  221. package/dist/web-effect-library.js.map +1 -0
  222. package/dist/web-effect-poster.d.ts +8 -0
  223. package/dist/web-effect-poster.js +52 -0
  224. package/dist/web-effect-poster.js.map +1 -0
  225. package/dist/web-effect-profiles.d.ts +118 -0
  226. package/dist/web-effect-profiles.js +180 -0
  227. package/dist/web-effect-profiles.js.map +1 -0
  228. package/dist/web-effect-service.d.ts +86 -0
  229. package/dist/web-effect-service.js +314 -0
  230. package/dist/web-effect-service.js.map +1 -0
  231. package/dist/web-effect-tools.d.ts +47 -0
  232. package/dist/web-effect-tools.js +129 -0
  233. package/dist/web-effect-tools.js.map +1 -0
  234. package/dist/web-effect-trials.d.ts +86 -0
  235. package/dist/web-effect-trials.js +204 -0
  236. package/dist/web-effect-trials.js.map +1 -0
  237. package/dist/web-effect-upload.d.ts +27 -0
  238. package/dist/web-effect-upload.js +185 -0
  239. package/dist/web-effect-upload.js.map +1 -0
  240. package/dist/web-effect-worker.d.ts +8 -0
  241. package/dist/web-effect-worker.js +170 -0
  242. package/dist/web-effect-worker.js.map +1 -0
  243. package/dist/web-effect.d.ts +103 -0
  244. package/dist/web-effect.js +153 -0
  245. package/dist/web-effect.js.map +1 -0
  246. package/dist/web-identity-color.d.ts +87 -0
  247. package/dist/web-identity-color.js +209 -0
  248. package/dist/web-identity-color.js.map +1 -0
  249. package/dist/web-identity-palette.d.ts +113 -0
  250. package/dist/web-identity-palette.js +84 -0
  251. package/dist/web-identity-palette.js.map +1 -0
  252. package/dist/web-image-meta.d.ts +25 -0
  253. package/dist/web-image-meta.js +200 -0
  254. package/dist/web-image-meta.js.map +1 -0
  255. package/dist/web-mod-agent.d.ts +50 -0
  256. package/dist/web-mod-agent.js +205 -0
  257. package/dist/web-mod-agent.js.map +1 -0
  258. package/dist/web-mod-bundle.d.ts +149 -0
  259. package/dist/web-mod-bundle.js +470 -0
  260. package/dist/web-mod-bundle.js.map +1 -0
  261. package/dist/web-mod-export.d.ts +59 -0
  262. package/dist/web-mod-export.js +79 -0
  263. package/dist/web-mod-export.js.map +1 -0
  264. package/dist/web-mod-store.d.ts +283 -0
  265. package/dist/web-mod-store.js +625 -0
  266. package/dist/web-mod-store.js.map +1 -0
  267. package/dist/web-org.d.ts +3 -3
  268. package/dist/web-org.js +11 -17
  269. package/dist/web-org.js.map +1 -1
  270. package/dist/web-owner-css-store.d.ts +180 -0
  271. package/dist/web-owner-css-store.js +384 -0
  272. package/dist/web-owner-css-store.js.map +1 -0
  273. package/dist/web-owner-css.d.ts +58 -0
  274. package/dist/web-owner-css.js +552 -0
  275. package/dist/web-owner-css.js.map +1 -0
  276. package/dist/web-prefs.d.ts +48 -0
  277. package/dist/web-prefs.js +209 -33
  278. package/dist/web-prefs.js.map +1 -1
  279. package/dist/web-preview.d.ts +9 -1
  280. package/dist/web-preview.js +24 -7
  281. package/dist/web-preview.js.map +1 -1
  282. package/dist/web-settings-patch.d.ts +18 -0
  283. package/dist/web-settings-patch.js +51 -0
  284. package/dist/web-settings-patch.js.map +1 -1
  285. package/dist/web-shell-routes.d.ts +1 -1
  286. package/dist/web-shell-routes.js +1 -1
  287. package/dist/web-shell-routes.js.map +1 -1
  288. package/dist/web-theme-store.d.ts +218 -0
  289. package/dist/web-theme-store.js +516 -0
  290. package/dist/web-theme-store.js.map +1 -0
  291. package/dist/web-theme.d.ts +121 -0
  292. package/dist/web-theme.js +407 -0
  293. package/dist/web-theme.js.map +1 -0
  294. package/dist/web-widget.d.ts +72 -0
  295. package/dist/web-widget.js +245 -0
  296. package/dist/web-widget.js.map +1 -0
  297. package/package.json +1 -1
  298. package/templates/systemd.service.ejs +8 -0
@@ -0,0 +1,245 @@
1
+ /**
2
+ * #1629 r4-4 (option A, the user's choice 2026-10-16): a widget is **declarative**. A mod supplies a small closed spec
3
+ * (which host components, in which order, with which labels) and data (the values they show); the page draws them
4
+ * with its own components (src/ui/shared/agent-widget.js). Nothing from a mod is HTML, script, an event handler, a
5
+ * URL or CSS: styling comes only from the agent's theme tokens and a person's own stylesheet, as everywhere else.
6
+ *
7
+ * Slots (r4 §2): `chat_header` and `details` are the agent's own areas (it, or a person, places a widget there);
8
+ * `sidebar` is the person's (their synced preference, never an agent's). A value is either the mod's (`key` → data)
9
+ * or one the page already shows (`bind`): the instance's own state, context and cost, and — in the person's sidebar
10
+ * only — the fleet's counts. The page resolves a bind from what it already has; nothing new is sent for it.
11
+ *
12
+ * One module validates and canonicalises both; the store keeps only what this returns, and the page checks again.
13
+ */
14
+ import { createHash } from "node:crypto";
15
+ import { canonicalText } from "./web-theme.js";
16
+ export const WIDGET_SLOTS = ["chat_header", "details", "sidebar"];
17
+ /** The agent's own slots. `sidebar` is a person's (owner_slot for an agent). */
18
+ export const AGENT_WIDGET_SLOTS = ["chat_header", "details"];
19
+ export const WIDGET_ITEM_TYPES = ["stat", "progress", "text", "list", "badge", "spark"];
20
+ export const WIDGET_TONES = ["ok", "warn", "bad", "info", "muted"];
21
+ /** Values the page already has for the instance itself (its status frame entry). */
22
+ export const INSTANCE_BINDS = ["state", "context_pct", "cost_usd"];
23
+ /** The fleet's counts: the person's sidebar only (an agent's widget never sees another instance). */
24
+ export const FLEET_BINDS = ["fleet.idle", "fleet.working", "fleet.needs_you", "fleet.stopped"];
25
+ /** The chat header is one short strip: at most 4 compact items, and no list or sparkline. */
26
+ export const SLOT_RULES = {
27
+ chat_header: { maxItems: 4, types: ["stat", "progress", "text", "badge"], binds: INSTANCE_BINDS },
28
+ details: { maxItems: 8, types: WIDGET_ITEM_TYPES, binds: INSTANCE_BINDS },
29
+ sidebar: { maxItems: 8, types: WIDGET_ITEM_TYPES, binds: FLEET_BINDS },
30
+ };
31
+ /** Which binds each component can show (a bind is a number or a state word). */
32
+ const BINDS_FOR = {
33
+ stat: ["context_pct", "cost_usd", ...FLEET_BINDS],
34
+ progress: ["context_pct"],
35
+ text: ["state"],
36
+ badge: ["state"],
37
+ list: [],
38
+ spark: [],
39
+ };
40
+ /** Every key an item of that type may carry (closed). */
41
+ const ITEM_KEYS = {
42
+ stat: ["type", "label", "key", "bind", "unit"],
43
+ progress: ["type", "label", "key", "bind", "max"],
44
+ text: ["type", "label", "key", "bind"],
45
+ list: ["type", "label", "key"],
46
+ badge: ["type", "label", "key", "bind", "tone", "tones"],
47
+ spark: ["type", "label", "key"],
48
+ };
49
+ /** A label is required where the value alone would mean nothing. */
50
+ const LABEL_REQUIRED = new Set(["stat", "progress", "spark"]);
51
+ export const WIDGET_TITLE_MAX = 24;
52
+ export const WIDGET_LABEL_MAX = 24;
53
+ export const WIDGET_UNIT_MAX = 8;
54
+ export const WIDGET_TEXT_MAX = 120;
55
+ export const WIDGET_LIST_ITEMS = 6;
56
+ export const WIDGET_LIST_TEXT_MAX = 60;
57
+ export const WIDGET_SPARK_POINTS = 48;
58
+ export const WIDGET_TONES_MAX = 8;
59
+ export const WIDGET_NUMBER_MAX = 1e15;
60
+ /** Canonical JSON bytes: the spec, and the data. */
61
+ export const WIDGET_SPEC_MAX_BYTES = 2048;
62
+ export const WIDGET_DATA_MAX_BYTES = 4096;
63
+ const KEY = /^[a-z][a-z0-9_]{0,31}$/;
64
+ const isObj = (v) => typeof v === "object" && v !== null && !Array.isArray(v) && Object.getPrototypeOf(v) === Object.prototype;
65
+ const bytesOf = (v) => Buffer.byteLength(JSON.stringify(v), "utf8");
66
+ const isNumber = (v) => typeof v === "number" && Number.isFinite(v) && Math.abs(v) <= WIDGET_NUMBER_MAX;
67
+ /** A null-prototype map, so "__proto__" is an ordinary key. */
68
+ function ownMap() { return Object.create(null); }
69
+ function put(o, k, v) { Object.defineProperty(o, k, { value: v, enumerable: true, writable: true, configurable: true }); }
70
+ /** A spec for `slot`, closed and canonical: unknown keys, types, binds or a component the slot can't hold are refused. */
71
+ export function checkWidgetSpec(raw, slot) {
72
+ const errors = [];
73
+ const bad = (path, problem) => { errors.push({ path, problem }); };
74
+ if (!isObj(raw))
75
+ return { ok: false, errors: [{ path: "spec", problem: "an object { v: 1, title, items }" }] };
76
+ for (const k of Object.keys(raw))
77
+ if (!["v", "title", "items"].includes(k))
78
+ bad(k, "unknown key");
79
+ if (raw.v !== 1)
80
+ bad("v", "must be 1");
81
+ const title = canonicalText(raw.title, 1, WIDGET_TITLE_MAX);
82
+ if (title === null)
83
+ bad("title", `1..${WIDGET_TITLE_MAX} characters on one line`);
84
+ const rules = SLOT_RULES[slot];
85
+ const items = [];
86
+ if (!Array.isArray(raw.items) || raw.items.length < 1 || raw.items.length > rules.maxItems)
87
+ bad("items", `1..${rules.maxItems} items in ${slot}`);
88
+ else
89
+ raw.items.forEach((it, i) => {
90
+ const at = `items.${i}`;
91
+ if (!isObj(it)) {
92
+ bad(at, "an object");
93
+ return;
94
+ }
95
+ const type = it.type;
96
+ if (!WIDGET_ITEM_TYPES.includes(type)) {
97
+ bad(`${at}.type`, WIDGET_ITEM_TYPES.join(" | "));
98
+ return;
99
+ }
100
+ if (!rules.types.includes(type)) {
101
+ bad(`${at}.type`, `not in ${slot} (${rules.types.join(", ")})`);
102
+ return;
103
+ }
104
+ for (const k of Object.keys(it))
105
+ if (!ITEM_KEYS[type].includes(k))
106
+ bad(`${at}.${k}`, "unknown key");
107
+ const out = { type };
108
+ if (it.label !== undefined || LABEL_REQUIRED.has(type)) {
109
+ const label = canonicalText(it.label, 1, WIDGET_LABEL_MAX);
110
+ if (label === null)
111
+ bad(`${at}.label`, `1..${WIDGET_LABEL_MAX} characters on one line`);
112
+ else
113
+ out.label = label;
114
+ }
115
+ const hasKey = it.key !== undefined, hasBind = it.bind !== undefined;
116
+ if (hasKey === hasBind)
117
+ bad(at, "exactly one of key (your data) or bind (a value the page has)");
118
+ if (hasKey) {
119
+ if (typeof it.key === "string" && KEY.test(it.key))
120
+ out.key = it.key;
121
+ else
122
+ bad(`${at}.key`, "a-z, 0-9 and _ (1..32, starting with a letter)");
123
+ }
124
+ if (hasBind) {
125
+ const b = it.bind;
126
+ if (!BINDS_FOR[type].includes(b))
127
+ bad(`${at}.bind`, BINDS_FOR[type].length ? `${type} shows ${BINDS_FOR[type].join(", ")}` : `${type} has no bind`);
128
+ else if (!rules.binds.includes(b))
129
+ bad(`${at}.bind`, `not in ${slot}`);
130
+ else
131
+ out.bind = b;
132
+ }
133
+ if (it.unit !== undefined) {
134
+ const u = canonicalText(it.unit, 1, WIDGET_UNIT_MAX);
135
+ if (u === null)
136
+ bad(`${at}.unit`, `1..${WIDGET_UNIT_MAX} characters`);
137
+ else
138
+ out.unit = u;
139
+ }
140
+ if (it.max !== undefined) {
141
+ if (isNumber(it.max) && it.max > 0)
142
+ out.max = it.max;
143
+ else
144
+ bad(`${at}.max`, "a number > 0");
145
+ }
146
+ if (it.tone !== undefined) {
147
+ if (WIDGET_TONES.includes(it.tone))
148
+ out.tone = it.tone;
149
+ else
150
+ bad(`${at}.tone`, WIDGET_TONES.join(" | "));
151
+ }
152
+ if (it.tones !== undefined) {
153
+ if (!isObj(it.tones) || Object.keys(it.tones).length < 1 || Object.keys(it.tones).length > WIDGET_TONES_MAX)
154
+ bad(`${at}.tones`, `1..${WIDGET_TONES_MAX} entries { value: tone }`);
155
+ else {
156
+ const tones = ownMap();
157
+ for (const [k, v] of Object.entries(it.tones)) {
158
+ const word = canonicalText(k, 1, WIDGET_LABEL_MAX);
159
+ if (word === null || !WIDGET_TONES.includes(v)) {
160
+ bad(`${at}.tones`, `each value 1..${WIDGET_LABEL_MAX} characters → ${WIDGET_TONES.join(" | ")}`);
161
+ break;
162
+ }
163
+ put(tones, word, v);
164
+ }
165
+ out.tones = tones;
166
+ }
167
+ }
168
+ items.push(out);
169
+ });
170
+ if (errors.length)
171
+ return { ok: false, errors };
172
+ const spec = { v: 1, title: title, items };
173
+ if (bytesOf(spec) > WIDGET_SPEC_MAX_BYTES)
174
+ return { ok: false, errors: [{ path: "spec", problem: `at most ${WIDGET_SPEC_MAX_BYTES} bytes` }] };
175
+ return { ok: true, value: spec };
176
+ }
177
+ /** Whether `v` is a value an item of `type` can show (the same rule on the page). */
178
+ export function valueFits(type, v) {
179
+ switch (type) {
180
+ case "stat": return isNumber(v) || canonicalText(v, 1, WIDGET_LABEL_MAX) !== null;
181
+ case "progress": return isNumber(v);
182
+ case "text": return canonicalText(v, 1, WIDGET_TEXT_MAX) !== null;
183
+ case "badge": return canonicalText(v, 1, WIDGET_LABEL_MAX) !== null;
184
+ case "list": return Array.isArray(v) && v.length >= 1 && v.length <= WIDGET_LIST_ITEMS && v.every(s => canonicalText(s, 1, WIDGET_LIST_TEXT_MAX) !== null);
185
+ case "spark": return Array.isArray(v) && v.length >= 2 && v.length <= WIDGET_SPARK_POINTS && v.every(isNumber);
186
+ }
187
+ }
188
+ const normalized = (v) => typeof v === "string" ? v.normalize("NFC") : Array.isArray(v) ? v.map(x => typeof x === "string" ? x.normalize("NFC") : x) : v;
189
+ /** Data for `spec`: closed to the keys the spec names, each value fitting every item that shows it. */
190
+ export function checkWidgetData(raw, spec) {
191
+ if (!isObj(raw))
192
+ return { ok: false, errors: [{ path: "data", problem: "an object { key: value }" }] };
193
+ const users = new Map();
194
+ for (const it of spec.items)
195
+ if (it.key)
196
+ users.set(it.key, [...(users.get(it.key) ?? []), it.type]);
197
+ const errors = [];
198
+ const out = ownMap();
199
+ for (const [k, v] of Object.entries(raw)) {
200
+ const types = users.get(k);
201
+ if (!types) {
202
+ errors.push({ path: `data.${k.slice(0, 40)}`, problem: "no item shows this key" });
203
+ continue;
204
+ }
205
+ const bad = types.find(t => !valueFits(t, v));
206
+ if (bad) {
207
+ errors.push({ path: `data.${k}`, problem: `not a value a ${bad} shows` });
208
+ continue;
209
+ }
210
+ put(out, k, normalized(v));
211
+ }
212
+ if (errors.length)
213
+ return { ok: false, errors };
214
+ if (bytesOf(out) > WIDGET_DATA_MAX_BYTES)
215
+ return { ok: false, errors: [{ path: "data", problem: `at most ${WIDGET_DATA_MAX_BYTES} bytes` }] };
216
+ return { ok: true, value: out };
217
+ }
218
+ /** `patch` over `prev`: a key set to null is removed; the result is checked whole. */
219
+ export function mergeWidgetData(prev, patch, spec) {
220
+ if (!isObj(patch))
221
+ return { ok: false, errors: [{ path: "data", problem: "an object { key: value | null }" }] };
222
+ const next = ownMap();
223
+ for (const [k, v] of Object.entries(prev))
224
+ put(next, k, v);
225
+ for (const [k, v] of Object.entries(patch)) {
226
+ if (v === null)
227
+ delete next[k];
228
+ else
229
+ put(next, k, v);
230
+ }
231
+ return checkWidgetData({ ...next }, spec);
232
+ }
233
+ /** The data kept when a spec changes: each value that still fits the new spec. */
234
+ export function carryWidgetData(prev, spec) {
235
+ const out = ownMap();
236
+ for (const [k, v] of Object.entries(prev))
237
+ if (checkWidgetData({ [k]: v }, spec).ok)
238
+ put(out, k, v);
239
+ return out;
240
+ }
241
+ /** A spec's id: its content (canonical JSON). The same spec in two bundles is the same widget. */
242
+ export function widgetId(spec) {
243
+ return createHash("sha256").update(JSON.stringify(spec)).digest("hex").slice(0, 32);
244
+ }
245
+ //# sourceMappingURL=web-widget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-widget.js","sourceRoot":"","sources":["../src/web-widget.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,aAAa,EAAE,SAAS,EAAE,SAAS,CAAU,CAAC;AAE3E,gFAAgF;AAChF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,aAAa,EAAE,SAAS,CAAU,CAAC;AAGtE,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAU,CAAC;AAEjG,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAU,CAAC;AAE5E,oFAAoF;AACpF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,aAAa,EAAE,UAAU,CAAU,CAAC;AAC5E,qGAAqG;AACrG,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,eAAe,CAAU,CAAC;AAGxG,6FAA6F;AAC7F,MAAM,CAAC,MAAM,UAAU,GAA6G;IAClI,WAAW,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE;IACjG,OAAO,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,cAAc,EAAE;IACzE,OAAO,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,WAAW,EAAE;CACvE,CAAC;AACF,gFAAgF;AAChF,MAAM,SAAS,GAAkD;IAC/D,IAAI,EAAE,CAAC,aAAa,EAAE,UAAU,EAAE,GAAG,WAAW,CAAC;IACjD,QAAQ,EAAE,CAAC,aAAa,CAAC;IACzB,IAAI,EAAE,CAAC,OAAO,CAAC;IACf,KAAK,EAAE,CAAC,OAAO,CAAC;IAChB,IAAI,EAAE,EAAE;IACR,KAAK,EAAE,EAAE;CACV,CAAC;AACF,yDAAyD;AACzD,MAAM,SAAS,GAA8C;IAC3D,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC;IAC9C,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC;IACjD,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC;IACtC,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC;IAC9B,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC;IACxD,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC;CAChC,CAAC;AACF,oEAAoE;AACpE,MAAM,cAAc,GAAgC,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;AAE3F,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAC;AACnC,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAC;AACnC,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC;AACjC,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,CAAC;AACnC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AACnC,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AACvC,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,CAAC;AACtC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAClC,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AACtC,oDAAoD;AACpD,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAC1C,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAC1C,MAAM,GAAG,GAAG,wBAAwB,CAAC;AAkBrC,MAAM,KAAK,GAAG,CAAC,CAAU,EAAgC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,SAAS,CAAC;AACtK,MAAM,OAAO,GAAG,CAAC,CAAU,EAAU,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AACrF,MAAM,QAAQ,GAAG,CAAC,CAAU,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,iBAAiB,CAAC;AAC9H,+DAA+D;AAC/D,SAAS,MAAM,KAA2B,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAsB,CAAC,CAAC,CAAC;AAC5F,SAAS,GAAG,CAAI,CAAoB,EAAE,CAAS,EAAE,CAAI,IAAU,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAEjK,0HAA0H;AAC1H,MAAM,UAAU,eAAe,CAAC,GAAY,EAAE,IAAgB;IAC5D,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,OAAe,EAAE,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACnF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,kCAAkC,EAAE,CAAC,EAAE,CAAC;IAC/G,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,IAAI,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,GAAG,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;IAClG,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC;QAAE,GAAG,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,gBAAgB,CAAC,CAAC;IAC5D,IAAI,KAAK,KAAK,IAAI;QAAE,GAAG,CAAC,OAAO,EAAE,MAAM,gBAAgB,yBAAyB,CAAC,CAAC;IAClF,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,QAAQ;QAAE,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,CAAC,QAAQ,aAAa,IAAI,EAAE,CAAC,CAAC;;QAC7I,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;YAC/B,MAAM,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;gBAAC,GAAG,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YACjD,MAAM,IAAI,GAAG,EAAE,CAAC,IAAsB,CAAC;YACvC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAAC,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YACpG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAAC,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,IAAI,KAAK,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YAC7G,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gBAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;oBAAE,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;YACpG,MAAM,GAAG,GAAe,EAAE,IAAI,EAAE,CAAC;YACjC,IAAI,EAAE,CAAC,KAAK,KAAK,SAAS,IAAI,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvD,MAAM,KAAK,GAAG,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,gBAAgB,CAAC,CAAC;gBAC3D,IAAI,KAAK,KAAK,IAAI;oBAAE,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,gBAAgB,yBAAyB,CAAC,CAAC;;oBAAM,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC;YAClH,CAAC;YACD,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,KAAK,SAAS,EAAE,OAAO,GAAG,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC;YACrE,IAAI,MAAM,KAAK,OAAO;gBAAE,GAAG,CAAC,EAAE,EAAE,+DAA+D,CAAC,CAAC;YACjG,IAAI,MAAM,EAAE,CAAC;gBAAC,IAAI,OAAO,EAAE,CAAC,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;oBAAE,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC;;oBAAM,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,gDAAgD,CAAC,CAAC;YAAC,CAAC;YAC9J,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,CAAC,GAAG,EAAE,CAAC,IAAkB,CAAC;gBAChC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;oBAAE,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,UAAU,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,cAAc,CAAC,CAAC;qBAC/I,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;oBAAE,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,IAAI,EAAE,CAAC,CAAC;;oBAClE,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;YACpB,CAAC;YACD,IAAI,EAAE,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAAC,MAAM,CAAC,GAAG,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC;gBAAC,IAAI,CAAC,KAAK,IAAI;oBAAE,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,eAAe,aAAa,CAAC,CAAC;;oBAAM,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;YAAC,CAAC;YAC9K,IAAI,EAAE,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;gBAAC,IAAI,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC;oBAAE,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC;;oBAAM,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;YAAC,CAAC;YAC1H,IAAI,EAAE,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAkB,CAAC;oBAAE,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,IAAkB,CAAC;;oBAAM,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAAC,CAAC;YACpK,IAAI,EAAE,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBAC3B,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,gBAAgB;oBAAE,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,gBAAgB,0BAA0B,CAAC,CAAC;qBAC7K,CAAC;oBACJ,MAAM,KAAK,GAAG,MAAM,EAAc,CAAC;oBACnC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC9C,MAAM,IAAI,GAAG,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,gBAAgB,CAAC,CAAC;wBACnD,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAe,CAAC,EAAE,CAAC;4BAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,iBAAiB,gBAAgB,iBAAiB,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;4BAAC,MAAM;wBAAC,CAAC;wBAC1K,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,CAAe,CAAC,CAAC;oBACpC,CAAC;oBACD,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC;gBACpB,CAAC;YACH,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAChD,MAAM,IAAI,GAAe,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,KAAM,EAAE,KAAK,EAAE,CAAC;IACxD,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,qBAAqB;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,qBAAqB,QAAQ,EAAE,CAAC,EAAE,CAAC;IAC/I,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACnC,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,SAAS,CAAC,IAAoB,EAAE,CAAU;IACxD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,MAAM,CAAC,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,gBAAgB,CAAC,KAAK,IAAI,CAAC;QAClF,KAAK,UAAU,CAAC,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;QACpC,KAAK,MAAM,CAAC,CAAC,OAAO,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,eAAe,CAAC,KAAK,IAAI,CAAC;QAClE,KAAK,OAAO,CAAC,CAAC,OAAO,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,gBAAgB,CAAC,KAAK,IAAI,CAAC;QACpE,KAAK,MAAM,CAAC,CAAC,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,iBAAiB,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,oBAAoB,CAAC,KAAK,IAAI,CAAC,CAAC;QAC3J,KAAK,OAAO,CAAC,CAAC,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,mBAAmB,IAAI,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACjH,CAAC;AACH,CAAC;AACD,MAAM,UAAU,GAAG,CAAC,CAAc,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAA4B,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;AAE9N,uGAAuG;AACvG,MAAM,UAAU,eAAe,CAAC,GAAY,EAAE,IAAgB;IAC5D,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC,EAAE,CAAC;IACvG,MAAM,KAAK,GAAG,IAAI,GAAG,EAA4B,CAAC;IAClD,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,KAAK;QAAE,IAAI,EAAE,CAAC,GAAG;YAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACpG,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,MAAM,GAAG,GAAG,MAAM,EAAe,CAAC;IAClC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,CAAC,KAAK,EAAE,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QAC7G,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,GAAG,EAAE,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,OAAO,EAAE,iBAAiB,GAAG,QAAQ,EAAE,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QACjG,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,UAAU,CAAC,CAAgB,CAAC,CAAC,CAAC;IAC5C,CAAC;IACD,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAChD,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,qBAAqB;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,qBAAqB,QAAQ,EAAE,CAAC,EAAE,CAAC;IAC9I,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AAClC,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,eAAe,CAAC,IAAgB,EAAE,KAAc,EAAE,IAAgB;IAChF,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,iCAAiC,EAAE,CAAC,EAAE,CAAC;IAChH,MAAM,IAAI,GAAG,MAAM,EAAW,CAAC;IAC/B,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3D,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAAC,IAAI,CAAC,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;;YAAM,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAAC,CAAC;IACrG,OAAO,eAAe,CAAC,EAAE,GAAG,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;AAC5C,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,eAAe,CAAC,IAAgB,EAAE,IAAgB;IAChE,MAAM,GAAG,GAAG,MAAM,EAAe,CAAC;IAClC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,IAAI,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,EAAE;YAAE,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACpG,OAAO,GAAG,CAAC;AACb,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,QAAQ,CAAC,IAAgB;IACvC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACtF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@songsid/agend",
3
- "version": "2.2.0",
3
+ "version": "2.3.0-beta.2",
4
4
  "description": "Multi-agent fleet daemon — run coding CLIs (Claude, Muse, Codex, OpenCode) from Discord or Telegram",
5
5
  "type": "module",
6
6
  "bin": {
@@ -47,6 +47,14 @@ KillMode=mixed
47
47
  # server and every CLI the fleet starts. LimitCORE=0 covers a file core_pattern.
48
48
  CoredumpFilter=0
49
49
  LimitCORE=0
50
+ # One OOM-killed process must not take the fleet with it (#2015). With the
51
+ # default OOMPolicy=stop, a kernel OOM kill of ANY process in this cgroup (an
52
+ # agent's one-off script, 2026-10-17) stopped the whole unit: every CLI, tmux
53
+ # and the fleet. With continue only that process dies: a killed CLI is a crash
54
+ # the fleet restarts, a killed tool child is an error its CLI sees, and a killed
55
+ # fleet process is a failed main process that Restart=on-failure brings back.
56
+ # systemd before 243 does not know the key and ignores it (with a warning).
57
+ OOMPolicy=continue
50
58
  StandardOutput=append:<%= logPath %>
51
59
  StandardError=append:<%= logPath %>
52
60