@ai-matrx/agents 0.59.229 → 0.59.231

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.
@@ -1,25 +1,182 @@
1
+ // catalog/selectors.ts
2
+ function memoize1(fn) {
3
+ let lastA;
4
+ let last;
5
+ let has = false;
6
+ return (a) => {
7
+ if (!has || lastA !== a) {
8
+ last = fn(a);
9
+ lastA = a;
10
+ has = true;
11
+ }
12
+ return last;
13
+ };
14
+ }
15
+ function memoize2(fn) {
16
+ let lastA;
17
+ let lastB;
18
+ let last;
19
+ let has = false;
20
+ return (a, b) => {
21
+ if (!has || lastA !== a || lastB !== b) {
22
+ last = fn(a, b);
23
+ lastA = a;
24
+ lastB = b;
25
+ has = true;
26
+ }
27
+ return last;
28
+ };
29
+ }
30
+ var selectAllAgentCategories = memoize1(
31
+ (agents) => {
32
+ const cats = /* @__PURE__ */ new Set();
33
+ for (const a of agents) {
34
+ if (a.agentType === "user" && a.category) cats.add(a.category);
35
+ }
36
+ return Array.from(cats).sort();
37
+ }
38
+ );
39
+ var selectAllSystemAgentCategories = memoize1(
40
+ (agents) => {
41
+ const cats = /* @__PURE__ */ new Set();
42
+ for (const a of agents) {
43
+ if (a.agentType === "builtin" && a.category) cats.add(a.category);
44
+ }
45
+ return Array.from(cats).sort();
46
+ }
47
+ );
48
+ var selectAllAgentTags = memoize1(
49
+ (agents) => {
50
+ const tags = /* @__PURE__ */ new Set();
51
+ for (const a of agents) {
52
+ if (a.agentType === "user") a.tags?.forEach((t) => tags.add(t));
53
+ }
54
+ return Array.from(tags).sort();
55
+ }
56
+ );
57
+ var selectAllSystemAgentTags = memoize1(
58
+ (agents) => {
59
+ const tags = /* @__PURE__ */ new Set();
60
+ for (const a of agents) {
61
+ if (a.agentType === "builtin") a.tags?.forEach((t) => tags.add(t));
62
+ }
63
+ return Array.from(tags).sort();
64
+ }
65
+ );
66
+ var selectUserTypeAgents = memoize1(
67
+ (agents) => agents.filter((a) => a.agentType === "user")
68
+ );
69
+ var selectBuiltinTypeAgents = memoize1(
70
+ (agents) => agents.filter((a) => a.agentType === "builtin")
71
+ );
72
+ function agentMatchesArchiveFilter(agent, archFilter) {
73
+ if (archFilter === "active") return !agent.isArchived;
74
+ if (archFilter === "archived") return Boolean(agent.isArchived);
75
+ return true;
76
+ }
77
+ function countBuiltinRows(agents, archFilter) {
78
+ let n = 0;
79
+ for (const a of agents) {
80
+ if (a.agentType !== "builtin") continue;
81
+ if (!agentMatchesArchiveFilter(a, archFilter)) continue;
82
+ n += 1;
83
+ }
84
+ return n;
85
+ }
86
+ function countUserRows(agents, archFilter, predicate) {
87
+ let n = 0;
88
+ for (const a of agents) {
89
+ if (a.agentType !== "user") continue;
90
+ if (!agentMatchesArchiveFilter(a, archFilter)) continue;
91
+ if (predicate(a)) n += 1;
92
+ }
93
+ return n;
94
+ }
95
+ var isOwned = (a) => a.isOwner === true;
96
+ var isShared = (a) => a.isOwner === false && a.accessLevel != null;
97
+ var isAny = () => true;
98
+ var isFavorite = (a) => Boolean(a.isFavorite);
99
+ var selectAgentTabCounts = memoize2(
100
+ (agents, archFilter) => ({
101
+ mine: countUserRows(agents, archFilter, isOwned),
102
+ shared: countUserRows(agents, archFilter, isShared),
103
+ all: countUserRows(agents, archFilter, isAny),
104
+ system: countBuiltinRows(agents, archFilter)
105
+ })
106
+ );
107
+ var selectTotalUserAgentsCount = memoize1(
108
+ (agents) => countUserRows(agents, "active", isAny)
109
+ );
110
+ var selectTotalOwnedAgentsCount = memoize1(
111
+ (agents) => countUserRows(agents, "active", isOwned)
112
+ );
113
+ var selectTotalSharedAgentsCount = memoize1(
114
+ (agents) => countUserRows(agents, "active", isShared)
115
+ );
116
+ var selectTotalBuiltinAgentsCount = memoize1(
117
+ (agents) => countBuiltinRows(agents, "active")
118
+ );
119
+ var selectTotalFavoriteAgentsCount = memoize1(
120
+ (agents) => countUserRows(agents, "active", isFavorite)
121
+ );
122
+
1
123
  // quick/shape.ts
2
124
  var QUICK_AGENT_KIND = "quick";
3
125
  var QUICK_AGENT_TAG = "kind:quick";
4
- var QUICK_AGENT_BOUNDS = {
5
- temperature: { min: 0, max: 2, step: 0.1 },
6
- topP: { min: 0, max: 1, step: 0.05 },
7
- maxOutputTokens: { min: 256, max: 32768, step: 256 }
126
+ var QUICK_AGENT_KNOBS = {
127
+ temperatureMax: { feature: "agents.quick", key: "temperature_max" },
128
+ temperatureDefault: { feature: "agents.quick", key: "temperature_default" },
129
+ topPDefault: { feature: "agents.quick", key: "top_p_default" },
130
+ maxOutputMin: { feature: "agents.quick", key: "max_output_min" },
131
+ maxOutputMax: { feature: "agents.quick", key: "max_output_max" },
132
+ maxOutputDefault: { feature: "agents.quick", key: "max_output_default" }
8
133
  };
9
- var QUICK_AGENT_DEFAULT_SETTINGS = Object.freeze({
10
- temperature: 0.7,
11
- topP: 1,
12
- maxOutputTokens: 4096
13
- });
134
+ var isNum = (v) => typeof v === "number" && Number.isFinite(v);
135
+ function sliderStep(min, max) {
136
+ const raw = (max - min) / 100;
137
+ if (!(raw > 0)) return 1;
138
+ const pow = 10 ** Math.floor(Math.log10(raw));
139
+ const unit = raw / pow;
140
+ const nice = unit <= 1 ? 1 : unit <= 2 ? 2 : unit <= 5 ? 5 : 10;
141
+ return Number((nice * pow).toPrecision(6));
142
+ }
143
+ function limit(min, max, rest, whole) {
144
+ const step = whole ? Math.max(1, Math.round(sliderStep(min, max))) : sliderStep(min, max);
145
+ return { min, max, step, default: Math.min(max, Math.max(min, rest)) };
146
+ }
147
+ function resolveQuickAgentLimits(model, knobs) {
148
+ const t = model?.temperature;
149
+ const p = model?.top_p;
150
+ const m = model?.max_output_tokens;
151
+ const tMin = isNum(t?.min) ? t.min : 0;
152
+ const tMax = isNum(t?.max) ? t.max : knobs.temperatureMax;
153
+ const tRest = isNum(t?.default) ? t.default : knobs.temperatureDefault;
154
+ const pMin = isNum(p?.min) ? p.min : 0;
155
+ const pMax = isNum(p?.max) ? p.max : 1;
156
+ const pRest = isNum(p?.default) ? p.default : knobs.topPDefault;
157
+ const mMin = isNum(m?.min) ? m.min : knobs.maxOutputMin;
158
+ const mMax = isNum(m?.max) ? m.max : knobs.maxOutputMax;
159
+ const mRest = isNum(m?.default) ? m.default : knobs.maxOutputDefault;
160
+ if (!isNum(tMax) || !isNum(tRest) || !isNum(pRest) || !isNum(mMin) || !isNum(mMax) || !isNum(mRest)) return null;
161
+ if (tMax <= tMin || pMax <= pMin || mMax <= mMin) return null;
162
+ return {
163
+ temperature: limit(tMin, tMax, tRest, false),
164
+ topP: limit(pMin, pMax, pRest, false),
165
+ maxOutputTokens: limit(mMin, mMax, mRest, true)
166
+ };
167
+ }
168
+ function defaultQuickAgentSettings(limits) {
169
+ return { temperature: limits.temperature.default, topP: limits.topP.default, maxOutputTokens: limits.maxOutputTokens.default };
170
+ }
14
171
  function clamp(value, bound) {
15
172
  if (!Number.isFinite(value)) return bound.min;
16
173
  return Math.min(bound.max, Math.max(bound.min, value));
17
174
  }
18
- function clampQuickAgentSettings(settings) {
175
+ function clampQuickAgentSettings(settings, limits) {
19
176
  return {
20
- temperature: clamp(settings.temperature, QUICK_AGENT_BOUNDS.temperature),
21
- topP: clamp(settings.topP, QUICK_AGENT_BOUNDS.topP),
22
- maxOutputTokens: Math.round(clamp(settings.maxOutputTokens, QUICK_AGENT_BOUNDS.maxOutputTokens))
177
+ temperature: clamp(settings.temperature, limits.temperature),
178
+ topP: clamp(settings.topP, limits.topP),
179
+ maxOutputTokens: Math.round(clamp(settings.maxOutputTokens, limits.maxOutputTokens))
23
180
  };
24
181
  }
25
182
  function quickAgentProblems(def) {
@@ -30,44 +187,31 @@ function quickAgentProblems(def) {
30
187
  return problems;
31
188
  }
32
189
  function quickAgentSettingsJson(settings) {
33
- const s = clampQuickAgentSettings(settings);
34
- return { stream: true, temperature: s.temperature, top_p: s.topP, max_output_tokens: s.maxOutputTokens };
190
+ return { stream: true, temperature: settings.temperature, top_p: settings.topP, max_output_tokens: settings.maxOutputTokens };
35
191
  }
36
192
  function quickAgentMessages(systemPrompt) {
37
193
  return [{ role: "system", content: [{ type: "text", text: systemPrompt }] }];
38
194
  }
39
- function buildQuickAgentRow(def, owner) {
195
+ function quickAgentFields(def) {
40
196
  return {
41
- agent_type: "user",
42
197
  name: def.name.trim(),
43
- description: null,
44
198
  tags: [QUICK_AGENT_TAG],
45
- is_active: true,
46
- is_archived: false,
47
- model_id: def.modelId,
199
+ isActive: true,
200
+ isArchived: false,
201
+ modelId: def.modelId,
48
202
  messages: quickAgentMessages(def.systemPrompt),
49
203
  settings: quickAgentSettingsJson(def.settings),
50
- tools: [],
51
- metadata: { kind: QUICK_AGENT_KIND },
52
- created_by: owner.userId,
53
- organization_id: owner.organizationId
54
- };
55
- }
56
- function buildQuickAgentUpdate(def) {
57
- return {
58
- name: def.name.trim(),
59
- model_id: def.modelId,
60
- messages: quickAgentMessages(def.systemPrompt),
61
- settings: quickAgentSettingsJson(def.settings)
204
+ tools: []
62
205
  };
63
206
  }
64
207
  function num(value, fallback) {
65
208
  return typeof value === "number" && Number.isFinite(value) ? value : fallback;
66
209
  }
67
- function quickAgentFromRow(row) {
210
+ function quickAgentFromRow(row, defaults) {
68
211
  if (!row) return null;
69
212
  const metadata = row["metadata"];
70
- if (metadata?.["kind"] !== QUICK_AGENT_KIND) return null;
213
+ const tags = Array.isArray(row["tags"]) ? row["tags"] : [];
214
+ if (metadata?.["kind"] !== QUICK_AGENT_KIND && !tags.includes(QUICK_AGENT_TAG)) return null;
71
215
  const messages = Array.isArray(row["messages"]) ? row["messages"] : [];
72
216
  const system = messages.find((m) => m["role"] === "system");
73
217
  const parts = Array.isArray(system?.["content"]) ? system?.["content"] : [];
@@ -78,75 +222,54 @@ function quickAgentFromRow(row) {
78
222
  name: typeof row["name"] === "string" ? row["name"] : "",
79
223
  systemPrompt,
80
224
  modelId: typeof row["model_id"] === "string" ? row["model_id"] : "",
81
- settings: clampQuickAgentSettings({
82
- temperature: num(raw["temperature"], QUICK_AGENT_DEFAULT_SETTINGS.temperature),
83
- topP: num(raw["top_p"], QUICK_AGENT_DEFAULT_SETTINGS.topP),
84
- maxOutputTokens: num(raw["max_output_tokens"], QUICK_AGENT_DEFAULT_SETTINGS.maxOutputTokens)
85
- })
225
+ settings: {
226
+ temperature: num(raw["temperature"], defaults.temperature),
227
+ topP: num(raw["top_p"], defaults.topP),
228
+ maxOutputTokens: num(raw["max_output_tokens"], defaults.maxOutputTokens)
229
+ }
86
230
  };
87
231
  }
88
232
  function isQuickAgentSummary(row) {
89
233
  return row.tags.includes(QUICK_AGENT_TAG);
90
234
  }
235
+ function listQuickAgents(rows, userId) {
236
+ const live = (row) => isQuickAgentSummary(row) && !row.isArchived && row.isActive !== false;
237
+ const user = selectUserTypeAgents(rows).filter(live);
238
+ const mine = userId ? user.filter((row) => row.createdBy === userId) : [];
239
+ const organization = user.filter((row) => !mine.includes(row));
240
+ const system = selectBuiltinTypeAgents(rows).filter(live);
241
+ return { mine, organization, system };
242
+ }
91
243
  function listMyQuickAgents(rows, userId) {
92
- if (!userId) return [];
93
- return rows.filter((row) => isQuickAgentSummary(row) && row.createdBy === userId && !row.isArchived && row.isActive !== false);
244
+ const lanes = listQuickAgents(rows, userId);
245
+ return [...lanes.mine, ...lanes.organization, ...lanes.system];
94
246
  }
95
247
  function withoutQuickAgents(rows) {
96
248
  return rows.filter((row) => !isQuickAgentSummary(row));
97
249
  }
98
250
 
99
- // quick/writes.ts
100
- function refuse(def) {
101
- const problems = quickAgentProblems(def);
102
- if (problems.length > 0) throw new Error(problems[0]);
103
- }
104
- function fail(error) {
105
- throw new Error(error?.message ?? "The agent could not be saved.");
106
- }
107
- var table = (client) => client.schema("agent").from("definition");
108
- async function createQuickAgent(client, def, owner) {
109
- refuse(def);
110
- const { data, error } = await table(client).insert(buildQuickAgentRow(def, owner)).select().single();
111
- if (error) fail(error);
112
- const saved = quickAgentFromRow(data);
113
- if (!saved) fail(null);
114
- return saved;
115
- }
116
- async function updateQuickAgent(client, id, def) {
117
- refuse(def);
118
- const { data, error } = await table(client).update(buildQuickAgentUpdate(def)).eq("id", id).select().single();
119
- if (error) fail(error);
120
- const saved = quickAgentFromRow(data);
121
- if (!saved) fail(null);
122
- return saved;
123
- }
124
- async function deleteQuickAgent(client, id) {
125
- const { error } = await table(client).update({ deleted_at: (/* @__PURE__ */ new Date()).toISOString() }).eq("id", id);
126
- if (error) fail(error);
127
- }
128
- async function readQuickAgent(client, id) {
129
- const { data, error } = await table(client).select("id,name,model_id,messages,settings,metadata").eq("id", id).is("deleted_at", null).maybeSingle();
130
- if (error) fail(error);
131
- return quickAgentFromRow(data);
251
+ // quick/reads.ts
252
+ async function readQuickAgent(client, id, defaults) {
253
+ const { data, error } = await client.schema("agent").from("definition").select("id,name,model_id,messages,settings,tags,metadata").eq("id", id).is("deleted_at", null).maybeSingle();
254
+ if (error) throw new Error(error.message ?? "The agent could not be read.");
255
+ return quickAgentFromRow(data, defaults);
132
256
  }
133
257
  export {
134
- QUICK_AGENT_BOUNDS,
135
- QUICK_AGENT_DEFAULT_SETTINGS,
136
258
  QUICK_AGENT_KIND,
259
+ QUICK_AGENT_KNOBS,
137
260
  QUICK_AGENT_TAG,
138
- buildQuickAgentRow,
139
- buildQuickAgentUpdate,
140
261
  clampQuickAgentSettings,
141
- createQuickAgent,
142
- deleteQuickAgent,
262
+ defaultQuickAgentSettings,
143
263
  isQuickAgentSummary,
144
264
  listMyQuickAgents,
265
+ listQuickAgents,
266
+ quickAgentFields,
145
267
  quickAgentFromRow,
146
268
  quickAgentMessages,
147
269
  quickAgentProblems,
148
270
  quickAgentSettingsJson,
149
271
  readQuickAgent,
150
- updateQuickAgent,
272
+ resolveQuickAgentLimits,
273
+ sliderStep,
151
274
  withoutQuickAgents
152
275
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-matrx/agents",
3
- "version": "0.59.229",
3
+ "version": "0.59.231",
4
4
  "description": "Portable AI Matrx agent stream protocol, event projection, and safe result-presentation primitives.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -509,14 +509,14 @@
509
509
  "sideEffects": false,
510
510
  "dependencies": {
511
511
  "@ai-matrx/alchemy": "latest",
512
+ "@ai-matrx/api": "latest",
512
513
  "@ai-matrx/associations": "latest",
513
514
  "@ai-matrx/content-ir": "latest",
514
515
  "@ai-matrx/data": "latest",
515
516
  "@ai-matrx/design-system": "latest",
516
- "@ai-matrx/api": "latest",
517
517
  "@ai-matrx/diff": "latest",
518
- "@ai-matrx/icons": "latest",
519
- "@ai-matrx/kit": "latest"
518
+ "@ai-matrx/kit": "latest",
519
+ "@ai-matrx/icons": "latest"
520
520
  },
521
521
  "peerDependencies": {
522
522
  "react": ">=18.0.0",
@@ -561,5 +561,5 @@
561
561
  "verify:tarball": "node ./scripts/verify-tarball.mjs",
562
562
  "typegen:self-test": "node scripts/typegen/drop-guard.self-test.mjs && node scripts/typegen/check-api-types-fresh.mjs --self-test"
563
563
  },
564
- "gitHead": "3a8fce70c32ca93948e6ed86c8edfeb8546d7f06"
564
+ "gitHead": "93aada8319da70a8a2b3211c99935d3a44f9a0a3"
565
565
  }