@a-company/gnomon 0.0.0-stage → 8.0.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.
- package/README.md +126 -2
- package/dist/agent.d.ts +28 -0
- package/dist/agent.js +45708 -0
- package/dist/build-id.json +1 -0
- package/dist/cli/gnomon.js +53946 -0
- package/dist/cli/gnomond.js +47744 -0
- package/dist/gnomon-local/cli.js +897 -0
- package/dist/index.d.ts +3477 -0
- package/dist/index.js +13698 -0
- package/dist/loops.d.ts +440 -0
- package/dist/loops.js +4706 -0
- package/dist/signer-CQ3Bpe7G.d.ts +158 -0
- package/dist/transport/gnomon-web.js +688 -0
- package/gnomon-mods/.purpose +143 -0
- package/gnomon-mods/constellation/README.md +27 -0
- package/gnomon-mods/constellation/fixtures/map-the-idea.golden.json +19 -0
- package/gnomon-mods/constellation/fixtures/map-the-idea.json +3 -0
- package/gnomon-mods/constellation/fixtures/summarize-the-session.golden.json +20 -0
- package/gnomon-mods/constellation/fixtures/summarize-the-session.json +3 -0
- package/gnomon-mods/constellation/fixtures/two-blocks.golden.json +4 -0
- package/gnomon-mods/constellation/fixtures/two-blocks.json +3 -0
- package/gnomon-mods/constellation/gnomon-manifest.json +68 -0
- package/gnomon-mods/constellation/skills/constellation-desk/SKILL.md +35 -0
- package/gnomon-mods/ledger/README.md +10 -0
- package/gnomon-mods/ledger/fixtures/breaker.golden.json +28 -0
- package/gnomon-mods/ledger/fixtures/breaker.json +80 -0
- package/gnomon-mods/ledger/fixtures/compacted.golden.json +42 -0
- package/gnomon-mods/ledger/fixtures/compacted.json +103 -0
- package/gnomon-mods/ledger/fixtures/over-budget.golden.json +24 -0
- package/gnomon-mods/ledger/fixtures/over-budget.json +86 -0
- package/gnomon-mods/ledger/fixtures/strip-reduced.golden.json +23 -0
- package/gnomon-mods/ledger/fixtures/strip-reduced.json +76 -0
- package/gnomon-mods/ledger/fixtures/strip.golden.json +18 -0
- package/gnomon-mods/ledger/fixtures/strip.json +68 -0
- package/gnomon-mods/ledger/gnomon-manifest.json +16 -0
- package/gnomon-mods/ledger/index.mjs +77 -0
- package/gnomon-mods/ledger/model.mjs +237 -0
- package/gnomon-mods/neurons/README.md +31 -0
- package/gnomon-mods/neurons/fixtures/capture-a-decision.golden.json +20 -0
- package/gnomon-mods/neurons/fixtures/capture-a-decision.json +3 -0
- package/gnomon-mods/neurons/fixtures/capture-a-learning.golden.json +19 -0
- package/gnomon-mods/neurons/fixtures/capture-a-learning.json +3 -0
- package/gnomon-mods/neurons/fixtures/search-the-brain.golden.json +19 -0
- package/gnomon-mods/neurons/fixtures/search-the-brain.json +3 -0
- package/gnomon-mods/neurons/fixtures/undeclared-kind.golden.json +9 -0
- package/gnomon-mods/neurons/fixtures/undeclared-kind.json +3 -0
- package/gnomon-mods/neurons/gnomon-manifest.json +87 -0
- package/gnomon-mods/neurons/skills/neurons-desk/SKILL.md +44 -0
- package/gnomon-mods/paradigm-context/README.md +9 -0
- package/gnomon-mods/paradigm-context/fixtures/empty.golden.json +28 -0
- package/gnomon-mods/paradigm-context/fixtures/empty.json +48 -0
- package/gnomon-mods/paradigm-context/fixtures/full-dark.golden.json +497 -0
- package/gnomon-mods/paradigm-context/fixtures/full-dark.json +134 -0
- package/gnomon-mods/paradigm-context/fixtures/full.golden.json +497 -0
- package/gnomon-mods/paradigm-context/fixtures/full.json +134 -0
- package/gnomon-mods/paradigm-context/fixtures/stale.golden.json +205 -0
- package/gnomon-mods/paradigm-context/fixtures/stale.json +69 -0
- package/gnomon-mods/paradigm-context/fixtures/unfocused.golden.json +28 -0
- package/gnomon-mods/paradigm-context/fixtures/unfocused.json +14 -0
- package/gnomon-mods/paradigm-context/gnomon-manifest.json +15 -0
- package/gnomon-mods/paradigm-context/index.mjs +64 -0
- package/gnomon-mods/paradigm-context/model.mjs +137 -0
- package/gnomon-mods/workshop/README.md +12 -0
- package/gnomon-mods/workshop/fixtures/strip-reduced.golden.json +56 -0
- package/gnomon-mods/workshop/fixtures/strip-reduced.json +16 -0
- package/gnomon-mods/workshop/fixtures/strip.golden.json +56 -0
- package/gnomon-mods/workshop/fixtures/strip.json +16 -0
- package/gnomon-mods/workshop/gnomon-manifest.json +14 -0
- package/gnomon-mods/workshop/index.mjs +73 -0
- package/gnomon-mods/workshop/model.mjs +152 -0
- package/package.json +80 -4
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": "display-block:v1",
|
|
3
|
+
"type": "Box",
|
|
4
|
+
"title": "Workshop",
|
|
5
|
+
"direction": "column",
|
|
6
|
+
"children": [
|
|
7
|
+
{
|
|
8
|
+
"type": "Box",
|
|
9
|
+
"title": "needs you 1",
|
|
10
|
+
"children": [
|
|
11
|
+
{
|
|
12
|
+
"type": "Text",
|
|
13
|
+
"text": "▲ permission",
|
|
14
|
+
"tone": "cap",
|
|
15
|
+
"cap": {
|
|
16
|
+
"shape": "tall",
|
|
17
|
+
"hue": 2,
|
|
18
|
+
"filled": true,
|
|
19
|
+
"state": "needs",
|
|
20
|
+
"label": "? permission"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
]
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"type": "Box",
|
|
27
|
+
"title": "working 1 of 2",
|
|
28
|
+
"children": [
|
|
29
|
+
{
|
|
30
|
+
"type": "Text",
|
|
31
|
+
"text": "▲ builder filled bob",
|
|
32
|
+
"tone": "hue-2",
|
|
33
|
+
"cap": {
|
|
34
|
+
"shape": "tall",
|
|
35
|
+
"hue": 2,
|
|
36
|
+
"filled": true,
|
|
37
|
+
"state": "working",
|
|
38
|
+
"label": "builder"
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"type": "Text",
|
|
43
|
+
"text": "▲ builder outlined still",
|
|
44
|
+
"tone": "violet",
|
|
45
|
+
"cap": {
|
|
46
|
+
"shape": "tall",
|
|
47
|
+
"hue": 5,
|
|
48
|
+
"filled": false,
|
|
49
|
+
"state": "knot",
|
|
50
|
+
"label": "builder"
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
]
|
|
54
|
+
}
|
|
55
|
+
]
|
|
56
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"input": {
|
|
3
|
+
"fixtureEvents": [
|
|
4
|
+
{ "kind": "session.open", "payload": { "hsid": "hsid:v1:01HZZZZZZZZZZZZZZZZZZZZZZA", "backend": "claude", "project": 2 } },
|
|
5
|
+
{ "kind": "session.open", "payload": { "hsid": "hsid:v1:01HZZZZZZZZZZZZZZZZZZZZZZB", "backend": "local", "project": 5 } },
|
|
6
|
+
{ "kind": "turn.partial", "payload": { "hsid": "hsid:v1:01HZZZZZZZZZZZZZZZZZZZZZZA" } },
|
|
7
|
+
{ "kind": "approval.request", "payload": { "cardId": "card:01HZZZZZZZZZZZZZZZZZZZZZZC", "kind": "permission", "hsid": "hsid:v1:01HZZZZZZZZZZZZZZZZZZZZZZA" } },
|
|
8
|
+
{ "kind": "approval.request", "payload": { "cardId": "card:01HZZZZZZZZZZZZZZZZZZZZZZD", "kind": "plan", "hsid": "hsid:v1:01HZZZZZZZZZZZZZZZZZZZZZZB" } },
|
|
9
|
+
{ "kind": "approval.decide", "payload": { "cardId": "card:01HZZZZZZZZZZZZZZZZZZZZZZD" } },
|
|
10
|
+
{ "kind": "warpline.knot", "payload": { "hsid": "hsid:v1:01HZZZZZZZZZZZZZZZZZZZZZZB" } },
|
|
11
|
+
{ "kind": "mod.paused", "payload": { "name": "hello", "reason": "user" } }
|
|
12
|
+
]
|
|
13
|
+
},
|
|
14
|
+
"width": 40,
|
|
15
|
+
"prefs": { "motion": "full", "theme": "day" }
|
|
16
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"manifest": 2,
|
|
3
|
+
"kind": "mod",
|
|
4
|
+
"publisher": "gnomon",
|
|
5
|
+
"name": "workshop",
|
|
6
|
+
"version": "1.1.0",
|
|
7
|
+
"abi": "mod-abi:v1",
|
|
8
|
+
"description": "The Workshop (spec §11.6): needs-you caps per pending card and working caps per session, every attribute from kernel events.",
|
|
9
|
+
"provides": {
|
|
10
|
+
"views": [{ "id": "workshop.strip", "slot": "sidebar", "placement": "append", "fixtures": ["fixtures/strip.json", "fixtures/strip-reduced.json"] }],
|
|
11
|
+
"events": ["modns.gnomon.workshop.moved"]
|
|
12
|
+
},
|
|
13
|
+
"requires": { "capabilities": ["log.read"], "egress": "none" }
|
|
14
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
// #workshop-mod (spec §11.6; first-party, mod-abi:v1, declared effects `read`).
|
|
2
|
+
// Runs under #mod-host from its pinned snapshot. Self-contained on purpose: it
|
|
3
|
+
// imports nothing outside this folder, so its packageHash (pinned in the
|
|
4
|
+
// kernel's first-party allowlist) never depends on a build of the SDK.
|
|
5
|
+
// State comes ONLY from the host's projected kernel-event feed (`event`
|
|
6
|
+
// notifications, granted by `log.read`); a fixture render (host-initiated, no
|
|
7
|
+
// relayedFor) may replay `input.fixtureEvents` — a relayed render never can.
|
|
8
|
+
import { apply, emptyState, render } from './model.mjs';
|
|
9
|
+
|
|
10
|
+
const ABI = 'mod-abi:v1';
|
|
11
|
+
// Echoed at init; the host refuses any other id (a mod-ABI change needs a new Workshop build).
|
|
12
|
+
const MOD_ABI_ID = 'sha256:7aaf92f46dc35fc35141557c1f89088958f220e6bf53ea31a630bb06430ba082';
|
|
13
|
+
const MAX_FIXTURE_EVENTS = 1024;
|
|
14
|
+
|
|
15
|
+
const live = emptyState();
|
|
16
|
+
const send = (msg) => process.stdout.write(`${JSON.stringify({ jsonrpc: '2.0', ...msg })}\n`);
|
|
17
|
+
|
|
18
|
+
function handle(method, p) {
|
|
19
|
+
switch (method) {
|
|
20
|
+
case 'init':
|
|
21
|
+
if (p.abi !== ABI) throw Object.assign(new Error(`unsupported abi ${String(p.abi)}`), { code: -32602 });
|
|
22
|
+
return { abi: ABI, features: [], modAbiId: MOD_ABI_ID };
|
|
23
|
+
case 'health':
|
|
24
|
+
return { ok: true, abi: ABI };
|
|
25
|
+
case 'shutdown':
|
|
26
|
+
setImmediate(() => process.exit(0));
|
|
27
|
+
return {};
|
|
28
|
+
case 'view.render': {
|
|
29
|
+
if (p.viewId !== 'workshop.strip') throw Object.assign(new Error(`no view ${String(p.viewId)}`), { code: -32601 });
|
|
30
|
+
const prefs = p.prefs && typeof p.prefs === 'object' ? p.prefs : {};
|
|
31
|
+
const fx = !p.relayedFor && p.input && Array.isArray(p.input.fixtureEvents) ? p.input.fixtureEvents.slice(0, MAX_FIXTURE_EVENTS) : null;
|
|
32
|
+
let state = live;
|
|
33
|
+
if (fx) {
|
|
34
|
+
state = emptyState();
|
|
35
|
+
for (const e of fx) apply(state, e);
|
|
36
|
+
}
|
|
37
|
+
return { block: render(state, prefs) };
|
|
38
|
+
}
|
|
39
|
+
default:
|
|
40
|
+
throw Object.assign(new Error(`unknown method ${method}`), { code: -32601 });
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
let buf = '';
|
|
45
|
+
process.stdin.setEncoding('utf8');
|
|
46
|
+
process.stdin.on('data', (chunk) => {
|
|
47
|
+
buf += chunk;
|
|
48
|
+
let nl;
|
|
49
|
+
while ((nl = buf.indexOf('\n')) >= 0) {
|
|
50
|
+
const line = buf.slice(0, nl).trim();
|
|
51
|
+
buf = buf.slice(nl + 1);
|
|
52
|
+
if (!line) continue;
|
|
53
|
+
let msg;
|
|
54
|
+
try {
|
|
55
|
+
msg = JSON.parse(line);
|
|
56
|
+
} catch {
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
if (typeof msg.method !== 'string') continue; // the Workshop makes no mod → host requests
|
|
60
|
+
const params = msg.params && typeof msg.params === 'object' ? msg.params : {};
|
|
61
|
+
if (msg.method === 'event') {
|
|
62
|
+
apply(live, params.event);
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
if (msg.method === 'cancel' || msg.id === undefined) continue;
|
|
66
|
+
try {
|
|
67
|
+
send({ id: msg.id, result: handle(msg.method, params) });
|
|
68
|
+
} catch (e) {
|
|
69
|
+
send({ id: msg.id, error: { code: typeof e.code === 'number' ? e.code : -32000, message: String(e.message) } });
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
process.stdin.on('end', () => process.exit(0));
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
// #workshop-mod model (spec §11.6, G-WSP-01): a pure reducer over the host's
|
|
2
|
+
// kernel-event feed and a pure render to display-block:v1 (kit:v1 only).
|
|
3
|
+
// Every attribute is derived from kernel event fields the host projects
|
|
4
|
+
// (session.open{hsid, backend, project}, session.exited, turn.partial,
|
|
5
|
+
// turn.result, approval.request{cardId, kind, hsid}, approval.decide,
|
|
6
|
+
// approval.expire, warpline.knot{hsid}, mod.paused{name, reason},
|
|
7
|
+
// mod.health{name, ok}); nothing here reads model text.
|
|
8
|
+
|
|
9
|
+
/** Bounds (the feed is kernel-written, but a mod never trusts a count). */
|
|
10
|
+
export const MAX_SESSIONS = 256;
|
|
11
|
+
export const MAX_CARDS = 256;
|
|
12
|
+
export const MAX_PAUSED = 64;
|
|
13
|
+
// the six project pigments: the kernel feed projects `project` with gnomon-contracts projectHue (0..5)
|
|
14
|
+
export const HUES = 6;
|
|
15
|
+
export const WORK_TYPES = Object.freeze(['builder', 'reviewer', 'teacher', 'tender']);
|
|
16
|
+
const ID = /^[A-Za-z0-9:._-]{1,128}$/;
|
|
17
|
+
const KIND = /^[a-z][a-z0-9-]{0,31}$/;
|
|
18
|
+
// S0b: a mod id <publisher>.<name> (contracts MOD_ID_PATTERN; ≤ 60 characters in total)
|
|
19
|
+
const MOD_ID = /^[a-z0-9](?:[a-z0-9]|-(?=[a-z0-9])){0,38}\.[a-z](?:[a-z0-9]|-(?=[a-z0-9])){0,23}$/;
|
|
20
|
+
const MOD = { test: (s) => typeof s === 'string' && s.length <= 60 && MOD_ID.test(s) };
|
|
21
|
+
|
|
22
|
+
export function emptyState() {
|
|
23
|
+
return { sessions: new Map(), cards: new Map(), paused: new Map() };
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const firstKey = (m) => m.keys().next().value;
|
|
27
|
+
|
|
28
|
+
/** Apply one projected kernel event; unknown kinds and malformed fields are ignored (fail closed: no cap appears). */
|
|
29
|
+
export function apply(state, event) {
|
|
30
|
+
if (!event || typeof event !== 'object' || typeof event.kind !== 'string') return state;
|
|
31
|
+
const p = event.payload && typeof event.payload === 'object' ? event.payload : {};
|
|
32
|
+
const hsid = typeof p.hsid === 'string' && ID.test(p.hsid) ? p.hsid : null;
|
|
33
|
+
switch (event.kind) {
|
|
34
|
+
case 'session.open': {
|
|
35
|
+
if (!hsid) break;
|
|
36
|
+
if (!state.sessions.has(hsid) && state.sessions.size >= MAX_SESSIONS) state.sessions.delete(firstKey(state.sessions));
|
|
37
|
+
state.sessions.set(hsid, {
|
|
38
|
+
backend: p.backend === 'local' ? 'local' : 'claude',
|
|
39
|
+
project: Number.isInteger(p.project) && p.project >= 0 && p.project < HUES ? p.project : 0,
|
|
40
|
+
work: WORK_TYPES.includes(p.work) ? p.work : 'builder',
|
|
41
|
+
streaming: false,
|
|
42
|
+
knot: false,
|
|
43
|
+
});
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
case 'session.exited':
|
|
47
|
+
if (hsid) state.sessions.delete(hsid);
|
|
48
|
+
for (const [id, c] of state.cards) if (hsid && c.hsid === hsid) state.cards.delete(id);
|
|
49
|
+
break;
|
|
50
|
+
case 'turn.partial': {
|
|
51
|
+
const s = hsid && state.sessions.get(hsid);
|
|
52
|
+
if (s) s.streaming = true;
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
case 'turn.result': {
|
|
56
|
+
const s = hsid && state.sessions.get(hsid);
|
|
57
|
+
if (s) s.streaming = false;
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
case 'warpline.knot': {
|
|
61
|
+
const s = hsid && state.sessions.get(hsid);
|
|
62
|
+
if (s) s.knot = true;
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
case 'approval.request': {
|
|
66
|
+
const id = typeof p.cardId === 'string' && ID.test(p.cardId) ? p.cardId : null;
|
|
67
|
+
if (!id) break;
|
|
68
|
+
if (!state.cards.has(id) && state.cards.size >= MAX_CARDS) state.cards.delete(firstKey(state.cards));
|
|
69
|
+
state.cards.set(id, { kind: typeof p.kind === 'string' && KIND.test(p.kind) ? p.kind : 'card', hsid });
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
case 'mod.paused': {
|
|
73
|
+
if (typeof p.name !== 'string' || !MOD.test(p.name)) break;
|
|
74
|
+
if (!state.paused.has(p.name) && state.paused.size >= MAX_PAUSED) state.paused.delete(firstKey(state.paused));
|
|
75
|
+
state.paused.set(p.name, typeof p.reason === 'string' && KIND.test(p.reason) ? p.reason : 'paused');
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
case 'mod.health':
|
|
79
|
+
if (p.ok === true && typeof p.name === 'string') state.paused.delete(p.name);
|
|
80
|
+
break;
|
|
81
|
+
case 'approval.decide':
|
|
82
|
+
case 'approval.expire':
|
|
83
|
+
if (typeof p.cardId === 'string') state.cards.delete(p.cardId);
|
|
84
|
+
break;
|
|
85
|
+
default:
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
return state;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const HAT = { builder: '▲', reviewer: '◆', teacher: '■', tender: '●' };
|
|
92
|
+
/** The cap's hat (S5): the closed contracts shapes; the GUI owns the drawing. */
|
|
93
|
+
const SHAPE = { builder: 'tall', reviewer: 'wide', teacher: 'floppy', tender: 'wide' };
|
|
94
|
+
/** The mark a waiting cap's label starts with: KNOT, a failure, a gate-class ask, else a question. */
|
|
95
|
+
const MARK = { knot: '◆', incident: '✕', fallback: '✕', 'gate-class': '!', strictness: '!', grant: '!', install: '!' };
|
|
96
|
+
const LABEL_MAX = 40;
|
|
97
|
+
const label = (s) => [...s].slice(0, LABEL_MAX).join('');
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* render(state, prefs) → display-block:v1. Hat shape = work type; filled = Claude, outlined = local; hue = project;
|
|
101
|
+
* violet only for KNOT. Each cap is a Text whose `text` is the accessible (and reduced-motion) form and whose `cap`
|
|
102
|
+
* is the closed contracts shape {shape, hue, filled, state, label} the kernel gate checks and the GUI draws.
|
|
103
|
+
*/
|
|
104
|
+
export function render(state, prefs = {}) {
|
|
105
|
+
const reduced = prefs.motion === 'reduced';
|
|
106
|
+
const needs = [...state.cards.values()];
|
|
107
|
+
const working = [...state.sessions.entries()].sort((a, b) => (a[0] < b[0] ? -1 : 1));
|
|
108
|
+
const cap = (s) => {
|
|
109
|
+
const hat = HAT[s.work] ?? HAT.builder;
|
|
110
|
+
const fill = s.backend === 'local' ? 'outlined' : 'filled';
|
|
111
|
+
const tone = s.knot ? 'violet' : `hue-${s.project}`;
|
|
112
|
+
const pose = s.streaming ? (reduced ? 'working' : 'bob') : 'still';
|
|
113
|
+
const st = s.knot ? 'knot' : s.streaming ? 'working' : 'idle';
|
|
114
|
+
return { type: 'Text', text: `${hat} ${s.work} ${fill} ${pose}`, tone, cap: { shape: SHAPE[s.work] ?? 'tall', hue: s.project, filled: s.backend !== 'local', state: st, label: s.work } };
|
|
115
|
+
};
|
|
116
|
+
const need = (c) => {
|
|
117
|
+
const s = c.hsid ? state.sessions.get(c.hsid) : undefined;
|
|
118
|
+
return {
|
|
119
|
+
type: 'Text',
|
|
120
|
+
text: `▲ ${c.kind}`,
|
|
121
|
+
tone: 'cap',
|
|
122
|
+
cap: { shape: SHAPE[s?.work] ?? 'tall', hue: s ? s.project : 0, filled: s ? s.backend !== 'local' : true, state: c.kind === 'knot' ? 'knot' : 'needs', label: label(`${MARK[c.kind] ?? '?'} ${c.kind}`) },
|
|
123
|
+
};
|
|
124
|
+
};
|
|
125
|
+
return {
|
|
126
|
+
schemaVersion: 'display-block:v1',
|
|
127
|
+
type: 'Box',
|
|
128
|
+
title: 'Workshop',
|
|
129
|
+
direction: 'column',
|
|
130
|
+
children: [
|
|
131
|
+
{
|
|
132
|
+
type: 'Box',
|
|
133
|
+
title: `needs you ${needs.length}`,
|
|
134
|
+
children: needs.length ? needs.map(need) : [{ type: 'Text', text: 'nothing waiting', tone: 'quiet' }],
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
type: 'Box',
|
|
138
|
+
title: `working ${working.filter(([, s]) => s.streaming).length} of ${working.length}`,
|
|
139
|
+
children: working.length ? working.map(([, s]) => cap(s)) : [{ type: 'Text', text: 'no sessions', tone: 'quiet' }],
|
|
140
|
+
},
|
|
141
|
+
...(state.paused.size
|
|
142
|
+
? [
|
|
143
|
+
{
|
|
144
|
+
type: 'Box',
|
|
145
|
+
title: `paused ${state.paused.size}`,
|
|
146
|
+
children: [...state.paused.entries()].sort((a, b) => (a[0] < b[0] ? -1 : 1)).map(([name, why]) => ({ type: 'Text', text: `⏸ mod ${name} paused (${why})`, tone: 'paused' })),
|
|
147
|
+
},
|
|
148
|
+
]
|
|
149
|
+
: []),
|
|
150
|
+
],
|
|
151
|
+
};
|
|
152
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,82 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@a-company/gnomon",
|
|
3
|
-
"version": "
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "8.0.2",
|
|
4
|
+
"description": "Gnomon — the Paradigm 8.0 kernel: one daemon per user owning sessions, identity, the hash-chained log, approvals and the localhost web endpoint (docs/specs/gnomon.md). ZERO runtime dependencies (G-SEC-01).",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./loops": {
|
|
14
|
+
"types": "./dist/loops.d.ts",
|
|
15
|
+
"import": "./dist/loops.js"
|
|
16
|
+
},
|
|
17
|
+
"./agent": {
|
|
18
|
+
"types": "./dist/agent.d.ts",
|
|
19
|
+
"import": "./dist/agent.js"
|
|
20
|
+
},
|
|
21
|
+
"./cli": "./dist/cli/gnomon.js",
|
|
22
|
+
"./package.json": "./package.json"
|
|
23
|
+
},
|
|
24
|
+
"bin": {
|
|
25
|
+
"gnomon": "dist/cli/gnomon.js",
|
|
26
|
+
"gnomond": "dist/cli/gnomond.js",
|
|
27
|
+
"gnomon-web": "dist/transport/gnomon-web.js"
|
|
28
|
+
},
|
|
29
|
+
"files": [
|
|
30
|
+
"dist",
|
|
31
|
+
"gnomon-mods"
|
|
32
|
+
],
|
|
33
|
+
"scripts": {
|
|
34
|
+
"build": "tsup && node scripts/build-stamp.mjs",
|
|
35
|
+
"build:release": "node scripts/build-release.mjs",
|
|
36
|
+
"release:darwin": "node scripts/release-darwin.mjs",
|
|
37
|
+
"dev": "tsup --watch",
|
|
38
|
+
"typecheck": "tsc --noEmit",
|
|
39
|
+
"test": "vitest run && npm run test:perf",
|
|
40
|
+
"test:watch": "vitest",
|
|
41
|
+
"probe": "node probes/run.mjs",
|
|
42
|
+
"test:perf": "node scripts/test-perf.mjs",
|
|
43
|
+
"repin:first-party": "node scripts/repin-first-party.mjs",
|
|
44
|
+
"install:darwin": "node scripts/install-darwin.mjs",
|
|
45
|
+
"prepack": "node scripts/prepack.mjs",
|
|
46
|
+
"postpack": "node scripts/prepack.mjs --clean",
|
|
47
|
+
"prepublishOnly": "node ../../scripts/gate-gnomon-publish.mjs"
|
|
48
|
+
},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@a-company/gnomon-contracts": "1.0.0",
|
|
51
|
+
"@types/node": "^24.0.0",
|
|
52
|
+
"tsup": "^9.0.0",
|
|
53
|
+
"typescript": "^5.9.3",
|
|
54
|
+
"vitest": "^5.0.5"
|
|
55
|
+
},
|
|
56
|
+
"optionalDependencies": {
|
|
57
|
+
"@a-company/gnomon-darwin-arm64": "8.0.2"
|
|
58
|
+
},
|
|
59
|
+
"publishConfig": {
|
|
60
|
+
"access": "public"
|
|
61
|
+
},
|
|
62
|
+
"author": "ascend42",
|
|
63
|
+
"license": "MIT",
|
|
64
|
+
"repository": {
|
|
65
|
+
"type": "git",
|
|
66
|
+
"url": "git+https://github.com/ascend42/a-paradigm.git",
|
|
67
|
+
"directory": "packages/gnomon"
|
|
68
|
+
},
|
|
69
|
+
"bugs": {
|
|
70
|
+
"url": "https://github.com/ascend42/a-paradigm/issues"
|
|
71
|
+
},
|
|
72
|
+
"homepage": "https://github.com/ascend42/a-paradigm#readme",
|
|
73
|
+
"keywords": [
|
|
74
|
+
"paradigm",
|
|
75
|
+
"gnomon",
|
|
76
|
+
"kernel",
|
|
77
|
+
"daemon"
|
|
78
|
+
],
|
|
79
|
+
"engines": {
|
|
80
|
+
"node": ">=24.0.0"
|
|
81
|
+
}
|
|
82
|
+
}
|