@haaaiawd/second-nature 0.1.17 → 0.1.18
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/index.js +855 -855
- package/openclaw.plugin.json +29 -29
- package/package.json +52 -52
- package/runtime/cli/commands/index.d.ts +14 -14
- package/runtime/cli/commands/index.js +193 -193
- package/runtime/cli/explain/explain-surface-subject.d.ts +8 -8
- package/runtime/cli/explain/explain-surface-subject.js +9 -9
- package/runtime/cli/explain/format-explanation.d.ts +12 -12
- package/runtime/cli/explain/format-explanation.js +12 -12
- package/runtime/cli/explain/resolve-subject.js +41 -41
- package/runtime/cli/host-capability/classify-delivery.d.ts +14 -14
- package/runtime/cli/host-capability/classify-delivery.js +20 -20
- package/runtime/cli/host-capability/probe-host-capability.d.ts +2 -2
- package/runtime/cli/host-capability/probe-host-capability.js +58 -58
- package/runtime/cli/host-capability/record-host-capability.d.ts +6 -6
- package/runtime/cli/host-capability/record-host-capability.js +14 -14
- package/runtime/cli/host-capability/types.d.ts +71 -71
- package/runtime/cli/host-capability/types.js +6 -6
- package/runtime/cli/host-smoke/run-host-smoke.d.ts +2 -2
- package/runtime/cli/host-smoke/run-host-smoke.js +40 -40
- package/runtime/cli/host-smoke/types.d.ts +35 -35
- package/runtime/cli/host-smoke/types.js +6 -6
- package/runtime/cli/index.js +58 -54
- package/runtime/cli/ops/heartbeat-surface.d.ts +38 -35
- package/runtime/cli/ops/heartbeat-surface.js +73 -71
- package/runtime/cli/ops/ops-router.d.ts +19 -16
- package/runtime/cli/ops/ops-router.js +89 -87
- package/runtime/cli/ops/show-operator-fallback.d.ts +13 -13
- package/runtime/cli/ops/show-operator-fallback.js +22 -22
- package/runtime/cli/ops/workspace-heartbeat-runner.d.ts +19 -10
- package/runtime/cli/ops/workspace-heartbeat-runner.js +39 -26
- package/runtime/cli/read-models/index.d.ts +29 -29
- package/runtime/cli/read-models/index.js +256 -256
- package/runtime/cli/read-models/operator-explain-map.d.ts +6 -6
- package/runtime/cli/read-models/operator-explain-map.js +10 -10
- package/runtime/cli/read-models/types.d.ts +79 -79
- package/runtime/cli/runtime/runtime-artifact-boundary.d.ts +28 -28
- package/runtime/cli/runtime/runtime-artifact-boundary.js +94 -94
- package/runtime/connectors/base/contract.d.ts +87 -87
- package/runtime/connectors/base/execution-policy.d.ts +47 -47
- package/runtime/connectors/base/execution-policy.js +82 -82
- package/runtime/connectors/base/index.d.ts +8 -8
- package/runtime/connectors/base/index.js +8 -8
- package/runtime/connectors/base/manifest.d.ts +64 -64
- package/runtime/connectors/base/manifest.js +86 -86
- package/runtime/connectors/base/map-life-evidence.d.ts +16 -16
- package/runtime/connectors/base/map-life-evidence.js +79 -79
- package/runtime/connectors/base/policy-layer.d.ts +29 -29
- package/runtime/connectors/base/policy-layer.js +198 -198
- package/runtime/connectors/base/route-planner.js +99 -99
- package/runtime/connectors/index.d.ts +5 -5
- package/runtime/connectors/index.js +5 -5
- package/runtime/connectors/near-real/near-real-connector-smoke.d.ts +19 -19
- package/runtime/connectors/near-real/near-real-connector-smoke.js +152 -152
- package/runtime/core/second-nature/heartbeat/heartbeat-executor.js +114 -114
- package/runtime/core/second-nature/heartbeat/heartbeat-loop.d.ts +63 -63
- package/runtime/core/second-nature/heartbeat/heartbeat-loop.js +139 -139
- package/runtime/core/second-nature/heartbeat/index.d.ts +8 -8
- package/runtime/core/second-nature/heartbeat/index.js +7 -7
- package/runtime/core/second-nature/heartbeat/run-heartbeat-cycle.d.ts +21 -21
- package/runtime/core/second-nature/heartbeat/run-heartbeat-cycle.js +35 -35
- package/runtime/core/second-nature/heartbeat/runtime-snapshot.d.ts +28 -28
- package/runtime/core/second-nature/heartbeat/runtime-snapshot.js +35 -35
- package/runtime/core/second-nature/heartbeat/signal.d.ts +42 -42
- package/runtime/core/second-nature/heartbeat/snapshot-builder.d.ts +51 -51
- package/runtime/core/second-nature/index.d.ts +22 -22
- package/runtime/core/second-nature/index.js +22 -22
- package/runtime/core/second-nature/orchestrator/effect-dispatcher.d.ts +100 -100
- package/runtime/core/second-nature/orchestrator/effect-dispatcher.js +144 -144
- package/runtime/core/second-nature/orchestrator/guard-layer.d.ts +8 -8
- package/runtime/core/second-nature/orchestrator/guard-layer.js +110 -110
- package/runtime/core/second-nature/orchestrator/intent-planner.d.ts +13 -13
- package/runtime/core/second-nature/orchestrator/intent-planner.js +199 -199
- package/runtime/core/second-nature/orchestrator/lease-manager.d.ts +14 -14
- package/runtime/core/second-nature/orchestrator/lease-manager.js +58 -58
- package/runtime/core/second-nature/outreach/build-outreach-draft-request.d.ts +6 -6
- package/runtime/core/second-nature/outreach/build-outreach-draft-request.js +63 -63
- package/runtime/core/second-nature/outreach/delivery-target.d.ts +26 -26
- package/runtime/core/second-nature/outreach/delivery-target.js +70 -70
- package/runtime/core/second-nature/outreach/dispatch-user-outreach.d.ts +38 -38
- package/runtime/core/second-nature/outreach/dispatch-user-outreach.js +119 -119
- package/runtime/core/second-nature/outreach/judge-input-from-snapshot.d.ts +7 -7
- package/runtime/core/second-nature/outreach/judge-input-from-snapshot.js +45 -45
- package/runtime/core/second-nature/outreach/judge-outreach.d.ts +40 -40
- package/runtime/core/second-nature/outreach/judge-outreach.js +121 -121
- package/runtime/core/second-nature/quiet/run-source-backed-quiet.d.ts +21 -21
- package/runtime/core/second-nature/quiet/run-source-backed-quiet.js +123 -123
- package/runtime/core/second-nature/rhythm/planner-rhythm-window.d.ts +15 -15
- package/runtime/core/second-nature/rhythm/planner-rhythm-window.js +52 -52
- package/runtime/core/second-nature/rhythm/policy-bridge.d.ts +19 -19
- package/runtime/core/second-nature/rhythm/policy-bridge.js +34 -34
- package/runtime/core/second-nature/runtime/service-entry.js +45 -45
- package/runtime/core/second-nature/types.d.ts +51 -51
- package/runtime/guidance/draft-outreach-message.d.ts +7 -7
- package/runtime/guidance/draft-outreach-message.js +42 -42
- package/runtime/guidance/evidence-guidance.d.ts +40 -40
- package/runtime/guidance/evidence-guidance.js +52 -52
- package/runtime/guidance/index.d.ts +11 -11
- package/runtime/guidance/index.js +11 -11
- package/runtime/guidance/outreach-draft-schema.d.ts +228 -228
- package/runtime/guidance/outreach-draft-schema.js +80 -80
- package/runtime/observability/audit/append-only-audit-store.d.ts +14 -14
- package/runtime/observability/audit/append-only-audit-store.js +21 -21
- package/runtime/observability/audit/audit-envelope.d.ts +51 -51
- package/runtime/observability/audit/audit-envelope.js +130 -130
- package/runtime/observability/audit/verify-audit-hash-chain.d.ts +23 -23
- package/runtime/observability/audit/verify-audit-hash-chain.js +83 -83
- package/runtime/observability/db/index.js +124 -124
- package/runtime/observability/db/schema/host-capability-reports.d.ts +180 -180
- package/runtime/observability/db/schema/host-capability-reports.js +12 -12
- package/runtime/observability/db/schema/index.d.ts +947 -947
- package/runtime/observability/db/schema/index.js +71 -71
- package/runtime/observability/index.d.ts +20 -19
- package/runtime/observability/index.js +19 -18
- package/runtime/observability/query/explain-query.d.ts +48 -48
- package/runtime/observability/query/explain-query.js +114 -114
- package/runtime/observability/query/export-audit-bundle.d.ts +22 -22
- package/runtime/observability/query/export-audit-bundle.js +27 -27
- package/runtime/observability/services/decision-ledger.d.ts +46 -46
- package/runtime/observability/services/decision-ledger.js +161 -161
- package/runtime/observability/services/governance-audit.d.ts +41 -41
- package/runtime/observability/services/governance-audit.js +163 -163
- package/runtime/observability/services/governance-plane-recorder.d.ts +47 -47
- package/runtime/observability/services/governance-plane-recorder.js +55 -55
- package/runtime/observability/services/lived-experience-audit.d.ts +97 -97
- package/runtime/observability/services/lived-experience-audit.js +162 -162
- package/runtime/observability/services/runtime-decision-recorder.d.ts +29 -0
- package/runtime/observability/services/runtime-decision-recorder.js +94 -0
- package/runtime/storage/bootstrap/native-sqlite-probe.d.ts +7 -7
- package/runtime/storage/bootstrap/native-sqlite-probe.js +28 -28
- package/runtime/storage/bootstrap/repair-gate.d.ts +17 -17
- package/runtime/storage/bootstrap/repair-gate.js +71 -71
- package/runtime/storage/bootstrap/storage-mode-smoke.d.ts +38 -38
- package/runtime/storage/bootstrap/storage-mode-smoke.js +85 -85
- package/runtime/storage/db/index.js +154 -154
- package/runtime/storage/db/schema/delivery-attempts.d.ts +199 -199
- package/runtime/storage/db/schema/delivery-attempts.js +13 -13
- package/runtime/storage/db/schema/index.d.ts +9 -9
- package/runtime/storage/db/schema/index.js +9 -9
- package/runtime/storage/db/schema/life-evidence-index.d.ts +161 -161
- package/runtime/storage/db/schema/life-evidence-index.js +11 -11
- package/runtime/storage/db/schema/operator-fallback-artifacts.d.ts +161 -161
- package/runtime/storage/db/schema/operator-fallback-artifacts.js +11 -11
- package/runtime/storage/db/schema/policies.d.ts +98 -98
- package/runtime/storage/db/schema/policies.js +8 -8
- package/runtime/storage/delivery/query-delivery-attempts.d.ts +3 -3
- package/runtime/storage/delivery/query-delivery-attempts.js +32 -32
- package/runtime/storage/delivery/types.d.ts +27 -27
- package/runtime/storage/delivery/types.js +1 -1
- package/runtime/storage/delivery/write-delivery-attempt.d.ts +6 -6
- package/runtime/storage/delivery/write-delivery-attempt.js +36 -36
- package/runtime/storage/fallback/load-operator-fallback.d.ts +14 -14
- package/runtime/storage/fallback/load-operator-fallback.js +47 -47
- package/runtime/storage/fallback/operator-fallback-types.d.ts +9 -9
- package/runtime/storage/fallback/operator-fallback-types.js +1 -1
- package/runtime/storage/fallback/operator-fallback-view.d.ts +11 -11
- package/runtime/storage/fallback/operator-fallback-view.js +1 -1
- package/runtime/storage/fallback/write-operator-fallback.d.ts +6 -6
- package/runtime/storage/fallback/write-operator-fallback.js +21 -21
- package/runtime/storage/index.d.ts +37 -37
- package/runtime/storage/index.js +30 -30
- package/runtime/storage/life-evidence/append-life-evidence.d.ts +7 -7
- package/runtime/storage/life-evidence/append-life-evidence.js +64 -64
- package/runtime/storage/life-evidence/types.d.ts +45 -45
- package/runtime/storage/life-evidence/types.js +6 -6
- package/runtime/storage/quiet/persist-quiet-artifact.d.ts +7 -7
- package/runtime/storage/quiet/persist-quiet-artifact.js +22 -22
- package/runtime/storage/quiet/quiet-artifact-types.d.ts +18 -18
- package/runtime/storage/quiet/quiet-artifact-types.js +1 -1
- package/runtime/storage/quiet/quiet-artifact-writer.d.ts +15 -15
- package/runtime/storage/quiet/quiet-artifact-writer.js +56 -56
- package/runtime/storage/repositories/credential-repository.js +30 -30
- package/runtime/storage/rhythm/rhythm-policy-snapshot.d.ts +10 -10
- package/runtime/storage/rhythm/rhythm-policy-snapshot.js +34 -34
- package/runtime/storage/services/credential-vault.d.ts +13 -13
- package/runtime/storage/services/credential-vault.js +116 -116
- package/runtime/storage/snapshots/continuity-snapshot.d.ts +9 -9
- package/runtime/storage/snapshots/continuity-snapshot.js +41 -41
- package/runtime/storage/snapshots/life-evidence-snapshot.d.ts +6 -6
- package/runtime/storage/snapshots/life-evidence-snapshot.js +114 -114
- package/runtime/storage/snapshots/types.d.ts +58 -58
- package/runtime/storage/snapshots/types.js +1 -1
- package/runtime/storage/state-api.js +104 -104
- package/runtime/storage/user-interest/load-user-interest-snapshot.d.ts +2 -2
- package/runtime/storage/user-interest/load-user-interest-snapshot.js +150 -150
- package/runtime/storage/user-interest/types.d.ts +25 -25
- package/runtime/storage/user-interest/types.js +1 -1
- package/workspace-ops-bridge.js +81 -80
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
export function formatExplanation(model) {
|
|
2
|
-
return {
|
|
3
|
-
subjectType: model.subjectType,
|
|
4
|
-
conclusion: model.conclusion,
|
|
5
|
-
keyFactors: model.keyFactors,
|
|
6
|
-
evidenceRefs: model.evidenceRefs,
|
|
7
|
-
requiredUserInput: model.requiredUserInput,
|
|
8
|
-
nextStep: model.nextStep,
|
|
9
|
-
warnings: model.warnings,
|
|
10
|
-
relatedAuditEventIds: model.relatedAuditEventIds,
|
|
11
|
-
};
|
|
12
|
-
}
|
|
1
|
+
export function formatExplanation(model) {
|
|
2
|
+
return {
|
|
3
|
+
subjectType: model.subjectType,
|
|
4
|
+
conclusion: model.conclusion,
|
|
5
|
+
keyFactors: model.keyFactors,
|
|
6
|
+
evidenceRefs: model.evidenceRefs,
|
|
7
|
+
requiredUserInput: model.requiredUserInput,
|
|
8
|
+
nextStep: model.nextStep,
|
|
9
|
+
warnings: model.warnings,
|
|
10
|
+
relatedAuditEventIds: model.relatedAuditEventIds,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
@@ -1,41 +1,41 @@
|
|
|
1
|
-
function splitSubject(raw) {
|
|
2
|
-
const [prefix, ...rest] = raw.split(":");
|
|
3
|
-
return {
|
|
4
|
-
prefix: (prefix ?? "").trim(),
|
|
5
|
-
id: rest.join(":").trim(),
|
|
6
|
-
};
|
|
7
|
-
}
|
|
8
|
-
export function resolveExplainSubject(raw) {
|
|
9
|
-
const { prefix, id } = splitSubject(raw);
|
|
10
|
-
if (!id) {
|
|
11
|
-
throw new Error("explain_subject_requires_id");
|
|
12
|
-
}
|
|
13
|
-
if (prefix === "decision") {
|
|
14
|
-
return { kind: "decision", id };
|
|
15
|
-
}
|
|
16
|
-
if (prefix === "platform") {
|
|
17
|
-
return { kind: "platform-selection", id };
|
|
18
|
-
}
|
|
19
|
-
if (prefix === "outreach") {
|
|
20
|
-
return { kind: "outreach", id };
|
|
21
|
-
}
|
|
22
|
-
if (prefix === "soul") {
|
|
23
|
-
return { kind: "soul-change", id };
|
|
24
|
-
}
|
|
25
|
-
if (prefix === "fallback") {
|
|
26
|
-
return { kind: "fallback", id };
|
|
27
|
-
}
|
|
28
|
-
if (prefix === "probe") {
|
|
29
|
-
return { kind: "probe", id };
|
|
30
|
-
}
|
|
31
|
-
if (prefix === "report") {
|
|
32
|
-
return { kind: "report", id };
|
|
33
|
-
}
|
|
34
|
-
if (prefix === "delivery") {
|
|
35
|
-
return { kind: "delivery", id };
|
|
36
|
-
}
|
|
37
|
-
if (prefix === "source" || prefix === "source_ref") {
|
|
38
|
-
return { kind: "source_ref", id };
|
|
39
|
-
}
|
|
40
|
-
throw new Error("explain_subject_unsupported");
|
|
41
|
-
}
|
|
1
|
+
function splitSubject(raw) {
|
|
2
|
+
const [prefix, ...rest] = raw.split(":");
|
|
3
|
+
return {
|
|
4
|
+
prefix: (prefix ?? "").trim(),
|
|
5
|
+
id: rest.join(":").trim(),
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
export function resolveExplainSubject(raw) {
|
|
9
|
+
const { prefix, id } = splitSubject(raw);
|
|
10
|
+
if (!id) {
|
|
11
|
+
throw new Error("explain_subject_requires_id");
|
|
12
|
+
}
|
|
13
|
+
if (prefix === "decision") {
|
|
14
|
+
return { kind: "decision", id };
|
|
15
|
+
}
|
|
16
|
+
if (prefix === "platform") {
|
|
17
|
+
return { kind: "platform-selection", id };
|
|
18
|
+
}
|
|
19
|
+
if (prefix === "outreach") {
|
|
20
|
+
return { kind: "outreach", id };
|
|
21
|
+
}
|
|
22
|
+
if (prefix === "soul") {
|
|
23
|
+
return { kind: "soul-change", id };
|
|
24
|
+
}
|
|
25
|
+
if (prefix === "fallback") {
|
|
26
|
+
return { kind: "fallback", id };
|
|
27
|
+
}
|
|
28
|
+
if (prefix === "probe") {
|
|
29
|
+
return { kind: "probe", id };
|
|
30
|
+
}
|
|
31
|
+
if (prefix === "report") {
|
|
32
|
+
return { kind: "report", id };
|
|
33
|
+
}
|
|
34
|
+
if (prefix === "delivery") {
|
|
35
|
+
return { kind: "delivery", id };
|
|
36
|
+
}
|
|
37
|
+
if (prefix === "source" || prefix === "source_ref") {
|
|
38
|
+
return { kind: "source_ref", id };
|
|
39
|
+
}
|
|
40
|
+
throw new Error("explain_subject_unsupported");
|
|
41
|
+
}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Normalizes host-reported delivery signals into DeliveryCapabilityStatus (cli-system).
|
|
3
|
-
*/
|
|
4
|
-
import type { DeliveryCapabilityStatus } from "./types.js";
|
|
5
|
-
export interface ClassifyDeliveryCapabilityInput {
|
|
6
|
-
/** Host-reported delivery channel / target hint */
|
|
7
|
-
rawTarget?: string | null;
|
|
8
|
-
channel?: string | null;
|
|
9
|
-
/** When false, host API for delivery is not reachable */
|
|
10
|
-
apiAvailable?: boolean;
|
|
11
|
-
/** When true, host explicitly reports unsupported delivery surface */
|
|
12
|
-
hostUnsupported?: boolean;
|
|
13
|
-
}
|
|
14
|
-
export declare function classifyDeliveryCapability(input: ClassifyDeliveryCapabilityInput): DeliveryCapabilityStatus;
|
|
1
|
+
/**
|
|
2
|
+
* Normalizes host-reported delivery signals into DeliveryCapabilityStatus (cli-system).
|
|
3
|
+
*/
|
|
4
|
+
import type { DeliveryCapabilityStatus } from "./types.js";
|
|
5
|
+
export interface ClassifyDeliveryCapabilityInput {
|
|
6
|
+
/** Host-reported delivery channel / target hint */
|
|
7
|
+
rawTarget?: string | null;
|
|
8
|
+
channel?: string | null;
|
|
9
|
+
/** When false, host API for delivery is not reachable */
|
|
10
|
+
apiAvailable?: boolean;
|
|
11
|
+
/** When true, host explicitly reports unsupported delivery surface */
|
|
12
|
+
hostUnsupported?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare function classifyDeliveryCapability(input: ClassifyDeliveryCapabilityInput): DeliveryCapabilityStatus;
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
export function classifyDeliveryCapability(input) {
|
|
2
|
-
if (input.hostUnsupported) {
|
|
3
|
-
return "host_unsupported";
|
|
4
|
-
}
|
|
5
|
-
if (input.apiAvailable === false) {
|
|
6
|
-
return "host_api_unavailable";
|
|
7
|
-
}
|
|
8
|
-
const target = (input.rawTarget ?? "").trim().toLowerCase();
|
|
9
|
-
if (target === "none" || target === "") {
|
|
10
|
-
return "target_none";
|
|
11
|
-
}
|
|
12
|
-
const ch = (input.channel ?? "").trim();
|
|
13
|
-
if (!ch) {
|
|
14
|
-
return "channel_missing";
|
|
15
|
-
}
|
|
16
|
-
if (target === "unknown" || target === "unspecified") {
|
|
17
|
-
return "unknown";
|
|
18
|
-
}
|
|
19
|
-
return "target_available";
|
|
20
|
-
}
|
|
1
|
+
export function classifyDeliveryCapability(input) {
|
|
2
|
+
if (input.hostUnsupported) {
|
|
3
|
+
return "host_unsupported";
|
|
4
|
+
}
|
|
5
|
+
if (input.apiAvailable === false) {
|
|
6
|
+
return "host_api_unavailable";
|
|
7
|
+
}
|
|
8
|
+
const target = (input.rawTarget ?? "").trim().toLowerCase();
|
|
9
|
+
if (target === "none" || target === "") {
|
|
10
|
+
return "target_none";
|
|
11
|
+
}
|
|
12
|
+
const ch = (input.channel ?? "").trim();
|
|
13
|
+
if (!ch) {
|
|
14
|
+
return "channel_missing";
|
|
15
|
+
}
|
|
16
|
+
if (target === "unknown" || target === "unspecified") {
|
|
17
|
+
return "unknown";
|
|
18
|
+
}
|
|
19
|
+
return "target_available";
|
|
20
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { HostCapabilityProbeOptions, HostCapabilityReport } from "./types.js";
|
|
2
|
-
export declare function probeHostCapability(options: HostCapabilityProbeOptions): HostCapabilityReport;
|
|
1
|
+
import type { HostCapabilityProbeOptions, HostCapabilityReport } from "./types.js";
|
|
2
|
+
export declare function probeHostCapability(options: HostCapabilityProbeOptions): HostCapabilityReport;
|
|
@@ -1,58 +1,58 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* OpenClaw host capability probe — aggregates adapter checks into HostCapabilityReport.
|
|
3
|
-
*/
|
|
4
|
-
import * as crypto from "node:crypto";
|
|
5
|
-
function mergeEvidenceRefs(...groups) {
|
|
6
|
-
const seen = new Set();
|
|
7
|
-
const out = [];
|
|
8
|
-
for (const group of groups) {
|
|
9
|
-
for (const ref of group) {
|
|
10
|
-
const key = `${ref.kind}:${ref.id}`;
|
|
11
|
-
if (!seen.has(key)) {
|
|
12
|
-
seen.add(key);
|
|
13
|
-
out.push(ref);
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
return out;
|
|
18
|
-
}
|
|
19
|
-
export function probeHostCapability(options) {
|
|
20
|
-
const { adapter, docLinks, docCheckedAt, hostVersion, observedVersion } = options;
|
|
21
|
-
const generatedAt = new Date().toISOString();
|
|
22
|
-
const pluginLoad = adapter.checkPluginLoad();
|
|
23
|
-
const heartbeatBridge = adapter.checkHeartbeatBridge();
|
|
24
|
-
const heartbeatToolInvocation = adapter.checkHeartbeatToolInvocation();
|
|
25
|
-
const delivery = adapter.checkDeliveryTarget();
|
|
26
|
-
const deliveryTarget = delivery.status;
|
|
27
|
-
const ackDropBehavior = adapter.checkAckDropBehavior();
|
|
28
|
-
const hookSupport = adapter.checkHookSupport();
|
|
29
|
-
const conflictRecords = [];
|
|
30
|
-
if (delivery.reason === "docs_vs_observed_mismatch" && docLinks.length > 0) {
|
|
31
|
-
const doc = docLinks[0];
|
|
32
|
-
conflictRecords.push({
|
|
33
|
-
capability: "delivery_target",
|
|
34
|
-
documentedBehavior: doc.documentedBehavior,
|
|
35
|
-
observedBehavior: deliveryTarget,
|
|
36
|
-
hostVersion,
|
|
37
|
-
docUrl: doc.url,
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
const evidenceRefs = mergeEvidenceRefs(pluginLoad.evidenceRefs, heartbeatBridge.evidenceRefs, heartbeatToolInvocation.evidenceRefs, delivery.evidenceRefs, ackDropBehavior.evidenceRefs, ...hookSupport.map((h) => h.evidenceRefs));
|
|
41
|
-
return {
|
|
42
|
-
reportId: crypto.randomUUID(),
|
|
43
|
-
generatedAt,
|
|
44
|
-
hostVersion,
|
|
45
|
-
observedVersion,
|
|
46
|
-
docLinks,
|
|
47
|
-
docCheckedAt,
|
|
48
|
-
pluginLoad,
|
|
49
|
-
heartbeatBridge,
|
|
50
|
-
heartbeatToolInvocation,
|
|
51
|
-
deliveryTarget,
|
|
52
|
-
ackDropBehavior,
|
|
53
|
-
hookSupport,
|
|
54
|
-
evidenceRefs,
|
|
55
|
-
conflictRecords,
|
|
56
|
-
recommendedNextStep: conflictRecords.length > 0 ? "reconcile_docs_vs_observed" : undefined,
|
|
57
|
-
};
|
|
58
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* OpenClaw host capability probe — aggregates adapter checks into HostCapabilityReport.
|
|
3
|
+
*/
|
|
4
|
+
import * as crypto from "node:crypto";
|
|
5
|
+
function mergeEvidenceRefs(...groups) {
|
|
6
|
+
const seen = new Set();
|
|
7
|
+
const out = [];
|
|
8
|
+
for (const group of groups) {
|
|
9
|
+
for (const ref of group) {
|
|
10
|
+
const key = `${ref.kind}:${ref.id}`;
|
|
11
|
+
if (!seen.has(key)) {
|
|
12
|
+
seen.add(key);
|
|
13
|
+
out.push(ref);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return out;
|
|
18
|
+
}
|
|
19
|
+
export function probeHostCapability(options) {
|
|
20
|
+
const { adapter, docLinks, docCheckedAt, hostVersion, observedVersion } = options;
|
|
21
|
+
const generatedAt = new Date().toISOString();
|
|
22
|
+
const pluginLoad = adapter.checkPluginLoad();
|
|
23
|
+
const heartbeatBridge = adapter.checkHeartbeatBridge();
|
|
24
|
+
const heartbeatToolInvocation = adapter.checkHeartbeatToolInvocation();
|
|
25
|
+
const delivery = adapter.checkDeliveryTarget();
|
|
26
|
+
const deliveryTarget = delivery.status;
|
|
27
|
+
const ackDropBehavior = adapter.checkAckDropBehavior();
|
|
28
|
+
const hookSupport = adapter.checkHookSupport();
|
|
29
|
+
const conflictRecords = [];
|
|
30
|
+
if (delivery.reason === "docs_vs_observed_mismatch" && docLinks.length > 0) {
|
|
31
|
+
const doc = docLinks[0];
|
|
32
|
+
conflictRecords.push({
|
|
33
|
+
capability: "delivery_target",
|
|
34
|
+
documentedBehavior: doc.documentedBehavior,
|
|
35
|
+
observedBehavior: deliveryTarget,
|
|
36
|
+
hostVersion,
|
|
37
|
+
docUrl: doc.url,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
const evidenceRefs = mergeEvidenceRefs(pluginLoad.evidenceRefs, heartbeatBridge.evidenceRefs, heartbeatToolInvocation.evidenceRefs, delivery.evidenceRefs, ackDropBehavior.evidenceRefs, ...hookSupport.map((h) => h.evidenceRefs));
|
|
41
|
+
return {
|
|
42
|
+
reportId: crypto.randomUUID(),
|
|
43
|
+
generatedAt,
|
|
44
|
+
hostVersion,
|
|
45
|
+
observedVersion,
|
|
46
|
+
docLinks,
|
|
47
|
+
docCheckedAt,
|
|
48
|
+
pluginLoad,
|
|
49
|
+
heartbeatBridge,
|
|
50
|
+
heartbeatToolInvocation,
|
|
51
|
+
deliveryTarget,
|
|
52
|
+
ackDropBehavior,
|
|
53
|
+
hookSupport,
|
|
54
|
+
evidenceRefs,
|
|
55
|
+
conflictRecords,
|
|
56
|
+
recommendedNextStep: conflictRecords.length > 0 ? "reconcile_docs_vs_observed" : undefined,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Persist HostCapabilityReport into observability SQLite (T1.1.2).
|
|
3
|
-
*/
|
|
4
|
-
import type { ObservabilityDatabase } from "../../observability/db/index.js";
|
|
5
|
-
import type { HostCapabilityReport } from "./types.js";
|
|
6
|
-
export declare function recordHostCapability(db: ObservabilityDatabase, report: HostCapabilityReport): Promise<void>;
|
|
1
|
+
/**
|
|
2
|
+
* Persist HostCapabilityReport into observability SQLite (T1.1.2).
|
|
3
|
+
*/
|
|
4
|
+
import type { ObservabilityDatabase } from "../../observability/db/index.js";
|
|
5
|
+
import type { HostCapabilityReport } from "./types.js";
|
|
6
|
+
export declare function recordHostCapability(db: ObservabilityDatabase, report: HostCapabilityReport): Promise<void>;
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { hostCapabilityReports } from "../../observability/db/schema/host-capability-reports.js";
|
|
2
|
-
export async function recordHostCapability(db, report) {
|
|
3
|
-
await db.db.insert(hostCapabilityReports).values({
|
|
4
|
-
reportId: report.reportId,
|
|
5
|
-
generatedAt: report.generatedAt,
|
|
6
|
-
hostVersion: report.hostVersion ?? null,
|
|
7
|
-
observedVersion: report.observedVersion ?? null,
|
|
8
|
-
docCheckedAt: report.docCheckedAt,
|
|
9
|
-
docLinksJson: JSON.stringify(report.docLinks),
|
|
10
|
-
deliveryTarget: report.deliveryTarget,
|
|
11
|
-
conflictRecordsJson: JSON.stringify(report.conflictRecords),
|
|
12
|
-
fullReportJson: JSON.stringify(report),
|
|
13
|
-
});
|
|
14
|
-
}
|
|
1
|
+
import { hostCapabilityReports } from "../../observability/db/schema/host-capability-reports.js";
|
|
2
|
+
export async function recordHostCapability(db, report) {
|
|
3
|
+
await db.db.insert(hostCapabilityReports).values({
|
|
4
|
+
reportId: report.reportId,
|
|
5
|
+
generatedAt: report.generatedAt,
|
|
6
|
+
hostVersion: report.hostVersion ?? null,
|
|
7
|
+
observedVersion: report.observedVersion ?? null,
|
|
8
|
+
docCheckedAt: report.docCheckedAt,
|
|
9
|
+
docLinksJson: JSON.stringify(report.docLinks),
|
|
10
|
+
deliveryTarget: report.deliveryTarget,
|
|
11
|
+
conflictRecordsJson: JSON.stringify(report.conflictRecords),
|
|
12
|
+
fullReportJson: JSON.stringify(report),
|
|
13
|
+
});
|
|
14
|
+
}
|
|
@@ -1,71 +1,71 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Host capability probe contracts (cli-system v5 / ADR-007).
|
|
3
|
-
*
|
|
4
|
-
* Test coverage: tests/unit/cli/host-capability.test.ts, tests/integration/cli/host-capability-probe.test.ts
|
|
5
|
-
*/
|
|
6
|
-
export type DeliveryCapabilityStatus = "target_available" | "target_none" | "channel_missing" | "host_api_unavailable" | "host_unsupported" | "unknown";
|
|
7
|
-
export type CapabilityVerdict = "pass" | "fail" | "unknown" | "not_applicable";
|
|
8
|
-
export interface SourceRef {
|
|
9
|
-
id: string;
|
|
10
|
-
kind: "platform_item" | "workspace_artifact" | "decision_record" | "user_anchor" | "connector_result" | "host_report" | "fallback_artifact";
|
|
11
|
-
uri: string;
|
|
12
|
-
excerptHash?: string;
|
|
13
|
-
observedAt?: string;
|
|
14
|
-
}
|
|
15
|
-
export interface HostCapabilityDocReference {
|
|
16
|
-
title: string;
|
|
17
|
-
url: string;
|
|
18
|
-
checkedAt: string;
|
|
19
|
-
documentedBehavior: string;
|
|
20
|
-
}
|
|
21
|
-
export interface HostCapabilityConflictRecord {
|
|
22
|
-
capability: string;
|
|
23
|
-
documentedBehavior: string;
|
|
24
|
-
observedBehavior: string;
|
|
25
|
-
hostVersion?: string;
|
|
26
|
-
docUrl?: string;
|
|
27
|
-
}
|
|
28
|
-
export interface CapabilityCheckResult {
|
|
29
|
-
name: string;
|
|
30
|
-
verdict: CapabilityVerdict;
|
|
31
|
-
observedAt: string;
|
|
32
|
-
reason?: string;
|
|
33
|
-
evidenceRefs: SourceRef[];
|
|
34
|
-
}
|
|
35
|
-
export interface HostCapabilityReport {
|
|
36
|
-
reportId: string;
|
|
37
|
-
generatedAt: string;
|
|
38
|
-
hostVersion?: string;
|
|
39
|
-
observedVersion?: string;
|
|
40
|
-
docLinks: HostCapabilityDocReference[];
|
|
41
|
-
docCheckedAt: string;
|
|
42
|
-
pluginLoad: CapabilityCheckResult;
|
|
43
|
-
heartbeatBridge: CapabilityCheckResult;
|
|
44
|
-
heartbeatToolInvocation: CapabilityCheckResult;
|
|
45
|
-
deliveryTarget: DeliveryCapabilityStatus;
|
|
46
|
-
ackDropBehavior: CapabilityCheckResult;
|
|
47
|
-
hookSupport: CapabilityCheckResult[];
|
|
48
|
-
evidenceRefs: SourceRef[];
|
|
49
|
-
conflictRecords: HostCapabilityConflictRecord[];
|
|
50
|
-
recommendedNextStep?: string;
|
|
51
|
-
}
|
|
52
|
-
export interface HostCapabilityProbeOptions {
|
|
53
|
-
adapter: HostCapabilityAdapter;
|
|
54
|
-
docLinks: HostCapabilityDocReference[];
|
|
55
|
-
docCheckedAt: string;
|
|
56
|
-
hostVersion?: string;
|
|
57
|
-
observedVersion?: string;
|
|
58
|
-
}
|
|
59
|
-
export interface HostCapabilityAdapter {
|
|
60
|
-
checkPluginLoad(): CapabilityCheckResult;
|
|
61
|
-
checkHeartbeatBridge(): CapabilityCheckResult;
|
|
62
|
-
checkHeartbeatToolInvocation(): CapabilityCheckResult;
|
|
63
|
-
/** Return normalized delivery capability as observed on the host */
|
|
64
|
-
checkDeliveryTarget(): {
|
|
65
|
-
status: DeliveryCapabilityStatus;
|
|
66
|
-
evidenceRefs: SourceRef[];
|
|
67
|
-
reason?: string;
|
|
68
|
-
};
|
|
69
|
-
checkAckDropBehavior(): CapabilityCheckResult;
|
|
70
|
-
checkHookSupport(): CapabilityCheckResult[];
|
|
71
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Host capability probe contracts (cli-system v5 / ADR-007).
|
|
3
|
+
*
|
|
4
|
+
* Test coverage: tests/unit/cli/host-capability.test.ts, tests/integration/cli/host-capability-probe.test.ts
|
|
5
|
+
*/
|
|
6
|
+
export type DeliveryCapabilityStatus = "target_available" | "target_none" | "channel_missing" | "host_api_unavailable" | "host_unsupported" | "unknown";
|
|
7
|
+
export type CapabilityVerdict = "pass" | "fail" | "unknown" | "not_applicable";
|
|
8
|
+
export interface SourceRef {
|
|
9
|
+
id: string;
|
|
10
|
+
kind: "platform_item" | "workspace_artifact" | "decision_record" | "user_anchor" | "connector_result" | "host_report" | "fallback_artifact";
|
|
11
|
+
uri: string;
|
|
12
|
+
excerptHash?: string;
|
|
13
|
+
observedAt?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface HostCapabilityDocReference {
|
|
16
|
+
title: string;
|
|
17
|
+
url: string;
|
|
18
|
+
checkedAt: string;
|
|
19
|
+
documentedBehavior: string;
|
|
20
|
+
}
|
|
21
|
+
export interface HostCapabilityConflictRecord {
|
|
22
|
+
capability: string;
|
|
23
|
+
documentedBehavior: string;
|
|
24
|
+
observedBehavior: string;
|
|
25
|
+
hostVersion?: string;
|
|
26
|
+
docUrl?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface CapabilityCheckResult {
|
|
29
|
+
name: string;
|
|
30
|
+
verdict: CapabilityVerdict;
|
|
31
|
+
observedAt: string;
|
|
32
|
+
reason?: string;
|
|
33
|
+
evidenceRefs: SourceRef[];
|
|
34
|
+
}
|
|
35
|
+
export interface HostCapabilityReport {
|
|
36
|
+
reportId: string;
|
|
37
|
+
generatedAt: string;
|
|
38
|
+
hostVersion?: string;
|
|
39
|
+
observedVersion?: string;
|
|
40
|
+
docLinks: HostCapabilityDocReference[];
|
|
41
|
+
docCheckedAt: string;
|
|
42
|
+
pluginLoad: CapabilityCheckResult;
|
|
43
|
+
heartbeatBridge: CapabilityCheckResult;
|
|
44
|
+
heartbeatToolInvocation: CapabilityCheckResult;
|
|
45
|
+
deliveryTarget: DeliveryCapabilityStatus;
|
|
46
|
+
ackDropBehavior: CapabilityCheckResult;
|
|
47
|
+
hookSupport: CapabilityCheckResult[];
|
|
48
|
+
evidenceRefs: SourceRef[];
|
|
49
|
+
conflictRecords: HostCapabilityConflictRecord[];
|
|
50
|
+
recommendedNextStep?: string;
|
|
51
|
+
}
|
|
52
|
+
export interface HostCapabilityProbeOptions {
|
|
53
|
+
adapter: HostCapabilityAdapter;
|
|
54
|
+
docLinks: HostCapabilityDocReference[];
|
|
55
|
+
docCheckedAt: string;
|
|
56
|
+
hostVersion?: string;
|
|
57
|
+
observedVersion?: string;
|
|
58
|
+
}
|
|
59
|
+
export interface HostCapabilityAdapter {
|
|
60
|
+
checkPluginLoad(): CapabilityCheckResult;
|
|
61
|
+
checkHeartbeatBridge(): CapabilityCheckResult;
|
|
62
|
+
checkHeartbeatToolInvocation(): CapabilityCheckResult;
|
|
63
|
+
/** Return normalized delivery capability as observed on the host */
|
|
64
|
+
checkDeliveryTarget(): {
|
|
65
|
+
status: DeliveryCapabilityStatus;
|
|
66
|
+
evidenceRefs: SourceRef[];
|
|
67
|
+
reason?: string;
|
|
68
|
+
};
|
|
69
|
+
checkAckDropBehavior(): CapabilityCheckResult;
|
|
70
|
+
checkHookSupport(): CapabilityCheckResult[];
|
|
71
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Host capability probe contracts (cli-system v5 / ADR-007).
|
|
3
|
-
*
|
|
4
|
-
* Test coverage: tests/unit/cli/host-capability.test.ts, tests/integration/cli/host-capability-probe.test.ts
|
|
5
|
-
*/
|
|
6
|
-
export {};
|
|
1
|
+
/**
|
|
2
|
+
* Host capability probe contracts (cli-system v5 / ADR-007).
|
|
3
|
+
*
|
|
4
|
+
* Test coverage: tests/unit/cli/host-capability.test.ts, tests/integration/cli/host-capability-probe.test.ts
|
|
5
|
+
*/
|
|
6
|
+
export {};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { HostSmokePlan, HostSmokeReport } from "./types.js";
|
|
2
|
-
export declare function runHostSmoke(plan: HostSmokePlan): Promise<HostSmokeReport>;
|
|
1
|
+
import type { HostSmokePlan, HostSmokeReport } from "./types.js";
|
|
2
|
+
export declare function runHostSmoke(plan: HostSmokePlan): Promise<HostSmokeReport>;
|
|
@@ -1,40 +1,40 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Reproducible host smoke runner (T1.3.1). Uses transcript fixtures — no live OpenClaw in unit/integration path.
|
|
3
|
-
*
|
|
4
|
-
* Core logic: evaluate `heartbeat_tool_invocation` by substring match for heartbeat_check / second_nature_ops heartbeat surface.
|
|
5
|
-
*/
|
|
6
|
-
import * as crypto from "node:crypto";
|
|
7
|
-
function evalHeartbeatToolInvocation(c) {
|
|
8
|
-
const hasHeartbeatCheck = c.toolInvocations.some((t) => /heartbeat_check|second_nature_ops\s*\(\s*\{[^}]*heartbeat_check|command\s*:\s*["']heartbeat_check["']/i.test(t));
|
|
9
|
-
if (hasHeartbeatCheck) {
|
|
10
|
-
return { caseType: c.type, status: "pass", reasons: [] };
|
|
11
|
-
}
|
|
12
|
-
return { caseType: c.type, status: "fail", reasons: ["heartbeat_tool_not_invoked"] };
|
|
13
|
-
}
|
|
14
|
-
function evalDocsConflict(c) {
|
|
15
|
-
if (c.observedBehavior.trim() === c.docExpectation.trim()) {
|
|
16
|
-
return { caseType: c.type, status: "pass", reasons: [] };
|
|
17
|
-
}
|
|
18
|
-
return {
|
|
19
|
-
caseType: c.type,
|
|
20
|
-
status: "fail",
|
|
21
|
-
reasons: ["docs_vs_observed_conflict", `expected:${c.docExpectation}`, `observed:${c.observedBehavior}`],
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
function evalCase(c) {
|
|
25
|
-
if (c.type === "heartbeat_tool_invocation") {
|
|
26
|
-
return evalHeartbeatToolInvocation(c);
|
|
27
|
-
}
|
|
28
|
-
return evalDocsConflict(c);
|
|
29
|
-
}
|
|
30
|
-
export async function runHostSmoke(plan) {
|
|
31
|
-
const results = plan.cases.map((c) => evalCase(c));
|
|
32
|
-
return {
|
|
33
|
-
reportId: crypto.randomUUID(),
|
|
34
|
-
generatedAt: new Date().toISOString(),
|
|
35
|
-
results,
|
|
36
|
-
docLinks: plan.docLinks,
|
|
37
|
-
docCheckedAt: plan.docCheckedAt,
|
|
38
|
-
hostVersion: plan.hostVersion,
|
|
39
|
-
};
|
|
40
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Reproducible host smoke runner (T1.3.1). Uses transcript fixtures — no live OpenClaw in unit/integration path.
|
|
3
|
+
*
|
|
4
|
+
* Core logic: evaluate `heartbeat_tool_invocation` by substring match for heartbeat_check / second_nature_ops heartbeat surface.
|
|
5
|
+
*/
|
|
6
|
+
import * as crypto from "node:crypto";
|
|
7
|
+
function evalHeartbeatToolInvocation(c) {
|
|
8
|
+
const hasHeartbeatCheck = c.toolInvocations.some((t) => /heartbeat_check|second_nature_ops\s*\(\s*\{[^}]*heartbeat_check|command\s*:\s*["']heartbeat_check["']/i.test(t));
|
|
9
|
+
if (hasHeartbeatCheck) {
|
|
10
|
+
return { caseType: c.type, status: "pass", reasons: [] };
|
|
11
|
+
}
|
|
12
|
+
return { caseType: c.type, status: "fail", reasons: ["heartbeat_tool_not_invoked"] };
|
|
13
|
+
}
|
|
14
|
+
function evalDocsConflict(c) {
|
|
15
|
+
if (c.observedBehavior.trim() === c.docExpectation.trim()) {
|
|
16
|
+
return { caseType: c.type, status: "pass", reasons: [] };
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
caseType: c.type,
|
|
20
|
+
status: "fail",
|
|
21
|
+
reasons: ["docs_vs_observed_conflict", `expected:${c.docExpectation}`, `observed:${c.observedBehavior}`],
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function evalCase(c) {
|
|
25
|
+
if (c.type === "heartbeat_tool_invocation") {
|
|
26
|
+
return evalHeartbeatToolInvocation(c);
|
|
27
|
+
}
|
|
28
|
+
return evalDocsConflict(c);
|
|
29
|
+
}
|
|
30
|
+
export async function runHostSmoke(plan) {
|
|
31
|
+
const results = plan.cases.map((c) => evalCase(c));
|
|
32
|
+
return {
|
|
33
|
+
reportId: crypto.randomUUID(),
|
|
34
|
+
generatedAt: new Date().toISOString(),
|
|
35
|
+
results,
|
|
36
|
+
docLinks: plan.docLinks,
|
|
37
|
+
docCheckedAt: plan.docCheckedAt,
|
|
38
|
+
hostVersion: plan.hostVersion,
|
|
39
|
+
};
|
|
40
|
+
}
|