@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,123 +1,123 @@
1
- import { isLifeEvidenceSliceEmpty } from "../heartbeat/runtime-snapshot.js";
2
- import { writeQuietArtifact } from "../../../storage/quiet/quiet-artifact-writer.js";
3
- import { persistQuietArtifactToWorkspace } from "../../../storage/quiet/persist-quiet-artifact.js";
4
- import { buildEvidencePack, buildQuietNarrativeGuidance, selectInterestBasis } from "../../../guidance/evidence-guidance.js";
5
- function toSourceRefFromControlPlane(r) {
6
- return {
7
- id: r.id,
8
- kind: r.kind,
9
- uri: r.uri,
10
- excerptHash: r.excerptHash,
11
- observedAt: r.observedAt,
12
- };
13
- }
14
- function toGuidanceRef(r) {
15
- return {
16
- id: r.id,
17
- kind: r.kind,
18
- uri: r.uri,
19
- excerptHash: r.excerptHash,
20
- observedAt: r.observedAt,
21
- };
22
- }
23
- export async function runSourceBackedQuiet(params) {
24
- const { candidate, runtime, day, userInterestSnapshot, workspaceRoot } = params;
25
- const empty = isLifeEvidenceSliceEmpty(runtime.lifeEvidence);
26
- if (empty) {
27
- const input = {
28
- day,
29
- kind: "empty_state",
30
- title: "Quiet — no life evidence",
31
- body: "No source-backed life evidence in window; narrative reflection is skipped.",
32
- claims: [],
33
- sourceRefs: [],
34
- };
35
- const ack = writeQuietArtifact(input);
36
- let persistedRelativePath;
37
- if (workspaceRoot) {
38
- const p = await persistQuietArtifactToWorkspace(workspaceRoot, ack, input);
39
- persistedRelativePath = p.relativePath;
40
- }
41
- return {
42
- result: {
43
- scope: "rhythm",
44
- status: "intent_selected",
45
- selectedIntentId: candidate.id,
46
- reasons: ["quiet_empty_state", "no_fictional_narrative"],
47
- },
48
- artifactAck: ack,
49
- persistedRelativePath,
50
- };
51
- }
52
- const bundleRefs = runtime.lifeEvidence.evidenceRefs.map(toSourceRefFromControlPlane);
53
- const guidanceRefs = runtime.lifeEvidence.evidenceRefs.map(toGuidanceRef);
54
- const ep = buildEvidencePack(guidanceRefs);
55
- if (!ep.ok) {
56
- return {
57
- result: {
58
- scope: "rhythm",
59
- status: "denied",
60
- selectedIntentId: candidate.id,
61
- reasons: ep.reasons,
62
- },
63
- };
64
- }
65
- const basis = selectInterestBasis({
66
- staleness: userInterestSnapshot?.staleness ?? "insufficient",
67
- confidence: userInterestSnapshot?.confidence ?? 0,
68
- signalCount: userInterestSnapshot?.signals.length ?? 0,
69
- });
70
- const claims = ep.pack.groundedRefs.map((g, i) => ({
71
- id: `fact:${g.id}`,
72
- text: `Evidence-backed note ${i + 1}`,
73
- claimType: "fact",
74
- sourceRefs: [
75
- {
76
- id: g.id,
77
- kind: g.kind,
78
- uri: g.uri,
79
- excerptHash: g.excerptHash,
80
- observedAt: g.observedAt,
81
- },
82
- ],
83
- }));
84
- const reportWrite = {
85
- day,
86
- kind: "daily_report",
87
- title: "Quiet daily report",
88
- body: `Source-backed quiet summary (${bundleRefs.length} refs).`,
89
- claims,
90
- sourceRefs: bundleRefs,
91
- };
92
- const ack = writeQuietArtifact(reportWrite);
93
- const gq = buildQuietNarrativeGuidance({
94
- interestBasis: basis,
95
- sourceCoverage: ack.sourceCoverage,
96
- outline: claims.map((c) => c.text),
97
- });
98
- if (gq.status === "unavailable") {
99
- return {
100
- result: {
101
- scope: "rhythm",
102
- status: "denied",
103
- selectedIntentId: candidate.id,
104
- reasons: gq.reasons,
105
- },
106
- };
107
- }
108
- let persistedRelativePath;
109
- if (workspaceRoot) {
110
- const p = await persistQuietArtifactToWorkspace(workspaceRoot, ack, reportWrite);
111
- persistedRelativePath = p.relativePath;
112
- }
113
- return {
114
- result: {
115
- scope: "rhythm",
116
- status: "intent_selected",
117
- selectedIntentId: candidate.id,
118
- reasons: ["quiet_artifact_written", ...gq.hints.slice(0, 2)],
119
- },
120
- artifactAck: ack,
121
- persistedRelativePath,
122
- };
123
- }
1
+ import { isLifeEvidenceSliceEmpty } from "../heartbeat/runtime-snapshot.js";
2
+ import { writeQuietArtifact } from "../../../storage/quiet/quiet-artifact-writer.js";
3
+ import { persistQuietArtifactToWorkspace } from "../../../storage/quiet/persist-quiet-artifact.js";
4
+ import { buildEvidencePack, buildQuietNarrativeGuidance, selectInterestBasis } from "../../../guidance/evidence-guidance.js";
5
+ function toSourceRefFromControlPlane(r) {
6
+ return {
7
+ id: r.id,
8
+ kind: r.kind,
9
+ uri: r.uri,
10
+ excerptHash: r.excerptHash,
11
+ observedAt: r.observedAt,
12
+ };
13
+ }
14
+ function toGuidanceRef(r) {
15
+ return {
16
+ id: r.id,
17
+ kind: r.kind,
18
+ uri: r.uri,
19
+ excerptHash: r.excerptHash,
20
+ observedAt: r.observedAt,
21
+ };
22
+ }
23
+ export async function runSourceBackedQuiet(params) {
24
+ const { candidate, runtime, day, userInterestSnapshot, workspaceRoot } = params;
25
+ const empty = isLifeEvidenceSliceEmpty(runtime.lifeEvidence);
26
+ if (empty) {
27
+ const input = {
28
+ day,
29
+ kind: "empty_state",
30
+ title: "Quiet — no life evidence",
31
+ body: "No source-backed life evidence in window; narrative reflection is skipped.",
32
+ claims: [],
33
+ sourceRefs: [],
34
+ };
35
+ const ack = writeQuietArtifact(input);
36
+ let persistedRelativePath;
37
+ if (workspaceRoot) {
38
+ const p = await persistQuietArtifactToWorkspace(workspaceRoot, ack, input);
39
+ persistedRelativePath = p.relativePath;
40
+ }
41
+ return {
42
+ result: {
43
+ scope: "rhythm",
44
+ status: "intent_selected",
45
+ selectedIntentId: candidate.id,
46
+ reasons: ["quiet_empty_state", "no_fictional_narrative"],
47
+ },
48
+ artifactAck: ack,
49
+ persistedRelativePath,
50
+ };
51
+ }
52
+ const bundleRefs = runtime.lifeEvidence.evidenceRefs.map(toSourceRefFromControlPlane);
53
+ const guidanceRefs = runtime.lifeEvidence.evidenceRefs.map(toGuidanceRef);
54
+ const ep = buildEvidencePack(guidanceRefs);
55
+ if (!ep.ok) {
56
+ return {
57
+ result: {
58
+ scope: "rhythm",
59
+ status: "denied",
60
+ selectedIntentId: candidate.id,
61
+ reasons: ep.reasons,
62
+ },
63
+ };
64
+ }
65
+ const basis = selectInterestBasis({
66
+ staleness: userInterestSnapshot?.staleness ?? "insufficient",
67
+ confidence: userInterestSnapshot?.confidence ?? 0,
68
+ signalCount: userInterestSnapshot?.signals.length ?? 0,
69
+ });
70
+ const claims = ep.pack.groundedRefs.map((g, i) => ({
71
+ id: `fact:${g.id}`,
72
+ text: `Evidence-backed note ${i + 1}`,
73
+ claimType: "fact",
74
+ sourceRefs: [
75
+ {
76
+ id: g.id,
77
+ kind: g.kind,
78
+ uri: g.uri,
79
+ excerptHash: g.excerptHash,
80
+ observedAt: g.observedAt,
81
+ },
82
+ ],
83
+ }));
84
+ const reportWrite = {
85
+ day,
86
+ kind: "daily_report",
87
+ title: "Quiet daily report",
88
+ body: `Source-backed quiet summary (${bundleRefs.length} refs).`,
89
+ claims,
90
+ sourceRefs: bundleRefs,
91
+ };
92
+ const ack = writeQuietArtifact(reportWrite);
93
+ const gq = buildQuietNarrativeGuidance({
94
+ interestBasis: basis,
95
+ sourceCoverage: ack.sourceCoverage,
96
+ outline: claims.map((c) => c.text),
97
+ });
98
+ if (gq.status === "unavailable") {
99
+ return {
100
+ result: {
101
+ scope: "rhythm",
102
+ status: "denied",
103
+ selectedIntentId: candidate.id,
104
+ reasons: gq.reasons,
105
+ },
106
+ };
107
+ }
108
+ let persistedRelativePath;
109
+ if (workspaceRoot) {
110
+ const p = await persistQuietArtifactToWorkspace(workspaceRoot, ack, reportWrite);
111
+ persistedRelativePath = p.relativePath;
112
+ }
113
+ return {
114
+ result: {
115
+ scope: "rhythm",
116
+ status: "intent_selected",
117
+ selectedIntentId: candidate.id,
118
+ reasons: ["quiet_artifact_written", ...gq.hints.slice(0, 2)],
119
+ },
120
+ artifactAck: ack,
121
+ persistedRelativePath,
122
+ };
123
+ }
@@ -1,15 +1,15 @@
1
- /**
2
- * Maps calendar rhythm policy + continuity into planner-facing window slice (T2.1.3).
3
- * Control-plane owns allowedIntentKinds; state never emits them (T2.1.2 boundary).
4
- */
5
- import type { ContinuitySnapshot, IntentKind } from "../types.js";
6
- import type { RhythmPolicy } from "./rhythm-policy.js";
7
- export interface PlannerRhythmWindowSlice {
8
- windowId: string;
9
- allowedIntentKinds: IntentKind[];
10
- quietBias: boolean;
11
- }
12
- /**
13
- * Derive allowed intent kinds and quiet bias for candidate planning.
14
- */
15
- export declare function buildPlannerRhythmWindow(now: string, continuity: ContinuitySnapshot, policy: RhythmPolicy): PlannerRhythmWindowSlice;
1
+ /**
2
+ * Maps calendar rhythm policy + continuity into planner-facing window slice (T2.1.3).
3
+ * Control-plane owns allowedIntentKinds; state never emits them (T2.1.2 boundary).
4
+ */
5
+ import type { ContinuitySnapshot, IntentKind } from "../types.js";
6
+ import type { RhythmPolicy } from "./rhythm-policy.js";
7
+ export interface PlannerRhythmWindowSlice {
8
+ windowId: string;
9
+ allowedIntentKinds: IntentKind[];
10
+ quietBias: boolean;
11
+ }
12
+ /**
13
+ * Derive allowed intent kinds and quiet bias for candidate planning.
14
+ */
15
+ export declare function buildPlannerRhythmWindow(now: string, continuity: ContinuitySnapshot, policy: RhythmPolicy): PlannerRhythmWindowSlice;
@@ -1,52 +1,52 @@
1
- import { selectRhythmWindow } from "./select-window.js";
2
- const ALL_INTENT_KINDS = [
3
- "work",
4
- "exploration",
5
- "social",
6
- "quiet",
7
- "reflection",
8
- "outreach",
9
- "maintenance",
10
- ];
11
- function allowedForPaused() {
12
- return ["maintenance"];
13
- }
14
- function allowedForMaintenanceOnly() {
15
- return ["work", "maintenance"];
16
- }
17
- function allowedForActiveWindow(windowId) {
18
- if (windowId.includes("work")) {
19
- return ["work", "exploration", "maintenance", "reflection", "outreach", "social", "quiet"];
20
- }
21
- if (windowId.includes("social")) {
22
- return ["social", "exploration", "work", "maintenance", "reflection", "outreach", "quiet"];
23
- }
24
- if (windowId.includes("reflection")) {
25
- return ["reflection", "work", "maintenance", "exploration", "social", "outreach", "quiet"];
26
- }
27
- return ALL_INTENT_KINDS;
28
- }
29
- function mergeQuietBias(decision, continuity, windowIsQuiet) {
30
- return windowIsQuiet || decision.topLevelMode === "quiet" || continuity.mode === "quiet";
31
- }
32
- /**
33
- * Derive allowed intent kinds and quiet bias for candidate planning.
34
- */
35
- export function buildPlannerRhythmWindow(now, continuity, policy) {
36
- const decision = selectRhythmWindow(now, continuity, policy);
37
- const window = policy.windows.find((w) => w.id === decision.windowId) ?? policy.windows[0];
38
- const windowIsQuiet = window.mode === "quiet";
39
- const quietBias = mergeQuietBias(decision, continuity, windowIsQuiet);
40
- let allowed;
41
- if (decision.topLevelMode === "paused_for_interrupt") {
42
- allowed = allowedForPaused();
43
- }
44
- else if (decision.topLevelMode === "maintenance_only") {
45
- allowed = allowedForMaintenanceOnly();
46
- }
47
- else {
48
- /** Calendar quiet sets `quietBias` only; candidate kinds stay window-biased (guards enforce quiet suppression). */
49
- allowed = allowedForActiveWindow(window.id);
50
- }
51
- return { windowId: decision.windowId, allowedIntentKinds: allowed, quietBias };
52
- }
1
+ import { selectRhythmWindow } from "./select-window.js";
2
+ const ALL_INTENT_KINDS = [
3
+ "work",
4
+ "exploration",
5
+ "social",
6
+ "quiet",
7
+ "reflection",
8
+ "outreach",
9
+ "maintenance",
10
+ ];
11
+ function allowedForPaused() {
12
+ return ["maintenance"];
13
+ }
14
+ function allowedForMaintenanceOnly() {
15
+ return ["work", "maintenance"];
16
+ }
17
+ function allowedForActiveWindow(windowId) {
18
+ if (windowId.includes("work")) {
19
+ return ["work", "exploration", "maintenance", "reflection", "outreach", "social", "quiet"];
20
+ }
21
+ if (windowId.includes("social")) {
22
+ return ["social", "exploration", "work", "maintenance", "reflection", "outreach", "quiet"];
23
+ }
24
+ if (windowId.includes("reflection")) {
25
+ return ["reflection", "work", "maintenance", "exploration", "social", "outreach", "quiet"];
26
+ }
27
+ return ALL_INTENT_KINDS;
28
+ }
29
+ function mergeQuietBias(decision, continuity, windowIsQuiet) {
30
+ return windowIsQuiet || decision.topLevelMode === "quiet" || continuity.mode === "quiet";
31
+ }
32
+ /**
33
+ * Derive allowed intent kinds and quiet bias for candidate planning.
34
+ */
35
+ export function buildPlannerRhythmWindow(now, continuity, policy) {
36
+ const decision = selectRhythmWindow(now, continuity, policy);
37
+ const window = policy.windows.find((w) => w.id === decision.windowId) ?? policy.windows[0];
38
+ const windowIsQuiet = window.mode === "quiet";
39
+ const quietBias = mergeQuietBias(decision, continuity, windowIsQuiet);
40
+ let allowed;
41
+ if (decision.topLevelMode === "paused_for_interrupt") {
42
+ allowed = allowedForPaused();
43
+ }
44
+ else if (decision.topLevelMode === "maintenance_only") {
45
+ allowed = allowedForMaintenanceOnly();
46
+ }
47
+ else {
48
+ /** Calendar quiet sets `quietBias` only; candidate kinds stay window-biased (guards enforce quiet suppression). */
49
+ allowed = allowedForActiveWindow(window.id);
50
+ }
51
+ return { windowId: decision.windowId, allowedIntentKinds: allowed, quietBias };
52
+ }
@@ -1,19 +1,19 @@
1
- /**
2
- * Bridges state-system RhythmPolicySnapshot fields into control-plane RhythmPolicy (T2.1.2).
3
- *
4
- * State never emits window decisions or allowedIntentKinds; control-plane owns
5
- * window geometry used by selectRhythmWindow(). Callers pass a pick of the DB read model.
6
- */
7
- import type { RhythmPolicy } from "./rhythm-policy.js";
8
- /** Subset of `RhythmPolicySnapshot` used for window derivation (no storage import from core). */
9
- export interface RhythmPolicySnapshotBridgeInput {
10
- quietEnabled: boolean;
11
- }
12
- /**
13
- * Reject drifted snapshot shapes that smuggle control-plane decision fields.
14
- */
15
- export declare function assertRhythmPolicySnapshotContract(snapshot: Record<string, unknown>): void;
16
- /**
17
- * Deterministic default windows from policy knobs (quiet hour tail when quietEnabled).
18
- */
19
- export declare function rhythmPolicySnapshotToRhythmPolicy(snapshot: RhythmPolicySnapshotBridgeInput): RhythmPolicy;
1
+ /**
2
+ * Bridges state-system RhythmPolicySnapshot fields into control-plane RhythmPolicy (T2.1.2).
3
+ *
4
+ * State never emits window decisions or allowedIntentKinds; control-plane owns
5
+ * window geometry used by selectRhythmWindow(). Callers pass a pick of the DB read model.
6
+ */
7
+ import type { RhythmPolicy } from "./rhythm-policy.js";
8
+ /** Subset of `RhythmPolicySnapshot` used for window derivation (no storage import from core). */
9
+ export interface RhythmPolicySnapshotBridgeInput {
10
+ quietEnabled: boolean;
11
+ }
12
+ /**
13
+ * Reject drifted snapshot shapes that smuggle control-plane decision fields.
14
+ */
15
+ export declare function assertRhythmPolicySnapshotContract(snapshot: Record<string, unknown>): void;
16
+ /**
17
+ * Deterministic default windows from policy knobs (quiet hour tail when quietEnabled).
18
+ */
19
+ export declare function rhythmPolicySnapshotToRhythmPolicy(snapshot: RhythmPolicySnapshotBridgeInput): RhythmPolicy;
@@ -1,34 +1,34 @@
1
- const FORBIDDEN_SNAPSHOT_KEYS = ["allowedIntentKinds", "windowDecision", "rhythmWindow"];
2
- /**
3
- * Reject drifted snapshot shapes that smuggle control-plane decision fields.
4
- */
5
- export function assertRhythmPolicySnapshotContract(snapshot) {
6
- for (const key of FORBIDDEN_SNAPSHOT_KEYS) {
7
- if (key in snapshot) {
8
- throw new Error(`rhythm_policy_snapshot_field_drift:${key}`);
9
- }
10
- }
11
- }
12
- /**
13
- * Deterministic default windows from policy knobs (quiet hour tail when quietEnabled).
14
- */
15
- export function rhythmPolicySnapshotToRhythmPolicy(snapshot) {
16
- assertRhythmPolicySnapshotContract(snapshot);
17
- if (snapshot.quietEnabled) {
18
- return {
19
- timezone: "UTC",
20
- quietSuppressionEnabled: true,
21
- windows: [
22
- { id: "w-work", startMinute: 0, endMinute: 480, mode: "active" },
23
- { id: "w-social", startMinute: 480, endMinute: 960, mode: "active" },
24
- { id: "w-reflection", startMinute: 960, endMinute: 1200, mode: "active" },
25
- { id: "w-quiet", startMinute: 1200, endMinute: 1440, mode: "quiet" },
26
- ],
27
- };
28
- }
29
- return {
30
- timezone: "UTC",
31
- quietSuppressionEnabled: false,
32
- windows: [{ id: "w-open", startMinute: 0, endMinute: 1440, mode: "active" }],
33
- };
34
- }
1
+ const FORBIDDEN_SNAPSHOT_KEYS = ["allowedIntentKinds", "windowDecision", "rhythmWindow"];
2
+ /**
3
+ * Reject drifted snapshot shapes that smuggle control-plane decision fields.
4
+ */
5
+ export function assertRhythmPolicySnapshotContract(snapshot) {
6
+ for (const key of FORBIDDEN_SNAPSHOT_KEYS) {
7
+ if (key in snapshot) {
8
+ throw new Error(`rhythm_policy_snapshot_field_drift:${key}`);
9
+ }
10
+ }
11
+ }
12
+ /**
13
+ * Deterministic default windows from policy knobs (quiet hour tail when quietEnabled).
14
+ */
15
+ export function rhythmPolicySnapshotToRhythmPolicy(snapshot) {
16
+ assertRhythmPolicySnapshotContract(snapshot);
17
+ if (snapshot.quietEnabled) {
18
+ return {
19
+ timezone: "UTC",
20
+ quietSuppressionEnabled: true,
21
+ windows: [
22
+ { id: "w-work", startMinute: 0, endMinute: 480, mode: "active" },
23
+ { id: "w-social", startMinute: 480, endMinute: 960, mode: "active" },
24
+ { id: "w-reflection", startMinute: 960, endMinute: 1200, mode: "active" },
25
+ { id: "w-quiet", startMinute: 1200, endMinute: 1440, mode: "quiet" },
26
+ ],
27
+ };
28
+ }
29
+ return {
30
+ timezone: "UTC",
31
+ quietSuppressionEnabled: false,
32
+ windows: [{ id: "w-open", startMinute: 0, endMinute: 1440, mode: "active" }],
33
+ };
34
+ }
@@ -1,45 +1,45 @@
1
- /**
2
- * Second Nature Runtime Service Entry
3
- *
4
- * This module provides the actual implementation for the `second-nature-runtime` service.
5
- * It serves as the heartbeat host bridge candidate carrier and initializes the
6
- * minimal runtime state needed for the plugin to function.
7
- *
8
- * Per ADR-005: heartbeat is the free-rhythm main entry; this service provides
9
- * the stable runtime state that heartbeat rounds will interact with.
10
- */
11
- let activeHandle = null;
12
- /**
13
- * Start the Second Nature runtime service.
14
- *
15
- * This is the non-empty implementation that replaces the previous `start() { return; }` shell.
16
- * It initializes the minimal runtime state and returns a handle that can be used
17
- * by the heartbeat host bridge.
18
- */
19
- export function startRuntimeService(ctx) {
20
- if (activeHandle?.ready) {
21
- return activeHandle;
22
- }
23
- // Initialize minimal runtime state
24
- // In future iterations, this will connect to:
25
- // - state-system (SQLite database initialization)
26
- // - observability-system (event store setup)
27
- // - control-plane-system (heartbeat bridge preparation)
28
- const workspaceRoot = ctx?.workspaceRoot ?? process.cwd();
29
- /** Keep in sync with `plugin/package.json` when cutting releases. */
30
- const version = "0.1.18";
31
- activeHandle = {
32
- ready: true,
33
- version,
34
- close() {
35
- activeHandle = null;
36
- },
37
- };
38
- return activeHandle;
39
- }
40
- /**
41
- * Get the current runtime service handle, or null if not started.
42
- */
43
- export function getRuntimeHandle() {
44
- return activeHandle;
45
- }
1
+ /**
2
+ * Second Nature Runtime Service Entry
3
+ *
4
+ * This module provides the actual implementation for the `second-nature-runtime` service.
5
+ * It serves as the heartbeat host bridge candidate carrier and initializes the
6
+ * minimal runtime state needed for the plugin to function.
7
+ *
8
+ * Per ADR-005: heartbeat is the free-rhythm main entry; this service provides
9
+ * the stable runtime state that heartbeat rounds will interact with.
10
+ */
11
+ let activeHandle = null;
12
+ /**
13
+ * Start the Second Nature runtime service.
14
+ *
15
+ * This is the non-empty implementation that replaces the previous `start() { return; }` shell.
16
+ * It initializes the minimal runtime state and returns a handle that can be used
17
+ * by the heartbeat host bridge.
18
+ */
19
+ export function startRuntimeService(ctx) {
20
+ if (activeHandle?.ready) {
21
+ return activeHandle;
22
+ }
23
+ // Initialize minimal runtime state
24
+ // In future iterations, this will connect to:
25
+ // - state-system (SQLite database initialization)
26
+ // - observability-system (event store setup)
27
+ // - control-plane-system (heartbeat bridge preparation)
28
+ const workspaceRoot = ctx?.workspaceRoot ?? process.cwd();
29
+ /** Keep in sync with `plugin/package.json` when cutting releases. */
30
+ const version = "0.1.19";
31
+ activeHandle = {
32
+ ready: true,
33
+ version,
34
+ close() {
35
+ activeHandle = null;
36
+ },
37
+ };
38
+ return activeHandle;
39
+ }
40
+ /**
41
+ * Get the current runtime service handle, or null if not started.
42
+ */
43
+ export function getRuntimeHandle() {
44
+ return activeHandle;
45
+ }