@idleware/ringi 0.0.0 → 0.1.1
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/README.md +15 -10
- package/package.json +8 -6
- package/target/esm/app/agent.js +1 -0
- package/target/esm/app/budget.js +1 -0
- package/target/esm/app/context.js +1 -0
- package/target/esm/app/hubs.js +1 -0
- package/target/esm/app/overview.js +1 -0
- package/target/esm/app/room.js +1 -0
- package/target/esm/app/rooms.js +1 -0
- package/target/esm/app/session.js +1 -0
- package/target/esm/app/view.js +1 -0
- package/target/esm/cli/agent.js +1 -0
- package/target/esm/cli/args.js +1 -0
- package/target/esm/cli/context.js +1 -0
- package/target/esm/cli/index.js +1 -0
- package/target/esm/cli/operator.js +1 -0
- package/target/esm/cli/session.js +1 -0
- package/target/esm/cli/shared.js +1 -0
- package/target/esm/cli/skill.js +1 -0
- package/target/esm/cli.js +1 -0
- package/target/esm/domain/decisions.js +1 -0
- package/target/esm/domain/index.js +1 -0
- package/target/esm/domain/profiles.js +1 -0
- package/target/esm/domain/signals.js +1 -0
- package/target/esm/home/index.js +1 -0
- package/target/esm/hub/index.js +1 -0
- package/target/esm/hub/signals.js +1 -0
- package/target/esm/index.js +1 -0
- package/target/esm/lib/index.js +1 -0
- package/target/esm/protocol/files.js +1 -0
- package/target/esm/protocol/index.js +1 -0
- package/target/esm/runtime/reader.js +1 -0
- package/target/esm/runtime/session.js +1 -0
- package/target/esm/runtime/watch.js +1 -0
- package/target/esm/store/git/index.js +1 -0
- package/target/esm/store/git/remote.js +1 -0
- package/target/esm/store/index.js +1 -0
- package/target/esm/store/kafka/index.js +1 -0
- package/target/esm/store/temporal/index.js +1 -0
package/README.md
CHANGED
|
@@ -1,15 +1,20 @@
|
|
|
1
1
|
# ringi
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://github.com/idleware/ringi/actions/workflows/ci.yml)
|
|
4
|
+
[](https://qlty.sh/gh/idleware/projects/ringi)
|
|
5
|
+
[](https://qlty.sh/gh/idleware/projects/ringi)
|
|
6
|
+
[](https://www.npmjs.com/package/@idleware/ringi)
|
|
4
7
|
|
|
5
|
-
|
|
6
|
-
kind. It connects the parts, agents of any vendor on one machine or many, and keeps them in sync: who said what to
|
|
7
|
-
whom, who took which work, what it may spend, what came of it. Every message is a stored, checkable record; a peer's
|
|
8
|
-
message is data, never an instruction.
|
|
8
|
+
*Distributed agent coordinator.*
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
Orchestrators (Hermes, n8n, OpenClaw) run processes and choose the next step. ringi only connects the parts, agents
|
|
11
|
+
of any vendor on one machine or many, and keeps them in sync: who said what to whom, who took which work, what it may
|
|
12
|
+
spend, what came of it. Everything is a stored, checkable record; whatever a peer writes is data, never an
|
|
13
|
+
instruction.
|
|
14
|
+
|
|
15
|
+
- **Your rules.** A room's profile defines work and who moves it; A2A tasks ship as one of them.
|
|
16
|
+
- **Budgets.** Proposal, stamps, decision ([稟議](https://en.wikipedia.org/wiki/Japanese_management_culture#Managerial_style)). The runner spends a grant, never the model.
|
|
17
|
+
- **Signals.** Each counted transition is marked beside its message (git: a tag).
|
|
13
18
|
- **Any store.** Git first; one CLI and a skill for you and the agents.
|
|
14
19
|
|
|
15
20
|
```sh
|
|
@@ -17,7 +22,7 @@ npm i -g @idleware/ringi
|
|
|
17
22
|
ringi skill install
|
|
18
23
|
```
|
|
19
24
|
|
|
20
|
-
Node.js
|
|
25
|
+
Node.js 16 or later.
|
|
21
26
|
|
|
22
27
|
## Local: one machine, several agents
|
|
23
28
|
|
|
@@ -51,7 +56,7 @@ Codex: add `~/.ringi` to `writable_roots` in `~/.codex/config.toml`, or approve
|
|
|
51
56
|
```
|
|
52
57
|
|
|
53
58
|
1. `ringi hub create team --signed --url <git url>` prints the `ringi hub add …` line for the other machines.
|
|
54
|
-
2. There, `ringi join team fix --as codex`
|
|
59
|
+
2. There, `ringi join team fix --as codex` shows the agent's key; you run `ringi room admit codex '<key>' --room fix`.
|
|
55
60
|
3. `ringi watch team:fix/codex --require-grant --exec 'codex exec "…"'`
|
|
56
61
|
|
|
57
62
|
## Your own profile
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@idleware/ringi",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Distributed agent coordinator",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"agents",
|
|
@@ -31,6 +31,7 @@
|
|
|
31
31
|
"types": "target/dts/index.d.ts",
|
|
32
32
|
"files": [
|
|
33
33
|
"target/esm",
|
|
34
|
+
"!target/esm/**/*.map",
|
|
34
35
|
"target/dts",
|
|
35
36
|
"src/main/resources"
|
|
36
37
|
],
|
|
@@ -38,13 +39,14 @@
|
|
|
38
39
|
"build": "tsc -p tsconfig.json && node -e \"require('fs').chmodSync('target/esm/cli.js', 0o755)\"",
|
|
39
40
|
"test": "npm run build && tsc -p tsconfig.test.json && node --test --test-reporter=spec src/test/ts/*.test.ts",
|
|
40
41
|
"test:conformance": "node --test --test-reporter=spec src/test/ts/ringi.test.ts src/test/ts/model.test.ts src/test/ts/flow.test.ts",
|
|
41
|
-
"commands": "node target/esm/cli.js help --md > COMMANDS.md"
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
"
|
|
42
|
+
"commands": "node target/esm/cli.js help --md > COMMANDS.md",
|
|
43
|
+
"release": "npx --yes zx-semrel@1.25.1",
|
|
44
|
+
"test:coverage": "npm run build && tsc -p tsconfig.test.json && c8 --reporter=lcov --reporter=text-summary --report-dir=target/coverage --exclude-after-remap --include='src/main/ts/**' node --test src/test/ts/*.test.ts",
|
|
45
|
+
"test:smoke": "node --test --test-reporter=spec src/test/ts/flow.test.ts"
|
|
45
46
|
},
|
|
46
47
|
"devDependencies": {
|
|
47
|
-
"@types/node": "
|
|
48
|
+
"@types/node": "26.6.3",
|
|
49
|
+
"c8": "12.0.0",
|
|
48
50
|
"typescript": "7.0.2"
|
|
49
51
|
},
|
|
50
52
|
"publishConfig": {
|
package/target/esm/app/agent.js
CHANGED
package/target/esm/app/budget.js
CHANGED
|
@@ -13,3 +13,4 @@ export const operator = ({ hub, room } = {}) => {
|
|
|
13
13
|
export const agent = () => bound();
|
|
14
14
|
export const about = () => ({ version: VERSION, home: HOME, resources: RESOURCES, contract: `${HUB_MAJOR}.x`, capabilities: [...CAPS] });
|
|
15
15
|
export { config };
|
|
16
|
+
//# sourceMappingURL=context.js.map
|
package/target/esm/app/hubs.js
CHANGED
package/target/esm/app/room.js
CHANGED
|
@@ -124,3 +124,4 @@ export const signals = ({ R, me }, { repair = false } = {}) => readerLock(R, me,
|
|
|
124
124
|
// What interfaces need to show and store a message's files: their sizes, and a path safe to write under.
|
|
125
125
|
export { withSizes } from '../hub/index.js';
|
|
126
126
|
export { checkPath } from '../protocol/files.js';
|
|
127
|
+
//# sourceMappingURL=room.js.map
|
package/target/esm/app/rooms.js
CHANGED
package/target/esm/app/view.js
CHANGED
|
@@ -49,3 +49,4 @@ export const proposalView = (x) => ({ id: x.proposal.id, subject: x.proposal.sub
|
|
|
49
49
|
decider: x.decider, state: x.state, budget: x.budget, stamps: x.stamps, missing: x.missing });
|
|
50
50
|
export const grantView = (x, usage) => ({ grant: x.grant.id, proposal: x.proposal.id,
|
|
51
51
|
subject: x.proposal.subject, budget: x.grant.budget, revoked: x.grant.revoked, usage });
|
|
52
|
+
//# sourceMappingURL=view.js.map
|
package/target/esm/cli/agent.js
CHANGED
package/target/esm/cli/args.js
CHANGED
|
@@ -58,3 +58,4 @@ export const attachments = (spec) => {
|
|
|
58
58
|
return [{ path: dest, file: src, mode: mode(src) }];
|
|
59
59
|
return walk(src).map(f => ({ path: checkPath(`${dest}/${path.relative(src, f).split(path.sep).join('/')}`), file: f, mode: mode(f) }));
|
|
60
60
|
};
|
|
61
|
+
//# sourceMappingURL=args.js.map
|
package/target/esm/cli/index.js
CHANGED
package/target/esm/cli/shared.js
CHANGED
|
@@ -140,3 +140,4 @@ export const grants = (a, o) => {
|
|
|
140
140
|
out(`${short(g.grant)} ${g.revoked ? 'revoked ' : u.left ? 'active ' : 'spent '} runs ${u.runs}/${g.budget.runs}, open ${u.open}${u.uncertain ? `, uncertain ${u.uncertain}` : ''}, ${u.seconds}s used, ≤${g.budget['run-seconds']}s a run, concurrency ${g.budget.concurrency} ${g.subject}`);
|
|
141
141
|
}
|
|
142
142
|
};
|
|
143
|
+
//# sourceMappingURL=shared.js.map
|
package/target/esm/cli/skill.js
CHANGED
|
@@ -51,3 +51,4 @@ in ~/.codex/config.toml. Otherwise agents re-run ringi commands with sandbox esc
|
|
|
51
51
|
return void process.stdout.write(fs.readFileSync(path.join(SKILL, 'SKILL.md'), 'utf8'));
|
|
52
52
|
fail('usage: ringi skill install [--project] | uninstall [--project] | status | show');
|
|
53
53
|
};
|
|
54
|
+
//# sourceMappingURL=skill.js.map
|
package/target/esm/cli.js
CHANGED
|
@@ -175,3 +175,4 @@ export const usageOf = (all, grant, now = Date.now() / 1000) => {
|
|
|
175
175
|
const open = unsettled.filter(m => now - m.time <= grant.budget['run-seconds'] + 60);
|
|
176
176
|
return { runs: reserves.length, open: open.length, uncertain: unsettled.length - open.length, seconds, left: Math.max(0, grant.budget.runs - reserves.length) };
|
|
177
177
|
};
|
|
178
|
+
//# sourceMappingURL=decisions.js.map
|
|
@@ -93,3 +93,4 @@ export const taskOf = (all, root, profile) => {
|
|
|
93
93
|
};
|
|
94
94
|
export const tasksIn = (all, profile) => [...all.values()].filter(m => m.kind === profile.opens && !m.bad).map(r => taskOf(all, r, profile));
|
|
95
95
|
export const isOpen = (t, profile) => !profile.terminal.includes(t.state);
|
|
96
|
+
//# sourceMappingURL=profiles.js.map
|
package/target/esm/home/index.js
CHANGED
|
@@ -85,3 +85,4 @@ export const locked = (name, fn) => {
|
|
|
85
85
|
export const configFile = () => path.join(HOME, 'config.json');
|
|
86
86
|
export const config = () => ({ hub: 'local', room: null, ...readJson(configFile(), {}) });
|
|
87
87
|
export const setConfig = (patch) => writeJson(configFile(), { ...config(), ...patch });
|
|
88
|
+
//# sourceMappingURL=index.js.map
|
package/target/esm/hub/index.js
CHANGED
|
@@ -209,3 +209,4 @@ export const withSizes = (R, m) => {
|
|
|
209
209
|
};
|
|
210
210
|
export const pongText = (me, m, what) => compose(`pong: ${me} ${what}`, [['To', m.from], ['Re', m.id], ['Kind', 'pong'], ['Hop', String(m.hopEff + 1)]]);
|
|
211
211
|
export { OPERATOR, HIDDEN };
|
|
212
|
+
//# sourceMappingURL=index.js.map
|
package/target/esm/index.js
CHANGED
package/target/esm/lib/index.js
CHANGED
|
@@ -109,3 +109,4 @@ export const parseSelector = (sel) => {
|
|
|
109
109
|
const m = /^(?:([a-z0-9._-]+):)?([^/]+)\/([^/]+)$/.exec(sel ?? '');
|
|
110
110
|
return m ? { hub: m[1] ?? null, room: m[2], agent: m[3] } : fail('a session is named <room>/<agent> or <hub>:<room>/<agent>');
|
|
111
111
|
};
|
|
112
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -12,3 +12,4 @@ import { kafka } from './kafka/index.js';
|
|
|
12
12
|
import { temporal } from './temporal/index.js';
|
|
13
13
|
// The store types this ringi knows. Another type is a directory here implementing Store, and an entry below.
|
|
14
14
|
export const STORES = { git: (dir, d, home) => new GitStore(dir, d, home), kafka, temporal };
|
|
15
|
+
//# sourceMappingURL=index.js.map
|