@haaaiawd/second-nature 0.1.18 → 0.1.20

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.
Files changed (190) hide show
  1. package/index.js +911 -855
  2. package/openclaw.plugin.json +29 -29
  3. package/package.json +52 -52
  4. package/runtime/cli/commands/index.d.ts +14 -14
  5. package/runtime/cli/commands/index.js +224 -193
  6. package/runtime/cli/explain/explain-surface-subject.d.ts +8 -8
  7. package/runtime/cli/explain/explain-surface-subject.js +9 -9
  8. package/runtime/cli/explain/format-explanation.d.ts +12 -12
  9. package/runtime/cli/explain/format-explanation.js +12 -12
  10. package/runtime/cli/explain/resolve-subject.js +41 -41
  11. package/runtime/cli/host-capability/classify-delivery.d.ts +14 -14
  12. package/runtime/cli/host-capability/classify-delivery.js +20 -20
  13. package/runtime/cli/host-capability/probe-host-capability.d.ts +2 -2
  14. package/runtime/cli/host-capability/probe-host-capability.js +58 -58
  15. package/runtime/cli/host-capability/record-host-capability.d.ts +6 -6
  16. package/runtime/cli/host-capability/record-host-capability.js +14 -14
  17. package/runtime/cli/host-capability/types.d.ts +71 -71
  18. package/runtime/cli/host-capability/types.js +6 -6
  19. package/runtime/cli/host-smoke/run-host-smoke.d.ts +2 -2
  20. package/runtime/cli/host-smoke/run-host-smoke.js +40 -40
  21. package/runtime/cli/host-smoke/types.d.ts +35 -35
  22. package/runtime/cli/host-smoke/types.js +6 -6
  23. package/runtime/cli/index.js +67 -58
  24. package/runtime/cli/ops/heartbeat-surface.d.ts +45 -38
  25. package/runtime/cli/ops/heartbeat-surface.js +79 -73
  26. package/runtime/cli/ops/ops-router.d.ts +32 -19
  27. package/runtime/cli/ops/ops-router.js +188 -89
  28. package/runtime/cli/ops/show-operator-fallback.d.ts +13 -13
  29. package/runtime/cli/ops/show-operator-fallback.js +22 -22
  30. package/runtime/cli/ops/workspace-heartbeat-runner.d.ts +40 -19
  31. package/runtime/cli/ops/workspace-heartbeat-runner.js +93 -39
  32. package/runtime/cli/read-models/index.d.ts +46 -29
  33. package/runtime/cli/read-models/index.js +391 -256
  34. package/runtime/cli/read-models/operator-explain-map.d.ts +6 -6
  35. package/runtime/cli/read-models/operator-explain-map.js +10 -10
  36. package/runtime/cli/read-models/types.d.ts +129 -79
  37. package/runtime/cli/runtime/runtime-artifact-boundary.d.ts +28 -28
  38. package/runtime/cli/runtime/runtime-artifact-boundary.js +94 -94
  39. package/runtime/connectors/base/contract.d.ts +87 -87
  40. package/runtime/connectors/base/execution-policy.d.ts +47 -47
  41. package/runtime/connectors/base/execution-policy.js +82 -82
  42. package/runtime/connectors/base/index.d.ts +8 -8
  43. package/runtime/connectors/base/index.js +8 -8
  44. package/runtime/connectors/base/manifest.d.ts +64 -64
  45. package/runtime/connectors/base/manifest.js +86 -86
  46. package/runtime/connectors/base/map-life-evidence.d.ts +16 -16
  47. package/runtime/connectors/base/map-life-evidence.js +79 -79
  48. package/runtime/connectors/base/policy-layer.d.ts +29 -29
  49. package/runtime/connectors/base/policy-layer.js +198 -198
  50. package/runtime/connectors/base/route-planner.js +99 -99
  51. package/runtime/connectors/index.d.ts +5 -5
  52. package/runtime/connectors/index.js +5 -5
  53. package/runtime/connectors/near-real/near-real-connector-smoke.d.ts +19 -19
  54. package/runtime/connectors/near-real/near-real-connector-smoke.js +152 -152
  55. package/runtime/core/second-nature/heartbeat/heartbeat-executor.js +114 -114
  56. package/runtime/core/second-nature/heartbeat/heartbeat-loop.d.ts +63 -63
  57. package/runtime/core/second-nature/heartbeat/heartbeat-loop.js +162 -139
  58. package/runtime/core/second-nature/heartbeat/index.d.ts +8 -8
  59. package/runtime/core/second-nature/heartbeat/index.js +7 -7
  60. package/runtime/core/second-nature/heartbeat/run-heartbeat-cycle.d.ts +21 -21
  61. package/runtime/core/second-nature/heartbeat/run-heartbeat-cycle.js +35 -35
  62. package/runtime/core/second-nature/heartbeat/runtime-snapshot.d.ts +28 -28
  63. package/runtime/core/second-nature/heartbeat/runtime-snapshot.js +35 -35
  64. package/runtime/core/second-nature/heartbeat/signal.d.ts +42 -42
  65. package/runtime/core/second-nature/heartbeat/snapshot-builder.d.ts +51 -51
  66. package/runtime/core/second-nature/index.d.ts +22 -22
  67. package/runtime/core/second-nature/index.js +22 -22
  68. package/runtime/core/second-nature/orchestrator/effect-dispatcher.d.ts +100 -100
  69. package/runtime/core/second-nature/orchestrator/effect-dispatcher.js +144 -144
  70. package/runtime/core/second-nature/orchestrator/guard-layer.d.ts +8 -8
  71. package/runtime/core/second-nature/orchestrator/guard-layer.js +110 -110
  72. package/runtime/core/second-nature/orchestrator/intent-planner.d.ts +13 -13
  73. package/runtime/core/second-nature/orchestrator/intent-planner.js +199 -199
  74. package/runtime/core/second-nature/orchestrator/lease-manager.d.ts +14 -14
  75. package/runtime/core/second-nature/orchestrator/lease-manager.js +58 -58
  76. package/runtime/core/second-nature/outreach/build-outreach-draft-request.d.ts +6 -6
  77. package/runtime/core/second-nature/outreach/build-outreach-draft-request.js +63 -63
  78. package/runtime/core/second-nature/outreach/delivery-target.d.ts +26 -26
  79. package/runtime/core/second-nature/outreach/delivery-target.js +70 -70
  80. package/runtime/core/second-nature/outreach/dispatch-user-outreach.d.ts +38 -38
  81. package/runtime/core/second-nature/outreach/dispatch-user-outreach.js +119 -119
  82. package/runtime/core/second-nature/outreach/judge-input-from-snapshot.d.ts +7 -7
  83. package/runtime/core/second-nature/outreach/judge-input-from-snapshot.js +45 -45
  84. package/runtime/core/second-nature/outreach/judge-outreach.d.ts +40 -40
  85. package/runtime/core/second-nature/outreach/judge-outreach.js +121 -121
  86. package/runtime/core/second-nature/quiet/run-source-backed-quiet.d.ts +21 -21
  87. package/runtime/core/second-nature/quiet/run-source-backed-quiet.js +123 -123
  88. package/runtime/core/second-nature/rhythm/planner-rhythm-window.d.ts +15 -15
  89. package/runtime/core/second-nature/rhythm/planner-rhythm-window.js +52 -52
  90. package/runtime/core/second-nature/rhythm/policy-bridge.d.ts +19 -19
  91. package/runtime/core/second-nature/rhythm/policy-bridge.js +34 -34
  92. package/runtime/core/second-nature/runtime/service-entry.js +45 -45
  93. package/runtime/core/second-nature/types.d.ts +51 -51
  94. package/runtime/guidance/draft-outreach-message.d.ts +7 -7
  95. package/runtime/guidance/draft-outreach-message.js +42 -42
  96. package/runtime/guidance/evidence-guidance.d.ts +40 -40
  97. package/runtime/guidance/evidence-guidance.js +52 -52
  98. package/runtime/guidance/index.d.ts +11 -11
  99. package/runtime/guidance/index.js +11 -11
  100. package/runtime/guidance/outreach-draft-schema.d.ts +228 -228
  101. package/runtime/guidance/outreach-draft-schema.js +80 -80
  102. package/runtime/observability/audit/append-only-audit-store.d.ts +14 -14
  103. package/runtime/observability/audit/append-only-audit-store.js +21 -21
  104. package/runtime/observability/audit/audit-envelope.d.ts +51 -51
  105. package/runtime/observability/audit/audit-envelope.js +130 -130
  106. package/runtime/observability/audit/verify-audit-hash-chain.d.ts +23 -23
  107. package/runtime/observability/audit/verify-audit-hash-chain.js +83 -83
  108. package/runtime/observability/db/index.js +47 -47
  109. package/runtime/observability/db/schema/host-capability-reports.d.ts +180 -180
  110. package/runtime/observability/db/schema/host-capability-reports.js +12 -12
  111. package/runtime/observability/db/schema/index.d.ts +947 -947
  112. package/runtime/observability/db/schema/index.js +71 -71
  113. package/runtime/observability/index.d.ts +20 -20
  114. package/runtime/observability/index.js +19 -19
  115. package/runtime/observability/query/explain-query.d.ts +48 -48
  116. package/runtime/observability/query/explain-query.js +114 -114
  117. package/runtime/observability/query/export-audit-bundle.d.ts +22 -22
  118. package/runtime/observability/query/export-audit-bundle.js +27 -27
  119. package/runtime/observability/services/decision-ledger.d.ts +46 -46
  120. package/runtime/observability/services/decision-ledger.js +161 -161
  121. package/runtime/observability/services/governance-audit.d.ts +41 -41
  122. package/runtime/observability/services/governance-audit.js +163 -163
  123. package/runtime/observability/services/governance-plane-recorder.d.ts +47 -47
  124. package/runtime/observability/services/governance-plane-recorder.js +55 -55
  125. package/runtime/observability/services/lived-experience-audit.d.ts +97 -97
  126. package/runtime/observability/services/lived-experience-audit.js +162 -162
  127. package/runtime/observability/services/observability-retention.d.ts +10 -0
  128. package/runtime/observability/services/observability-retention.js +37 -0
  129. package/runtime/observability/services/runtime-decision-recorder.d.ts +29 -29
  130. package/runtime/observability/services/runtime-decision-recorder.js +94 -94
  131. package/runtime/storage/bootstrap/native-sqlite-probe.d.ts +7 -7
  132. package/runtime/storage/bootstrap/native-sqlite-probe.js +28 -28
  133. package/runtime/storage/bootstrap/repair-gate.d.ts +17 -17
  134. package/runtime/storage/bootstrap/repair-gate.js +71 -71
  135. package/runtime/storage/bootstrap/storage-mode-smoke.d.ts +38 -38
  136. package/runtime/storage/bootstrap/storage-mode-smoke.js +85 -85
  137. package/runtime/storage/db/index.js +61 -61
  138. package/runtime/storage/db/schema/delivery-attempts.d.ts +199 -199
  139. package/runtime/storage/db/schema/delivery-attempts.js +13 -13
  140. package/runtime/storage/db/schema/index.d.ts +9 -9
  141. package/runtime/storage/db/schema/index.js +9 -9
  142. package/runtime/storage/db/schema/life-evidence-index.d.ts +161 -161
  143. package/runtime/storage/db/schema/life-evidence-index.js +11 -11
  144. package/runtime/storage/db/schema/operator-fallback-artifacts.d.ts +161 -161
  145. package/runtime/storage/db/schema/operator-fallback-artifacts.js +11 -11
  146. package/runtime/storage/db/schema/policies.d.ts +98 -98
  147. package/runtime/storage/db/schema/policies.js +8 -8
  148. package/runtime/storage/delivery/query-delivery-attempts.d.ts +3 -3
  149. package/runtime/storage/delivery/query-delivery-attempts.js +32 -32
  150. package/runtime/storage/delivery/types.d.ts +27 -27
  151. package/runtime/storage/delivery/types.js +1 -1
  152. package/runtime/storage/delivery/write-delivery-attempt.d.ts +6 -6
  153. package/runtime/storage/delivery/write-delivery-attempt.js +36 -36
  154. package/runtime/storage/fallback/load-operator-fallback.d.ts +14 -14
  155. package/runtime/storage/fallback/load-operator-fallback.js +47 -47
  156. package/runtime/storage/fallback/operator-fallback-types.d.ts +9 -9
  157. package/runtime/storage/fallback/operator-fallback-types.js +1 -1
  158. package/runtime/storage/fallback/operator-fallback-view.d.ts +11 -11
  159. package/runtime/storage/fallback/operator-fallback-view.js +1 -1
  160. package/runtime/storage/fallback/write-operator-fallback.d.ts +6 -6
  161. package/runtime/storage/fallback/write-operator-fallback.js +21 -21
  162. package/runtime/storage/index.d.ts +37 -37
  163. package/runtime/storage/index.js +30 -30
  164. package/runtime/storage/life-evidence/append-life-evidence.d.ts +7 -7
  165. package/runtime/storage/life-evidence/append-life-evidence.js +64 -64
  166. package/runtime/storage/life-evidence/types.d.ts +45 -45
  167. package/runtime/storage/life-evidence/types.js +6 -6
  168. package/runtime/storage/quiet/persist-quiet-artifact.d.ts +7 -7
  169. package/runtime/storage/quiet/persist-quiet-artifact.js +22 -22
  170. package/runtime/storage/quiet/quiet-artifact-types.d.ts +18 -18
  171. package/runtime/storage/quiet/quiet-artifact-types.js +1 -1
  172. package/runtime/storage/quiet/quiet-artifact-writer.d.ts +15 -15
  173. package/runtime/storage/quiet/quiet-artifact-writer.js +56 -56
  174. package/runtime/storage/repositories/credential-repository.js +30 -30
  175. package/runtime/storage/rhythm/rhythm-policy-snapshot.d.ts +10 -10
  176. package/runtime/storage/rhythm/rhythm-policy-snapshot.js +34 -34
  177. package/runtime/storage/services/credential-vault.d.ts +13 -13
  178. package/runtime/storage/services/credential-vault.js +116 -116
  179. package/runtime/storage/snapshots/continuity-snapshot.d.ts +9 -9
  180. package/runtime/storage/snapshots/continuity-snapshot.js +41 -41
  181. package/runtime/storage/snapshots/life-evidence-snapshot.d.ts +6 -6
  182. package/runtime/storage/snapshots/life-evidence-snapshot.js +114 -114
  183. package/runtime/storage/snapshots/types.d.ts +58 -58
  184. package/runtime/storage/snapshots/types.js +1 -1
  185. package/runtime/storage/state-api.js +104 -104
  186. package/runtime/storage/user-interest/load-user-interest-snapshot.d.ts +2 -2
  187. package/runtime/storage/user-interest/load-user-interest-snapshot.js +150 -150
  188. package/runtime/storage/user-interest/types.d.ts +25 -25
  189. package/runtime/storage/user-interest/types.js +1 -1
  190. package/workspace-ops-bridge.js +90 -81
@@ -1,87 +1,87 @@
1
- import type { CredentialContext, CredentialState } from "../../shared/types/credential.js";
2
- import { type FailureClass } from "./failure-taxonomy.js";
3
- export declare const CHANNEL_TYPES: readonly ["api_rest", "api_rpc", "a2a", "mcp", "cli", "skill", "browser"];
4
- export type ChannelType = (typeof CHANNEL_TYPES)[number];
5
- export declare const CAPABILITY_INTENTS: readonly ["feed.read", "post.publish", "comment.reply", "notification.list", "message.send", "agent.register", "agent.heartbeat", "work.discover", "task.claim"];
6
- export type CapabilityIntent = (typeof CAPABILITY_INTENTS)[number];
7
- export interface ConnectorRequest {
8
- platformId: string;
9
- intent: CapabilityIntent;
10
- payload: Record<string, unknown>;
11
- preferredChannel?: ChannelType;
12
- timeoutMs?: number;
13
- idempotencyKey?: string;
14
- decisionId?: string;
15
- intentId?: string;
16
- }
17
- export interface ExecutionPlan {
18
- platformId: string;
19
- intent: CapabilityIntent;
20
- channel: ChannelType;
21
- endpointMode: "rest_json" | "a2a_envelope" | "cli_stdout" | "skill_call";
22
- idempotencyKey?: string;
23
- /** True when selected channel is manifest-marked degraded (cli/skill/browser). */
24
- degraded?: boolean;
25
- }
26
- export interface ConnectorResult<T> {
27
- status: "success" | "retryable_failure" | "terminal_failure";
28
- data?: T;
29
- failureClass?: FailureClass;
30
- retryAfterMs?: number;
31
- metadata: {
32
- platformId: string;
33
- channel: ChannelType;
34
- latencyMs: number;
35
- degraded?: boolean;
36
- };
37
- }
38
- export interface RawAttempt {
39
- platformId: string;
40
- channel: ChannelType;
41
- latencyMs: number;
42
- degraded?: boolean;
43
- success: boolean;
44
- payload?: unknown;
45
- error?: unknown;
46
- }
47
- export interface CredentialContextPort {
48
- loadCredentialState(platformId: string): Promise<CredentialContext>;
49
- }
50
- export interface CooldownLedgerPort {
51
- loadCooldownState(platformId: string, intent: CapabilityIntent): Promise<{
52
- blocked: boolean;
53
- retryAfterMs?: number;
54
- }>;
55
- }
56
- export interface RouteContextPort extends CredentialContextPort, CooldownLedgerPort {
57
- }
58
- export interface ConnectorManifestLike {
59
- platformId: string;
60
- supportedCapabilities: CapabilityIntent[];
61
- channelPriority: ChannelType[];
62
- credentialTypes: string[];
63
- degradedChannels?: ChannelType[];
64
- sourceRefPolicy?: {
65
- minSourceRefs?: number;
66
- rejectInlineSensitivePayload?: boolean;
67
- };
68
- }
69
- export interface ConnectorManifestLoader {
70
- loadManifest(platformId: string): ConnectorManifestLike;
71
- }
72
- export interface RoutePlanner {
73
- planRoute(intent: CapabilityIntent, request: ConnectorRequest): Promise<ExecutionPlan>;
74
- }
75
- export interface ExecutionRunner {
76
- run(plan: ExecutionPlan, request: ConnectorRequest): Promise<RawAttempt>;
77
- }
78
- export interface ConnectorExecutionPort {
79
- executeCapability(intent: CapabilityIntent, request: ConnectorRequest): Promise<ConnectorResult<unknown>>;
80
- }
81
- export declare function normalizeOutcome(attempt: RawAttempt): ConnectorResult<unknown>;
82
- export declare function createConnectorContractCore(input: {
83
- manifestLoader: ConnectorManifestLoader;
84
- routePlanner: RoutePlanner;
85
- executionRunner: ExecutionRunner;
86
- }): ConnectorExecutionPort;
87
- export declare function isCredentialActive(state: CredentialState): boolean;
1
+ import type { CredentialContext, CredentialState } from "../../shared/types/credential.js";
2
+ import { type FailureClass } from "./failure-taxonomy.js";
3
+ export declare const CHANNEL_TYPES: readonly ["api_rest", "api_rpc", "a2a", "mcp", "cli", "skill", "browser"];
4
+ export type ChannelType = (typeof CHANNEL_TYPES)[number];
5
+ export declare const CAPABILITY_INTENTS: readonly ["feed.read", "post.publish", "comment.reply", "notification.list", "message.send", "agent.register", "agent.heartbeat", "work.discover", "task.claim"];
6
+ export type CapabilityIntent = (typeof CAPABILITY_INTENTS)[number];
7
+ export interface ConnectorRequest {
8
+ platformId: string;
9
+ intent: CapabilityIntent;
10
+ payload: Record<string, unknown>;
11
+ preferredChannel?: ChannelType;
12
+ timeoutMs?: number;
13
+ idempotencyKey?: string;
14
+ decisionId?: string;
15
+ intentId?: string;
16
+ }
17
+ export interface ExecutionPlan {
18
+ platformId: string;
19
+ intent: CapabilityIntent;
20
+ channel: ChannelType;
21
+ endpointMode: "rest_json" | "a2a_envelope" | "cli_stdout" | "skill_call";
22
+ idempotencyKey?: string;
23
+ /** True when selected channel is manifest-marked degraded (cli/skill/browser). */
24
+ degraded?: boolean;
25
+ }
26
+ export interface ConnectorResult<T> {
27
+ status: "success" | "retryable_failure" | "terminal_failure";
28
+ data?: T;
29
+ failureClass?: FailureClass;
30
+ retryAfterMs?: number;
31
+ metadata: {
32
+ platformId: string;
33
+ channel: ChannelType;
34
+ latencyMs: number;
35
+ degraded?: boolean;
36
+ };
37
+ }
38
+ export interface RawAttempt {
39
+ platformId: string;
40
+ channel: ChannelType;
41
+ latencyMs: number;
42
+ degraded?: boolean;
43
+ success: boolean;
44
+ payload?: unknown;
45
+ error?: unknown;
46
+ }
47
+ export interface CredentialContextPort {
48
+ loadCredentialState(platformId: string): Promise<CredentialContext>;
49
+ }
50
+ export interface CooldownLedgerPort {
51
+ loadCooldownState(platformId: string, intent: CapabilityIntent): Promise<{
52
+ blocked: boolean;
53
+ retryAfterMs?: number;
54
+ }>;
55
+ }
56
+ export interface RouteContextPort extends CredentialContextPort, CooldownLedgerPort {
57
+ }
58
+ export interface ConnectorManifestLike {
59
+ platformId: string;
60
+ supportedCapabilities: CapabilityIntent[];
61
+ channelPriority: ChannelType[];
62
+ credentialTypes: string[];
63
+ degradedChannels?: ChannelType[];
64
+ sourceRefPolicy?: {
65
+ minSourceRefs?: number;
66
+ rejectInlineSensitivePayload?: boolean;
67
+ };
68
+ }
69
+ export interface ConnectorManifestLoader {
70
+ loadManifest(platformId: string): ConnectorManifestLike;
71
+ }
72
+ export interface RoutePlanner {
73
+ planRoute(intent: CapabilityIntent, request: ConnectorRequest): Promise<ExecutionPlan>;
74
+ }
75
+ export interface ExecutionRunner {
76
+ run(plan: ExecutionPlan, request: ConnectorRequest): Promise<RawAttempt>;
77
+ }
78
+ export interface ConnectorExecutionPort {
79
+ executeCapability(intent: CapabilityIntent, request: ConnectorRequest): Promise<ConnectorResult<unknown>>;
80
+ }
81
+ export declare function normalizeOutcome(attempt: RawAttempt): ConnectorResult<unknown>;
82
+ export declare function createConnectorContractCore(input: {
83
+ manifestLoader: ConnectorManifestLoader;
84
+ routePlanner: RoutePlanner;
85
+ executionRunner: ExecutionRunner;
86
+ }): ConnectorExecutionPort;
87
+ export declare function isCredentialActive(state: CredentialState): boolean;
@@ -1,47 +1,47 @@
1
- import type { CapabilityIntent, ConnectorRequest, ExecutionPlan } from "./contract.js";
2
- export type EffectSemanticsClass = "read_only" | "side_effect" | "task_claim" | "keepalive";
3
- export declare function classifyConnectorIntentEffect(intent: CapabilityIntent): EffectSemanticsClass;
4
- export interface EffectCommitLedgerPort {
5
- getOrCreateIntentCommitRecord(input: {
6
- decisionId: string;
7
- intentId: string;
8
- idempotencyKey: string;
9
- effectClass: string;
10
- }): Promise<{
11
- existing: boolean;
12
- record: {
13
- id: string;
14
- state: string;
15
- outcomeRef?: string;
16
- };
17
- }>;
18
- }
19
- /** In-memory ledger for tests and offline harnesses. */
20
- export declare class InMemoryEffectCommitLedger implements EffectCommitLedgerPort {
21
- private readonly byKey;
22
- private key;
23
- getOrCreateIntentCommitRecord(input: {
24
- decisionId: string;
25
- intentId: string;
26
- idempotencyKey: string;
27
- effectClass: string;
28
- }): Promise<{
29
- existing: boolean;
30
- record: {
31
- id: string;
32
- state: string;
33
- outcomeRef?: string;
34
- };
35
- }>;
36
- /** Test seam: mark a key as already committed with replayable outcome. */
37
- seedCommitted(decisionId: string, idempotencyKey: string, outcomeRef: string): void;
38
- markState(decisionId: string, idempotencyKey: string, state: string): void;
39
- }
40
- export interface EnforceExecutionPolicyDeps {
41
- effectCommitLedger?: EffectCommitLedgerPort;
42
- }
43
- export declare function enforceExecutionPolicy(plan: ExecutionPlan, intent: CapabilityIntent, request: ConnectorRequest, deps: EnforceExecutionPolicyDeps): Promise<{
44
- skipAdapter: boolean;
45
- existingOutcomeRef?: string;
46
- effectCommitId?: string;
47
- }>;
1
+ import type { CapabilityIntent, ConnectorRequest, ExecutionPlan } from "./contract.js";
2
+ export type EffectSemanticsClass = "read_only" | "side_effect" | "task_claim" | "keepalive";
3
+ export declare function classifyConnectorIntentEffect(intent: CapabilityIntent): EffectSemanticsClass;
4
+ export interface EffectCommitLedgerPort {
5
+ getOrCreateIntentCommitRecord(input: {
6
+ decisionId: string;
7
+ intentId: string;
8
+ idempotencyKey: string;
9
+ effectClass: string;
10
+ }): Promise<{
11
+ existing: boolean;
12
+ record: {
13
+ id: string;
14
+ state: string;
15
+ outcomeRef?: string;
16
+ };
17
+ }>;
18
+ }
19
+ /** In-memory ledger for tests and offline harnesses. */
20
+ export declare class InMemoryEffectCommitLedger implements EffectCommitLedgerPort {
21
+ private readonly byKey;
22
+ private key;
23
+ getOrCreateIntentCommitRecord(input: {
24
+ decisionId: string;
25
+ intentId: string;
26
+ idempotencyKey: string;
27
+ effectClass: string;
28
+ }): Promise<{
29
+ existing: boolean;
30
+ record: {
31
+ id: string;
32
+ state: string;
33
+ outcomeRef?: string;
34
+ };
35
+ }>;
36
+ /** Test seam: mark a key as already committed with replayable outcome. */
37
+ seedCommitted(decisionId: string, idempotencyKey: string, outcomeRef: string): void;
38
+ markState(decisionId: string, idempotencyKey: string, state: string): void;
39
+ }
40
+ export interface EnforceExecutionPolicyDeps {
41
+ effectCommitLedger?: EffectCommitLedgerPort;
42
+ }
43
+ export declare function enforceExecutionPolicy(plan: ExecutionPlan, intent: CapabilityIntent, request: ConnectorRequest, deps: EnforceExecutionPolicyDeps): Promise<{
44
+ skipAdapter: boolean;
45
+ existingOutcomeRef?: string;
46
+ effectCommitId?: string;
47
+ }>;
@@ -1,82 +1,82 @@
1
- /**
2
- * Side-effect idempotency + degraded-channel gate + effect commit replay (T3.2.1).
3
- * Aligns with connector-system.detail §3.6 enforceExecutionPolicy.
4
- */
5
- import * as crypto from "node:crypto";
6
- import { ConnectorPolicyError } from "./failure-taxonomy.js";
7
- const READONLY = new Set([
8
- "feed.read",
9
- "notification.list",
10
- "work.discover",
11
- ]);
12
- export function classifyConnectorIntentEffect(intent) {
13
- if (intent === "agent.heartbeat")
14
- return "keepalive";
15
- if (intent === "task.claim")
16
- return "task_claim";
17
- if (READONLY.has(intent))
18
- return "read_only";
19
- return "side_effect";
20
- }
21
- /** In-memory ledger for tests and offline harnesses. */
22
- export class InMemoryEffectCommitLedger {
23
- byKey = new Map();
24
- key(decisionId, idempotencyKey) {
25
- return `${decisionId}::${idempotencyKey}`;
26
- }
27
- async getOrCreateIntentCommitRecord(input) {
28
- const k = this.key(input.decisionId, input.idempotencyKey);
29
- const hit = this.byKey.get(k);
30
- if (hit) {
31
- return { existing: true, record: hit };
32
- }
33
- const id = crypto.randomUUID();
34
- const rec = { id, state: "planned", outcomeRef: undefined };
35
- this.byKey.set(k, rec);
36
- return { existing: false, record: rec };
37
- }
38
- /** Test seam: mark a key as already committed with replayable outcome. */
39
- seedCommitted(decisionId, idempotencyKey, outcomeRef) {
40
- const id = crypto.randomUUID();
41
- this.byKey.set(this.key(decisionId, idempotencyKey), { id, state: "committed", outcomeRef });
42
- }
43
- markState(decisionId, idempotencyKey, state) {
44
- const k = this.key(decisionId, idempotencyKey);
45
- const cur = this.byKey.get(k);
46
- if (!cur)
47
- throw new Error("ledger_seed_missing");
48
- this.byKey.set(k, { ...cur, state });
49
- }
50
- }
51
- export async function enforceExecutionPolicy(plan, intent, request, deps) {
52
- const semantics = classifyConnectorIntentEffect(intent);
53
- if ((semantics === "side_effect" || semantics === "task_claim") && !plan.idempotencyKey?.trim()) {
54
- throw new ConnectorPolicyError("permanent_input_error", "side_effect_requires_idempotency_key");
55
- }
56
- if (plan.degraded && (semantics === "side_effect" || semantics === "task_claim")) {
57
- throw new ConnectorPolicyError("semantic_rejection", "degraded_channel_not_allowed_for_side_effect");
58
- }
59
- if (plan.idempotencyKey && deps.effectCommitLedger) {
60
- if (!request.decisionId?.trim() || !request.intentId?.trim()) {
61
- throw new ConnectorPolicyError("permanent_input_error", "effect_commit_requires_decision_and_intent_id");
62
- }
63
- const lookup = await deps.effectCommitLedger.getOrCreateIntentCommitRecord({
64
- decisionId: request.decisionId,
65
- intentId: request.intentId,
66
- idempotencyKey: plan.idempotencyKey,
67
- effectClass: semantics,
68
- });
69
- if (lookup.existing && lookup.record.state === "committed") {
70
- return {
71
- skipAdapter: true,
72
- existingOutcomeRef: lookup.record.outcomeRef,
73
- effectCommitId: lookup.record.id,
74
- };
75
- }
76
- if (lookup.existing && (lookup.record.state === "dispatched" || lookup.record.state === "reconcile")) {
77
- throw new ConnectorPolicyError("concurrency_conflict", "effect_commit_requires_reconcile");
78
- }
79
- return { skipAdapter: false, effectCommitId: lookup.record.id };
80
- }
81
- return { skipAdapter: false };
82
- }
1
+ /**
2
+ * Side-effect idempotency + degraded-channel gate + effect commit replay (T3.2.1).
3
+ * Aligns with connector-system.detail §3.6 enforceExecutionPolicy.
4
+ */
5
+ import * as crypto from "node:crypto";
6
+ import { ConnectorPolicyError } from "./failure-taxonomy.js";
7
+ const READONLY = new Set([
8
+ "feed.read",
9
+ "notification.list",
10
+ "work.discover",
11
+ ]);
12
+ export function classifyConnectorIntentEffect(intent) {
13
+ if (intent === "agent.heartbeat")
14
+ return "keepalive";
15
+ if (intent === "task.claim")
16
+ return "task_claim";
17
+ if (READONLY.has(intent))
18
+ return "read_only";
19
+ return "side_effect";
20
+ }
21
+ /** In-memory ledger for tests and offline harnesses. */
22
+ export class InMemoryEffectCommitLedger {
23
+ byKey = new Map();
24
+ key(decisionId, idempotencyKey) {
25
+ return `${decisionId}::${idempotencyKey}`;
26
+ }
27
+ async getOrCreateIntentCommitRecord(input) {
28
+ const k = this.key(input.decisionId, input.idempotencyKey);
29
+ const hit = this.byKey.get(k);
30
+ if (hit) {
31
+ return { existing: true, record: hit };
32
+ }
33
+ const id = crypto.randomUUID();
34
+ const rec = { id, state: "planned", outcomeRef: undefined };
35
+ this.byKey.set(k, rec);
36
+ return { existing: false, record: rec };
37
+ }
38
+ /** Test seam: mark a key as already committed with replayable outcome. */
39
+ seedCommitted(decisionId, idempotencyKey, outcomeRef) {
40
+ const id = crypto.randomUUID();
41
+ this.byKey.set(this.key(decisionId, idempotencyKey), { id, state: "committed", outcomeRef });
42
+ }
43
+ markState(decisionId, idempotencyKey, state) {
44
+ const k = this.key(decisionId, idempotencyKey);
45
+ const cur = this.byKey.get(k);
46
+ if (!cur)
47
+ throw new Error("ledger_seed_missing");
48
+ this.byKey.set(k, { ...cur, state });
49
+ }
50
+ }
51
+ export async function enforceExecutionPolicy(plan, intent, request, deps) {
52
+ const semantics = classifyConnectorIntentEffect(intent);
53
+ if ((semantics === "side_effect" || semantics === "task_claim") && !plan.idempotencyKey?.trim()) {
54
+ throw new ConnectorPolicyError("permanent_input_error", "side_effect_requires_idempotency_key");
55
+ }
56
+ if (plan.degraded && (semantics === "side_effect" || semantics === "task_claim")) {
57
+ throw new ConnectorPolicyError("semantic_rejection", "degraded_channel_not_allowed_for_side_effect");
58
+ }
59
+ if (plan.idempotencyKey && deps.effectCommitLedger) {
60
+ if (!request.decisionId?.trim() || !request.intentId?.trim()) {
61
+ throw new ConnectorPolicyError("permanent_input_error", "effect_commit_requires_decision_and_intent_id");
62
+ }
63
+ const lookup = await deps.effectCommitLedger.getOrCreateIntentCommitRecord({
64
+ decisionId: request.decisionId,
65
+ intentId: request.intentId,
66
+ idempotencyKey: plan.idempotencyKey,
67
+ effectClass: semantics,
68
+ });
69
+ if (lookup.existing && lookup.record.state === "committed") {
70
+ return {
71
+ skipAdapter: true,
72
+ existingOutcomeRef: lookup.record.outcomeRef,
73
+ effectCommitId: lookup.record.id,
74
+ };
75
+ }
76
+ if (lookup.existing && (lookup.record.state === "dispatched" || lookup.record.state === "reconcile")) {
77
+ throw new ConnectorPolicyError("concurrency_conflict", "effect_commit_requires_reconcile");
78
+ }
79
+ return { skipAdapter: false, effectCommitId: lookup.record.id };
80
+ }
81
+ return { skipAdapter: false };
82
+ }
@@ -1,8 +1,8 @@
1
- export * from "./contract.js";
2
- export * from "./manifest.js";
3
- export * from "./map-life-evidence.js";
4
- export * from "./failure-taxonomy.js";
5
- export * from "./route-planner.js";
6
- export * from "./channel-health.js";
7
- export * from "./policy-layer.js";
8
- export * from "./execution-policy.js";
1
+ export * from "./contract.js";
2
+ export * from "./manifest.js";
3
+ export * from "./map-life-evidence.js";
4
+ export * from "./failure-taxonomy.js";
5
+ export * from "./route-planner.js";
6
+ export * from "./channel-health.js";
7
+ export * from "./policy-layer.js";
8
+ export * from "./execution-policy.js";
@@ -1,8 +1,8 @@
1
- export * from "./contract.js";
2
- export * from "./manifest.js";
3
- export * from "./map-life-evidence.js";
4
- export * from "./failure-taxonomy.js";
5
- export * from "./route-planner.js";
6
- export * from "./channel-health.js";
7
- export * from "./policy-layer.js";
8
- export * from "./execution-policy.js";
1
+ export * from "./contract.js";
2
+ export * from "./manifest.js";
3
+ export * from "./map-life-evidence.js";
4
+ export * from "./failure-taxonomy.js";
5
+ export * from "./route-planner.js";
6
+ export * from "./channel-health.js";
7
+ export * from "./policy-layer.js";
8
+ export * from "./execution-policy.js";
@@ -1,64 +1,64 @@
1
- import { z } from "zod";
2
- import { type CapabilityIntent, type ChannelType } from "./contract.js";
3
- declare const connectorManifestSchema: z.ZodObject<{
4
- platformId: z.ZodString;
5
- supportedCapabilities: z.ZodArray<z.ZodEnum<{
6
- "feed.read": "feed.read";
7
- "post.publish": "post.publish";
8
- "comment.reply": "comment.reply";
9
- "notification.list": "notification.list";
10
- "message.send": "message.send";
11
- "agent.register": "agent.register";
12
- "agent.heartbeat": "agent.heartbeat";
13
- "work.discover": "work.discover";
14
- "task.claim": "task.claim";
15
- }>>;
16
- channelPriority: z.ZodArray<z.ZodEnum<{
17
- api_rest: "api_rest";
18
- api_rpc: "api_rpc";
19
- a2a: "a2a";
20
- mcp: "mcp";
21
- cli: "cli";
22
- skill: "skill";
23
- browser: "browser";
24
- }>>;
25
- credentialTypes: z.ZodArray<z.ZodString>;
26
- degradedChannels: z.ZodOptional<z.ZodArray<z.ZodEnum<{
27
- api_rest: "api_rest";
28
- api_rpc: "api_rpc";
29
- a2a: "a2a";
30
- mcp: "mcp";
31
- cli: "cli";
32
- skill: "skill";
33
- browser: "browser";
34
- }>>>;
35
- sourceRefPolicy: z.ZodOptional<z.ZodObject<{
36
- minSourceRefs: z.ZodDefault<z.ZodNumber>;
37
- rejectInlineSensitivePayload: z.ZodOptional<z.ZodBoolean>;
38
- }, z.core.$strip>>;
39
- }, z.core.$strip>;
40
- export type ConnectorManifest = z.infer<typeof connectorManifestSchema>;
41
- export declare class CapabilityContractRegistry {
42
- private readonly byPlatform;
43
- register(manifest: ConnectorManifest): void;
44
- loadManifest(platformId: string): ConnectorManifest;
45
- listRegisteredPlatformIds(): string[];
46
- hasCapability(platformId: string, intent: CapabilityIntent): boolean;
47
- listCapabilities(platformId: string): CapabilityIntent[];
48
- listChannels(platformId: string): ChannelType[];
49
- }
50
- /** T3.1.1 contract name for manifest-first registry. */
51
- export declare const ConnectorManifestRegistry: typeof CapabilityContractRegistry;
52
- export type ConnectorManifestRegistry = CapabilityContractRegistry;
53
- export declare function describeConnector(registry: CapabilityContractRegistry, platformId: string): ConnectorManifest;
54
- export declare function checkConnector(registry: CapabilityContractRegistry, platformId: string): {
55
- ok: boolean;
56
- errors: string[];
57
- };
58
- export declare function discoverCapabilities(registry: CapabilityContractRegistry): Array<{
59
- platformId: string;
60
- capabilities: CapabilityIntent[];
61
- degradedChannels?: ChannelType[];
62
- }>;
63
- export declare function parseConnectorManifest(input: unknown): ConnectorManifest;
64
- export {};
1
+ import { z } from "zod";
2
+ import { type CapabilityIntent, type ChannelType } from "./contract.js";
3
+ declare const connectorManifestSchema: z.ZodObject<{
4
+ platformId: z.ZodString;
5
+ supportedCapabilities: z.ZodArray<z.ZodEnum<{
6
+ "feed.read": "feed.read";
7
+ "post.publish": "post.publish";
8
+ "comment.reply": "comment.reply";
9
+ "notification.list": "notification.list";
10
+ "message.send": "message.send";
11
+ "agent.register": "agent.register";
12
+ "agent.heartbeat": "agent.heartbeat";
13
+ "work.discover": "work.discover";
14
+ "task.claim": "task.claim";
15
+ }>>;
16
+ channelPriority: z.ZodArray<z.ZodEnum<{
17
+ api_rest: "api_rest";
18
+ api_rpc: "api_rpc";
19
+ a2a: "a2a";
20
+ mcp: "mcp";
21
+ cli: "cli";
22
+ skill: "skill";
23
+ browser: "browser";
24
+ }>>;
25
+ credentialTypes: z.ZodArray<z.ZodString>;
26
+ degradedChannels: z.ZodOptional<z.ZodArray<z.ZodEnum<{
27
+ api_rest: "api_rest";
28
+ api_rpc: "api_rpc";
29
+ a2a: "a2a";
30
+ mcp: "mcp";
31
+ cli: "cli";
32
+ skill: "skill";
33
+ browser: "browser";
34
+ }>>>;
35
+ sourceRefPolicy: z.ZodOptional<z.ZodObject<{
36
+ minSourceRefs: z.ZodDefault<z.ZodNumber>;
37
+ rejectInlineSensitivePayload: z.ZodOptional<z.ZodBoolean>;
38
+ }, z.core.$strip>>;
39
+ }, z.core.$strip>;
40
+ export type ConnectorManifest = z.infer<typeof connectorManifestSchema>;
41
+ export declare class CapabilityContractRegistry {
42
+ private readonly byPlatform;
43
+ register(manifest: ConnectorManifest): void;
44
+ loadManifest(platformId: string): ConnectorManifest;
45
+ listRegisteredPlatformIds(): string[];
46
+ hasCapability(platformId: string, intent: CapabilityIntent): boolean;
47
+ listCapabilities(platformId: string): CapabilityIntent[];
48
+ listChannels(platformId: string): ChannelType[];
49
+ }
50
+ /** T3.1.1 contract name for manifest-first registry. */
51
+ export declare const ConnectorManifestRegistry: typeof CapabilityContractRegistry;
52
+ export type ConnectorManifestRegistry = CapabilityContractRegistry;
53
+ export declare function describeConnector(registry: CapabilityContractRegistry, platformId: string): ConnectorManifest;
54
+ export declare function checkConnector(registry: CapabilityContractRegistry, platformId: string): {
55
+ ok: boolean;
56
+ errors: string[];
57
+ };
58
+ export declare function discoverCapabilities(registry: CapabilityContractRegistry): Array<{
59
+ platformId: string;
60
+ capabilities: CapabilityIntent[];
61
+ degradedChannels?: ChannelType[];
62
+ }>;
63
+ export declare function parseConnectorManifest(input: unknown): ConnectorManifest;
64
+ export {};