@stratusagent/agents 0.11.4 → 0.11.5
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.
- package/dist/define.d.ts +22 -0
- package/dist/define.d.ts.map +1 -0
- package/dist/define.js +64 -0
- package/dist/define.js.map +1 -0
- package/dist/frontmatter.d.ts +65 -0
- package/dist/frontmatter.d.ts.map +1 -0
- package/dist/frontmatter.js +260 -0
- package/dist/frontmatter.js.map +1 -0
- package/dist/identity.d.ts +139 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +259 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +11 -654
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -1641
- package/dist/index.js.map +1 -1
- package/dist/router.d.ts +18 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +44 -0
- package/dist/router.js.map +1 -0
- package/dist/schedules.d.ts +163 -0
- package/dist/schedules.d.ts.map +1 -0
- package/dist/schedules.js +215 -0
- package/dist/schedules.js.map +1 -0
- package/dist/skills.d.ts +135 -0
- package/dist/skills.d.ts.map +1 -0
- package/dist/skills.js +167 -0
- package/dist/skills.js.map +1 -0
- package/dist/soul.d.ts +44 -0
- package/dist/soul.d.ts.map +1 -0
- package/dist/soul.js +98 -0
- package/dist/soul.js.map +1 -0
- package/dist/tools/delegate.d.ts +93 -0
- package/dist/tools/delegate.d.ts.map +1 -0
- package/dist/tools/delegate.js +223 -0
- package/dist/tools/delegate.js.map +1 -0
- package/dist/tools/gateway-only.d.ts +19 -0
- package/dist/tools/gateway-only.d.ts.map +1 -0
- package/dist/tools/gateway-only.js +29 -0
- package/dist/tools/gateway-only.js.map +1 -0
- package/dist/tools/memory.d.ts +51 -0
- package/dist/tools/memory.d.ts.map +1 -0
- package/dist/tools/memory.js +306 -0
- package/dist/tools/memory.js.map +1 -0
- package/dist/tools/message.d.ts +26 -0
- package/dist/tools/message.d.ts.map +1 -0
- package/dist/tools/message.js +46 -0
- package/dist/tools/message.js.map +1 -0
- package/dist/tools/schedule.d.ts +20 -0
- package/dist/tools/schedule.d.ts.map +1 -0
- package/dist/tools/schedule.js +146 -0
- package/dist/tools/schedule.js.map +1 -0
- package/package.json +2 -2
package/dist/identity.js
ADDED
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
// First names only — agents should feel like a teammate you call by name.
|
|
2
|
+
// Uniqueness comes from the generated id suffix, never from the name.
|
|
3
|
+
const AGENT_NAMES = [
|
|
4
|
+
'Ada', 'Amara', 'Arlo', 'Asha', 'August', 'Beatrix', 'Caleb', 'Camila',
|
|
5
|
+
'Dara', 'Devon', 'Eleni', 'Elio', 'Esme', 'Felix', 'Freya', 'Gideon',
|
|
6
|
+
'Hana', 'Hugo', 'Imani', 'Ines', 'Jasper', 'Juno', 'Kai', 'Kira',
|
|
7
|
+
'Leandro', 'Lucia', 'Mabel', 'Mateo', 'Nadia', 'Nico', 'Odessa', 'Otis',
|
|
8
|
+
'Priya', 'Quinn', 'Rafael', 'Romy', 'Sana', 'Silas', 'Tamsin', 'Theo',
|
|
9
|
+
'Uma', 'Vera', 'Wesley', 'Xiomara', 'Yusuf', 'Zadie',
|
|
10
|
+
'Alba', 'Bruno', 'Celia', 'Dashiell', 'Edie', 'Ferris', 'Greta', 'Hollis',
|
|
11
|
+
'Ida', 'Jules', 'Koa', 'Lior', 'Marisol', 'Nyla', 'Oren', 'Paloma',
|
|
12
|
+
'Reza', 'Sunny', 'Tobias', 'Vada', 'Wren', 'Yara', 'Zeke',
|
|
13
|
+
];
|
|
14
|
+
/**
|
|
15
|
+
* The one house style every Stratus agent avatar is drawn in. Surfaces
|
|
16
|
+
* (CLI, web, macOS) render this style; agents differ by their name-derived
|
|
17
|
+
* hue and palette, so the team looks cohesive while each member is
|
|
18
|
+
* recognizable.
|
|
19
|
+
*/
|
|
20
|
+
export const AVATAR_STYLE = 'stratus';
|
|
21
|
+
/** Deterministic 32-bit hash so the same seed always yields the same identity. */
|
|
22
|
+
const hashSeed = (seed) => {
|
|
23
|
+
let hash = 2166136261;
|
|
24
|
+
for (let index = 0; index < seed.length; index += 1) {
|
|
25
|
+
hash ^= seed.charCodeAt(index);
|
|
26
|
+
hash = Math.imul(hash, 16777619);
|
|
27
|
+
}
|
|
28
|
+
return hash >>> 0;
|
|
29
|
+
};
|
|
30
|
+
const hslToHex = (hue, saturation, lightness) => {
|
|
31
|
+
const s = saturation / 100;
|
|
32
|
+
const l = lightness / 100;
|
|
33
|
+
const k = (n) => (n + hue / 30) % 12;
|
|
34
|
+
const a = s * Math.min(l, 1 - l);
|
|
35
|
+
const channel = (n) => {
|
|
36
|
+
const value = l - a * Math.max(-1, Math.min(k(n) - 3, Math.min(9 - k(n), 1)));
|
|
37
|
+
return Math.round(value * 255).toString(16).padStart(2, '0');
|
|
38
|
+
};
|
|
39
|
+
return `#${channel(0)}${channel(8)}${channel(4)}`;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Generate a human-ish first name. Deterministic when a seed is supplied;
|
|
43
|
+
* random otherwise.
|
|
44
|
+
*/
|
|
45
|
+
export const generateAgentName = (seed) => {
|
|
46
|
+
const value = seed !== undefined
|
|
47
|
+
? hashSeed(seed)
|
|
48
|
+
: Math.floor(Math.random() * 0xffffffff);
|
|
49
|
+
return AGENT_NAMES[value % AGENT_NAMES.length] ?? 'Quinn';
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Derive an avatar theme from a name: a stable hue and a small palette in
|
|
53
|
+
* the shared Stratus house style. Consumers (CLI, web, macOS) draw the
|
|
54
|
+
* actual image from this so the agent looks the same on every surface.
|
|
55
|
+
*/
|
|
56
|
+
export const generateAvatarTheme = (name) => {
|
|
57
|
+
const value = hashSeed(name);
|
|
58
|
+
const hue = value % 360;
|
|
59
|
+
return {
|
|
60
|
+
seed: name,
|
|
61
|
+
hue,
|
|
62
|
+
palette: [
|
|
63
|
+
hslToHex(hue, 70, 55),
|
|
64
|
+
hslToHex((hue + 30) % 360, 65, 70),
|
|
65
|
+
hslToHex((hue + 180) % 360, 60, 45),
|
|
66
|
+
],
|
|
67
|
+
style: AVATAR_STYLE,
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
export const slugify = (name) => name
|
|
71
|
+
.toLowerCase()
|
|
72
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
73
|
+
.replace(/^-+|-+$/g, '') || 'agent';
|
|
74
|
+
/**
|
|
75
|
+
* The shape an id is *minted* in: lowercase alphanumerics and internal
|
|
76
|
+
* hyphens, starting with an alphanumeric. Everything `slugify` produces
|
|
77
|
+
* matches it, so every id this module derives does.
|
|
78
|
+
*
|
|
79
|
+
* Not what validation enforces. A hand-written `id:` predates any shape
|
|
80
|
+
* rule and `Ava_1` was as valid as `ava` — see `isValidAgentId`.
|
|
81
|
+
*/
|
|
82
|
+
export const AGENT_ID_PATTERN = /^[a-z0-9][a-z0-9-]*$/;
|
|
83
|
+
/**
|
|
84
|
+
* How long an id we *build* is allowed to get. A construction bound, not a
|
|
85
|
+
* validation rule — `isValidAgentId` deliberately does not check it.
|
|
86
|
+
*
|
|
87
|
+
* Every id derived from a long name predates this bound, and enforcing it
|
|
88
|
+
* retroactively drops working agents off the roster, while trimming them
|
|
89
|
+
* silently re-keys their sessions, memory, and credentials to an id nobody
|
|
90
|
+
* has ever used. So the bound applies where an id is minted fresh and
|
|
91
|
+
* nothing is keyed to it yet, and nowhere else. File systems still have
|
|
92
|
+
* limits, and an id long enough to hit them fails at the join with a name
|
|
93
|
+
* that says so.
|
|
94
|
+
*/
|
|
95
|
+
export const MAX_AGENT_ID_LENGTH = 64;
|
|
96
|
+
/**
|
|
97
|
+
* What an id may never be, whatever else it is: anything that stops being
|
|
98
|
+
* a single, addressable path segment. A separator escapes the directory,
|
|
99
|
+
* a leading dot hides the file or walks up out of it (`..`), and a control
|
|
100
|
+
* character is not typeable back.
|
|
101
|
+
*/
|
|
102
|
+
const PATH_UNSAFE_ID = /[/\\]|[\u0000-\u001f\u007f]/;
|
|
103
|
+
/**
|
|
104
|
+
* The safety half of every id rule here, shared because agent ids and
|
|
105
|
+
* session ids answer it identically and a second copy would drift from the
|
|
106
|
+
* first the next time one of them learned something.
|
|
107
|
+
*
|
|
108
|
+
* Safety only: what an id may never be. Shape — the slug pattern, a length
|
|
109
|
+
* bound — is per-kind and stays with the kind, because the reasons differ.
|
|
110
|
+
*/
|
|
111
|
+
const isAddressableId = (id) => id.length > 0
|
|
112
|
+
// Invisible leading or trailing space cannot be typed back reliably, so
|
|
113
|
+
// an id that is not its own trimmed self is a mistake, not a legacy.
|
|
114
|
+
&& id === id.trim()
|
|
115
|
+
&& !id.startsWith('.')
|
|
116
|
+
&& !PATH_UNSAFE_ID.test(id)
|
|
117
|
+
// An id keys plain objects too — `credentials.channels.slack[id]` among
|
|
118
|
+
// them — where an inherited name is not a free slot. `toString` reads as
|
|
119
|
+
// already connected with nothing stored, and `__proto__` assigns through
|
|
120
|
+
// to the prototype, so the write lands nowhere and `JSON.stringify` drops
|
|
121
|
+
// it. `in {}` names exactly that set, and names it by the property it
|
|
122
|
+
// has rather than by a list to keep in step.
|
|
123
|
+
&& !(id in {});
|
|
124
|
+
/**
|
|
125
|
+
* Whether `id` is safe to key an agent's resources and paths by.
|
|
126
|
+
*
|
|
127
|
+
* Ids are not labels. They key sessions, memory, credentials, Slack channel
|
|
128
|
+
* tokens, and every per-agent path on disk — and an explicit frontmatter
|
|
129
|
+
* `id` is untrusted input: a soul file travels with a repository, and in
|
|
130
|
+
* the hosted profile it comes from a tenant. `id: ../../escape` reaches
|
|
131
|
+
* every one of those joins intact, so it is stopped once here rather than
|
|
132
|
+
* defended at each of them.
|
|
133
|
+
*
|
|
134
|
+
* **Unsafe is the rule, not un-sluglike.** Nothing before this checked an
|
|
135
|
+
* explicit id at all, so `Ava_1`, `team.alpha`, and `AVA` are all out there
|
|
136
|
+
* keying real sessions and real credentials. Holding them to the shape ids
|
|
137
|
+
* are minted in would not make anything safer — none of them can leave
|
|
138
|
+
* their directory — and `loadRosterSouls` degrades a soul that will not
|
|
139
|
+
* parse to a warning, so the only thing it would accomplish is dropping
|
|
140
|
+
* those agents off the roster on upgrade, quietly, while their data stays
|
|
141
|
+
* behind under the old id. Reserving the slug shape for ids nobody has
|
|
142
|
+
* chosen yet costs nothing; imposing it on ids people are already using
|
|
143
|
+
* costs them their agent.
|
|
144
|
+
*
|
|
145
|
+
* Rejected, never sanitized: rewriting `../../escape` into `escape` hands
|
|
146
|
+
* back an agent nobody asked for, keyed to resources nobody named.
|
|
147
|
+
*/
|
|
148
|
+
// `*` is the delegate wildcard (`delegates: ['*']`), so an agent with that
|
|
149
|
+
// id could never be delegated to alone — reserved rather than ambiguous.
|
|
150
|
+
// Agent ids only: a session id is a broader address, and the wildcard means
|
|
151
|
+
// nothing there.
|
|
152
|
+
export const isValidAgentId = (id) => isAddressableId(id) && id !== '*';
|
|
153
|
+
/**
|
|
154
|
+
* Whether a `delegates` entry is one the soul can hold: any agent id, or
|
|
155
|
+
* the wildcard — the same rule as {@link isValidAgentId}, so every agent a
|
|
156
|
+
* roster can hold can be named as a target. Exported so the control API
|
|
157
|
+
* refuses a bad entry as the client's error rather than discovering it in
|
|
158
|
+
* the soul round-trip.
|
|
159
|
+
*/
|
|
160
|
+
export const isValidDelegateEntry = (entry) => entry === '*' || isValidAgentId(entry);
|
|
161
|
+
/**
|
|
162
|
+
* How much of a new session id is the *client's* to spend, on top of the
|
|
163
|
+
* agent id it addresses.
|
|
164
|
+
*
|
|
165
|
+
* Every id in circulation is a colon-joined address that embeds the agent
|
|
166
|
+
* id — `web:<agentId>:<uuid>` from the dashboard, a channel key of
|
|
167
|
+
* `<channel>:<agentId>:<team>:<conversation>:<thread>`, with a bare UUID
|
|
168
|
+
* from the CLI the one exception. So a flat cap is the wrong shape: agent
|
|
169
|
+
* ids are deliberately unbounded (see {@link isValidAgentId}), and a flat
|
|
170
|
+
* 200 refused every dashboard conversation for an agent whose id ran past
|
|
171
|
+
* 159 characters — an agent that stays on the roster and simply stops being
|
|
172
|
+
* chattable, which is the quiet-breakage failure the unbounded rule exists
|
|
173
|
+
* to avoid.
|
|
174
|
+
*
|
|
175
|
+
* Budgeting the composition instead keeps the bound meaningful without
|
|
176
|
+
* capping the agent id through the back door. It cannot be gamed to widen
|
|
177
|
+
* itself: the allowance comes from an agent id already checked against the
|
|
178
|
+
* roster, not from the caller's own string.
|
|
179
|
+
*/
|
|
180
|
+
export const MAX_SESSION_ID_LENGTH = 200;
|
|
181
|
+
/**
|
|
182
|
+
* Ids that are a client's bug rendered as text, not an address anyone chose.
|
|
183
|
+
*
|
|
184
|
+
* Each is what JavaScript prints when an id was never computed — an
|
|
185
|
+
* unresolved variable, a null field, arithmetic that went sideways, an
|
|
186
|
+
* object concatenated into a template. The dashboard shipped the first one:
|
|
187
|
+
* `/sessions/undefined/messages`, accepted, and a durable conversation
|
|
188
|
+
* literally named `undefined`.
|
|
189
|
+
*
|
|
190
|
+
* A blocklist rather than a pattern, because these are safe, well-formed
|
|
191
|
+
* strings — nothing about their *shape* is wrong, which is exactly why no
|
|
192
|
+
* shape rule catches them. Kept to the strings the language itself
|
|
193
|
+
* produces: guessing at what else looks like a mistake would start refusing
|
|
194
|
+
* ids people meant.
|
|
195
|
+
*/
|
|
196
|
+
const STRINGIFIED_NOTHING = new Set(['undefined', 'null', 'NaN', '[object Object]']);
|
|
197
|
+
/**
|
|
198
|
+
* Whether `id` may open a *new* conversation.
|
|
199
|
+
*
|
|
200
|
+
* Session ids are client-minted and a `POST` to an unknown one creates it,
|
|
201
|
+
* so this is the only thing standing between an HTTP caller and a durable
|
|
202
|
+
* row. `undefined`, `null`, and a bare space have all reached the session
|
|
203
|
+
* table through that door — the dashboard shipped the first of them.
|
|
204
|
+
*
|
|
205
|
+
* **Checked where an id is minted, never where one is used.** An id already
|
|
206
|
+
* in the store addresses a real conversation, whatever shape it is, and
|
|
207
|
+
* re-validating on read would lock someone out of their own history to
|
|
208
|
+
* enforce a rule that postdates it. Same reasoning as
|
|
209
|
+
* {@link MAX_AGENT_ID_LENGTH}, which is why the length bound lives here and
|
|
210
|
+
* not in {@link isValidAgentId}.
|
|
211
|
+
*
|
|
212
|
+
* `agentId` is the agent the id addresses, when the caller knows it — every
|
|
213
|
+
* client convention embeds it, so its length is part of the budget rather
|
|
214
|
+
* than something the bound gets to cap. The allowance applies only to an id
|
|
215
|
+
* that actually contains it, since those are the characters being paid for;
|
|
216
|
+
* a bare UUID and an unrelated string are both held to
|
|
217
|
+
* {@link MAX_SESSION_ID_LENGTH} alone, as they are when `agentId` is
|
|
218
|
+
* omitted.
|
|
219
|
+
*
|
|
220
|
+
* Shape is deliberately not enforced. Every id above is a legitimate
|
|
221
|
+
* address, and no pattern admitting all of them excludes `undefined` — so
|
|
222
|
+
* the safety rule, a bound, and {@link STRINGIFIED_NOTHING} are what catch
|
|
223
|
+
* the real mistakes. Rejected, never sanitized: trimming an id hands the
|
|
224
|
+
* caller back a conversation at an address it never asked for.
|
|
225
|
+
*/
|
|
226
|
+
export const isValidSessionId = (id, agentId) => isAddressableId(id)
|
|
227
|
+
// The allowance is for an id that actually *spends* those characters on
|
|
228
|
+
// the agent id. Granting it merely because the request names a long-id
|
|
229
|
+
// agent would let that agent's existence buy an unrelated caller 300 more
|
|
230
|
+
// characters of junk — the durable-garbage case the bound is here to stop.
|
|
231
|
+
&& id.length <= MAX_SESSION_ID_LENGTH
|
|
232
|
+
+ (agentId !== undefined && id.includes(agentId) ? agentId.length : 0)
|
|
233
|
+
&& !STRINGIFIED_NOTHING.has(id);
|
|
234
|
+
/**
|
|
235
|
+
* A freshly minted id, bounded — `base` trimmed so that appending `suffix`
|
|
236
|
+
* still fits, with any hyphen left dangling by the trim removed.
|
|
237
|
+
*
|
|
238
|
+
* Only for ids nothing is keyed to yet: a generated agent's
|
|
239
|
+
* name-plus-suffix, and `agent new` retrying a filename collision. Both mint
|
|
240
|
+
* an id in the same breath as the agent, so trimming takes nothing away.
|
|
241
|
+
* Shared rather than re-derived so the two do not each own half of the bound
|
|
242
|
+
* and drift. An id derived from a name someone chose does *not* come through
|
|
243
|
+
* here — that name may already have an agent behind it.
|
|
244
|
+
*/
|
|
245
|
+
export const agentIdWithSuffix = (base, suffix) => {
|
|
246
|
+
const tail = suffix ? `-${suffix}` : '';
|
|
247
|
+
const room = Math.max(1, MAX_AGENT_ID_LENGTH - tail.length);
|
|
248
|
+
return `${base.slice(0, room).replace(/-+$/, '') || 'agent'}${tail}`;
|
|
249
|
+
};
|
|
250
|
+
// Ids for generated names carry a short unique suffix: the name pool is
|
|
251
|
+
// small, and two agents that draw the same name must still be two people —
|
|
252
|
+
// memory and access scopes are keyed by id. Deterministic when seeded.
|
|
253
|
+
export const generatedIdSuffix = (seed) => {
|
|
254
|
+
const value = seed !== undefined
|
|
255
|
+
? hashSeed(`${seed}:id`)
|
|
256
|
+
: Math.floor(Math.random() * 0xffffffff);
|
|
257
|
+
return value.toString(36).padStart(4, '0').slice(0, 4);
|
|
258
|
+
};
|
|
259
|
+
//# sourceMappingURL=identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"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"}
|