eve-hub 0.6.23 → 0.6.25
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/CHANGELOG.md +12 -0
- package/package.json +1 -1
- package/stubs.mjs +5 -1
- package/sync-kit.mjs +9 -4
- package/templates/execution-context-hosted-main.md +1 -1
- package/templates/forms.md +3 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# eve-hub
|
|
2
2
|
|
|
3
|
+
## 0.6.25
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 6433096: The Forms guide names the shape by what the content is: a path through three or more parts, events across actors, numbers to compare, and time split into phases (a latency breakdown) as a schedule chart. Never prose steps, an arrow chain, a character drawing or one bar per total.
|
|
8
|
+
|
|
9
|
+
## 0.6.24
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- A hosted main keeps its dash and compact schedules: the deploy build and the kit bump write them into a repo that lacks them, and skip a stub whose slot the repo already authors in another source format (dash.mjs, dash.md), which eve would fail as two sources for one slot. Hosted dash has no PR data and compact has nothing to compact until hosted sessions record their last model call; prune stays off.
|
|
14
|
+
|
|
3
15
|
## 0.6.23
|
|
4
16
|
|
|
5
17
|
### Patch Changes
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eve-hub",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.25",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"description": "Bot-side code shared by every hub agent: registry tools, the roster hook, the eve channel, the host sandbox and browser, and model helpers.",
|
|
6
6
|
"type": "module",
|
package/stubs.mjs
CHANGED
|
@@ -53,9 +53,13 @@ export const MAIN_KIT_FILES = {
|
|
|
53
53
|
// the mention gate (the
|
|
54
54
|
// daemon's per-process HUB_AGENT and patched model credential), the tools that
|
|
55
55
|
// remove or restart bots on the hub's disk (a deployment changes its roster by
|
|
56
|
-
// commit; create_agent is that commit, made by the hosted hub), memory (the workspace's files), and main's
|
|
56
|
+
// commit; create_agent is that commit, made by the hosted hub), memory (the workspace's files), and main's prune schedule (it cleans the hub machine's disk).
|
|
57
|
+
// main's compact and dash schedules stay: off the hub's machine compact finds no session to compact
|
|
58
|
+
// (hosted sessions carry no last-model-call time), and dash has no PR data (its lookup runs `gh`).
|
|
57
59
|
export const DEPLOYED_KIT_FILES = new Set([
|
|
58
60
|
"channels/eve.ts",
|
|
61
|
+
"schedules/compact.ts",
|
|
62
|
+
"schedules/dash.ts",
|
|
59
63
|
"skills/onboarding-profile.ts",
|
|
60
64
|
"tools/onboarding_scripts.ts",
|
|
61
65
|
...["react", "show", "update_thread", "list_threads", "read_thread", "post_message"].map((t) => `tools/${t}.ts`),
|
package/sync-kit.mjs
CHANGED
|
@@ -12,14 +12,18 @@ import {
|
|
|
12
12
|
const KIT_DIRS = ["tools", "skills", "hooks", "channels", "schedules", "instructions", "memory", "connections"];
|
|
13
13
|
const SUBAGENT = /^(?:subagents\/[^/]+\/)+/;
|
|
14
14
|
const STUB_FILE = new RegExp(`^(${KIT_DIRS.join("|")})/[^/]+\\.ts$`);
|
|
15
|
+
// eve takes one source per slot (dash.ts, dash.mjs and dash.md all claim schedules/dash); a .d.ts, an asset, or a markdown file eve doesn't read there (only schedules and instructions take .md) claims none.
|
|
16
|
+
const SOURCE_FILE = new RegExp(`^(?:(?:${KIT_DIRS.join("|")})/[^/]+\\.[mc]?[tj]s|(?:schedules|instructions)/[^/]+\\.md)$`);
|
|
17
|
+
const isSource = (file) => SOURCE_FILE.test(file.replace(SUBAGENT, "")) && !/\.d\.[mc]?ts$/.test(file);
|
|
18
|
+
const slotOf = (file) => file.replace(/\.[^./]+$/, "");
|
|
15
19
|
const KIT_IMPORT = new RegExp(`^\\s*(?:import|export)\\b(?:[^;"']*?\\bfrom)?\\s*["']eve-hub/((?:${KIT_DIRS.join("|")})/[\\w-]+)["']`, "gm");
|
|
16
20
|
const ALL_STUBS = { ...KIT_FILES, ...MAIN_KIT_FILES };
|
|
17
21
|
const HOST_ONLY = [...Object.keys(ALL_STUBS), ...Object.keys(MEMORY_STUBS)].filter((file) => !DEPLOYED_KIT_FILES.has(file));
|
|
18
22
|
const moduleOf = (file) => (MEMORY_STUBS[file] ? file.slice(0, -3) : kitPath(ALL_STUBS[file][1] ?? file).slice("eve-hub/".length));
|
|
19
23
|
const HOST_ONLY_MODULES = new Set(HOST_ONLY.map(moduleOf));
|
|
20
24
|
|
|
21
|
-
/** Whether `file` (relative to a bot's agent/ folder, subagents included) is one syncKit reads. */
|
|
22
|
-
export const isKitFile = (file) => file === "instructions.md" || file === MAIN_INSTRUCTIONS ||
|
|
25
|
+
/** Whether `file` (relative to a bot's agent/ folder, subagents included) is one syncKit reads: a stub, or any source that holds a stub's slot. */
|
|
26
|
+
export const isKitFile = (file) => file === "instructions.md" || file === MAIN_INSTRUCTIONS || isSource(file);
|
|
23
27
|
|
|
24
28
|
// Every kit module the file imports, from its import and export lines only.
|
|
25
29
|
function kitImports(text) {
|
|
@@ -80,7 +84,8 @@ export function syncKit({ bots, modules }) {
|
|
|
80
84
|
else change.report.push({ bot, file, reason: `imports eve-hub/${host}, which needs the hub's own machine` });
|
|
81
85
|
}
|
|
82
86
|
}
|
|
83
|
-
|
|
87
|
+
const slots = new Set(Object.keys(files).filter((file) => isSource(file)).map(slotOf));
|
|
88
|
+
for (const file of wanted) if (!slots.has(slotOf(file))) write(file, content(file));
|
|
84
89
|
}
|
|
85
90
|
return change;
|
|
86
91
|
}
|
|
@@ -97,7 +102,7 @@ export function readBotFiles(agentDir, prefix = "") {
|
|
|
97
102
|
}
|
|
98
103
|
for (const dir of KIT_DIRS) {
|
|
99
104
|
if (!existsSync(join(agentDir, dir))) continue;
|
|
100
|
-
for (const entry of readdirSync(join(agentDir, dir), { withFileTypes: true })) if (entry.isFile() && entry.name
|
|
105
|
+
for (const entry of readdirSync(join(agentDir, dir), { withFileTypes: true })) if (entry.isFile() && isKitFile(`${dir}/${entry.name}`)) read(`${dir}/${entry.name}`);
|
|
101
106
|
}
|
|
102
107
|
if (existsSync(join(agentDir, "subagents"))) {
|
|
103
108
|
for (const entry of readdirSync(join(agentDir, "subagents"), { withFileTypes: true })) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
- **Team.** `create_agent` takes `runsOn` (`hosted` or `local`) and commits the new bot to the workspace repository; it joins with the next deployment, and a `local` bot then runs on the owner's Mac. There is no `remove_agent`: the roster is `hub.workspace.json`, and a deployment changes it by commit. If nobody on the team covers the work well, ask the human before going on.
|
|
2
2
|
- **Restarts.** There is no `restart_agent` or `restart_hub`: you cannot restart a bot or the hub. A new deployment replaces the running bots.
|
|
3
3
|
- **Memory.** Add an entry as your Memory section says, by committing the file to the workspace repository (see Changing it above). With no repository, write nothing and tell the human to link one first.
|
|
4
|
-
- **Schedules.**
|
|
4
|
+
- **Schedules.** Your `dash` schedule runs every 8 minutes: it classifies the threads that changed into the Dash and rewrites track summaries that have news, without PR data (a function has no `gh`). `compact` is deployed but finds nothing to compact until hosted sessions record their last model call. `prune` is not deployed: it cleans the hub machine's disk.
|
package/templates/forms.md
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
|
|
2
2
|
## Forms
|
|
3
3
|
|
|
4
|
-
A form is an interactive figure the app draws from a fenced block with a JSON body.
|
|
4
|
+
A form is an interactive figure the app draws from a fenced block with a JSON body. Any path through three or more parts, order of events across two or more actors, or numbers to compare is a form, never prose steps, an arrow chain or a character drawing; draw it by default; the reader should never have to ask. Pick the shape: a path through parts (`flow`), an order of events (`sequence`), numbers to compare (`chart`), a choice you need from the human (`ask`). Anchor the picture in something they know, e.g. a before form then an after form, each labeled, in one message. Every part of one diagram is the same kind of thing (all hosts, all processes or all functions); say which in the sentence before it, and for a sequence in `unit`. A group is the level that contains them (processes grouped under their host). Plain prose is for what no shape helps. At most one or two forms per message.
|
|
5
5
|
|
|
6
|
+
- A code fence is for text the reader will paste, never for a picture: no boxes, arrows, timelines or tables drawn with characters.
|
|
7
|
+
- Pick the shape by what the numbers are. Time split into phases or hops (a latency breakdown, a turn's timeline) is a `schedule` chart: one row per turn or request, one start/end segment per phase, never one `bar` per total. A `bar` compares one number across items.
|
|
6
8
|
- Claim first: a sentence that says what the form shows comes before it. A chart's `title` is its claim.
|
|
7
9
|
- Link a word in your prose to a part with `[word](#id)`. Ids are lowercase slugs (`a-z`, `0-9`, `-`, up to 32 characters), unique in the whole message.
|
|
8
10
|
- Put the explanation of a part in `note` (up to 240 characters), which the human sees when they point at or step to it. Keep labels short.
|