@uppercut-labs/agent-native 0.0.0-stage → 1.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 +21 -0
- package/README.md +164 -2
- package/agent/agent-prompt-short.md +1 -0
- package/agent/agent-prompt.md +26 -0
- package/bin/agent-native-site.mjs +269 -0
- package/bin/discover-routes.mjs +162 -0
- package/bin/verify-publication.mjs +317 -0
- package/dist/adapters/zod.d.ts +4 -0
- package/dist/adapters/zod.d.ts.map +1 -0
- package/dist/adapters/zod.js +20 -0
- package/dist/adapters/zod.js.map +1 -0
- package/dist/astro.d.ts +13 -0
- package/dist/astro.d.ts.map +1 -0
- package/dist/astro.js +41 -0
- package/dist/astro.js.map +1 -0
- package/dist/auth.d.ts +52 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +128 -0
- package/dist/auth.js.map +1 -0
- package/dist/browser.d.ts +47 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +219 -0
- package/dist/browser.js.map +1 -0
- package/dist/cli.d.ts +80 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +484 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/assert-never.d.ts +2 -0
- package/dist/core/assert-never.d.ts.map +1 -0
- package/dist/core/assert-never.js +5 -0
- package/dist/core/assert-never.js.map +1 -0
- package/dist/core/binding-internal.d.ts +10 -0
- package/dist/core/binding-internal.d.ts.map +1 -0
- package/dist/core/binding-internal.js +15 -0
- package/dist/core/binding-internal.js.map +1 -0
- package/dist/core/composition.d.ts +119 -0
- package/dist/core/composition.d.ts.map +1 -0
- package/dist/core/composition.js +545 -0
- package/dist/core/composition.js.map +1 -0
- package/dist/core/contracts.d.ts +55 -0
- package/dist/core/contracts.d.ts.map +1 -0
- package/dist/core/contracts.js +271 -0
- package/dist/core/contracts.js.map +1 -0
- package/dist/core/diagnostics.d.ts +14 -0
- package/dist/core/diagnostics.d.ts.map +1 -0
- package/dist/core/diagnostics.js +29 -0
- package/dist/core/diagnostics.js.map +1 -0
- package/dist/core/executor.d.ts +52 -0
- package/dist/core/executor.d.ts.map +1 -0
- package/dist/core/executor.js +98 -0
- package/dist/core/executor.js.map +1 -0
- package/dist/core/registry.d.ts +37 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +75 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/schema.d.ts +9 -0
- package/dist/core/schema.d.ts.map +1 -0
- package/dist/core/schema.js +36 -0
- package/dist/core/schema.js.map +1 -0
- package/dist/discovery.d.ts +16 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +23 -0
- package/dist/discovery.js.map +1 -0
- package/dist/doctor.d.ts +200 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +287 -0
- package/dist/doctor.js.map +1 -0
- package/dist/harness-codex.d.ts +17 -0
- package/dist/harness-codex.d.ts.map +1 -0
- package/dist/harness-codex.js +485 -0
- package/dist/harness-codex.js.map +1 -0
- package/dist/harness-mcp-bridge.d.ts +14 -0
- package/dist/harness-mcp-bridge.d.ts.map +1 -0
- package/dist/harness-mcp-bridge.js +159 -0
- package/dist/harness-mcp-bridge.js.map +1 -0
- package/dist/harness.d.ts +72 -0
- package/dist/harness.d.ts.map +1 -0
- package/dist/harness.js +101 -0
- package/dist/harness.js.map +1 -0
- package/dist/http.d.ts +20 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +537 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +73 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +1039 -0
- package/dist/init.js.map +1 -0
- package/dist/mcp-apps.d.ts +9 -0
- package/dist/mcp-apps.d.ts.map +1 -0
- package/dist/mcp-apps.js +171 -0
- package/dist/mcp-apps.js.map +1 -0
- package/dist/mcp-core.d.ts +64 -0
- package/dist/mcp-core.d.ts.map +1 -0
- package/dist/mcp-core.js +358 -0
- package/dist/mcp-core.js.map +1 -0
- package/dist/mcp.d.ts +3 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +2 -0
- package/dist/mcp.js.map +1 -0
- package/dist/next-browser.d.ts +14 -0
- package/dist/next-browser.d.ts.map +1 -0
- package/dist/next-browser.js +14 -0
- package/dist/next-browser.js.map +1 -0
- package/dist/next.d.ts +24 -0
- package/dist/next.d.ts.map +1 -0
- package/dist/next.js +28 -0
- package/dist/next.js.map +1 -0
- package/dist/package-version.d.ts +2 -0
- package/dist/package-version.d.ts.map +1 -0
- package/dist/package-version.js +3 -0
- package/dist/package-version.js.map +1 -0
- package/dist/publication.d.ts +115 -0
- package/dist/publication.d.ts.map +1 -0
- package/dist/publication.js +441 -0
- package/dist/publication.js.map +1 -0
- package/dist/registry.d.ts +3 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +2 -0
- package/dist/registry.js.map +1 -0
- package/docs/adopt-existing-site.md +189 -0
- package/docs/browser.md +70 -0
- package/docs/capabilities-and-bindings.md +141 -0
- package/docs/cli.md +88 -0
- package/docs/compatibility.md +32 -0
- package/docs/composition-and-versioning.md +113 -0
- package/docs/doctor-and-troubleshooting.md +58 -0
- package/docs/evidence/GHSA-ch52-4w7c-c8xp-2026-10-03.md +17 -0
- package/docs/evidence/GHSA-ch52-4w7c-c8xp-2026-10-10.md +30 -0
- package/docs/evidence/GHSA-ch52-4w7c-c8xp-2026-10-12.md +10 -0
- package/docs/evidence/UAN-002-house-style-review.md +29 -0
- package/docs/evidence/UAN-007-astro.md +43 -0
- package/docs/evidence/UAN-008-worker-sidecar.md +56 -0
- package/docs/evidence/UAN-009-init.md +43 -0
- package/docs/evidence/UAN-010-auth.md +17 -0
- package/docs/evidence/UAN-011-discovery.md +18 -0
- package/docs/evidence/UAN-012-mcp-apps.md +14 -0
- package/docs/evidence/UAN-013-astro-on-demand.md +47 -0
- package/docs/evidence/UAN-014-next.md +57 -0
- package/docs/evidence/UAN-015-node-hono.md +69 -0
- package/docs/evidence/UAN-016-composition.md +52 -0
- package/docs/evidence/UAN-017-version-migrations.md +50 -0
- package/docs/evidence/UAN-018-surface-overrides.md +30 -0
- package/docs/evidence/UAN-019-doctor.md +19 -0
- package/docs/evidence/UAN-020-negative-security-fixtures.md +61 -0
- package/docs/evidence/UAN-020-operational-failure-safety.md +49 -0
- package/docs/evidence/UAN-021-docs-coverage.md +30 -0
- package/docs/evidence/UAN-022-cross-platform-license-notices.md +39 -0
- package/docs/evidence/UAN-022-overhead-license-audit.md +233 -0
- package/docs/evidence/UAN-022-package-portability.md +54 -0
- package/docs/evidence/UAN-023-commercial-agent-hosts.md +36 -0
- package/docs/evidence/UAN-023-inspector-host-probe.md +37 -0
- package/docs/evidence/UAN-023-inspector-web-and-astro-adoption.md +44 -0
- package/docs/evidence/UAN-023-native-webmcp-chrome.md +44 -0
- package/docs/evidence/UAN-024-release-readiness-2026-10-10.md +33 -0
- package/docs/evidence/UAN-024-release-readiness.md +41 -0
- package/docs/evidence/codex-harness.md +56 -0
- package/docs/evidence/gate-2-domain-expansion.md +35 -0
- package/docs/evidence/recovery-and-selection-recipes-2026-10-15.md +63 -0
- package/docs/for-agents.md +50 -0
- package/docs/frameworks.md +62 -0
- package/docs/getting-started.md +109 -0
- package/docs/harness-codex.md +117 -0
- package/docs/harness-mcp-bridge.md +30 -0
- package/docs/http.md +80 -0
- package/docs/installation.md +95 -0
- package/docs/mcp-apps.md +57 -0
- package/docs/mcp.md +178 -0
- package/docs/next.md +73 -0
- package/docs/permissions-and-discovery.md +58 -0
- package/docs/programmatic-harness.md +88 -0
- package/docs/readability-frameworks.md +18 -0
- package/docs/reference.md +161 -0
- package/docs/release-handoff.md +41 -0
- package/docs/site-publication.md +85 -0
- package/docs/stability.md +53 -0
- package/docs/static-sites.md +141 -0
- package/docs/support-and-limitations.md +20 -0
- package/docs/surfaces.md +27 -0
- package/docs/upgrading-to-1.0.md +26 -0
- package/package.json +188 -4
- package/skill/agent-native/SKILL.md +54 -0
- package/skill/agent-native/references/adapter-decision.md +19 -0
- package/skill/agent-native/references/verification.md +25 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { CapabilityDefinition } from './contracts.js';
|
|
2
|
+
import { type DiagnosticObservation } from './diagnostics.js';
|
|
3
|
+
import type { ExecutionCaller } from './executor.js';
|
|
4
|
+
export type RuntimeTarget = 'browser' | 'server' | 'local';
|
|
5
|
+
export type ExecutionSignal = {
|
|
6
|
+
readonly aborted: boolean;
|
|
7
|
+
};
|
|
8
|
+
export type BindingExecutionContext = {
|
|
9
|
+
readonly capabilityId: string;
|
|
10
|
+
readonly runtime: RuntimeTarget;
|
|
11
|
+
/** The caller the executor authorized. Bindings use it to scope records to the caller. */
|
|
12
|
+
readonly caller: ExecutionCaller;
|
|
13
|
+
readonly signal?: ExecutionSignal;
|
|
14
|
+
};
|
|
15
|
+
export type CapabilityBindingOptions<Input, Output> = {
|
|
16
|
+
readonly id: string;
|
|
17
|
+
readonly targets: readonly RuntimeTarget[];
|
|
18
|
+
readonly execute: (input: Input, context: BindingExecutionContext) => Output | Promise<Output>;
|
|
19
|
+
};
|
|
20
|
+
export type CapabilityBinding = {
|
|
21
|
+
readonly id: string;
|
|
22
|
+
readonly capabilityId: string;
|
|
23
|
+
readonly targets: readonly RuntimeTarget[];
|
|
24
|
+
};
|
|
25
|
+
export type RegistryErrorKind = 'invalid-definition' | 'duplicate-definition' | 'invalid-binding';
|
|
26
|
+
export declare class CapabilityRegistryError extends Error {
|
|
27
|
+
readonly kind: RegistryErrorKind;
|
|
28
|
+
readonly observation: DiagnosticObservation;
|
|
29
|
+
constructor(kind: RegistryErrorKind, message: string, checkId: string);
|
|
30
|
+
}
|
|
31
|
+
export type CapabilityRegistry = {
|
|
32
|
+
readonly definitions: readonly CapabilityDefinition<unknown, unknown>[];
|
|
33
|
+
readonly bindings: readonly CapabilityBinding[];
|
|
34
|
+
};
|
|
35
|
+
export declare function bindCapability<Input, Output>(definition: CapabilityDefinition<Input, Output>, options: CapabilityBindingOptions<Input, Output>): CapabilityBinding;
|
|
36
|
+
export declare function createCapabilityRegistry(definitions: readonly CapabilityDefinition<unknown, unknown>[], bindings: readonly CapabilityBinding[]): CapabilityRegistry;
|
|
37
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/core/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAE3D,OAAO,EAA+B,KAAK,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAE3F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE3D,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,0FAA0F;IAC1F,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,wBAAwB,CAAC,KAAK,EAAE,MAAM,IAAI;IACpD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAC3C,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,uBAAuB,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAChG,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,oBAAoB,GAAG,sBAAsB,GAAG,iBAAiB,CAAC;AAElG,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,SAAgB,IAAI,EAAE,iBAAiB,CAAC;IACxC,SAAgB,WAAW,EAAE,qBAAqB,CAAC;IAEnD,YAAmB,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAK3E;CACF;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,WAAW,EAAE,SAAS,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;IACxE,QAAQ,CAAC,QAAQ,EAAE,SAAS,iBAAiB,EAAE,CAAC;CACjD,CAAC;AAEF,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAC1C,UAAU,EAAE,oBAAoB,CAAC,KAAK,EAAE,MAAM,CAAC,EAC/C,OAAO,EAAE,wBAAwB,CAAC,KAAK,EAAE,MAAM,CAAC,GAC/C,iBAAiB,CA4BnB;AAED,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,SAAS,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAC9D,QAAQ,EAAE,SAAS,iBAAiB,EAAE,GACrC,kBAAkB,CAyDpB"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { canonicalCapabilityId, isCapabilityDefinition } from './contracts.js';
|
|
2
|
+
import { createDiagnosticObservation } from './diagnostics.js';
|
|
3
|
+
import { getBindingRecord, setBindingRecord } from './binding-internal.js';
|
|
4
|
+
export class CapabilityRegistryError extends Error {
|
|
5
|
+
kind;
|
|
6
|
+
observation;
|
|
7
|
+
constructor(kind, message, checkId) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.name = 'CapabilityRegistryError';
|
|
10
|
+
this.kind = kind;
|
|
11
|
+
this.observation = createDiagnosticObservation({ checkId, status: 'failed' });
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export function bindCapability(definition, options) {
|
|
15
|
+
const capabilityId = canonicalCapabilityId(definition.identity);
|
|
16
|
+
if (!/^[a-z0-9]+(?:[.-][a-z0-9]+)*$/.test(options.id)) {
|
|
17
|
+
throw new TypeError('binding id must be a lowercase slug');
|
|
18
|
+
}
|
|
19
|
+
if (options.targets.length === 0 ||
|
|
20
|
+
options.targets.some((target) => !['browser', 'server', 'local'].includes(target))) {
|
|
21
|
+
throw new TypeError('binding targets must name one or more supported runtimes');
|
|
22
|
+
}
|
|
23
|
+
const targets = Object.freeze([...new Set(options.targets)]);
|
|
24
|
+
const binding = Object.freeze({
|
|
25
|
+
id: options.id,
|
|
26
|
+
capabilityId,
|
|
27
|
+
targets,
|
|
28
|
+
});
|
|
29
|
+
setBindingRecord(binding, {
|
|
30
|
+
definition,
|
|
31
|
+
async handler(input, context) {
|
|
32
|
+
const parsed = input;
|
|
33
|
+
return await options.execute(parsed, context);
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
return binding;
|
|
37
|
+
}
|
|
38
|
+
export function createCapabilityRegistry(definitions, bindings) {
|
|
39
|
+
let definitionIds = new Set();
|
|
40
|
+
let definitionsById = new Map();
|
|
41
|
+
for (const candidate of definitions) {
|
|
42
|
+
if (!isCapabilityDefinition(candidate)) {
|
|
43
|
+
throw new CapabilityRegistryError('invalid-definition', 'registry definition must include valid identity, schemas, risk, and access metadata', 'UAN-002.invalid-definition');
|
|
44
|
+
}
|
|
45
|
+
const definition = candidate;
|
|
46
|
+
let id;
|
|
47
|
+
try {
|
|
48
|
+
id = canonicalCapabilityId(definition.identity);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
throw new CapabilityRegistryError('invalid-definition', 'registry contains an invalid capability identity', 'UAN-002.invalid-definition');
|
|
52
|
+
}
|
|
53
|
+
if (definitionIds.has(id)) {
|
|
54
|
+
throw new CapabilityRegistryError('duplicate-definition', `registry contains duplicate identity ${id}`, 'UAN-002.duplicate-definition');
|
|
55
|
+
}
|
|
56
|
+
definitionIds.add(id);
|
|
57
|
+
definitionsById.set(id, definition);
|
|
58
|
+
}
|
|
59
|
+
let bindingIds = new Set();
|
|
60
|
+
for (const binding of bindings) {
|
|
61
|
+
const registeredDefinition = definitionsById.get(binding.capabilityId);
|
|
62
|
+
const boundDefinition = getBindingRecord(binding)?.definition;
|
|
63
|
+
if (registeredDefinition === undefined ||
|
|
64
|
+
boundDefinition !== registeredDefinition ||
|
|
65
|
+
bindingIds.has(binding.id)) {
|
|
66
|
+
throw new CapabilityRegistryError('invalid-binding', 'binding must target a registered definition and have a unique id', 'UAN-002.invalid-binding');
|
|
67
|
+
}
|
|
68
|
+
bindingIds.add(binding.id);
|
|
69
|
+
}
|
|
70
|
+
return Object.freeze({
|
|
71
|
+
definitions: Object.freeze([...definitions]),
|
|
72
|
+
bindings: Object.freeze([...bindings]),
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/core/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface SchemaPort<Value> {
|
|
2
|
+
parse(input: unknown): Value;
|
|
3
|
+
toJSONSchema(): Readonly<Record<string, unknown>>;
|
|
4
|
+
}
|
|
5
|
+
export type JsonValue = null | string | number | boolean | readonly JsonValue[] | {
|
|
6
|
+
readonly [key: string]: JsonValue;
|
|
7
|
+
};
|
|
8
|
+
export declare function cloneJsonValue(value: unknown, label?: string, seen?: Set<object>): JsonValue;
|
|
9
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/core/schema.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU,CAAC,KAAK;IAC/B,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,CAAC;IAC7B,YAAY,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACnD;AAED,MAAM,MAAM,SAAS,GACjB,IAAI,GACJ,MAAM,GACN,MAAM,GACN,OAAO,GACP,SAAS,SAAS,EAAE,GACpB;IAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAE1C,wBAAgB,cAAc,CAC5B,KAAK,EAAE,OAAO,EACd,KAAK,GAAE,MAAgB,EACvB,IAAI,GAAE,GAAG,CAAC,MAAM,CAAa,GAC5B,SAAS,CAgCX"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export function cloneJsonValue(value, label = 'value', seen = new Set()) {
|
|
2
|
+
if (value === null || typeof value === 'string' || typeof value === 'boolean')
|
|
3
|
+
return value;
|
|
4
|
+
if (typeof value === 'number') {
|
|
5
|
+
if (!Number.isFinite(value))
|
|
6
|
+
throw new TypeError(`${label} contains a non-finite number`);
|
|
7
|
+
return value;
|
|
8
|
+
}
|
|
9
|
+
if (typeof value !== 'object') {
|
|
10
|
+
throw new TypeError(`${label} contains a value that cannot be represented as JSON`);
|
|
11
|
+
}
|
|
12
|
+
const prototype = Object.getPrototypeOf(value);
|
|
13
|
+
if (prototype !== Object.prototype && prototype !== null && !Array.isArray(value)) {
|
|
14
|
+
throw new TypeError(`${label} contains a non-JSON object`);
|
|
15
|
+
}
|
|
16
|
+
if (Reflect.ownKeys(value).some((key) => typeof key === 'symbol')) {
|
|
17
|
+
throw new TypeError(`${label} contains a symbol property`);
|
|
18
|
+
}
|
|
19
|
+
if (seen.has(value))
|
|
20
|
+
throw new TypeError(`${label} contains a circular reference`);
|
|
21
|
+
seen.add(value);
|
|
22
|
+
let result;
|
|
23
|
+
if (Array.isArray(value)) {
|
|
24
|
+
result = Object.freeze(value.map((item) => cloneJsonValue(item, label, seen)));
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
let copy = Object.create(null);
|
|
28
|
+
for (const [key, item] of Object.entries(value)) {
|
|
29
|
+
copy[key] = cloneJsonValue(item, label, seen);
|
|
30
|
+
}
|
|
31
|
+
result = Object.freeze(copy);
|
|
32
|
+
}
|
|
33
|
+
seen.delete(value);
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/core/schema.ts"],"names":[],"mappings":"AAaA,MAAM,UAAU,cAAc,CAC5B,KAAc,EACd,KAAK,GAAW,OAAO,EACvB,IAAI,GAAgB,IAAI,GAAG,EAAE;IAE7B,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC5F,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,+BAA+B,CAAC,CAAC;QAC1F,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,sDAAsD,CAAC,CAAC;IACtF,CAAC;IACD,MAAM,SAAS,GAAY,MAAM,CAAC,cAAc,CAAC,KAAK,CAAY,CAAC;IACnE,IAAI,SAAS,KAAK,MAAM,CAAC,SAAS,IAAI,SAAS,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAClF,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,6BAA6B,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,GAAoB,EAAW,EAAE,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,EAAE,CAAC;QAC5F,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,6BAA6B,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,gCAAgC,CAAC,CAAC;IACnF,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAChB,IAAI,MAAiB,CAAC;IACtB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,GAAG,MAAM,CAAC,MAAM,CACpB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAa,EAAa,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAC3E,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,IAAI,IAAI,GAA8B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1D,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAChD,IAAI,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QAChD,CAAC;QACD,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnB,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type CapabilityDefinition } from './core/contracts.js';
|
|
2
|
+
export type CapabilitySurface = 'browser' | 'cli' | 'http' | 'mcp';
|
|
3
|
+
export type CapabilitySurfaceExposure = Partial<Readonly<Record<CapabilitySurface, {
|
|
4
|
+
readonly destructive?: readonly string[];
|
|
5
|
+
}>>>;
|
|
6
|
+
export type DiscoveryDenialReason = 'authorization-unavailable' | 'authorization-denied' | 'surface-not-exposed';
|
|
7
|
+
export type DiscoveryDecision = {
|
|
8
|
+
readonly visible: true;
|
|
9
|
+
} | {
|
|
10
|
+
readonly visible: false;
|
|
11
|
+
readonly reason: DiscoveryDenialReason;
|
|
12
|
+
};
|
|
13
|
+
export type CapabilityDiscoveryAuthorizer = (definition: CapabilityDefinition<unknown, unknown>) => boolean | Promise<boolean>;
|
|
14
|
+
export declare function isDestructiveCapabilityExposed(definition: CapabilityDefinition<unknown, unknown>, surface: CapabilitySurface, exposure?: CapabilitySurfaceExposure): boolean;
|
|
15
|
+
export declare function evaluateCapabilityDiscovery(definition: CapabilityDefinition<unknown, unknown>, surface: CapabilitySurface, exposure?: CapabilitySurfaceExposure, authorize?: CapabilityDiscoveryAuthorizer): Promise<DiscoveryDecision>;
|
|
16
|
+
//# sourceMappingURL=discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,KAAK,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAEvF,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;AAEnE,MAAM,MAAM,yBAAyB,GAAG,OAAO,CAC7C,QAAQ,CACN,MAAM,CACJ,iBAAiB,EACjB;IACE,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1C,CACF,CACF,CACF,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAC7B,2BAA2B,GAC3B,sBAAsB,GACtB,qBAAqB,CAAC;AAE1B,MAAM,MAAM,iBAAiB,GACzB;IAAE,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAA;CAAE,GAC1B;IAAE,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAA;CAAE,CAAC;AAExE,MAAM,MAAM,6BAA6B,GAAG,CAC1C,UAAU,EAAE,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,KAC/C,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAEhC,wBAAgB,8BAA8B,CAC5C,UAAU,EAAE,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,EAClD,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,CAAC,EAAE,yBAAyB,GACnC,OAAO,CAKT;AAED,wBAAsB,2BAA2B,CAC/C,UAAU,EAAE,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,EAClD,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,CAAC,EAAE,yBAAyB,EACpC,SAAS,CAAC,EAAE,6BAA6B,GACxC,OAAO,CAAC,iBAAiB,CAAC,CAgB5B"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { canonicalCapabilityId } from './core/contracts.js';
|
|
2
|
+
export function isDestructiveCapabilityExposed(definition, surface, exposure) {
|
|
3
|
+
return (definition.risk !== 'destructive' ||
|
|
4
|
+
exposure?.[surface]?.destructive?.includes(canonicalCapabilityId(definition.identity)) === true);
|
|
5
|
+
}
|
|
6
|
+
export async function evaluateCapabilityDiscovery(definition, surface, exposure, authorize) {
|
|
7
|
+
if (!isDestructiveCapabilityExposed(definition, surface, exposure)) {
|
|
8
|
+
return { visible: false, reason: 'surface-not-exposed' };
|
|
9
|
+
}
|
|
10
|
+
const publicRead = definition.risk === 'read' && definition.access.kind === 'public';
|
|
11
|
+
if (authorize === undefined) {
|
|
12
|
+
return publicRead ? { visible: true } : { visible: false, reason: 'authorization-unavailable' };
|
|
13
|
+
}
|
|
14
|
+
try {
|
|
15
|
+
if (await authorize(definition))
|
|
16
|
+
return { visible: true };
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return { visible: false, reason: 'authorization-denied' };
|
|
20
|
+
}
|
|
21
|
+
return { visible: false, reason: 'authorization-denied' };
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAA6B,MAAM,qBAAqB,CAAC;AA4BvF,MAAM,UAAU,8BAA8B,CAC5C,UAAkD,EAClD,OAA0B,EAC1B,QAAoC;IAEpC,OAAO,CACL,UAAU,CAAC,IAAI,KAAK,aAAa;QACjC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,qBAAqB,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,KAAK,IAAI,CAChG,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,UAAkD,EAClD,OAA0B,EAC1B,QAAoC,EACpC,SAAyC;IAEzC,IAAI,CAAC,8BAA8B,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC;QACnE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC;IAC3D,CAAC;IAED,MAAM,UAAU,GAAY,UAAU,CAAC,IAAI,KAAK,MAAM,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC;IAC9F,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,UAAU,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,2BAA2B,EAAE,CAAC;IAClG,CAAC;IAED,IAAI,CAAC;QACH,IAAI,MAAM,SAAS,CAAC,UAAU,CAAC;YAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC;IAC5D,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC;AAC5D,CAAC"}
|
package/dist/doctor.d.ts
ADDED
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { type DiagnosticStatus } from './core/diagnostics.js';
|
|
2
|
+
import type { CapabilityRegistry } from './core/registry.js';
|
|
3
|
+
import { type CapabilityDiscoveryAuthorizer, type CapabilitySurface, type CapabilitySurfaceExposure } from './discovery.js';
|
|
4
|
+
export type DoctorEvidenceKind = 'configured' | 'generated' | 'reachable' | 'protocol' | 'behavior';
|
|
5
|
+
export type DoctorEvidenceSource = 'unspecified' | 'fixture' | 'mock' | 'real-host';
|
|
6
|
+
export type DoctorFindingStatus = DiagnosticStatus | 'skipped';
|
|
7
|
+
export type DoctorFindingSeverity = 'info' | 'warning' | 'error';
|
|
8
|
+
export type DoctorExitCode = 0 | 1 | 2 | 3;
|
|
9
|
+
export declare const DOCTOR_REPORT_SCHEMA_VERSION = "uan.doctor-report/v1";
|
|
10
|
+
export declare const DOCTOR_REPORT_JSON_SCHEMA: Readonly<{
|
|
11
|
+
$schema: "https://json-schema.org/draft/2020-12/schema";
|
|
12
|
+
type: "object";
|
|
13
|
+
properties: {
|
|
14
|
+
schemaVersion: {
|
|
15
|
+
const: string;
|
|
16
|
+
};
|
|
17
|
+
profile: {
|
|
18
|
+
type: string;
|
|
19
|
+
properties: {
|
|
20
|
+
id: {
|
|
21
|
+
type: string;
|
|
22
|
+
pattern: string;
|
|
23
|
+
};
|
|
24
|
+
selectedCheckIds: {
|
|
25
|
+
type: string;
|
|
26
|
+
minItems: number;
|
|
27
|
+
uniqueItems: boolean;
|
|
28
|
+
items: {
|
|
29
|
+
readonly type: 'string';
|
|
30
|
+
readonly pattern: '^UAN-[0-9]{3}\\.[a-z0-9-]+$';
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
requiredCheckIds: {
|
|
34
|
+
type: string;
|
|
35
|
+
uniqueItems: boolean;
|
|
36
|
+
items: {
|
|
37
|
+
readonly type: 'string';
|
|
38
|
+
readonly pattern: '^UAN-[0-9]{3}\\.[a-z0-9-]+$';
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
required: string[];
|
|
43
|
+
additionalProperties: boolean;
|
|
44
|
+
};
|
|
45
|
+
findings: {
|
|
46
|
+
type: string;
|
|
47
|
+
items: {
|
|
48
|
+
type: string;
|
|
49
|
+
properties: {
|
|
50
|
+
checkId: {
|
|
51
|
+
readonly type: 'string';
|
|
52
|
+
readonly pattern: '^UAN-[0-9]{3}\\.[a-z0-9-]+$';
|
|
53
|
+
};
|
|
54
|
+
target: {
|
|
55
|
+
type: string;
|
|
56
|
+
minLength: number;
|
|
57
|
+
};
|
|
58
|
+
status: {
|
|
59
|
+
enum: string[];
|
|
60
|
+
};
|
|
61
|
+
severity: {
|
|
62
|
+
enum: string[];
|
|
63
|
+
};
|
|
64
|
+
timestamp: {
|
|
65
|
+
type: string;
|
|
66
|
+
minLength: number;
|
|
67
|
+
};
|
|
68
|
+
required: {
|
|
69
|
+
type: string;
|
|
70
|
+
};
|
|
71
|
+
evidence: {
|
|
72
|
+
type: string;
|
|
73
|
+
properties: {
|
|
74
|
+
kind: {
|
|
75
|
+
enum: string[];
|
|
76
|
+
};
|
|
77
|
+
source: {
|
|
78
|
+
enum: string[];
|
|
79
|
+
};
|
|
80
|
+
location: {
|
|
81
|
+
type: string;
|
|
82
|
+
minLength: number;
|
|
83
|
+
};
|
|
84
|
+
references: {
|
|
85
|
+
type: string;
|
|
86
|
+
items: {
|
|
87
|
+
type: string;
|
|
88
|
+
pattern: string;
|
|
89
|
+
};
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
required: string[];
|
|
93
|
+
additionalProperties: boolean;
|
|
94
|
+
};
|
|
95
|
+
explanation: {
|
|
96
|
+
type: string;
|
|
97
|
+
minLength: number;
|
|
98
|
+
};
|
|
99
|
+
nextAction: {
|
|
100
|
+
type: string;
|
|
101
|
+
minLength: number;
|
|
102
|
+
};
|
|
103
|
+
};
|
|
104
|
+
required: string[];
|
|
105
|
+
additionalProperties: boolean;
|
|
106
|
+
};
|
|
107
|
+
};
|
|
108
|
+
exitCode: {
|
|
109
|
+
type: string;
|
|
110
|
+
enum: number[];
|
|
111
|
+
};
|
|
112
|
+
};
|
|
113
|
+
required: string[];
|
|
114
|
+
additionalProperties: false;
|
|
115
|
+
}>;
|
|
116
|
+
export type DoctorEvidence = {
|
|
117
|
+
readonly kind: DoctorEvidenceKind;
|
|
118
|
+
readonly source: DoctorEvidenceSource;
|
|
119
|
+
readonly location: string;
|
|
120
|
+
readonly references: readonly string[];
|
|
121
|
+
};
|
|
122
|
+
export type DoctorFinding = {
|
|
123
|
+
readonly checkId: string;
|
|
124
|
+
readonly target: string;
|
|
125
|
+
readonly status: DoctorFindingStatus;
|
|
126
|
+
readonly severity: DoctorFindingSeverity;
|
|
127
|
+
readonly timestamp: string;
|
|
128
|
+
readonly required: boolean;
|
|
129
|
+
readonly evidence: DoctorEvidence;
|
|
130
|
+
readonly explanation: string;
|
|
131
|
+
readonly nextAction: string;
|
|
132
|
+
};
|
|
133
|
+
export type DoctorCheckResult = {
|
|
134
|
+
readonly status: DoctorFindingStatus;
|
|
135
|
+
readonly evidenceRefs?: readonly string[];
|
|
136
|
+
};
|
|
137
|
+
export type DoctorCheck = {
|
|
138
|
+
readonly checkId: string;
|
|
139
|
+
readonly target: string;
|
|
140
|
+
readonly required: boolean;
|
|
141
|
+
readonly severity: DoctorFindingSeverity;
|
|
142
|
+
readonly evidence: {
|
|
143
|
+
readonly kind: DoctorEvidenceKind;
|
|
144
|
+
readonly source?: DoctorEvidenceSource;
|
|
145
|
+
readonly location: string;
|
|
146
|
+
};
|
|
147
|
+
readonly explanations: Readonly<Record<DoctorFindingStatus, string>>;
|
|
148
|
+
readonly nextAction: string;
|
|
149
|
+
readonly observe: () => DoctorCheckResult | Promise<DoctorCheckResult>;
|
|
150
|
+
};
|
|
151
|
+
export type DoctorReport = {
|
|
152
|
+
readonly schemaVersion: typeof DOCTOR_REPORT_SCHEMA_VERSION;
|
|
153
|
+
readonly profile: DoctorCheckProfile;
|
|
154
|
+
readonly findings: readonly DoctorFinding[];
|
|
155
|
+
readonly exitCode: Exclude<DoctorExitCode, 2>;
|
|
156
|
+
};
|
|
157
|
+
export type DoctorCheckProfile = {
|
|
158
|
+
readonly id: string;
|
|
159
|
+
readonly selectedCheckIds: readonly string[];
|
|
160
|
+
readonly requiredCheckIds: readonly string[];
|
|
161
|
+
};
|
|
162
|
+
export type DoctorRunOptions = {
|
|
163
|
+
readonly now?: () => Date;
|
|
164
|
+
readonly profile?: DoctorCheckProfile;
|
|
165
|
+
};
|
|
166
|
+
export type RegistryInspection = {
|
|
167
|
+
readonly definitions: readonly {
|
|
168
|
+
readonly id: string;
|
|
169
|
+
readonly description: string;
|
|
170
|
+
readonly risk: 'read' | 'write' | 'destructive';
|
|
171
|
+
readonly access: {
|
|
172
|
+
readonly kind: 'public';
|
|
173
|
+
} | {
|
|
174
|
+
readonly kind: 'protected';
|
|
175
|
+
readonly scopes: readonly string[];
|
|
176
|
+
};
|
|
177
|
+
}[];
|
|
178
|
+
readonly bindings: readonly {
|
|
179
|
+
readonly id: string;
|
|
180
|
+
readonly capabilityId: string;
|
|
181
|
+
readonly targets: readonly ('browser' | 'server' | 'local')[];
|
|
182
|
+
}[];
|
|
183
|
+
};
|
|
184
|
+
export type AuthorizedCapability = RegistryInspection['definitions'][number] & {
|
|
185
|
+
readonly bindingIds: readonly string[];
|
|
186
|
+
};
|
|
187
|
+
export type AuthorizedCapabilityListOptions = {
|
|
188
|
+
readonly surface: CapabilitySurface;
|
|
189
|
+
readonly exposure?: CapabilitySurfaceExposure;
|
|
190
|
+
readonly authorize?: CapabilityDiscoveryAuthorizer;
|
|
191
|
+
};
|
|
192
|
+
export declare class DoctorUsageError extends TypeError {
|
|
193
|
+
readonly exitCode: 2;
|
|
194
|
+
constructor(message: string);
|
|
195
|
+
}
|
|
196
|
+
export declare function doctorExitCode(findings: readonly DoctorFinding[]): Exclude<DoctorExitCode, 2>;
|
|
197
|
+
export declare function runDoctor(checks: readonly DoctorCheck[], options?: DoctorRunOptions): Promise<DoctorReport>;
|
|
198
|
+
export declare function inspectCapabilityRegistry(registry: CapabilityRegistry): RegistryInspection;
|
|
199
|
+
export declare function listAuthorizedCapabilities(registry: CapabilityRegistry, options: AuthorizedCapabilityListOptions): Promise<readonly AuthorizedCapability[]>;
|
|
200
|
+
//# sourceMappingURL=doctor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
|