@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,99 +1,99 @@
|
|
|
1
|
-
import { ConnectorPolicyError } from "./failure-taxonomy.js";
|
|
2
|
-
const HIGH_RISK_SIDE_EFFECTS = new Set([
|
|
3
|
-
"post.publish",
|
|
4
|
-
"comment.reply",
|
|
5
|
-
"message.send",
|
|
6
|
-
"task.claim",
|
|
7
|
-
]);
|
|
8
|
-
function endpointModeFor(channel) {
|
|
9
|
-
if (channel === "a2a")
|
|
10
|
-
return "a2a_envelope";
|
|
11
|
-
if (channel === "cli")
|
|
12
|
-
return "cli_stdout";
|
|
13
|
-
if (channel === "skill" || channel === "browser")
|
|
14
|
-
return "skill_call";
|
|
15
|
-
return "rest_json";
|
|
16
|
-
}
|
|
17
|
-
const DEFAULT_DEGRADED_CHANNELS = ["cli", "skill", "browser"];
|
|
18
|
-
function isDegradedChannel(channel, degradedChannels) {
|
|
19
|
-
const policy = degradedChannels && degradedChannels.length > 0 ? degradedChannels : DEFAULT_DEGRADED_CHANNELS;
|
|
20
|
-
return policy.includes(channel);
|
|
21
|
-
}
|
|
22
|
-
function chooseByCredentialState(channels, credential) {
|
|
23
|
-
if (credential.status === "pending_verification") {
|
|
24
|
-
if (channels.includes("skill"))
|
|
25
|
-
return "skill";
|
|
26
|
-
if (channels.includes("browser"))
|
|
27
|
-
return "browser";
|
|
28
|
-
throw new ConnectorPolicyError("verification_required", "verification_recovery_channel_missing");
|
|
29
|
-
}
|
|
30
|
-
return undefined;
|
|
31
|
-
}
|
|
32
|
-
function choosePreferred(channels, preferred) {
|
|
33
|
-
if (preferred && channels.includes(preferred))
|
|
34
|
-
return preferred;
|
|
35
|
-
return undefined;
|
|
36
|
-
}
|
|
37
|
-
function chooseHealthy(channels, platformId, health) {
|
|
38
|
-
for (const channel of channels) {
|
|
39
|
-
const snapshot = health.get(platformId, channel);
|
|
40
|
-
if (!snapshot)
|
|
41
|
-
return channel;
|
|
42
|
-
if (snapshot.healthy && !snapshot.degraded)
|
|
43
|
-
return channel;
|
|
44
|
-
if (snapshot.healthy)
|
|
45
|
-
return channel;
|
|
46
|
-
}
|
|
47
|
-
return channels[0];
|
|
48
|
-
}
|
|
49
|
-
function enforceSideEffectSafety(intent, channel, degradedChannels) {
|
|
50
|
-
if (!HIGH_RISK_SIDE_EFFECTS.has(intent)) {
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
if (isDegradedChannel(channel, degradedChannels)) {
|
|
54
|
-
throw new ConnectorPolicyError("protocol_mismatch", "degraded_channel_not_allowed_for_side_effect");
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
export class ConnectorRoutePlanner {
|
|
58
|
-
registry;
|
|
59
|
-
statePort;
|
|
60
|
-
channelHealth;
|
|
61
|
-
constructor(registry, statePort, channelHealth) {
|
|
62
|
-
this.registry = registry;
|
|
63
|
-
this.statePort = statePort;
|
|
64
|
-
this.channelHealth = channelHealth;
|
|
65
|
-
}
|
|
66
|
-
async planRoute(intent, request) {
|
|
67
|
-
const manifest = this.registry.loadManifest(request.platformId);
|
|
68
|
-
if (!manifest.supportedCapabilities.includes(intent)) {
|
|
69
|
-
throw new ConnectorPolicyError("protocol_mismatch", "capability_not_supported_by_manifest");
|
|
70
|
-
}
|
|
71
|
-
const cooldown = await this.statePort.loadCooldownState(request.platformId, intent);
|
|
72
|
-
if (cooldown.blocked) {
|
|
73
|
-
throw new ConnectorPolicyError("cooldown_blocked", "platform_or_intent_cooldown_blocked", cooldown.retryAfterMs);
|
|
74
|
-
}
|
|
75
|
-
const credential = await this.statePort.loadCredentialState(request.platformId);
|
|
76
|
-
if (credential.status === "missing" || credential.status === "revoked" || credential.status === "failed") {
|
|
77
|
-
throw new ConnectorPolicyError("auth_failure", "credential_unavailable_for_route");
|
|
78
|
-
}
|
|
79
|
-
if (credential.status === "expired") {
|
|
80
|
-
throw new ConnectorPolicyError("credential_expired", "credential_expired_for_route");
|
|
81
|
-
}
|
|
82
|
-
const channels = [...manifest.channelPriority];
|
|
83
|
-
const byCredential = chooseByCredentialState(channels, credential);
|
|
84
|
-
const preferred = choosePreferred(channels, request.preferredChannel);
|
|
85
|
-
const selected = byCredential ?? preferred ?? chooseHealthy(channels, request.platformId, this.channelHealth);
|
|
86
|
-
if (!selected) {
|
|
87
|
-
throw new ConnectorPolicyError("protocol_mismatch", "no_available_channel");
|
|
88
|
-
}
|
|
89
|
-
enforceSideEffectSafety(intent, selected, manifest.degradedChannels);
|
|
90
|
-
return {
|
|
91
|
-
platformId: request.platformId,
|
|
92
|
-
intent,
|
|
93
|
-
channel: selected,
|
|
94
|
-
endpointMode: endpointModeFor(selected),
|
|
95
|
-
idempotencyKey: request.idempotencyKey,
|
|
96
|
-
degraded: isDegradedChannel(selected, manifest.degradedChannels),
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
}
|
|
1
|
+
import { ConnectorPolicyError } from "./failure-taxonomy.js";
|
|
2
|
+
const HIGH_RISK_SIDE_EFFECTS = new Set([
|
|
3
|
+
"post.publish",
|
|
4
|
+
"comment.reply",
|
|
5
|
+
"message.send",
|
|
6
|
+
"task.claim",
|
|
7
|
+
]);
|
|
8
|
+
function endpointModeFor(channel) {
|
|
9
|
+
if (channel === "a2a")
|
|
10
|
+
return "a2a_envelope";
|
|
11
|
+
if (channel === "cli")
|
|
12
|
+
return "cli_stdout";
|
|
13
|
+
if (channel === "skill" || channel === "browser")
|
|
14
|
+
return "skill_call";
|
|
15
|
+
return "rest_json";
|
|
16
|
+
}
|
|
17
|
+
const DEFAULT_DEGRADED_CHANNELS = ["cli", "skill", "browser"];
|
|
18
|
+
function isDegradedChannel(channel, degradedChannels) {
|
|
19
|
+
const policy = degradedChannels && degradedChannels.length > 0 ? degradedChannels : DEFAULT_DEGRADED_CHANNELS;
|
|
20
|
+
return policy.includes(channel);
|
|
21
|
+
}
|
|
22
|
+
function chooseByCredentialState(channels, credential) {
|
|
23
|
+
if (credential.status === "pending_verification") {
|
|
24
|
+
if (channels.includes("skill"))
|
|
25
|
+
return "skill";
|
|
26
|
+
if (channels.includes("browser"))
|
|
27
|
+
return "browser";
|
|
28
|
+
throw new ConnectorPolicyError("verification_required", "verification_recovery_channel_missing");
|
|
29
|
+
}
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
function choosePreferred(channels, preferred) {
|
|
33
|
+
if (preferred && channels.includes(preferred))
|
|
34
|
+
return preferred;
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
function chooseHealthy(channels, platformId, health) {
|
|
38
|
+
for (const channel of channels) {
|
|
39
|
+
const snapshot = health.get(platformId, channel);
|
|
40
|
+
if (!snapshot)
|
|
41
|
+
return channel;
|
|
42
|
+
if (snapshot.healthy && !snapshot.degraded)
|
|
43
|
+
return channel;
|
|
44
|
+
if (snapshot.healthy)
|
|
45
|
+
return channel;
|
|
46
|
+
}
|
|
47
|
+
return channels[0];
|
|
48
|
+
}
|
|
49
|
+
function enforceSideEffectSafety(intent, channel, degradedChannels) {
|
|
50
|
+
if (!HIGH_RISK_SIDE_EFFECTS.has(intent)) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
if (isDegradedChannel(channel, degradedChannels)) {
|
|
54
|
+
throw new ConnectorPolicyError("protocol_mismatch", "degraded_channel_not_allowed_for_side_effect");
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
export class ConnectorRoutePlanner {
|
|
58
|
+
registry;
|
|
59
|
+
statePort;
|
|
60
|
+
channelHealth;
|
|
61
|
+
constructor(registry, statePort, channelHealth) {
|
|
62
|
+
this.registry = registry;
|
|
63
|
+
this.statePort = statePort;
|
|
64
|
+
this.channelHealth = channelHealth;
|
|
65
|
+
}
|
|
66
|
+
async planRoute(intent, request) {
|
|
67
|
+
const manifest = this.registry.loadManifest(request.platformId);
|
|
68
|
+
if (!manifest.supportedCapabilities.includes(intent)) {
|
|
69
|
+
throw new ConnectorPolicyError("protocol_mismatch", "capability_not_supported_by_manifest");
|
|
70
|
+
}
|
|
71
|
+
const cooldown = await this.statePort.loadCooldownState(request.platformId, intent);
|
|
72
|
+
if (cooldown.blocked) {
|
|
73
|
+
throw new ConnectorPolicyError("cooldown_blocked", "platform_or_intent_cooldown_blocked", cooldown.retryAfterMs);
|
|
74
|
+
}
|
|
75
|
+
const credential = await this.statePort.loadCredentialState(request.platformId);
|
|
76
|
+
if (credential.status === "missing" || credential.status === "revoked" || credential.status === "failed") {
|
|
77
|
+
throw new ConnectorPolicyError("auth_failure", "credential_unavailable_for_route");
|
|
78
|
+
}
|
|
79
|
+
if (credential.status === "expired") {
|
|
80
|
+
throw new ConnectorPolicyError("credential_expired", "credential_expired_for_route");
|
|
81
|
+
}
|
|
82
|
+
const channels = [...manifest.channelPriority];
|
|
83
|
+
const byCredential = chooseByCredentialState(channels, credential);
|
|
84
|
+
const preferred = choosePreferred(channels, request.preferredChannel);
|
|
85
|
+
const selected = byCredential ?? preferred ?? chooseHealthy(channels, request.platformId, this.channelHealth);
|
|
86
|
+
if (!selected) {
|
|
87
|
+
throw new ConnectorPolicyError("protocol_mismatch", "no_available_channel");
|
|
88
|
+
}
|
|
89
|
+
enforceSideEffectSafety(intent, selected, manifest.degradedChannels);
|
|
90
|
+
return {
|
|
91
|
+
platformId: request.platformId,
|
|
92
|
+
intent,
|
|
93
|
+
channel: selected,
|
|
94
|
+
endpointMode: endpointModeFor(selected),
|
|
95
|
+
idempotencyKey: request.idempotencyKey,
|
|
96
|
+
degraded: isDegradedChannel(selected, manifest.degradedChannels),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export * from "./base/index.js";
|
|
2
|
-
export * from "./social-community/moltbook/index.js";
|
|
3
|
-
export * from "./social-community/instreet/index.js";
|
|
4
|
-
export * from "./agent-network/evomap/index.js";
|
|
5
|
-
export * from "./near-real/near-real-connector-smoke.js";
|
|
1
|
+
export * from "./base/index.js";
|
|
2
|
+
export * from "./social-community/moltbook/index.js";
|
|
3
|
+
export * from "./social-community/instreet/index.js";
|
|
4
|
+
export * from "./agent-network/evomap/index.js";
|
|
5
|
+
export * from "./near-real/near-real-connector-smoke.js";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export * from "./base/index.js";
|
|
2
|
-
export * from "./social-community/moltbook/index.js";
|
|
3
|
-
export * from "./social-community/instreet/index.js";
|
|
4
|
-
export * from "./agent-network/evomap/index.js";
|
|
5
|
-
export * from "./near-real/near-real-connector-smoke.js";
|
|
1
|
+
export * from "./base/index.js";
|
|
2
|
+
export * from "./social-community/moltbook/index.js";
|
|
3
|
+
export * from "./social-community/instreet/index.js";
|
|
4
|
+
export * from "./agent-network/evomap/index.js";
|
|
5
|
+
export * from "./near-real/near-real-connector-smoke.js";
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import type { ObservabilityDatabase } from "../../observability/db/index.js";
|
|
2
|
-
import type { StateDatabase } from "../../storage/db/index.js";
|
|
3
|
-
export interface NearRealConnectorSmokeResult {
|
|
4
|
-
generatedAt: string;
|
|
5
|
-
platforms: {
|
|
6
|
-
social: "moltbook";
|
|
7
|
-
agentNetwork: "evomap";
|
|
8
|
-
};
|
|
9
|
-
feedReadEvidenceId?: string;
|
|
10
|
-
workDiscoverEvidenceId?: string;
|
|
11
|
-
taskClaimDryRunOk: boolean;
|
|
12
|
-
executionAttemptRowsForDecision: number;
|
|
13
|
-
}
|
|
14
|
-
export interface RunNearRealConnectorSmokeInput {
|
|
15
|
-
state: StateDatabase;
|
|
16
|
-
observabilityDb: ObservabilityDatabase;
|
|
17
|
-
workspaceRoot: string;
|
|
18
|
-
}
|
|
19
|
-
export declare function runNearRealConnectorSmoke(input: RunNearRealConnectorSmokeInput): Promise<NearRealConnectorSmokeResult>;
|
|
1
|
+
import type { ObservabilityDatabase } from "../../observability/db/index.js";
|
|
2
|
+
import type { StateDatabase } from "../../storage/db/index.js";
|
|
3
|
+
export interface NearRealConnectorSmokeResult {
|
|
4
|
+
generatedAt: string;
|
|
5
|
+
platforms: {
|
|
6
|
+
social: "moltbook";
|
|
7
|
+
agentNetwork: "evomap";
|
|
8
|
+
};
|
|
9
|
+
feedReadEvidenceId?: string;
|
|
10
|
+
workDiscoverEvidenceId?: string;
|
|
11
|
+
taskClaimDryRunOk: boolean;
|
|
12
|
+
executionAttemptRowsForDecision: number;
|
|
13
|
+
}
|
|
14
|
+
export interface RunNearRealConnectorSmokeInput {
|
|
15
|
+
state: StateDatabase;
|
|
16
|
+
observabilityDb: ObservabilityDatabase;
|
|
17
|
+
workspaceRoot: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function runNearRealConnectorSmoke(input: RunNearRealConnectorSmokeInput): Promise<NearRealConnectorSmokeResult>;
|
|
@@ -1,152 +1,152 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* T3.3.1 — Near-real connector smoke: sentinel adapters + policy + telemetry + life evidence ingest.
|
|
3
|
-
* Uses fixture payloads (no live HTTP); task.claim runs with idempotency key (dry-run style outcome).
|
|
4
|
-
*/
|
|
5
|
-
import { eq } from "drizzle-orm";
|
|
6
|
-
import { CapabilityContractRegistry } from "../base/manifest.js";
|
|
7
|
-
import { ConnectorRoutePlanner } from "../base/route-planner.js";
|
|
8
|
-
import { ChannelHealthStore } from "../base/channel-health.js";
|
|
9
|
-
import { createConnectorPolicyLayer } from "../base/policy-layer.js";
|
|
10
|
-
import { InMemoryEffectCommitLedger } from "../base/execution-policy.js";
|
|
11
|
-
import { mapLifeEvidence } from "../base/map-life-evidence.js";
|
|
12
|
-
import { moltbookManifest } from "../social-community/moltbook/manifest.js";
|
|
13
|
-
import { evomapManifest } from "../agent-network/evomap/manifest.js";
|
|
14
|
-
import { ExecutionTelemetry } from "../../observability/services/execution-telemetry.js";
|
|
15
|
-
import { executionAttempts } from "../../observability/db/schema/index.js";
|
|
16
|
-
import { appendLifeEvidence } from "../../storage/life-evidence/append-life-evidence.js";
|
|
17
|
-
const DECISION_ID = "dec-near-real-smoke";
|
|
18
|
-
function smokeRouteContext() {
|
|
19
|
-
return {
|
|
20
|
-
async loadCredentialState(platformId) {
|
|
21
|
-
if (platformId === "moltbook") {
|
|
22
|
-
return { platformId, status: "active", credentialType: "api_key" };
|
|
23
|
-
}
|
|
24
|
-
if (platformId === "evomap") {
|
|
25
|
-
return { platformId, status: "active", credentialType: "node_secret" };
|
|
26
|
-
}
|
|
27
|
-
throw new Error(`near_real_smoke_unsupported_platform:${platformId}`);
|
|
28
|
-
},
|
|
29
|
-
async loadCooldownState() {
|
|
30
|
-
return { blocked: false };
|
|
31
|
-
},
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
const smokeExecutionRunner = {
|
|
35
|
-
async run(plan, request) {
|
|
36
|
-
if (plan.platformId === "moltbook" && plan.intent === "feed.read") {
|
|
37
|
-
return {
|
|
38
|
-
platformId: plan.platformId,
|
|
39
|
-
channel: plan.channel,
|
|
40
|
-
latencyMs: 2,
|
|
41
|
-
success: true,
|
|
42
|
-
payload: {
|
|
43
|
-
items: [{ id: "mb-smoke-1", title: "near-real fixture post" }],
|
|
44
|
-
},
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
if (plan.platformId === "evomap" && plan.intent === "work.discover") {
|
|
48
|
-
return {
|
|
49
|
-
platformId: plan.platformId,
|
|
50
|
-
channel: plan.channel,
|
|
51
|
-
latencyMs: 3,
|
|
52
|
-
success: true,
|
|
53
|
-
payload: {
|
|
54
|
-
items: [{ id: "ev-task-smoke-1", title: "fixture agent task" }],
|
|
55
|
-
},
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
if (plan.platformId === "evomap" && plan.intent === "task.claim") {
|
|
59
|
-
return {
|
|
60
|
-
platformId: plan.platformId,
|
|
61
|
-
channel: plan.channel,
|
|
62
|
-
latencyMs: 1,
|
|
63
|
-
success: true,
|
|
64
|
-
degraded: plan.degraded,
|
|
65
|
-
payload: {
|
|
66
|
-
dryRun: true,
|
|
67
|
-
taskId: typeof request.payload.taskId === "string" ? request.payload.taskId : "unknown",
|
|
68
|
-
note: "near_real_smoke_no_external_side_effect",
|
|
69
|
-
},
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
throw new Error(`near_real_smoke_unhandled:${plan.platformId}:${plan.intent}`);
|
|
73
|
-
},
|
|
74
|
-
};
|
|
75
|
-
export async function runNearRealConnectorSmoke(input) {
|
|
76
|
-
const ledger = new InMemoryEffectCommitLedger();
|
|
77
|
-
const registry = new CapabilityContractRegistry();
|
|
78
|
-
registry.register({ ...moltbookManifest });
|
|
79
|
-
registry.register({ ...evomapManifest });
|
|
80
|
-
const planner = new ConnectorRoutePlanner(registry, smokeRouteContext(), new ChannelHealthStore());
|
|
81
|
-
const telemetry = new ExecutionTelemetry(input.observabilityDb);
|
|
82
|
-
const policy = createConnectorPolicyLayer({
|
|
83
|
-
routePlanner: planner,
|
|
84
|
-
executionRunner: smokeExecutionRunner,
|
|
85
|
-
telemetry,
|
|
86
|
-
effectCommitLedger: ledger,
|
|
87
|
-
retryPolicy: { maxRetries: 1, jitter: false },
|
|
88
|
-
});
|
|
89
|
-
const base = {
|
|
90
|
-
decisionId: DECISION_ID,
|
|
91
|
-
payload: {},
|
|
92
|
-
};
|
|
93
|
-
const feedResult = await policy.executeWithPolicy("feed.read", {
|
|
94
|
-
platformId: "moltbook",
|
|
95
|
-
intent: "feed.read",
|
|
96
|
-
...base,
|
|
97
|
-
intentId: "intent-smoke-feed-read",
|
|
98
|
-
payload: {},
|
|
99
|
-
});
|
|
100
|
-
let feedReadEvidenceId;
|
|
101
|
-
const feedCand = mapLifeEvidence({
|
|
102
|
-
platformId: "moltbook",
|
|
103
|
-
intent: "feed.read",
|
|
104
|
-
result: feedResult,
|
|
105
|
-
});
|
|
106
|
-
if (feedCand) {
|
|
107
|
-
const ack = await appendLifeEvidence(input.state, input.workspaceRoot, feedCand);
|
|
108
|
-
feedReadEvidenceId = ack.evidenceId;
|
|
109
|
-
}
|
|
110
|
-
const workResult = await policy.executeWithPolicy("work.discover", {
|
|
111
|
-
platformId: "evomap",
|
|
112
|
-
intent: "work.discover",
|
|
113
|
-
...base,
|
|
114
|
-
intentId: "intent-smoke-work-discover",
|
|
115
|
-
payload: {},
|
|
116
|
-
});
|
|
117
|
-
let workDiscoverEvidenceId;
|
|
118
|
-
const workCand = mapLifeEvidence({
|
|
119
|
-
platformId: "evomap",
|
|
120
|
-
intent: "work.discover",
|
|
121
|
-
result: workResult,
|
|
122
|
-
});
|
|
123
|
-
if (workCand) {
|
|
124
|
-
const ack = await appendLifeEvidence(input.state, input.workspaceRoot, workCand);
|
|
125
|
-
workDiscoverEvidenceId = ack.evidenceId;
|
|
126
|
-
}
|
|
127
|
-
const claimResult = await policy.executeWithPolicy("task.claim", {
|
|
128
|
-
platformId: "evomap",
|
|
129
|
-
intent: "task.claim",
|
|
130
|
-
...base,
|
|
131
|
-
intentId: "intent-smoke-task-claim",
|
|
132
|
-
payload: { taskId: "ev-task-smoke-1" },
|
|
133
|
-
idempotencyKey: "idem-near-real-task-claim-smoke",
|
|
134
|
-
});
|
|
135
|
-
const claimPayload = claimResult.status === "success" && claimResult.data && typeof claimResult.data === "object"
|
|
136
|
-
? claimResult.data
|
|
137
|
-
: undefined;
|
|
138
|
-
const attemptRows = await input.observabilityDb.db
|
|
139
|
-
.select()
|
|
140
|
-
.from(executionAttempts)
|
|
141
|
-
.where(eq(executionAttempts.decisionId, DECISION_ID));
|
|
142
|
-
return {
|
|
143
|
-
generatedAt: new Date().toISOString(),
|
|
144
|
-
platforms: { social: "moltbook", agentNetwork: "evomap" },
|
|
145
|
-
feedReadEvidenceId,
|
|
146
|
-
workDiscoverEvidenceId,
|
|
147
|
-
taskClaimDryRunOk: claimResult.status === "success" &&
|
|
148
|
-
claimPayload?.dryRun === true &&
|
|
149
|
-
claimPayload?.note === "near_real_smoke_no_external_side_effect",
|
|
150
|
-
executionAttemptRowsForDecision: attemptRows.length,
|
|
151
|
-
};
|
|
152
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* T3.3.1 — Near-real connector smoke: sentinel adapters + policy + telemetry + life evidence ingest.
|
|
3
|
+
* Uses fixture payloads (no live HTTP); task.claim runs with idempotency key (dry-run style outcome).
|
|
4
|
+
*/
|
|
5
|
+
import { eq } from "drizzle-orm";
|
|
6
|
+
import { CapabilityContractRegistry } from "../base/manifest.js";
|
|
7
|
+
import { ConnectorRoutePlanner } from "../base/route-planner.js";
|
|
8
|
+
import { ChannelHealthStore } from "../base/channel-health.js";
|
|
9
|
+
import { createConnectorPolicyLayer } from "../base/policy-layer.js";
|
|
10
|
+
import { InMemoryEffectCommitLedger } from "../base/execution-policy.js";
|
|
11
|
+
import { mapLifeEvidence } from "../base/map-life-evidence.js";
|
|
12
|
+
import { moltbookManifest } from "../social-community/moltbook/manifest.js";
|
|
13
|
+
import { evomapManifest } from "../agent-network/evomap/manifest.js";
|
|
14
|
+
import { ExecutionTelemetry } from "../../observability/services/execution-telemetry.js";
|
|
15
|
+
import { executionAttempts } from "../../observability/db/schema/index.js";
|
|
16
|
+
import { appendLifeEvidence } from "../../storage/life-evidence/append-life-evidence.js";
|
|
17
|
+
const DECISION_ID = "dec-near-real-smoke";
|
|
18
|
+
function smokeRouteContext() {
|
|
19
|
+
return {
|
|
20
|
+
async loadCredentialState(platformId) {
|
|
21
|
+
if (platformId === "moltbook") {
|
|
22
|
+
return { platformId, status: "active", credentialType: "api_key" };
|
|
23
|
+
}
|
|
24
|
+
if (platformId === "evomap") {
|
|
25
|
+
return { platformId, status: "active", credentialType: "node_secret" };
|
|
26
|
+
}
|
|
27
|
+
throw new Error(`near_real_smoke_unsupported_platform:${platformId}`);
|
|
28
|
+
},
|
|
29
|
+
async loadCooldownState() {
|
|
30
|
+
return { blocked: false };
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
const smokeExecutionRunner = {
|
|
35
|
+
async run(plan, request) {
|
|
36
|
+
if (plan.platformId === "moltbook" && plan.intent === "feed.read") {
|
|
37
|
+
return {
|
|
38
|
+
platformId: plan.platformId,
|
|
39
|
+
channel: plan.channel,
|
|
40
|
+
latencyMs: 2,
|
|
41
|
+
success: true,
|
|
42
|
+
payload: {
|
|
43
|
+
items: [{ id: "mb-smoke-1", title: "near-real fixture post" }],
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
if (plan.platformId === "evomap" && plan.intent === "work.discover") {
|
|
48
|
+
return {
|
|
49
|
+
platformId: plan.platformId,
|
|
50
|
+
channel: plan.channel,
|
|
51
|
+
latencyMs: 3,
|
|
52
|
+
success: true,
|
|
53
|
+
payload: {
|
|
54
|
+
items: [{ id: "ev-task-smoke-1", title: "fixture agent task" }],
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
if (plan.platformId === "evomap" && plan.intent === "task.claim") {
|
|
59
|
+
return {
|
|
60
|
+
platformId: plan.platformId,
|
|
61
|
+
channel: plan.channel,
|
|
62
|
+
latencyMs: 1,
|
|
63
|
+
success: true,
|
|
64
|
+
degraded: plan.degraded,
|
|
65
|
+
payload: {
|
|
66
|
+
dryRun: true,
|
|
67
|
+
taskId: typeof request.payload.taskId === "string" ? request.payload.taskId : "unknown",
|
|
68
|
+
note: "near_real_smoke_no_external_side_effect",
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
throw new Error(`near_real_smoke_unhandled:${plan.platformId}:${plan.intent}`);
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
export async function runNearRealConnectorSmoke(input) {
|
|
76
|
+
const ledger = new InMemoryEffectCommitLedger();
|
|
77
|
+
const registry = new CapabilityContractRegistry();
|
|
78
|
+
registry.register({ ...moltbookManifest });
|
|
79
|
+
registry.register({ ...evomapManifest });
|
|
80
|
+
const planner = new ConnectorRoutePlanner(registry, smokeRouteContext(), new ChannelHealthStore());
|
|
81
|
+
const telemetry = new ExecutionTelemetry(input.observabilityDb);
|
|
82
|
+
const policy = createConnectorPolicyLayer({
|
|
83
|
+
routePlanner: planner,
|
|
84
|
+
executionRunner: smokeExecutionRunner,
|
|
85
|
+
telemetry,
|
|
86
|
+
effectCommitLedger: ledger,
|
|
87
|
+
retryPolicy: { maxRetries: 1, jitter: false },
|
|
88
|
+
});
|
|
89
|
+
const base = {
|
|
90
|
+
decisionId: DECISION_ID,
|
|
91
|
+
payload: {},
|
|
92
|
+
};
|
|
93
|
+
const feedResult = await policy.executeWithPolicy("feed.read", {
|
|
94
|
+
platformId: "moltbook",
|
|
95
|
+
intent: "feed.read",
|
|
96
|
+
...base,
|
|
97
|
+
intentId: "intent-smoke-feed-read",
|
|
98
|
+
payload: {},
|
|
99
|
+
});
|
|
100
|
+
let feedReadEvidenceId;
|
|
101
|
+
const feedCand = mapLifeEvidence({
|
|
102
|
+
platformId: "moltbook",
|
|
103
|
+
intent: "feed.read",
|
|
104
|
+
result: feedResult,
|
|
105
|
+
});
|
|
106
|
+
if (feedCand) {
|
|
107
|
+
const ack = await appendLifeEvidence(input.state, input.workspaceRoot, feedCand);
|
|
108
|
+
feedReadEvidenceId = ack.evidenceId;
|
|
109
|
+
}
|
|
110
|
+
const workResult = await policy.executeWithPolicy("work.discover", {
|
|
111
|
+
platformId: "evomap",
|
|
112
|
+
intent: "work.discover",
|
|
113
|
+
...base,
|
|
114
|
+
intentId: "intent-smoke-work-discover",
|
|
115
|
+
payload: {},
|
|
116
|
+
});
|
|
117
|
+
let workDiscoverEvidenceId;
|
|
118
|
+
const workCand = mapLifeEvidence({
|
|
119
|
+
platformId: "evomap",
|
|
120
|
+
intent: "work.discover",
|
|
121
|
+
result: workResult,
|
|
122
|
+
});
|
|
123
|
+
if (workCand) {
|
|
124
|
+
const ack = await appendLifeEvidence(input.state, input.workspaceRoot, workCand);
|
|
125
|
+
workDiscoverEvidenceId = ack.evidenceId;
|
|
126
|
+
}
|
|
127
|
+
const claimResult = await policy.executeWithPolicy("task.claim", {
|
|
128
|
+
platformId: "evomap",
|
|
129
|
+
intent: "task.claim",
|
|
130
|
+
...base,
|
|
131
|
+
intentId: "intent-smoke-task-claim",
|
|
132
|
+
payload: { taskId: "ev-task-smoke-1" },
|
|
133
|
+
idempotencyKey: "idem-near-real-task-claim-smoke",
|
|
134
|
+
});
|
|
135
|
+
const claimPayload = claimResult.status === "success" && claimResult.data && typeof claimResult.data === "object"
|
|
136
|
+
? claimResult.data
|
|
137
|
+
: undefined;
|
|
138
|
+
const attemptRows = await input.observabilityDb.db
|
|
139
|
+
.select()
|
|
140
|
+
.from(executionAttempts)
|
|
141
|
+
.where(eq(executionAttempts.decisionId, DECISION_ID));
|
|
142
|
+
return {
|
|
143
|
+
generatedAt: new Date().toISOString(),
|
|
144
|
+
platforms: { social: "moltbook", agentNetwork: "evomap" },
|
|
145
|
+
feedReadEvidenceId,
|
|
146
|
+
workDiscoverEvidenceId,
|
|
147
|
+
taskClaimDryRunOk: claimResult.status === "success" &&
|
|
148
|
+
claimPayload?.dryRun === true &&
|
|
149
|
+
claimPayload?.note === "near_real_smoke_no_external_side_effect",
|
|
150
|
+
executionAttemptRowsForDecision: attemptRows.length,
|
|
151
|
+
};
|
|
152
|
+
}
|