@plurnk/plurnk-meta 1.21.1 → 1.23.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/README.md +1 -3
- package/SPEC.md +45 -0
- package/dist/ErrorDetail.d.ts +7 -0
- package/dist/ErrorDetail.d.ts.map +1 -0
- package/dist/ErrorDetail.js +18 -0
- package/dist/ErrorDetail.js.map +1 -0
- package/dist/Knob.d.ts +9 -0
- package/dist/Knob.d.ts.map +1 -0
- package/dist/Knob.js +51 -0
- package/dist/Knob.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +41 -1
- package/dist/index.js.map +1 -1
- package/dist/observe.d.ts +4 -0
- package/dist/observe.d.ts.map +1 -0
- package/dist/observe.js +61 -0
- package/dist/observe.js.map +1 -0
- package/docs/worker.md +30 -13
- package/package.json +5 -3
- package/DOGFOOD.md +0 -94
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @plurnk/plurnk-meta
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
What plurnk's packages share that no single package owns: plugin discovery and trust, and the teaching material the service gives models.
|
|
4
4
|
|
|
5
5
|
**Membership primitives** (`import Meta from "@plurnk/plurnk-meta"`): the shared implementation of exact family identity, trust, attribution normalization, enumeration, and root resolution consumed by the four family-owned scanners (schemes, mimetypes, providers, execs). [SPEC.md](./SPEC.md) owns the complete contract ({§plugin-discovery}).
|
|
6
6
|
|
|
@@ -14,6 +14,4 @@ The plurnk metaproject layer, published — what the family shares that no singl
|
|
|
14
14
|
|
|
15
15
|
**The teaching corpus**: authored policy, an optional Recap, the Plurnk skill entry, and built-in scheme references resolved from this installed package. Meta owns the source bytes and membership; core owns admission, resource composition, and projection. See [`CORPUS.md`](./CORPUS.md) and {§teaching-corpus}.
|
|
16
16
|
|
|
17
|
-
[`DOGFOOD.md`](./DOGFOOD.md) defines the whole-product, outside-client acceptance gate for daily-driver and release readiness.
|
|
18
|
-
|
|
19
17
|
Third-party plugin authors: your package is discovered under any scope through one string `plurnk.kind`, enumerated by these primitives, and gated before import by the operator's trust knob — no registration with us required. An admitted package may declare always-on `plurnk.attribution` tags and its loaded plugin object may decide per provider attempt whether to return additional tags from `attributions(context)` ({§plugin-attribution}). MIT.
|
package/SPEC.md
CHANGED
|
@@ -93,6 +93,41 @@ Coordinated capabilities spanning families use explicit daemon-module
|
|
|
93
93
|
composition ({§module-lifecycle}); a multi-kind manifest is not a parallel
|
|
94
94
|
module mechanism.
|
|
95
95
|
|
|
96
|
+
### §env-knob One environment reader
|
|
97
|
+
|
|
98
|
+
`Knob` reads a declared key from the system environment by name and nothing
|
|
99
|
+
else: `text`, `list`, `flag` (exactly `0` or `1`), `choice` (one of a
|
|
100
|
+
vocabulary), `percent` (`80%` is 0.8) and `integer(name, floor)` (a safe
|
|
101
|
+
integer of at least the floor, which bounds what the operator may say and is
|
|
102
|
+
never a value used in the operator's place). An unset key is a broken floor
|
|
103
|
+
and an invalid value is the operator's mistake; both crash naming the key.
|
|
104
|
+
No reader accepts a fallback: a signature that could carry one is a second
|
|
105
|
+
home for a choice. Every package reads its knobs through it, so the failure
|
|
106
|
+
wording has one home.
|
|
107
|
+
|
|
108
|
+
### §error-detail-bound One diagnostic-preview bound
|
|
109
|
+
|
|
110
|
+
`new ErrorDetail(knob)` binds a package's model-facing diagnostic preview to
|
|
111
|
+
that package's `*_ERROR_DETAIL_LIMIT` knob, read through {§env-knob}:
|
|
112
|
+
`preview(value)` keeps at most that many characters of an error's message
|
|
113
|
+
(or a value's string form) and marks the cut with `...`. The bound is read at
|
|
114
|
+
each preview; an unset or invalid bound crashes by name at the first
|
|
115
|
+
diagnostic, never degrades into an unbounded one.
|
|
116
|
+
|
|
117
|
+
### §plugin-manifest-read One package.json read
|
|
118
|
+
|
|
119
|
+
`Meta.readManifest(dir, kind)` is the one read of a package's family claim:
|
|
120
|
+
its `package.json`, parsed, with a `plurnk` object declaring exactly that
|
|
121
|
+
`kind` ({§plugin-family-kind}). It answers `null` for a missing or
|
|
122
|
+
malformed manifest, a non-object, no `plurnk` object, or another family —
|
|
123
|
+
none of those is a package of that family, and a scanner skips them without
|
|
124
|
+
evidence. The result carries the manifest path, the package name when
|
|
125
|
+
`name` is a non-empty string (otherwise `null`; what an unnamed package is
|
|
126
|
+
remains the family's decision), and the `plurnk` object untouched: family
|
|
127
|
+
fields are validated by the family, after the trust gate. A scanner that
|
|
128
|
+
passes an `AbortSignal` receives the abort; it is never masked as an
|
|
129
|
+
unreadable directory. No family reads a manifest any other way.
|
|
130
|
+
|
|
96
131
|
### §plugin-attribution Plugin-authored attribution tags
|
|
97
132
|
|
|
98
133
|
| Surface | Contract |
|
|
@@ -129,3 +164,13 @@ does not crash discovery: the family result preserves its package identity as
|
|
|
129
164
|
skipped evidence. The composed host decides how to present that evidence.
|
|
130
165
|
Direct framework consumers receive the same safe load boundary and can choose
|
|
131
166
|
their own presentation.
|
|
167
|
+
|
|
168
|
+
## §observed-span Redaction-first spans
|
|
169
|
+
|
|
170
|
+
`observed(tracer, name, attributes, fn, options?)` and its synchronous twin wrap
|
|
171
|
+
one span around `fn` on the caller's tracer: attributes admit strings (capped at
|
|
172
|
+
300 characters), numbers and booleans and drop everything else; a thrown error
|
|
173
|
+
marks the span `ERROR` and records only `error.type`, the error's class name,
|
|
174
|
+
never its message. Every instrumented package binds these to its own tracer
|
|
175
|
+
rather than declaring a second helper; prompts, payloads and arbitrary URLs never
|
|
176
|
+
reach a span through them.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorDetail.d.ts","sourceRoot":"","sources":["../src/ErrorDetail.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,OAAO,OAAO,WAAW;;IAG5B,YAAY,IAAI,EAAE,MAAM,EAEvB;IAED,KAAK,IAAI,MAAM,CAEd;IAED,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAI9B;CACJ"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import Knob from "./Knob.js";
|
|
2
|
+
// {§error-detail-bound} — a package's model-facing diagnostic detail is bounded by that package's
|
|
3
|
+
// knob, read through the one reader: an unset or invalid bound crashes by name, never degrades.
|
|
4
|
+
export default class ErrorDetail {
|
|
5
|
+
#knob;
|
|
6
|
+
constructor(knob) {
|
|
7
|
+
this.#knob = knob;
|
|
8
|
+
}
|
|
9
|
+
limit() {
|
|
10
|
+
return Knob.integer(this.#knob, 0);
|
|
11
|
+
}
|
|
12
|
+
preview(value) {
|
|
13
|
+
const text = value instanceof Error ? value.message : String(value);
|
|
14
|
+
const limit = this.limit();
|
|
15
|
+
return text.length > limit ? `${text.slice(0, limit)}...` : text;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=ErrorDetail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorDetail.js","sourceRoot":"","sources":["../src/ErrorDetail.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,kGAAkG;AAClG,gGAAgG;AAChG,MAAM,CAAC,OAAO,OAAO,WAAW;IACnB,KAAK,CAAS;IAEvB,YAAY,IAAY;QACpB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACtB,CAAC;IAED,KAAK;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,CAAC,KAAc;QAClB,MAAM,IAAI,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACpE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IACrE,CAAC;CACJ"}
|
package/dist/Knob.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export default class Knob {
|
|
2
|
+
static text(name: string): string;
|
|
3
|
+
static list(name: string): string[];
|
|
4
|
+
static flag(name: string): boolean;
|
|
5
|
+
static choice<T extends string>(name: string, options: readonly T[]): T;
|
|
6
|
+
static percent(name: string): number;
|
|
7
|
+
static integer(name: string, floor: number): number;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=Knob.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Knob.d.ts","sourceRoot":"","sources":["../src/Knob.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,OAAO,OAAO,IAAI;IACrB,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIhC;IAGD,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAElC;IAGD,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAIjC;IAGD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,CAMtE;IAGD,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOnC;IAGD,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAOlD;CACJ"}
|
package/dist/Knob.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// {§env-knob} — a knob is read from the system environment, and its value lives on the panel and
|
|
2
|
+
// nowhere else ({§operator-config-only-home}). The floor guarantees every declared key, so an unset
|
|
3
|
+
// key is a broken deployment and an invalid one is the operator's mistake: both crash by name, never
|
|
4
|
+
// degrade. No reader here accepts a value, because a signature that could carry one is a second home
|
|
5
|
+
// for a choice. This is the one reader; a package that spells its own has a second home for the rule.
|
|
6
|
+
export default class Knob {
|
|
7
|
+
static text(name) {
|
|
8
|
+
const raw = process.env[name];
|
|
9
|
+
if (raw === undefined)
|
|
10
|
+
throw new Error(`${name} is missing from the assembled environment floor.`);
|
|
11
|
+
return raw;
|
|
12
|
+
}
|
|
13
|
+
// A comma list; empty is the empty list.
|
|
14
|
+
static list(name) {
|
|
15
|
+
return Knob.text(name).split(",").map((item) => item.trim()).filter((item) => item.length > 0);
|
|
16
|
+
}
|
|
17
|
+
// The house switch: exactly 0 or 1.
|
|
18
|
+
static flag(name) {
|
|
19
|
+
const raw = Knob.text(name);
|
|
20
|
+
if (raw !== "0" && raw !== "1")
|
|
21
|
+
throw new Error(`${name} must be 0 or 1; got ${JSON.stringify(raw)}.`);
|
|
22
|
+
return raw === "1";
|
|
23
|
+
}
|
|
24
|
+
// `options` is the vocabulary the operator chooses from, never a choice made for them.
|
|
25
|
+
static choice(name, options) {
|
|
26
|
+
const raw = Knob.text(name);
|
|
27
|
+
if (!options.includes(raw)) {
|
|
28
|
+
throw new Error(`${name} must be one of ${options.join(", ")}; got ${JSON.stringify(raw)}.`);
|
|
29
|
+
}
|
|
30
|
+
return raw;
|
|
31
|
+
}
|
|
32
|
+
// The panel's own notation, a share strictly between nothing and everything: `80%` is 0.8.
|
|
33
|
+
static percent(name) {
|
|
34
|
+
const raw = Knob.text(name);
|
|
35
|
+
const percent = Number(/^([0-9]+(?:\.[0-9]+)?)%$/u.exec(raw)?.[1]);
|
|
36
|
+
if (!Number.isFinite(percent) || percent <= 0 || percent >= 100) {
|
|
37
|
+
throw new Error(`${name} must be a percentage in (0, 100); got ${JSON.stringify(raw)}.`);
|
|
38
|
+
}
|
|
39
|
+
return percent / 100;
|
|
40
|
+
}
|
|
41
|
+
// `floor` is a bound on what the operator may say, never a value used in the operator's place.
|
|
42
|
+
static integer(name, floor) {
|
|
43
|
+
const raw = Knob.text(name);
|
|
44
|
+
const value = Number(raw);
|
|
45
|
+
if (raw.trim().length === 0 || !Number.isSafeInteger(value) || value < floor) {
|
|
46
|
+
throw new Error(`${name} must be a safe integer of at least ${floor}; got ${JSON.stringify(raw)}.`);
|
|
47
|
+
}
|
|
48
|
+
return value;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=Knob.js.map
|
package/dist/Knob.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Knob.js","sourceRoot":"","sources":["../src/Knob.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,15 @@
|
|
|
1
|
+
export { default as Knob } from "./Knob.ts";
|
|
2
|
+
export { default as ErrorDetail } from "./ErrorDetail.ts";
|
|
1
3
|
export interface PackageCandidate {
|
|
2
4
|
dir: string;
|
|
3
5
|
name: string;
|
|
4
6
|
}
|
|
5
7
|
export type PluginKind = "exec" | "mimetype" | "provider" | "scheme" | "http-materializer" | "module";
|
|
8
|
+
export interface PluginManifest {
|
|
9
|
+
readonly manifestPath: string;
|
|
10
|
+
readonly packageName: string | null;
|
|
11
|
+
readonly plurnk: Record<string, unknown>;
|
|
12
|
+
}
|
|
6
13
|
export type PluginAttributionDeclaration = string | string[];
|
|
7
14
|
export type PluginAttribution = readonly string[];
|
|
8
15
|
export type PackageAttributions = ReadonlyMap<string, PluginAttribution>;
|
|
@@ -16,6 +23,7 @@ export interface PluginAttributionContext {
|
|
|
16
23
|
export interface PluginAttributionSource {
|
|
17
24
|
attributions?(context: PluginAttributionContext): PluginAttributionDeclaration | null | undefined;
|
|
18
25
|
}
|
|
26
|
+
export { observed, observedSync } from "./observe.ts";
|
|
19
27
|
export declare const TEACHING_CORPUS: Readonly<{
|
|
20
28
|
readonly policy: "POLICY.md";
|
|
21
29
|
readonly recap: "recap.md";
|
|
@@ -28,6 +36,9 @@ export type TeachingCorpusSource = typeof TEACHING_CORPUS.policy | typeof TEACHI
|
|
|
28
36
|
export default class Meta {
|
|
29
37
|
#private;
|
|
30
38
|
static declaresKind(manifest: unknown, kind: PluginKind): boolean;
|
|
39
|
+
static readManifest(dir: string, kind: PluginKind, { signal }?: {
|
|
40
|
+
signal?: AbortSignal;
|
|
41
|
+
}): Promise<PluginManifest | null>;
|
|
31
42
|
static isTrusted(packageName: string, env?: Record<string, string | undefined>): boolean;
|
|
32
43
|
static normalizeAttribution(raw: unknown, packageName: string): PluginAttribution;
|
|
33
44
|
static runtimeAttribution(source: unknown, context: PluginAttributionContext, packageName: string): PluginAttribution;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
// The metaproject layer's membership slice — the mechanics every discovery
|
|
2
2
|
// surface shares ({§plugin-discovery} / {§operator-config-env-defaults}):
|
|
3
3
|
// - declaresKind: the ONE package → capability-family representation.
|
|
4
|
+
// - readManifest: the ONE package.json read: a family's manifest, or null for
|
|
5
|
+
// anything that is not a package of that family. Field
|
|
6
|
+
// validation past the family claim is the caller's.
|
|
7
|
+
// - Knob: the ONE environment reader: the panel's value by name, or a
|
|
8
|
+
// crash by name ({§env-knob}).
|
|
9
|
+
// - ErrorDetail: the ONE diagnostic-preview bound, per package knob
|
|
10
|
+
// ({§error-detail-bound}).
|
|
4
11
|
// - isTrusted: THE trust rule. One implementation; a second definition
|
|
5
12
|
// of membership trust anywhere in the family is a bug.
|
|
6
13
|
// - normalizeAttribution:
|
|
@@ -16,16 +23,19 @@
|
|
|
16
23
|
// checkouts escape node_modules via symlink realpaths and
|
|
17
24
|
// land on the monorepo root's. Null when nothing is found;
|
|
18
25
|
// the fallback is the caller's policy.
|
|
19
|
-
import { readdir } from "node:fs/promises";
|
|
26
|
+
import { readdir, readFile } from "node:fs/promises";
|
|
20
27
|
import { existsSync, readFileSync } from "node:fs";
|
|
21
28
|
import { parseEnv } from "node:util";
|
|
22
29
|
import path from "node:path";
|
|
23
30
|
import { fileURLToPath } from "node:url";
|
|
31
|
+
export { default as Knob } from "./Knob.js";
|
|
32
|
+
export { default as ErrorDetail } from "./ErrorDetail.js";
|
|
24
33
|
const SCHEME_TEACHING = Object.freeze({
|
|
25
34
|
worker: "docs/worker.md",
|
|
26
35
|
});
|
|
27
36
|
// {§teaching-corpus} — the authored package membership is one exported fact;
|
|
28
37
|
// consumers decide when and where each required source is projected.
|
|
38
|
+
export { observed, observedSync } from "./observe.js";
|
|
29
39
|
export const TEACHING_CORPUS = Object.freeze({
|
|
30
40
|
policy: "POLICY.md",
|
|
31
41
|
recap: "recap.md",
|
|
@@ -42,6 +52,36 @@ export default class Meta {
|
|
|
42
52
|
return false;
|
|
43
53
|
return manifest.kind === kind;
|
|
44
54
|
}
|
|
55
|
+
// {§plugin-manifest-read} — null for a missing or malformed package.json, a non-object,
|
|
56
|
+
// no `plurnk` object, or another family: none of those is a package of this family, and
|
|
57
|
+
// discovery skips them without a word. An abort is the caller's contract and surfaces.
|
|
58
|
+
static async readManifest(dir, kind, { signal } = {}) {
|
|
59
|
+
const manifestPath = path.join(dir, "package.json");
|
|
60
|
+
let raw;
|
|
61
|
+
try {
|
|
62
|
+
raw = await readFile(manifestPath, { encoding: "utf8", signal });
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
if (err instanceof Error && err.name === "AbortError")
|
|
66
|
+
throw err;
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
let pkg;
|
|
70
|
+
try {
|
|
71
|
+
pkg = JSON.parse(raw);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
if (typeof pkg !== "object" || pkg === null)
|
|
77
|
+
return null;
|
|
78
|
+
const record = pkg;
|
|
79
|
+
const plurnk = record.plurnk;
|
|
80
|
+
if (typeof plurnk !== "object" || plurnk === null || !Meta.declaresKind(plurnk, kind))
|
|
81
|
+
return null;
|
|
82
|
+
const packageName = typeof record.name === "string" && record.name.length > 0 ? record.name : null;
|
|
83
|
+
return { manifestPath, packageName, plurnk: plurnk };
|
|
84
|
+
}
|
|
45
85
|
// {§operator-config-only-home} — the trust gate is asked while the floor is still being
|
|
46
86
|
// assembled (it decides whose panel joins it), so an unset key cannot mean "the panel said
|
|
47
87
|
// nothing". This package owns the key, so it reads its own panel: the operator's environment
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,0EAA0E;AAC1E,6EAA6E;AAC7E,kFAAkF;AAClF,+EAA+E;AAC/E,4BAA4B;AAC5B,4EAA4E;AAC5E,gFAAgF;AAChF,iFAAiF;AACjF,+EAA+E;AAC/E,6EAA6E;AAC7E,2CAA2C;AAC3C,8EAA8E;AAC9E,iFAAiF;AACjF,4EAA4E;AAC5E,kFAAkF;AAClF,mFAAmF;AACnF,+DAA+D;AAE/D,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type Span, type SpanOptions, type Tracer } from "@opentelemetry/api";
|
|
2
|
+
export declare const observed: <T>(tracer: Tracer, name: string, attributes: Record<string, unknown>, fn: (span: Span) => Promise<T>, options?: SpanOptions) => Promise<T>;
|
|
3
|
+
export declare const observedSync: <T>(tracer: Tracer, name: string, attributes: Record<string, unknown>, fn: (span: Span) => T, options?: SpanOptions) => T;
|
|
4
|
+
//# sourceMappingURL=observe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observe.d.ts","sourceRoot":"","sources":["../src/observe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,KAAK,IAAI,EAAE,KAAK,WAAW,EAAE,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAuC9G,eAAO,MAAM,QAAQ,GAAU,CAAC,UACpB,MAAM,QACR,MAAM,cACA,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,MAC/B,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,YACpB,WAAW,KACtB,OAAO,CAAC,CAAC,CAUX,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,CAAC,UAClB,MAAM,QACR,MAAM,cACA,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,MAC/B,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,YACX,WAAW,KACtB,CAUF,CAAC"}
|
package/dist/observe.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { context, SpanStatusCode, trace } from "@opentelemetry/api";
|
|
2
|
+
// {§observed-span} — redaction-first span helpers shared by every instrumented package. Callers
|
|
3
|
+
// pass identifiers, counts and statuses only; string values are length-capped as a backstop, and a
|
|
4
|
+
// failure marks the span ERROR with the error's class name, never its message.
|
|
5
|
+
const MAX_STRING_LENGTH = 300;
|
|
6
|
+
const errorType = (error) => {
|
|
7
|
+
const name = error instanceof Error ? error.constructor.name : typeof error;
|
|
8
|
+
return name.length <= MAX_STRING_LENGTH ? name : name.slice(0, MAX_STRING_LENGTH);
|
|
9
|
+
};
|
|
10
|
+
const sanitize = (attributes) => {
|
|
11
|
+
const out = {};
|
|
12
|
+
for (const [key, value] of Object.entries(attributes)) {
|
|
13
|
+
if (value === undefined)
|
|
14
|
+
continue;
|
|
15
|
+
if (typeof value === "string") {
|
|
16
|
+
out[key] = value.length <= MAX_STRING_LENGTH ? value : value.slice(0, MAX_STRING_LENGTH);
|
|
17
|
+
}
|
|
18
|
+
else if (typeof value === "number" || typeof value === "boolean") {
|
|
19
|
+
out[key] = value;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return out;
|
|
23
|
+
};
|
|
24
|
+
const spanOptions = (attributes, options) => ({
|
|
25
|
+
...options,
|
|
26
|
+
attributes: {
|
|
27
|
+
...sanitize(attributes),
|
|
28
|
+
...(options?.attributes === undefined ? {} : sanitize(options.attributes)),
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
const failed = (span, error) => {
|
|
32
|
+
span.setAttribute("error.type", errorType(error));
|
|
33
|
+
span.setStatus({ code: SpanStatusCode.ERROR });
|
|
34
|
+
};
|
|
35
|
+
export const observed = async (tracer, name, attributes, fn, options) => {
|
|
36
|
+
const span = tracer.startSpan(name, spanOptions(attributes, options));
|
|
37
|
+
try {
|
|
38
|
+
return await context.with(trace.setSpan(context.active(), span), () => fn(span));
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
failed(span, error);
|
|
42
|
+
throw error;
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
span.end();
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
export const observedSync = (tracer, name, attributes, fn, options) => {
|
|
49
|
+
const span = tracer.startSpan(name, spanOptions(attributes, options));
|
|
50
|
+
try {
|
|
51
|
+
return fn(span);
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
failed(span, error);
|
|
55
|
+
throw error;
|
|
56
|
+
}
|
|
57
|
+
finally {
|
|
58
|
+
span.end();
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=observe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observe.js","sourceRoot":"","sources":["../src/observe.ts"],"names":[],"mappings":"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"}
|
package/docs/worker.md
CHANGED
|
@@ -2,21 +2,23 @@
|
|
|
2
2
|
|
|
3
3
|
## Summary
|
|
4
4
|
|
|
5
|
-
Coordinate workers, request isolated BARE inference, and manage workspace entries.
|
|
5
|
+
Coordinate workers (WORK, FORK), request isolated BARE inference, and manage workspace entries.
|
|
6
6
|
|
|
7
7
|
Workers inhabit one workspace. The authority selects a worker; a path selects
|
|
8
8
|
an entry rather than controlling that worker.
|
|
9
9
|
|
|
10
10
|
| Address | Meaning | Model access |
|
|
11
11
|
| --- | --- | --- |
|
|
12
|
-
| `worker://
|
|
13
|
-
| `message://
|
|
14
|
-
| `ops://
|
|
15
|
-
| `worker://
|
|
12
|
+
| `worker://exampleWorkerName` | Named worker | WORK/FORK create; SEND messages; READ collects; KILL terminates. |
|
|
13
|
+
| `message://exampleWorkerName/ab3d5678` | Retained message | READ/FIND/COPY inspect; SEND replies. Neither EDIT nor KILL changes its source. |
|
|
14
|
+
| `ops://exampleWorkerName/1` | What that loop said, or how it ended | READ/FIND/COPY inspect; source is immutable. |
|
|
15
|
+
| `worker://exampleWorkerName/example.md` | Named scratch entry | Read and write from any worker in the workspace. |
|
|
16
16
|
| `worker:///example.md` | Shared commons entry | Read and write. |
|
|
17
17
|
|
|
18
18
|
The packet's `## Worker` block, below the log, names your worker, its parent
|
|
19
|
-
(`null` at a root),
|
|
19
|
+
(`null` at a root), the loop and turn you are producing, and `previousEmission`, the
|
|
20
|
+
address of the program you submitted last: the log rows at that coordinate are its
|
|
21
|
+
receipts. Addresses are
|
|
20
22
|
literal and keep the same meaning when passed to another worker. Scratch
|
|
21
23
|
belongs to the workspace; a namespace does not require a namesake worker.
|
|
22
24
|
Generated references live under `worker:///_plurnk/`, and reference refreshes
|
|
@@ -32,6 +34,12 @@ the default channel stays the source, and a pattern matches the channel it
|
|
|
32
34
|
addresses. The projection follows every source write and is never written
|
|
33
35
|
itself.
|
|
34
36
|
|
|
37
|
+
A READ of an image, PDF or audio source retains its bytes: on a route whose
|
|
38
|
+
model takes that media, every later packet carries them as a native part
|
|
39
|
+
captioned with the READ's log coordinate, until you KILL that READ row. The
|
|
40
|
+
service never re-sends media; a captioned part is your own earlier READ, not a
|
|
41
|
+
new arrival.
|
|
42
|
+
|
|
35
43
|
## Delegation
|
|
36
44
|
|
|
37
45
|
WORK starts a fresh log with the task body as its prompt; FORK copies your
|
|
@@ -43,6 +51,10 @@ an existing worker, even after it finishes. Names match
|
|
|
43
51
|
worker gives it a follow-up task. `[{"env": {...}}]` on WORK or FORK is the
|
|
44
52
|
child's starting environment (`env.md`).
|
|
45
53
|
|
|
54
|
+
```FORK (worker://exampleWorkerName) <!-- a sibling that begins with your history -->
|
|
55
|
+
The child's task, continuing from what you already know.
|
|
56
|
+
```
|
|
57
|
+
|
|
46
58
|
Parents observe a direct child's mutations, messages, executor invocations, and
|
|
47
59
|
worker launches, including failed actions, as rows in their own log.
|
|
48
60
|
Exploration and context curation (NOTE, READ, FIND, BARE, WAIT, and log KILL)
|
|
@@ -67,11 +79,11 @@ is empty when an already-delivered answer stands. While live work remains, that
|
|
|
67
79
|
KILL joins it without cancelling it and delivers no final answer.
|
|
68
80
|
|
|
69
81
|
Each child task's conclusion wakes its waiting parent and arrives once, as an
|
|
70
|
-
`_plurnk` READ of `ops://
|
|
82
|
+
`_plurnk` READ of `ops://exampleWorkerName/1` carrying what the child said: the
|
|
71
83
|
execution outcome, not another message, and not delivered again as a reply. A
|
|
72
84
|
failure retains its status and Problem. READ that address with a scope to
|
|
73
85
|
inspect more of the exact result, even after the child starts another task.
|
|
74
|
-
Bare `READ (worker://
|
|
86
|
+
Bare `READ (worker://exampleWorkerName)` collects the current result instead, naming its
|
|
75
87
|
exact source in `resource`; while the child is running it returns `425`. A
|
|
76
88
|
result does not imply that every task in that worker has finished.
|
|
77
89
|
|
|
@@ -100,11 +112,16 @@ ordinary message from `schedule://<alias>`.
|
|
|
100
112
|
|
|
101
113
|
## BARE inference
|
|
102
114
|
|
|
103
|
-
BARE makes one isolated call to the
|
|
104
|
-
|
|
115
|
+
BARE makes one isolated call to the model, not a persistent worker. Nothing
|
|
116
|
+
reaches it but the fence body: no log, no files, no web, no tools, no memory of
|
|
117
|
+
this loop. It answers from the body and the model's own knowledge alone, so it
|
|
118
|
+
cannot look anything up, and what it does not know it will guess. Use it to
|
|
119
|
+
isolate a sub-problem whose complete inputs fit in the body — a long text to
|
|
120
|
+
judge, a tangle to reason through without the log in view — never to search,
|
|
121
|
+
recall, or fetch.
|
|
105
122
|
|
|
106
123
|
```BARE
|
|
107
|
-
A self-contained prompt.
|
|
124
|
+
A self-contained prompt, with everything it needs pasted in.
|
|
108
125
|
```
|
|
109
126
|
|
|
110
127
|
The prompt is not truncated to fit; provider capacity still applies.
|
|
@@ -123,11 +140,11 @@ The worker name is required. Any worker in the workspace can READ these
|
|
|
123
140
|
sources; `log:///` remains your own context. READ brings the selected source
|
|
124
141
|
into your log, and KILL of that READ curates only its log projection, never the
|
|
125
142
|
original evidence. The current turn's reasoning exists when its OPs execute, so
|
|
126
|
-
`READ (reasoning://
|
|
143
|
+
`READ (reasoning://exampleWorkerName/1/3) <1,-1>` from `worker://exampleWorkerName` on loop 1,
|
|
127
144
|
turn 3 retains it; a turn that produced no reasoning reads empty, and a turn
|
|
128
145
|
that has not happened returns a missing-source result. READ never requests
|
|
129
146
|
inference. NOTE retains working memory without changing the loop state; only
|
|
130
147
|
NOTE also executes from exposed reasoning, while quoted examples and other
|
|
131
148
|
reasoned operations remain data. Notes are ordinary log items whose read-only
|
|
132
|
-
sources stay searchable (`FIND (note://
|
|
149
|
+
sources stay searchable (`FIND (note://exampleWorkerName/**) /parser/`) and READable
|
|
133
150
|
after curation or a FORK.
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@plurnk/plurnk-meta",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.23.0",
|
|
4
|
+
"description": "Plugin discovery and trust primitives shared by plurnk plugin families, and the teaching material the plurnk service gives models: policy, Recap, the plurnk skill and scheme references.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"plurnk",
|
|
7
7
|
"agent-skills",
|
|
@@ -13,12 +13,14 @@
|
|
|
13
13
|
"engines": {
|
|
14
14
|
"node": ">=26"
|
|
15
15
|
},
|
|
16
|
+
"dependencies": {
|
|
17
|
+
"@opentelemetry/api": "^1.9.1"
|
|
18
|
+
},
|
|
16
19
|
"files": [
|
|
17
20
|
".env.defaults",
|
|
18
21
|
"dist/**/*",
|
|
19
22
|
"README.md",
|
|
20
23
|
"SPEC.md",
|
|
21
|
-
"DOGFOOD.md",
|
|
22
24
|
"CORPUS.md",
|
|
23
25
|
"POLICY.md",
|
|
24
26
|
"recap.md",
|
package/DOGFOOD.md
DELETED
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
# Metaproject orientation-readiness gate
|
|
2
|
-
|
|
3
|
-
This opt-in capstone asks a floor model to inspect an assembled open-project
|
|
4
|
-
forest through the outside client and deliver an evidence-bearing orientation
|
|
5
|
-
report. It is intentionally expensive: a fresh campaign semantically prepares
|
|
6
|
-
the complete forest. Execute it only after the focused package, integration,
|
|
7
|
-
demo, live-model, and modest-candidate paths are healthy—not as a routine
|
|
8
|
-
debugging loop or release gate.
|
|
9
|
-
|
|
10
|
-
Invoke it with:
|
|
11
|
-
|
|
12
|
-
```sh
|
|
13
|
-
PLURNK_ACCEPTANCE_PROJECT_ROOT=/path/to/open-project-forest \
|
|
14
|
-
PLURNK_CLIENT_CHECKOUT=/path/to/open-client \
|
|
15
|
-
npm run readiness:metaproject -- --model <selector> --requiem --preserve
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
Both paths are explicit preconditions. The runner never guesses a sibling
|
|
19
|
-
checkout or treats another organization under a shared parent directory as
|
|
20
|
-
part of the open project.
|
|
21
|
-
|
|
22
|
-
This gate does not replace the evidence ladder that qualifies it:
|
|
23
|
-
|
|
24
|
-
1. Deterministic package and integration coverage proves owned contracts.
|
|
25
|
-
2. An assembled modest-repository candidate smoke proves the production client
|
|
26
|
-
and daemon can work together.
|
|
27
|
-
3. Focused `live/demo` stories are toy tasks that establish the system is sane
|
|
28
|
-
enough to test seriously.
|
|
29
|
-
4. The separate bench lane runs real third-party agentic benchmarks and preserves
|
|
30
|
-
their digest, reasoning, and requiem evidence.
|
|
31
|
-
5. Only after those layers are healthy does this full-forest campaign ask whether
|
|
32
|
-
PLURNK is ready to develop PLURNK itself.
|
|
33
|
-
|
|
34
|
-
The canonical `plurnk-service` checkout owns this gate. Its doctrine lives in
|
|
35
|
-
`plurnk-meta` because the report crosses service, contracts, plugins, the
|
|
36
|
-
outside client, project membership, AG-UI, model routing, persistence, and
|
|
37
|
-
forensic digestion.
|
|
38
|
-
|
|
39
|
-
## Preconditions
|
|
40
|
-
|
|
41
|
-
- A clean canonical `plurnk-service` checkout with its gate green.
|
|
42
|
-
- The explicit outside open-client checkout built from its repository head.
|
|
43
|
-
- Every default-installed optional provider resolvable from the daemon.
|
|
44
|
-
- An explicitly assembled open-project forest with its root `AGENTS.md`; shared
|
|
45
|
-
parent directories containing other organizations are not valid substitutes.
|
|
46
|
-
- One inexpensive capable model selector and, optionally, one local smoke-test selector.
|
|
47
|
-
|
|
48
|
-
Missing preconditions are RED outcomes. The runner never silently skips a phase.
|
|
49
|
-
|
|
50
|
-
## Contract
|
|
51
|
-
|
|
52
|
-
One campaign proves the following through production client and AG-UI surfaces:
|
|
53
|
-
|
|
54
|
-
1. **Candidate build.** The exact service and explicit outside-client checkouts build.
|
|
55
|
-
2. **Clean bootstrap.** A canonical daemon starts on a new database and the
|
|
56
|
-
client creates a user-named workspace over the explicit forest.
|
|
57
|
-
3. **Inspection.** The model performs successful retrievals, including READ,
|
|
58
|
-
before answering and names multiple inspected repository artifacts.
|
|
59
|
-
4. **Comprehension.** The report covers service, contracts/DSL, client/AG-UI,
|
|
60
|
-
repository topology, current-work evidence, and confidence-limiting gaps.
|
|
61
|
-
If the canonical forge is unavailable inside the run, it must say that the
|
|
62
|
-
current goal is unverified rather than promote archived GitHub history.
|
|
63
|
-
5. **Forensics.** The supported digest captures the database, packet, reasoning,
|
|
64
|
-
usage, and operation evidence used by the deterministic verdict.
|
|
65
|
-
|
|
66
|
-
Proposal modes, reconnect, model hot-swap, and restart/resume are not asserted
|
|
67
|
-
by this executable slice. Expansion of the capstone remains tracked in #3.
|
|
68
|
-
|
|
69
|
-
Passing individual package tests or receiving HTTP 200 is insufficient. The user-visible client must remain usable and the requested terminal deliverable must be present.
|
|
70
|
-
|
|
71
|
-
## Evidence
|
|
72
|
-
|
|
73
|
-
Each preserved campaign atomically claims `benchmarks/run<N>-orientation/` and writes:
|
|
74
|
-
|
|
75
|
-
- `workspace` — the generated workspace name;
|
|
76
|
-
- `prompt.md` — the exact orientation request;
|
|
77
|
-
- `client.json` and `client.stderr.log` — the client result and diagnostics;
|
|
78
|
-
- `service.stdout.log` and `service.stderr.log`;
|
|
79
|
-
- `phases.json` — commands, timings, and exit statuses without secrets;
|
|
80
|
-
- `verdict.json` — lifecycle, publication, inspection, evidence, and coverage checks;
|
|
81
|
-
- `plurnk.db` — the preserved database;
|
|
82
|
-
- `digest/` — `digest.md`, `digest.json`, `reasoning.md`, and packet sections;
|
|
83
|
-
- requiem artifacts in `digest/` when `--requiem` is requested.
|
|
84
|
-
|
|
85
|
-
The database is evidence, never the diagnostic interface. Assertions consume client output, AG-UI events, and digest artifacts.
|
|
86
|
-
|
|
87
|
-
## Posture
|
|
88
|
-
|
|
89
|
-
- Execute in the foreground and fail hard.
|
|
90
|
-
- Preserve every failing specimen; preserve passing specimens when requested.
|
|
91
|
-
- Never reuse a database for a clean-bootstrap comparison.
|
|
92
|
-
- A provider/configuration/install failure is a gate failure, not a skipped model test.
|
|
93
|
-
- Never infer current work from an archived issue or an uninspected forge reference.
|
|
94
|
-
- File every cross-family defect on the canonical forge with its owning lane label and specimen path.
|