@tenphi/akno 0.1.0
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/LICENSE +83 -0
- package/README.md +46 -0
- package/dist/args.d.ts +18 -0
- package/dist/args.d.ts.map +1 -0
- package/dist/args.js +92 -0
- package/dist/args.js.map +1 -0
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +142 -0
- package/dist/bin.js.map +1 -0
- package/dist/commands/adopt-cmd.d.ts +2 -0
- package/dist/commands/adopt-cmd.d.ts.map +1 -0
- package/dist/commands/adopt-cmd.js +61 -0
- package/dist/commands/adopt-cmd.js.map +1 -0
- package/dist/commands/answer-cmd.d.ts +2 -0
- package/dist/commands/answer-cmd.d.ts.map +1 -0
- package/dist/commands/answer-cmd.js +150 -0
- package/dist/commands/answer-cmd.js.map +1 -0
- package/dist/commands/bench-cmd.d.ts +4 -0
- package/dist/commands/bench-cmd.d.ts.map +1 -0
- package/dist/commands/bench-cmd.js +1542 -0
- package/dist/commands/bench-cmd.js.map +1 -0
- package/dist/commands/config-cmd.d.ts +7 -0
- package/dist/commands/config-cmd.d.ts.map +1 -0
- package/dist/commands/config-cmd.js +80 -0
- package/dist/commands/config-cmd.js.map +1 -0
- package/dist/commands/context-cmd.d.ts +2 -0
- package/dist/commands/context-cmd.d.ts.map +1 -0
- package/dist/commands/context-cmd.js +130 -0
- package/dist/commands/context-cmd.js.map +1 -0
- package/dist/commands/doctor-cmd.d.ts +2 -0
- package/dist/commands/doctor-cmd.d.ts.map +1 -0
- package/dist/commands/doctor-cmd.js +198 -0
- package/dist/commands/doctor-cmd.js.map +1 -0
- package/dist/commands/dream-cmd.d.ts +26 -0
- package/dist/commands/dream-cmd.d.ts.map +1 -0
- package/dist/commands/dream-cmd.js +1167 -0
- package/dist/commands/dream-cmd.js.map +1 -0
- package/dist/commands/dream-model-status.d.ts +5 -0
- package/dist/commands/dream-model-status.d.ts.map +1 -0
- package/dist/commands/dream-model-status.js +33 -0
- package/dist/commands/dream-model-status.js.map +1 -0
- package/dist/commands/dream-notifications.d.ts +24 -0
- package/dist/commands/dream-notifications.d.ts.map +1 -0
- package/dist/commands/dream-notifications.js +168 -0
- package/dist/commands/dream-notifications.js.map +1 -0
- package/dist/commands/dream-schedule.d.ts +55 -0
- package/dist/commands/dream-schedule.d.ts.map +1 -0
- package/dist/commands/dream-schedule.js +160 -0
- package/dist/commands/dream-schedule.js.map +1 -0
- package/dist/commands/folder-cmd.d.ts +2 -0
- package/dist/commands/folder-cmd.d.ts.map +1 -0
- package/dist/commands/folder-cmd.js +84 -0
- package/dist/commands/folder-cmd.js.map +1 -0
- package/dist/commands/graph-cmd.d.ts +2 -0
- package/dist/commands/graph-cmd.d.ts.map +1 -0
- package/dist/commands/graph-cmd.js +126 -0
- package/dist/commands/graph-cmd.js.map +1 -0
- package/dist/commands/inbox-cmd.d.ts +2 -0
- package/dist/commands/inbox-cmd.d.ts.map +1 -0
- package/dist/commands/inbox-cmd.js +69 -0
- package/dist/commands/inbox-cmd.js.map +1 -0
- package/dist/commands/index-cmd.d.ts +2 -0
- package/dist/commands/index-cmd.d.ts.map +1 -0
- package/dist/commands/index-cmd.js +102 -0
- package/dist/commands/index-cmd.js.map +1 -0
- package/dist/commands/ingest-cmd.d.ts +2 -0
- package/dist/commands/ingest-cmd.d.ts.map +1 -0
- package/dist/commands/ingest-cmd.js +167 -0
- package/dist/commands/ingest-cmd.js.map +1 -0
- package/dist/commands/init-cmd.d.ts +292 -0
- package/dist/commands/init-cmd.d.ts.map +1 -0
- package/dist/commands/init-cmd.js +476 -0
- package/dist/commands/init-cmd.js.map +1 -0
- package/dist/commands/init-prompts.d.ts +51 -0
- package/dist/commands/init-prompts.d.ts.map +1 -0
- package/dist/commands/init-prompts.js +192 -0
- package/dist/commands/init-prompts.js.map +1 -0
- package/dist/commands/list-cmd.d.ts +2 -0
- package/dist/commands/list-cmd.d.ts.map +1 -0
- package/dist/commands/list-cmd.js +77 -0
- package/dist/commands/list-cmd.js.map +1 -0
- package/dist/commands/maintenance-policy-output.d.ts +4 -0
- package/dist/commands/maintenance-policy-output.d.ts.map +1 -0
- package/dist/commands/maintenance-policy-output.js +72 -0
- package/dist/commands/maintenance-policy-output.js.map +1 -0
- package/dist/commands/mutate-cmd.d.ts +5 -0
- package/dist/commands/mutate-cmd.d.ts.map +1 -0
- package/dist/commands/mutate-cmd.js +224 -0
- package/dist/commands/mutate-cmd.js.map +1 -0
- package/dist/commands/plan-cmd.d.ts +9 -0
- package/dist/commands/plan-cmd.d.ts.map +1 -0
- package/dist/commands/plan-cmd.js +411 -0
- package/dist/commands/plan-cmd.js.map +1 -0
- package/dist/commands/read-cmd.d.ts +2 -0
- package/dist/commands/read-cmd.d.ts.map +1 -0
- package/dist/commands/read-cmd.js +89 -0
- package/dist/commands/read-cmd.js.map +1 -0
- package/dist/commands/recall-cmd.d.ts +2 -0
- package/dist/commands/recall-cmd.d.ts.map +1 -0
- package/dist/commands/recall-cmd.js +176 -0
- package/dist/commands/recall-cmd.js.map +1 -0
- package/dist/commands/redeploy-cmd.d.ts +43 -0
- package/dist/commands/redeploy-cmd.d.ts.map +1 -0
- package/dist/commands/redeploy-cmd.js +270 -0
- package/dist/commands/redeploy-cmd.js.map +1 -0
- package/dist/commands/rules-cmd.d.ts +2 -0
- package/dist/commands/rules-cmd.d.ts.map +1 -0
- package/dist/commands/rules-cmd.js +72 -0
- package/dist/commands/rules-cmd.js.map +1 -0
- package/dist/commands/serve-cmd.d.ts +23 -0
- package/dist/commands/serve-cmd.d.ts.map +1 -0
- package/dist/commands/serve-cmd.js +415 -0
- package/dist/commands/serve-cmd.js.map +1 -0
- package/dist/commands/timeline-cmd.d.ts +2 -0
- package/dist/commands/timeline-cmd.d.ts.map +1 -0
- package/dist/commands/timeline-cmd.js +67 -0
- package/dist/commands/timeline-cmd.js.map +1 -0
- package/dist/commands/write-cmd.d.ts +49 -0
- package/dist/commands/write-cmd.d.ts.map +1 -0
- package/dist/commands/write-cmd.js +269 -0
- package/dist/commands/write-cmd.js.map +1 -0
- package/dist/ops-handle.d.ts +67 -0
- package/dist/ops-handle.d.ts.map +1 -0
- package/dist/ops-handle.js +196 -0
- package/dist/ops-handle.js.map +1 -0
- package/dist/output.d.ts +28 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +87 -0
- package/dist/output.js.map +1 -0
- package/dist/serve/http.d.ts +19 -0
- package/dist/serve/http.d.ts.map +1 -0
- package/dist/serve/http.js +135 -0
- package/dist/serve/http.js.map +1 -0
- package/dist/serve/mcp.d.ts +21 -0
- package/dist/serve/mcp.d.ts.map +1 -0
- package/dist/serve/mcp.js +79 -0
- package/dist/serve/mcp.js.map +1 -0
- package/dist/serve/socket.d.ts +15 -0
- package/dist/serve/socket.d.ts.map +1 -0
- package/dist/serve/socket.js +311 -0
- package/dist/serve/socket.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +15 -0
- package/dist/version.js.map +1 -0
- package/package.json +40 -0
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { openOptionsFrom, parse } from "../args.js";
|
|
2
|
+
import { heading, json, kv, line, statusLabel, style } from "../output.js";
|
|
3
|
+
import { resolveOps } from "../ops-handle.js";
|
|
4
|
+
const FOLDER_HELP = `akno folder <path> --description <text> [options]
|
|
5
|
+
|
|
6
|
+
Declare a folder and what belongs in it. The rule is written to
|
|
7
|
+
<akno_path>/akno.jsonc, so the taxonomy travels with the notes.
|
|
8
|
+
|
|
9
|
+
Never gated: nothing here waits on approval. What it asks for is a sentence —
|
|
10
|
+
\`description\` is what the next caller reads before filing a page there.
|
|
11
|
+
|
|
12
|
+
--description <text> What belongs here. Required.
|
|
13
|
+
--role <r> knowledge | source | inference | ignored. Default knowledge.
|
|
14
|
+
--remember <m> integrate | deny. Knowledge defaults to integrate; other roles deny.
|
|
15
|
+
--type <t> Default page type for this folder.
|
|
16
|
+
--ingest <mode> page | document | file | auto | ignore.
|
|
17
|
+
--rank <n> 0..2, multiplied into the recall score.
|
|
18
|
+
--route Make this an inbox: arrivals are named and moved out of it.
|
|
19
|
+
--actor <who> user | agent.
|
|
20
|
+
--dry-run Report the rule; write nothing.
|
|
21
|
+
--json`;
|
|
22
|
+
export async function folderCommand(argv) {
|
|
23
|
+
const { values, positionals } = parse(argv, {
|
|
24
|
+
description: { type: 'string' },
|
|
25
|
+
role: { type: 'string' },
|
|
26
|
+
remember: { type: 'string' },
|
|
27
|
+
type: { type: 'string' },
|
|
28
|
+
ingest: { type: 'string' },
|
|
29
|
+
rank: { type: 'string' },
|
|
30
|
+
route: { type: 'boolean', default: false },
|
|
31
|
+
actor: { type: 'string' },
|
|
32
|
+
'dry-run': { type: 'boolean', default: false },
|
|
33
|
+
});
|
|
34
|
+
if (values.help || positionals.length === 0) {
|
|
35
|
+
line(FOLDER_HELP);
|
|
36
|
+
return positionals.length === 0 && !values.help ? 1 : 0;
|
|
37
|
+
}
|
|
38
|
+
if (!values.description) {
|
|
39
|
+
line(style.red(' --description is required. A folder nothing can explain is the thing this prevents.'));
|
|
40
|
+
return 1;
|
|
41
|
+
}
|
|
42
|
+
const handle = await resolveOps(values, openOptionsFrom(values), {
|
|
43
|
+
write: true,
|
|
44
|
+
...(values.actor === 'user' || values.actor === 'agent' ? { actor: values.actor } : {}),
|
|
45
|
+
});
|
|
46
|
+
try {
|
|
47
|
+
const result = await handle.ops.folder({
|
|
48
|
+
path: positionals[0],
|
|
49
|
+
description: values.description,
|
|
50
|
+
...(values.role ? { role: values.role } : {}),
|
|
51
|
+
...(values.remember ? { remember: values.remember } : {}),
|
|
52
|
+
...(values.type ? { type: values.type } : {}),
|
|
53
|
+
...(values.ingest ? { ingest: values.ingest } : {}),
|
|
54
|
+
...(values.rank !== undefined ? { rank: Number(values.rank) } : {}),
|
|
55
|
+
...(values.route ? { route: true } : {}),
|
|
56
|
+
...(values['dry-run'] ? { dry_run: true } : {}),
|
|
57
|
+
});
|
|
58
|
+
if (values.json) {
|
|
59
|
+
json(result);
|
|
60
|
+
return 0;
|
|
61
|
+
}
|
|
62
|
+
if (result.outcome === 'noop') {
|
|
63
|
+
line(`${statusLabel('ok')} ${style.grey(result.note ?? 'already declared')}`);
|
|
64
|
+
kv(Object.entries(result.rule ?? {}).map(([key, value]) => [key, String(value)]));
|
|
65
|
+
return 0;
|
|
66
|
+
}
|
|
67
|
+
heading(`${style.green('declared')} ${result.path}`);
|
|
68
|
+
kv([
|
|
69
|
+
['rule', result.glob ?? null],
|
|
70
|
+
['in', result.rules_file ?? null],
|
|
71
|
+
...Object.entries(result.rule ?? {}).map(([key, value]) => [key, String(value)]),
|
|
72
|
+
]);
|
|
73
|
+
if (result.change_id) {
|
|
74
|
+
line(`\n ${style.grey('reverse with')} ${style.bold(`akno undo ${result.change_id}`)}`);
|
|
75
|
+
}
|
|
76
|
+
if (result.note)
|
|
77
|
+
line(style.grey(`\n ${result.note}`));
|
|
78
|
+
return 0;
|
|
79
|
+
}
|
|
80
|
+
finally {
|
|
81
|
+
await handle.close();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=folder-cmd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"folder-cmd.js","sourceRoot":"","sources":["../../src/commands/folder-cmd.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-cmd.d.ts","sourceRoot":"","sources":["../../src/commands/graph-cmd.ts"],"names":[],"mappings":"AA0BA,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA6DlE"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { openOptionsFrom, parse } from "../args.js";
|
|
2
|
+
import { json, line, statusLabel, style } from "../output.js";
|
|
3
|
+
import { resolveOps } from "../ops-handle.js";
|
|
4
|
+
const GRAPH_HELP = `akno graph [seed] [options]
|
|
5
|
+
|
|
6
|
+
Inspect bounded evidence paths without returning page bodies or copied claims.
|
|
7
|
+
|
|
8
|
+
--slug <slug> Seed one exact page.
|
|
9
|
+
--entity <id> Seed one exact canonical entity id.
|
|
10
|
+
--query <text> Resolve exact entity names contained in a query. A positional
|
|
11
|
+
seed is treated as the query when no seed flag is present.
|
|
12
|
+
--direction <d> out | in | both (default: both)
|
|
13
|
+
--relation <r,...> Restrict relationship types.
|
|
14
|
+
--hops <n> 1 | 2 | 3 (default: 2)
|
|
15
|
+
--limit <n> Maximum paths, up to 100 (default: 30).
|
|
16
|
+
--history Include superseded fact paths. Excluded by default.
|
|
17
|
+
--json Machine-readable response.`;
|
|
18
|
+
export async function graphCommand(argv) {
|
|
19
|
+
const { values, positionals } = parse(argv, {
|
|
20
|
+
slug: { type: 'string' },
|
|
21
|
+
entity: { type: 'string' },
|
|
22
|
+
query: { type: 'string' },
|
|
23
|
+
direction: { type: 'string' },
|
|
24
|
+
relation: { type: 'string' },
|
|
25
|
+
hops: { type: 'string' },
|
|
26
|
+
limit: { type: 'string' },
|
|
27
|
+
history: { type: 'boolean', default: false },
|
|
28
|
+
});
|
|
29
|
+
if (values.help) {
|
|
30
|
+
line(GRAPH_HELP);
|
|
31
|
+
return 0;
|
|
32
|
+
}
|
|
33
|
+
const positionalQuery = !values.slug && !values.entity && !values.query ? positionals.join(' ') : '';
|
|
34
|
+
const hasExplicitSeed = Boolean(values.slug || values.entity || values.query);
|
|
35
|
+
if ([values.slug, values.entity, values.query, positionalQuery || undefined].filter(Boolean).length !== 1 ||
|
|
36
|
+
(hasExplicitSeed && positionals.length > 0)) {
|
|
37
|
+
line(GRAPH_HELP);
|
|
38
|
+
return 1;
|
|
39
|
+
}
|
|
40
|
+
const handle = await resolveOps(values, openOptionsFrom(values));
|
|
41
|
+
try {
|
|
42
|
+
const result = await handle.ops.graph({
|
|
43
|
+
...(values.slug ? { slug: values.slug } : {}),
|
|
44
|
+
...(values.entity ? { entity: values.entity } : {}),
|
|
45
|
+
...(values.query || positionalQuery ? { query: values.query ?? positionalQuery } : {}),
|
|
46
|
+
...(values.direction ? { direction: values.direction } : {}),
|
|
47
|
+
...(values.relation
|
|
48
|
+
? { relations: values.relation.split(',').map((value) => value.trim()) }
|
|
49
|
+
: {}),
|
|
50
|
+
...(values.hops ? { max_hops: Number(values.hops) } : {}),
|
|
51
|
+
...(values.limit ? { limit: Number(values.limit) } : {}),
|
|
52
|
+
...(values.history ? { include_history: true } : {}),
|
|
53
|
+
});
|
|
54
|
+
if (values.json) {
|
|
55
|
+
json(result);
|
|
56
|
+
return result.status === 'unavailable' ? 1 : 0;
|
|
57
|
+
}
|
|
58
|
+
printGraph(result);
|
|
59
|
+
return result.status === 'unavailable' ? 1 : 0;
|
|
60
|
+
}
|
|
61
|
+
finally {
|
|
62
|
+
await handle.close();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function printGraph(result) {
|
|
66
|
+
line(`${statusLabel(result.status)} ${style.grey(`${result.paths.length} path${result.paths.length === 1 ? '' : 's'}`)} ` +
|
|
67
|
+
`${style.grey(`${result.nodes.length} nodes, ${result.edges.length} edges`)}`);
|
|
68
|
+
if (result.degraded?.length)
|
|
69
|
+
line(style.yellow(` degraded: ${result.degraded.join(', ')}`));
|
|
70
|
+
if (result.note)
|
|
71
|
+
line(style.grey(` ${result.note}`));
|
|
72
|
+
const nodes = new Map(result.nodes.map((node) => [node.id, node]));
|
|
73
|
+
const edges = new Map(result.edges.map((edge) => [edge.id, edge]));
|
|
74
|
+
for (const seed of result.seeds) {
|
|
75
|
+
const node = nodes.get(seed.node);
|
|
76
|
+
line(` ${style.grey(`seed ${seed.form}`)} ${node ? nodeLabel(node) : seed.value}`);
|
|
77
|
+
}
|
|
78
|
+
for (const ambiguity of result.ambiguities) {
|
|
79
|
+
line(style.yellow(` ambiguous ${JSON.stringify(ambiguity.mention)}`));
|
|
80
|
+
for (const candidate of ambiguity.candidates) {
|
|
81
|
+
line(` ${nodeLabel(candidate)} ${candidate.entity ? style.grey(candidate.entity) : ''}`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
for (const path of result.paths) {
|
|
85
|
+
const start = nodes.get(path.nodes[0]);
|
|
86
|
+
if (!start)
|
|
87
|
+
continue;
|
|
88
|
+
let rendered = nodeLabel(start);
|
|
89
|
+
for (let index = 0; index < path.edges.length; index++) {
|
|
90
|
+
const edge = edges.get(path.edges[index]);
|
|
91
|
+
const from = path.nodes[index];
|
|
92
|
+
const next = nodes.get(path.nodes[index + 1]);
|
|
93
|
+
if (!edge || !next)
|
|
94
|
+
continue;
|
|
95
|
+
const relation = edge.predicate ? `${edge.relation}:${edge.predicate}` : edge.relation;
|
|
96
|
+
rendered +=
|
|
97
|
+
edge.from === from ? ` —${relation}→ ${nodeLabel(next)}` : ` ←${relation}— ${nodeLabel(next)}`;
|
|
98
|
+
}
|
|
99
|
+
line(` ${style.grey(`${path.hops}h ~${path.confidence.toFixed(3)}`)} ${rendered}`);
|
|
100
|
+
line(style.grey(` ${path.evidence.map(locator).join(' · ')}`));
|
|
101
|
+
}
|
|
102
|
+
if (result.truncated)
|
|
103
|
+
line(style.yellow(' traversal was truncated; narrower filters may reveal other paths'));
|
|
104
|
+
}
|
|
105
|
+
function nodeLabel(node) {
|
|
106
|
+
switch (node.kind) {
|
|
107
|
+
case 'entity':
|
|
108
|
+
return `${node.label ?? node.entity}${node.slug ? style.grey(` [${node.slug}]`) : ''}`;
|
|
109
|
+
case 'page':
|
|
110
|
+
return node.slug ?? node.label ?? node.id;
|
|
111
|
+
case 'document':
|
|
112
|
+
return `${node.label ?? node.document}${node.availability ? style.grey(` [${node.availability}]`) : ''}`;
|
|
113
|
+
case 'fact':
|
|
114
|
+
return `${node.fact}${node.slug && node.line_start ? style.grey(` [${node.slug}:${node.line_start}]`) : ''}`;
|
|
115
|
+
case 'event':
|
|
116
|
+
return `${node.event}${node.date ? style.grey(` [${node.date}]`) : ''}`;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
function locator(evidence) {
|
|
120
|
+
const lineRange = evidence.line_start
|
|
121
|
+
? `:${evidence.line_start}${evidence.line_end && evidence.line_end !== evidence.line_start ? `-${evidence.line_end}` : ''}`
|
|
122
|
+
: '';
|
|
123
|
+
const source = evidence.slug ?? evidence.document ?? evidence.event ?? evidence.fact ?? evidence.kind;
|
|
124
|
+
return `${source}${lineRange}${evidence.field ? `#${evidence.field}` : ''}`;
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=graph-cmd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-cmd.js","sourceRoot":"","sources":["../../src/commands/graph-cmd.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inbox-cmd.d.ts","sourceRoot":"","sources":["../../src/commands/inbox-cmd.ts"],"names":[],"mappings":"AAyBA,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAqDlE"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { openOptionsFrom, parse } from "../args.js";
|
|
2
|
+
import { runMaintenance } from "../ops-handle.js";
|
|
3
|
+
import { heading, json, line, style, truncate } from "../output.js";
|
|
4
|
+
const INBOX_HELP = `akno inbox [options]
|
|
5
|
+
|
|
6
|
+
Process whatever is sitting in an inbox folder: extract, name, summarize, and route.
|
|
7
|
+
A file that finds a home moves there with its page. A file that does not **stays in
|
|
8
|
+
the inbox**, with a proposal.
|
|
9
|
+
|
|
10
|
+
That failure mode is the point. An unrouted file sits visibly where you dropped it
|
|
11
|
+
rather than being filed confidently into the wrong place, where you would never look
|
|
12
|
+
for it. An inbox with three things in it is a to-do list; a misfiled document is a
|
|
13
|
+
lost one.
|
|
14
|
+
|
|
15
|
+
An inbox is any folder with \`route: true\` in its rule:
|
|
16
|
+
|
|
17
|
+
"inbox/**": { "ingest": "auto", "route": true }
|
|
18
|
+
|
|
19
|
+
\`akno serve\` does this automatically as files arrive. This command is for a
|
|
20
|
+
one-off pass, or for a machine that is not running the service.
|
|
21
|
+
|
|
22
|
+
--limit <n> Files to process in this pass (default 50).
|
|
23
|
+
--json`;
|
|
24
|
+
export async function inboxCommand(argv) {
|
|
25
|
+
const { values } = parse(argv, { limit: { type: 'string' } });
|
|
26
|
+
if (values.help) {
|
|
27
|
+
line(INBOX_HELP);
|
|
28
|
+
return 0;
|
|
29
|
+
}
|
|
30
|
+
const input = values.limit ? { limit: Number(values.limit) } : {};
|
|
31
|
+
// Through the service when one is running: filing a document writes, and exactly one
|
|
32
|
+
// process may write. The user running this by hand is the user, so a new folder is not gated.
|
|
33
|
+
const result = await runMaintenance('inbox', input, values, openOptionsFrom(values), (mem) => mem.inbox(input));
|
|
34
|
+
{
|
|
35
|
+
if (values.json) {
|
|
36
|
+
json(result);
|
|
37
|
+
return result.waiting.length > 0 ? 2 : 0;
|
|
38
|
+
}
|
|
39
|
+
const total = result.filed.length + result.waiting.length + result.skipped.length;
|
|
40
|
+
if (total === 0) {
|
|
41
|
+
line(style.grey('the inbox is empty'));
|
|
42
|
+
return 0;
|
|
43
|
+
}
|
|
44
|
+
if (result.filed.length > 0) {
|
|
45
|
+
heading(`${result.filed.length} filed`);
|
|
46
|
+
for (const entry of result.filed) {
|
|
47
|
+
line(` ${style.green('→')} ${entry.source} ${style.grey('became')} ${entry.slug}`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (result.waiting.length > 0) {
|
|
51
|
+
heading(`${result.waiting.length} still in the inbox`);
|
|
52
|
+
for (const entry of result.waiting) {
|
|
53
|
+
line(` ${style.yellow('·')} ${entry.source}`);
|
|
54
|
+
line(` ${style.grey(truncate(entry.reason, 96))}`);
|
|
55
|
+
if (entry.proposalId) {
|
|
56
|
+
line(` ${style.grey('decide with')} ${style.bold(`akno ingest <file> --folder <folder>`)}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (result.skipped.length > 0) {
|
|
61
|
+
heading(`${result.skipped.length} skipped`);
|
|
62
|
+
for (const entry of result.skipped) {
|
|
63
|
+
line(` ${style.grey(`${entry.source} — ${entry.reason}`)}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return result.waiting.length > 0 ? 2 : 0;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=inbox-cmd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inbox-cmd.js","sourceRoot":"","sources":["../../src/commands/inbox-cmd.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-cmd.d.ts","sourceRoot":"","sources":["../../src/commands/index-cmd.ts"],"names":[],"mappings":"AAoBA,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA6FlE"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { openOptionsFrom, parse } from "../args.js";
|
|
2
|
+
import { runMaintenance } from "../ops-handle.js";
|
|
3
|
+
import { heading, json, kv, line, ms, progressWriter, style } from "../output.js";
|
|
4
|
+
const INDEX_HELP = `akno index [options]
|
|
5
|
+
|
|
6
|
+
Reconcile the index against the knowledge base. Safe to run any time — a pass
|
|
7
|
+
with nothing changed stats the tree and stops.
|
|
8
|
+
|
|
9
|
+
--verify Hash every file instead of trusting mtime and size. The
|
|
10
|
+
correctness path: catches a sync client or a restored
|
|
11
|
+
backup that preserved mtime across a real content change.
|
|
12
|
+
--structural Skip the model-backed passes (embeddings, summaries,
|
|
13
|
+
facts). Structure indexes in milliseconds.
|
|
14
|
+
--rederive Re-run summaries and fact derivation even where the body
|
|
15
|
+
hash has not moved.
|
|
16
|
+
--rebuild Delete the index first, then index from scratch. Costs one
|
|
17
|
+
re-index and no data; the knowledge base is untouched.
|
|
18
|
+
--json Machine-readable report.`;
|
|
19
|
+
export async function indexCommand(argv) {
|
|
20
|
+
const { values } = parse(argv, {
|
|
21
|
+
verify: { type: 'boolean', default: false },
|
|
22
|
+
structural: { type: 'boolean', default: false },
|
|
23
|
+
rederive: { type: 'boolean', default: false },
|
|
24
|
+
rebuild: { type: 'boolean', default: false },
|
|
25
|
+
});
|
|
26
|
+
if (values.help) {
|
|
27
|
+
line(INDEX_HELP);
|
|
28
|
+
return 0;
|
|
29
|
+
}
|
|
30
|
+
if (values.rebuild) {
|
|
31
|
+
const { loadConfig } = await import('@tenphi/akno-core');
|
|
32
|
+
const config = loadConfig(openOptionsFrom(values));
|
|
33
|
+
const fs = await import('node:fs');
|
|
34
|
+
// Deleting the index costs one re-index and no data. That property is the
|
|
35
|
+
// design — so `--rebuild` is allowed to be this blunt.
|
|
36
|
+
for (const suffix of ['', '-wal', '-shm']) {
|
|
37
|
+
fs.rmSync(`${config.dbPath}${suffix}`, { force: true });
|
|
38
|
+
}
|
|
39
|
+
line(style.grey(`removed ${config.dbPath}`));
|
|
40
|
+
}
|
|
41
|
+
const input = {
|
|
42
|
+
...(values.verify ? { verify: true } : {}),
|
|
43
|
+
...(values.structural ? { structuralOnly: true } : {}),
|
|
44
|
+
...(values.rederive ? { rederive: true } : {}),
|
|
45
|
+
};
|
|
46
|
+
// Through the service when one is running — it holds the write handle. In-process it also
|
|
47
|
+
// gets a progress writer, which a socket cannot carry: the service logs its own progress.
|
|
48
|
+
const report = await runMaintenance('index', input, values, openOptionsFrom(values), async (mem) => {
|
|
49
|
+
const progress = progressWriter();
|
|
50
|
+
return mem.index({
|
|
51
|
+
...input,
|
|
52
|
+
onProgress: (update) => progress(update.phase, update.done, update.total, update.detail),
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
{
|
|
56
|
+
if (values.json) {
|
|
57
|
+
json(report);
|
|
58
|
+
return 0;
|
|
59
|
+
}
|
|
60
|
+
heading(`Indexed in ${ms(report.durationMs)}`);
|
|
61
|
+
kv([
|
|
62
|
+
['pages indexed', report.pagesIndexed],
|
|
63
|
+
['pages unchanged', report.pagesUnchanged],
|
|
64
|
+
['pages renamed', report.pagesRenamed > 0 ? report.pagesRenamed : '-'],
|
|
65
|
+
['pages removed', report.pagesRemoved > 0 ? report.pagesRemoved : '-'],
|
|
66
|
+
['ignored by role', report.ignored > 0 ? report.ignored : '-'],
|
|
67
|
+
['chunks written', report.chunksWritten],
|
|
68
|
+
['chunks embedded', report.chunksEmbedded],
|
|
69
|
+
['pages summarized', report.pagesDerived],
|
|
70
|
+
['facts derived', report.factsDerived],
|
|
71
|
+
['events indexed', report.eventsIndexed],
|
|
72
|
+
['graph nodes', report.graphNodes],
|
|
73
|
+
['graph edges', report.graphEdges],
|
|
74
|
+
['graph entities', report.graphEntities],
|
|
75
|
+
['graph mentions', report.graphMentions],
|
|
76
|
+
['ambiguous mentions', report.graphAmbiguousMentions > 0 ? report.graphAmbiguousMentions : '-'],
|
|
77
|
+
['unresolved mentions', report.graphUnresolvedMentions > 0 ? report.graphUnresolvedMentions : '-'],
|
|
78
|
+
['contextual mentions', report.graphContextualMentions > 0 ? report.graphContextualMentions : '-'],
|
|
79
|
+
['new contextual choices', report.graphContextualResolved > 0 ? report.graphContextualResolved : '-'],
|
|
80
|
+
['contextual abstentions', report.graphContextualAbstained > 0 ? report.graphContextualAbstained : '-'],
|
|
81
|
+
['contextual failures', report.graphContextualFailed > 0 ? report.graphContextualFailed : '-'],
|
|
82
|
+
['graph facts', report.graphFacts],
|
|
83
|
+
['fact edges', report.graphFactEdges],
|
|
84
|
+
['non-traversable facts', report.graphNonTraversableFacts > 0 ? report.graphNonTraversableFacts : '-'],
|
|
85
|
+
['documents linked', report.documentsLinked],
|
|
86
|
+
['documents read', report.documentsExtracted > 0 ? report.documentsExtracted : '-'],
|
|
87
|
+
['documents summarized', report.documentsSummarized > 0 ? report.documentsSummarized : '-'],
|
|
88
|
+
['text renditions', report.renditionsWritten > 0 ? report.renditionsWritten : '-'],
|
|
89
|
+
['files hashed', report.hashed],
|
|
90
|
+
]);
|
|
91
|
+
if (report.warnings.length > 0) {
|
|
92
|
+
heading(`${report.warnings.length} warning${report.warnings.length === 1 ? '' : 's'}`);
|
|
93
|
+
for (const warning of report.warnings.slice(0, 20))
|
|
94
|
+
line(` ${style.yellow('·')} ${warning}`);
|
|
95
|
+
if (report.warnings.length > 20) {
|
|
96
|
+
line(style.grey(` … ${report.warnings.length - 20} more — see \`akno doctor\``));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return 0;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=index-cmd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-cmd.js","sourceRoot":"","sources":["../../src/commands/index-cmd.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingest-cmd.d.ts","sourceRoot":"","sources":["../../src/commands/ingest-cmd.ts"],"names":[],"mappings":"AA6BA,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAmInE"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { openOptionsFrom, parse } from "../args.js";
|
|
2
|
+
import { heading, json, kv, line, statusLabel, style, truncate } from "../output.js";
|
|
3
|
+
import { resolveOps } from "../ops-handle.js";
|
|
4
|
+
const INGEST_HELP = `akno ingest <path | url> [options]
|
|
5
|
+
|
|
6
|
+
Pull a file, a folder, or a URL into memory: extract the text, OCR it if there is no
|
|
7
|
+
text layer, name it from its contents, summarize it, and route it to a folder. You
|
|
8
|
+
never run an extraction tool.
|
|
9
|
+
|
|
10
|
+
A folder is walked one level deep — a recursive pass over a folder pointed at by
|
|
11
|
+
mistake is a thousand model calls — and every file gets its own verdict.
|
|
12
|
+
|
|
13
|
+
Extraction uses what macOS already has — PDFKit for a text layer, the Vision
|
|
14
|
+
framework for OCR. A small helper is compiled on first use and cached.
|
|
15
|
+
|
|
16
|
+
Two things it deliberately refuses to do:
|
|
17
|
+
· A file whose text cannot be read keeps its name and gets no page, rather than
|
|
18
|
+
being given a confident wrong one.
|
|
19
|
+
· A file with no clear destination stays where it is, with a proposal. A misfiled
|
|
20
|
+
document is a lost one.
|
|
21
|
+
|
|
22
|
+
--folder <path> Put it here, instead of letting routing decide.
|
|
23
|
+
--label <text> A description for the stored file.
|
|
24
|
+
--limit <n> Files to look at when ingesting a folder (default 50).
|
|
25
|
+
--move Move the source instead of copying it.
|
|
26
|
+
--actor <who> user | agent. The user is never gated.
|
|
27
|
+
--json`;
|
|
28
|
+
export async function ingestCommand(argv) {
|
|
29
|
+
const { values, positionals } = parse(argv, {
|
|
30
|
+
folder: { type: 'string' },
|
|
31
|
+
label: { type: 'string' },
|
|
32
|
+
limit: { type: 'string' },
|
|
33
|
+
move: { type: 'boolean', default: false },
|
|
34
|
+
actor: { type: 'string' },
|
|
35
|
+
});
|
|
36
|
+
if (values.help || positionals.length === 0) {
|
|
37
|
+
line(INGEST_HELP);
|
|
38
|
+
return values.help ? 0 : 1;
|
|
39
|
+
}
|
|
40
|
+
const handle = await resolveOps(values, openOptionsFrom(values), {
|
|
41
|
+
write: true,
|
|
42
|
+
...(values.actor === 'user' || values.actor === 'agent' ? { actor: values.actor } : {}),
|
|
43
|
+
});
|
|
44
|
+
try {
|
|
45
|
+
const target = positionals[0];
|
|
46
|
+
const result = await handle.ops.ingest({
|
|
47
|
+
// A URL and a path are told apart here rather than by the op, so `./https-notes`
|
|
48
|
+
// stays a path and does not become a fetch.
|
|
49
|
+
...(/^https?:\/\//i.test(target) ? { url: target } : { path: target }),
|
|
50
|
+
...(values.folder ? { folder: values.folder } : {}),
|
|
51
|
+
...(values.label ? { label: values.label } : {}),
|
|
52
|
+
...(values.limit ? { limit: Number(values.limit) } : {}),
|
|
53
|
+
...(values.move ? { route: true } : {}),
|
|
54
|
+
});
|
|
55
|
+
if (values.json) {
|
|
56
|
+
json(result);
|
|
57
|
+
return result.outcome === 'ok' || result.outcome === 'duplicate' ? 0 : 2;
|
|
58
|
+
}
|
|
59
|
+
if (result.batch) {
|
|
60
|
+
// A folder: one line per file, because three filing themselves and two needing a
|
|
61
|
+
// decision is not one outcome.
|
|
62
|
+
heading(result.note ?? `${result.batch.length} files`);
|
|
63
|
+
const width = Math.max(...result.batch.map((entry) => entry.source.length));
|
|
64
|
+
for (const entry of result.batch) {
|
|
65
|
+
const label = entry.outcome === 'ok'
|
|
66
|
+
? style.green('filed')
|
|
67
|
+
: entry.outcome === 'duplicate'
|
|
68
|
+
? style.grey('already stored')
|
|
69
|
+
: entry.outcome === 'error'
|
|
70
|
+
? style.red('error')
|
|
71
|
+
: style.yellow(entry.outcome === 'requires_approval' ? 'needs a home' : 'skipped');
|
|
72
|
+
line(` ${entry.source.padEnd(width)} ${label} ${style.grey(entry.slug ?? truncate(entry.note ?? '', 60))}`);
|
|
73
|
+
}
|
|
74
|
+
return result.batch.some((entry) => entry.outcome === 'ok') ? 0 : 2;
|
|
75
|
+
}
|
|
76
|
+
if (result.outcome === 'duplicate') {
|
|
77
|
+
line(`${statusLabel('ok')} ${style.grey('already stored')}`);
|
|
78
|
+
kv([
|
|
79
|
+
['document', result.document],
|
|
80
|
+
['file', result.rel_path],
|
|
81
|
+
['page', result.slug],
|
|
82
|
+
]);
|
|
83
|
+
return 0;
|
|
84
|
+
}
|
|
85
|
+
if (result.outcome === 'skipped') {
|
|
86
|
+
// Not a failure. A guard firing is the layer working, and the caller needs
|
|
87
|
+
// to know which one so it can decide whether to help.
|
|
88
|
+
line(`${statusLabel(result.status)} ${style.yellow('left where it is')}`);
|
|
89
|
+
line(` ${result.note}`);
|
|
90
|
+
if (result.ocr)
|
|
91
|
+
line(style.grey(' (OCR ran, but produced nothing usable)'));
|
|
92
|
+
return 2;
|
|
93
|
+
}
|
|
94
|
+
if (result.outcome === 'requires_approval' && result.approval) {
|
|
95
|
+
heading(style.yellow('needs a destination — the file stays where it is'));
|
|
96
|
+
kv([
|
|
97
|
+
['what it is', result.approval.reason],
|
|
98
|
+
['proposal', result.approval.proposal_id],
|
|
99
|
+
['pages', result.page_count ?? null],
|
|
100
|
+
['text from', describeSource(result.text_from)],
|
|
101
|
+
]);
|
|
102
|
+
if (result.approval.nearest.length > 0) {
|
|
103
|
+
line(` ${style.grey('folders that came closest')} ${result.approval.nearest.join(', ')}`);
|
|
104
|
+
}
|
|
105
|
+
line(`\n ${style.grey('decide with')} ${style.bold('akno ingest <path> --folder <folder>')}`);
|
|
106
|
+
return 2;
|
|
107
|
+
}
|
|
108
|
+
if (result.outcome === 'requires_folder' && result.requires_folder) {
|
|
109
|
+
// A different problem from the one above, and worth saying so: there is a destination
|
|
110
|
+
// in mind, it just has not been described yet. Nobody is waiting to approve it.
|
|
111
|
+
const required = result.requires_folder;
|
|
112
|
+
heading(style.yellow(`'${required.folder}' is not declared — the file stays where it is`));
|
|
113
|
+
kv([
|
|
114
|
+
['what it is', truncate(result.summary ?? '', 90) || null],
|
|
115
|
+
['pages', result.page_count ?? null],
|
|
116
|
+
['text from', describeSource(result.text_from)],
|
|
117
|
+
]);
|
|
118
|
+
if (required.nearest.length > 0) {
|
|
119
|
+
line(` ${style.grey('could go instead')} ${required.nearest.join(', ')}`);
|
|
120
|
+
}
|
|
121
|
+
line(`\n ${style.grey('say what belongs there, then ingest again:')}`);
|
|
122
|
+
line(` ${style.bold(`akno folder ${required.folder} --description "…"`)}`);
|
|
123
|
+
return 2;
|
|
124
|
+
}
|
|
125
|
+
line(`${statusLabel(result.status)} ${style.grey(`change ${result.change_id}`)}`);
|
|
126
|
+
kv([
|
|
127
|
+
['page', result.slug],
|
|
128
|
+
['file', result.rel_path],
|
|
129
|
+
['pages', result.page_count ?? null],
|
|
130
|
+
['text from', describeSource(result.text_from)],
|
|
131
|
+
['renamed from', result.renamed_from ?? null],
|
|
132
|
+
]);
|
|
133
|
+
if (result.summary)
|
|
134
|
+
line(`\n ${truncate(result.summary, 150)}`);
|
|
135
|
+
if (result.related?.length)
|
|
136
|
+
line(`\n ${style.grey('related')} ${result.related.join(', ')}`);
|
|
137
|
+
if (result.note)
|
|
138
|
+
line(`\n ${style.grey(result.note)}`);
|
|
139
|
+
line(`\n ${style.grey('reverse with')} ${style.bold(`akno undo ${result.change_id}`)}`);
|
|
140
|
+
return 0;
|
|
141
|
+
}
|
|
142
|
+
finally {
|
|
143
|
+
await handle.close();
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* `ocr: true/false` cannot distinguish a PDF's own text layer from a vision model's
|
|
148
|
+
* description of a photograph, and printing them the same way claims something untrue
|
|
149
|
+
* about where the text came from.
|
|
150
|
+
*/
|
|
151
|
+
function describeSource(via) {
|
|
152
|
+
switch (via) {
|
|
153
|
+
case 'text-layer':
|
|
154
|
+
return "the document's own text layer";
|
|
155
|
+
case 'ocr':
|
|
156
|
+
return 'OCR (macOS Vision)';
|
|
157
|
+
case 'plain':
|
|
158
|
+
return 'the file itself';
|
|
159
|
+
case 'textutil':
|
|
160
|
+
return 'textutil';
|
|
161
|
+
case 'vision':
|
|
162
|
+
return "a vision model's description — not text found in the image";
|
|
163
|
+
default:
|
|
164
|
+
return 'nothing could be extracted';
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=ingest-cmd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingest-cmd.js","sourceRoot":"","sources":["../../src/commands/ingest-cmd.ts"],"names":[],"mappings":"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"}
|