agentera 3.0.0-dev.20 → 3.0.0-dev.21

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 (228) hide show
  1. package/README.md +19 -0
  2. package/bundle/CHANGELOG.md +63 -70
  3. package/bundle/README.md +17 -0
  4. package/bundle/UPGRADE.md +38 -0
  5. package/bundle/references/adapters/package-surface-characterization.md +7 -0
  6. package/bundle/references/artifacts/artifact-registry-interface-model.yaml +3 -3
  7. package/bundle/references/artifacts/state-storage-authority.yaml +1446 -0
  8. package/bundle/references/cli/agent-ready-state-contract.yaml +11 -39
  9. package/bundle/references/cli/audience-namespace-cli-migration.yaml +30 -15
  10. package/bundle/references/meta/documentation-inventory.md +1 -0
  11. package/bundle/skills/agentera/capabilities/audit/schemas/artifacts.yaml +18 -10
  12. package/bundle/skills/agentera/capabilities/audit/schemas/validation.yaml +10 -10
  13. package/bundle/skills/agentera/capabilities/build/schemas/artifacts.yaml +11 -6
  14. package/bundle/skills/agentera/capabilities/discuss/schemas/artifacts.yaml +3 -2
  15. package/bundle/skills/agentera/capabilities/document/schemas/artifacts.yaml +15 -8
  16. package/bundle/skills/agentera/capabilities/document/schemas/validation.yaml +13 -13
  17. package/bundle/skills/agentera/capabilities/orchestrate/schemas/artifacts.yaml +15 -9
  18. package/bundle/skills/agentera/references/contract.md +65 -23
  19. package/bundle/skills/agentera/schemas/artifacts/decisions.yaml +15 -10
  20. package/bundle/skills/agentera/schemas/artifacts/experiments.yaml +134 -3
  21. package/bundle/skills/agentera/schemas/artifacts/health.yaml +16 -10
  22. package/bundle/skills/agentera/schemas/artifacts/objective.yaml +18 -4
  23. package/bundle/skills/agentera/schemas/artifacts/plan.yaml +23 -1
  24. package/bundle/skills/agentera/schemas/artifacts/progress.yaml +16 -10
  25. package/bundle/skills/agentera/schemas/artifacts/todo.yaml +34 -0
  26. package/dist/capabilities/audit/instructions.js +1 -1
  27. package/dist/capabilities/audit/instructions.js.map +1 -1
  28. package/dist/capabilities/build/instructions.js +1 -1
  29. package/dist/capabilities/build/instructions.js.map +1 -1
  30. package/dist/capabilities/discuss/instructions.js +1 -1
  31. package/dist/capabilities/discuss/instructions.js.map +1 -1
  32. package/dist/capabilities/document/instructions.js +1 -1
  33. package/dist/capabilities/document/instructions.js.map +1 -1
  34. package/dist/capabilities/optimize/instructions.js +1 -1
  35. package/dist/capabilities/optimize/instructions.js.map +1 -1
  36. package/dist/capabilities/orchestrate/instructions.js +1 -1
  37. package/dist/capabilities/orchestrate/instructions.js.map +1 -1
  38. package/dist/capabilities/plan/instructions.js +1 -1
  39. package/dist/capabilities/plan/instructions.js.map +1 -1
  40. package/dist/capabilities/profile/instructions.js +1 -1
  41. package/dist/capabilities/profile/instructions.js.map +1 -1
  42. package/dist/capabilities/vision/instructions.js +1 -1
  43. package/dist/capabilities/vision/instructions.js.map +1 -1
  44. package/dist/cli/appContext.js +14 -6
  45. package/dist/cli/appContext.js.map +1 -1
  46. package/dist/cli/capabilityContext/bespoke.js +3 -1
  47. package/dist/cli/capabilityContext/bespoke.js.map +1 -1
  48. package/dist/cli/capabilityContext/build.js +5 -4
  49. package/dist/cli/capabilityContext/build.js.map +1 -1
  50. package/dist/cli/capabilityContext/closeout.js +2 -1
  51. package/dist/cli/capabilityContext/closeout.js.map +1 -1
  52. package/dist/cli/capabilityContext/contract.js +29 -0
  53. package/dist/cli/capabilityContext/contract.js.map +1 -1
  54. package/dist/cli/capabilityContext/evidence.js +21 -20
  55. package/dist/cli/capabilityContext/evidence.js.map +1 -1
  56. package/dist/cli/capabilityContext/orchestration.js +3 -2
  57. package/dist/cli/capabilityContext/orchestration.js.map +1 -1
  58. package/dist/cli/capabilityContext/progress.js +9 -4
  59. package/dist/cli/capabilityContext/progress.js.map +1 -1
  60. package/dist/cli/capabilityContext/slim.js +37 -6
  61. package/dist/cli/capabilityContext/slim.js.map +1 -1
  62. package/dist/cli/capabilityContext/startup.js +30 -6
  63. package/dist/cli/capabilityContext/startup.js.map +1 -1
  64. package/dist/cli/capabilityContext/types.js +14 -4
  65. package/dist/cli/capabilityContext/types.js.map +1 -1
  66. package/dist/cli/commands/backfill.js +194 -0
  67. package/dist/cli/commands/backfill.js.map +1 -0
  68. package/dist/cli/commands/compact.js +40 -11
  69. package/dist/cli/commands/compact.js.map +1 -1
  70. package/dist/cli/commands/durability.js +85 -0
  71. package/dist/cli/commands/durability.js.map +1 -0
  72. package/dist/cli/commands/migrate.js +677 -0
  73. package/dist/cli/commands/migrate.js.map +1 -0
  74. package/dist/cli/commands/prime/collectOrientationState.js +23 -0
  75. package/dist/cli/commands/prime/collectOrientationState.js.map +1 -1
  76. package/dist/cli/commands/prime/orientationOutput.js +4 -2
  77. package/dist/cli/commands/prime/orientationOutput.js.map +1 -1
  78. package/dist/cli/commands/query.js +20 -2
  79. package/dist/cli/commands/query.js.map +1 -1
  80. package/dist/cli/commands/schema.js +247 -69
  81. package/dist/cli/commands/schema.js.map +1 -1
  82. package/dist/cli/commands/state/decisions.js +28 -10
  83. package/dist/cli/commands/state/decisions.js.map +1 -1
  84. package/dist/cli/commands/state/experimentRecords.js +156 -0
  85. package/dist/cli/commands/state/experimentRecords.js.map +1 -0
  86. package/dist/cli/commands/state/get.js +141 -0
  87. package/dist/cli/commands/state/get.js.map +1 -0
  88. package/dist/cli/commands/state/index.js +2 -2
  89. package/dist/cli/commands/state/index.js.map +1 -1
  90. package/dist/cli/commands/state/list.js +159 -0
  91. package/dist/cli/commands/state/list.js.map +1 -0
  92. package/dist/cli/commands/state/plan.js +146 -41
  93. package/dist/cli/commands/state/plan.js.map +1 -1
  94. package/dist/cli/commands/state/planTasks.js +164 -0
  95. package/dist/cli/commands/state/planTasks.js.map +1 -0
  96. package/dist/cli/commands/state/plans.js +154 -0
  97. package/dist/cli/commands/state/plans.js.map +1 -0
  98. package/dist/cli/commands/state/write.js +8 -3
  99. package/dist/cli/commands/state/write.js.map +1 -1
  100. package/dist/cli/dispatch/check.js +71 -4
  101. package/dist/cli/dispatch/check.js.map +1 -1
  102. package/dist/cli/dispatch/index.js +48 -30
  103. package/dist/cli/dispatch/index.js.map +1 -1
  104. package/dist/cli/dispatch/lifecycle.js +4 -4
  105. package/dist/cli/dispatch/lifecycle.js.map +1 -1
  106. package/dist/cli/dispatch/state.js +23 -3
  107. package/dist/cli/dispatch/state.js.map +1 -1
  108. package/dist/cli/errors.js +13 -14
  109. package/dist/cli/errors.js.map +1 -1
  110. package/dist/cli/help.js +162 -3
  111. package/dist/cli/help.js.map +1 -1
  112. package/dist/cli/orientation.js +146 -34
  113. package/dist/cli/orientation.js.map +1 -1
  114. package/dist/cli/planArtifacts.js +31 -2
  115. package/dist/cli/planArtifacts.js.map +1 -1
  116. package/dist/cli/prime-blob.js +1 -0
  117. package/dist/cli/prime-blob.js.map +1 -1
  118. package/dist/cli/startupCompletenessContract.js +3 -2
  119. package/dist/cli/startupCompletenessContract.js.map +1 -1
  120. package/dist/cli/stateQuery.js +5 -3
  121. package/dist/cli/stateQuery.js.map +1 -1
  122. package/dist/core/text.js +11 -0
  123. package/dist/core/text.js.map +1 -0
  124. package/dist/hooks/compaction/apply.js +224 -46
  125. package/dist/hooks/compaction/apply.js.map +1 -1
  126. package/dist/hooks/compaction/dryRun.js +2 -0
  127. package/dist/hooks/compaction/dryRun.js.map +1 -1
  128. package/dist/hooks/compaction/index.js +4 -4
  129. package/dist/hooks/compaction/index.js.map +1 -1
  130. package/dist/hooks/compaction/parse.js +73 -5
  131. package/dist/hooks/compaction/parse.js.map +1 -1
  132. package/dist/hooks/compaction/retention.js +22 -21
  133. package/dist/hooks/compaction/retention.js.map +1 -1
  134. package/dist/hooks/compaction/status.js +116 -23
  135. package/dist/hooks/compaction/status.js.map +1 -1
  136. package/dist/hooks/sessionStart.js +39 -7
  137. package/dist/hooks/sessionStart.js.map +1 -1
  138. package/dist/hooks/validateArtifact/index.js +2 -2
  139. package/dist/hooks/validateArtifact/index.js.map +1 -1
  140. package/dist/hooks/validateArtifact/markdown.js +9 -9
  141. package/dist/hooks/validateArtifact/markdown.js.map +1 -1
  142. package/dist/hooks/validateArtifact/traversal.js +11 -9
  143. package/dist/hooks/validateArtifact/traversal.js.map +1 -1
  144. package/dist/registries/artifactRegistry.js +147 -44
  145. package/dist/registries/artifactRegistry.js.map +1 -1
  146. package/dist/release/releaseMetadata.js +95 -1
  147. package/dist/release/releaseMetadata.js.map +1 -1
  148. package/dist/state/archiveDiscovery.js +589 -0
  149. package/dist/state/archiveDiscovery.js.map +1 -0
  150. package/dist/state/archivePublication.js +225 -0
  151. package/dist/state/archivePublication.js.map +1 -0
  152. package/dist/state/archiveRecovery.js +238 -0
  153. package/dist/state/archiveRecovery.js.map +1 -0
  154. package/dist/state/archiveReplay.js +54 -0
  155. package/dist/state/archiveReplay.js.map +1 -0
  156. package/dist/state/decisionOverlay.js +255 -0
  157. package/dist/state/decisionOverlay.js.map +1 -0
  158. package/dist/state/directRetrieval.js +322 -0
  159. package/dist/state/directRetrieval.js.map +1 -0
  160. package/dist/state/durability.js +451 -0
  161. package/dist/state/durability.js.map +1 -0
  162. package/dist/state/experimentArchive.js +64 -0
  163. package/dist/state/experimentArchive.js.map +1 -0
  164. package/dist/state/experimentIdentity.js +191 -0
  165. package/dist/state/experimentIdentity.js.map +1 -0
  166. package/dist/state/experimentRetrieval.js +447 -0
  167. package/dist/state/experimentRetrieval.js.map +1 -0
  168. package/dist/state/gitBackfill.js +561 -0
  169. package/dist/state/gitBackfill.js.map +1 -0
  170. package/dist/state/gitBackfillAuthority.js +141 -0
  171. package/dist/state/gitBackfillAuthority.js.map +1 -0
  172. package/dist/state/gitBackfillHistory.js +278 -0
  173. package/dist/state/gitBackfillHistory.js.map +1 -0
  174. package/dist/state/gitBackfillOutput.js +209 -0
  175. package/dist/state/gitBackfillOutput.js.map +1 -0
  176. package/dist/state/healthRepair.js +70 -0
  177. package/dist/state/healthRepair.js.map +1 -0
  178. package/dist/state/legacyIdentity.js +48 -0
  179. package/dist/state/legacyIdentity.js.map +1 -0
  180. package/dist/state/legacyMigration.js +516 -0
  181. package/dist/state/legacyMigration.js.map +1 -0
  182. package/dist/state/legacyMigrationParser.js +489 -0
  183. package/dist/state/legacyMigrationParser.js.map +1 -0
  184. package/dist/state/listAccounting.js +55 -0
  185. package/dist/state/listAccounting.js.map +1 -0
  186. package/dist/state/listClassification.js +18 -0
  187. package/dist/state/listClassification.js.map +1 -0
  188. package/dist/state/listRetrieval.js +782 -0
  189. package/dist/state/listRetrieval.js.map +1 -0
  190. package/dist/state/migrationAuthority.js +413 -0
  191. package/dist/state/migrationAuthority.js.map +1 -0
  192. package/dist/state/migrationEnrichment.js +35 -0
  193. package/dist/state/migrationEnrichment.js.map +1 -0
  194. package/dist/state/planIdentity.js +45 -0
  195. package/dist/state/planIdentity.js.map +1 -0
  196. package/dist/state/planRetrieval.js +314 -0
  197. package/dist/state/planRetrieval.js.map +1 -0
  198. package/dist/state/planTaskRetrieval.js +285 -0
  199. package/dist/state/planTaskRetrieval.js.map +1 -0
  200. package/dist/state/projectionPolicy.js +184 -0
  201. package/dist/state/projectionPolicy.js.map +1 -0
  202. package/dist/state/retrievalAuthority.js +326 -0
  203. package/dist/state/retrievalAuthority.js.map +1 -0
  204. package/dist/state/startupProjection.js +498 -0
  205. package/dist/state/startupProjection.js.map +1 -0
  206. package/dist/state/write/experimentPublication.js +193 -0
  207. package/dist/state/write/experimentPublication.js.map +1 -0
  208. package/dist/state/write/explain.js +28 -14
  209. package/dist/state/write/explain.js.map +1 -1
  210. package/dist/state/write/helpers.js +8 -0
  211. package/dist/state/write/helpers.js.map +1 -0
  212. package/dist/state/write/index.js +1 -0
  213. package/dist/state/write/index.js.map +1 -1
  214. package/dist/state/write/lock.js +24 -1
  215. package/dist/state/write/lock.js.map +1 -1
  216. package/dist/state/write/mutation.js +190 -0
  217. package/dist/state/write/mutation.js.map +1 -0
  218. package/dist/state/write/operations.js +36 -2
  219. package/dist/state/write/operations.js.map +1 -1
  220. package/dist/state/write/planPublication.js +172 -0
  221. package/dist/state/write/planPublication.js.map +1 -0
  222. package/dist/state/write/transaction.js +238 -225
  223. package/dist/state/write/transaction.js.map +1 -1
  224. package/dist/upgrade/migrateArtifactsV2ToV3.js +2 -2
  225. package/dist/upgrade/migrateArtifactsV2ToV3.js.map +1 -1
  226. package/dist/validate/crossCapability.js +9 -6
  227. package/dist/validate/crossCapability.js.map +1 -1
  228. package/package.json +2 -2
@@ -0,0 +1,451 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { spawnSync } from "node:child_process";
4
+ import { resolvePath } from "../core/paths.js";
5
+ import { resolveSourceRoot } from "../core/sourceRoot.js";
6
+ import { discoverNumberedArchives, numberedArchiveContract, stateDurabilityContract, } from "./archiveDiscovery.js";
7
+ const GIT_TIMEOUT_MS = 1_000;
8
+ const GIT_MAX_BUFFER = 2 * 1024 * 1024;
9
+ const REFLOG_LIMIT = "32";
10
+ function defaultGitRunner(args, cwd) {
11
+ const result = spawnSync("git", args, {
12
+ cwd,
13
+ encoding: "utf8",
14
+ timeout: GIT_TIMEOUT_MS,
15
+ maxBuffer: GIT_MAX_BUFFER,
16
+ shell: false,
17
+ windowsHide: true,
18
+ });
19
+ return {
20
+ status: result.status,
21
+ stdout: typeof result.stdout === "string" ? result.stdout : "",
22
+ timedOut: result.error?.code === "ETIMEDOUT" || result.signal === "SIGTERM",
23
+ ...(result.error?.code
24
+ ? { error: result.error.code }
25
+ : {}),
26
+ };
27
+ }
28
+ function successful(result) {
29
+ return result.status === 0 && !result.timedOut && !result.error;
30
+ }
31
+ function probeFailure(result, fallback) {
32
+ if (result.timedOut)
33
+ return "git_probe_timeout";
34
+ if (result.error || result.status === null)
35
+ return "git_probe_error";
36
+ return fallback;
37
+ }
38
+ function commandOutput(run, args, cwd) {
39
+ const result = run(args, cwd);
40
+ if (successful(result) && result.stdout.trim())
41
+ return { value: result.stdout.trim(), reason: "available" };
42
+ return { reason: probeFailure(result, "git_probe_error") };
43
+ }
44
+ function hasGitMetadata(projectRoot) {
45
+ let current = path.resolve(projectRoot);
46
+ for (;;) {
47
+ try {
48
+ fs.lstatSync(path.join(current, ".git"));
49
+ return true;
50
+ }
51
+ catch (error) {
52
+ if (error.code !== "ENOENT")
53
+ return true;
54
+ }
55
+ const parent = path.dirname(current);
56
+ if (parent === current)
57
+ return false;
58
+ current = parent;
59
+ }
60
+ }
61
+ function readHead(run, root) {
62
+ const result = run(["rev-parse", "--verify", "HEAD^{commit}"], root);
63
+ if (successful(result) && result.stdout.trim())
64
+ return { value: result.stdout.trim(), reason: "stable" };
65
+ return { reason: probeFailure(result, "missing_commit") };
66
+ }
67
+ function gitContext(projectRoot, run) {
68
+ if (!hasGitMetadata(projectRoot)) {
69
+ return { available: false, reason: "non_git", beforeReason: "non_git", shallow: false, run };
70
+ }
71
+ const inside = commandOutput(run, ["rev-parse", "--is-inside-work-tree"], projectRoot);
72
+ if (!inside.value || inside.value !== "true") {
73
+ const reason = inside.value ? "git_unavailable" : inside.reason;
74
+ return {
75
+ available: false,
76
+ reason,
77
+ beforeReason: reason,
78
+ shallow: false,
79
+ run,
80
+ };
81
+ }
82
+ const rootValue = commandOutput(run, ["rev-parse", "--show-toplevel"], projectRoot);
83
+ if (!rootValue.value) {
84
+ return {
85
+ available: false,
86
+ reason: rootValue.reason,
87
+ beforeReason: rootValue.reason,
88
+ shallow: false,
89
+ run,
90
+ };
91
+ }
92
+ const root = resolvePath(rootValue.value);
93
+ const beforeProbe = readHead(run, root);
94
+ const shallowProbe = commandOutput(run, ["rev-parse", "--is-shallow-repository"], root);
95
+ const probeIssue = shallowProbe.reason === "available" ? undefined : shallowProbe.reason;
96
+ return {
97
+ available: true,
98
+ reason: beforeProbe.value ? "available" : beforeProbe.reason,
99
+ root,
100
+ ...(beforeProbe.value ? { before: beforeProbe.value } : {}),
101
+ beforeReason: beforeProbe.reason,
102
+ ...(probeIssue ? { probeIssue } : {}),
103
+ shallow: shallowProbe.value === "true",
104
+ run,
105
+ };
106
+ }
107
+ function gitRelativePath(target, root) {
108
+ const relative = path.relative(root, target);
109
+ if (!relative || relative.startsWith(".." + path.sep) || path.isAbsolute(relative))
110
+ return undefined;
111
+ return relative.split(path.sep).join("/");
112
+ }
113
+ function statusForPath(context, relative) {
114
+ if (!context.root)
115
+ return undefined;
116
+ const result = context.run(["status", "--porcelain=v1", "--untracked-files=all", "--", relative], context.root);
117
+ return successful(result) ? result.stdout.trim() : undefined;
118
+ }
119
+ function blobAtHead(context, relative, head) {
120
+ if (!context.root)
121
+ return undefined;
122
+ const result = context.run(["cat-file", "-p", `${head}:${relative}`], context.root);
123
+ return successful(result) ? result.stdout : undefined;
124
+ }
125
+ function historyWasRewritten(context, relative, bytes, head) {
126
+ if (!context.root)
127
+ return false;
128
+ const reflog = context.run(["reflog", "show", `--format=%H%x09%gs`, "--max-count", REFLOG_LIMIT, "HEAD"], context.root);
129
+ if (!successful(reflog))
130
+ return false;
131
+ for (const line of reflog.stdout.split(/\r?\n/)) {
132
+ const match = /^([0-9a-f]{40})\t/.exec(line);
133
+ if (!match || match[1] === head)
134
+ continue;
135
+ const prior = blobAtHead(context, relative, match[1]);
136
+ if (prior !== bytes)
137
+ continue;
138
+ const ancestor = context.run(["merge-base", "--is-ancestor", match[1], head], context.root);
139
+ if (ancestor.status === 1 && !ancestor.timedOut)
140
+ return true;
141
+ }
142
+ return false;
143
+ }
144
+ function archiveTarget(projectRoot, contract, artifactId, entryNumber) {
145
+ return path.resolve(projectRoot, contract.archiveRoot, artifactId, `${entryNumber}${contract.archiveExtension}`);
146
+ }
147
+ function selectedCandidate(projectRoot, contract, artifactId, entryNumber, discovery) {
148
+ const target = archiveTarget(projectRoot, contract, artifactId, entryNumber);
149
+ const entry = discovery.entries.find((candidate) => candidate.path === target);
150
+ if (entry) {
151
+ try {
152
+ return {
153
+ path: target,
154
+ stableId: entry.stableId,
155
+ artifactId,
156
+ entryNumber,
157
+ local: "verified",
158
+ bytes: fs.readFileSync(target, "utf8"),
159
+ };
160
+ }
161
+ catch (error) {
162
+ return {
163
+ path: target,
164
+ stableId: `${artifactId}:${entryNumber}`,
165
+ artifactId,
166
+ entryNumber,
167
+ local: "corrupt",
168
+ localMessage: `cannot read validated archive: ${error.message}`,
169
+ };
170
+ }
171
+ }
172
+ const rejection = discovery.rejected.find((candidate) => path.resolve(candidate.path) === target);
173
+ if (rejection) {
174
+ return {
175
+ path: target,
176
+ stableId: `${artifactId}:${entryNumber}`,
177
+ artifactId,
178
+ entryNumber,
179
+ local: "corrupt",
180
+ localMessage: rejection.message,
181
+ };
182
+ }
183
+ return {
184
+ path: target,
185
+ stableId: `${artifactId}:${entryNumber}`,
186
+ artifactId,
187
+ entryNumber,
188
+ local: "unavailable",
189
+ };
190
+ }
191
+ function diagnosticsFor(candidate, git) {
192
+ const diagnostics = [];
193
+ if (candidate.local === "unavailable") {
194
+ diagnostics.push({
195
+ class: "local_recovery_unavailable",
196
+ message: `${candidate.stableId} has no validated local archive record`,
197
+ recovery: "Restore or publish the numbered archive locally; committed recovery is reported separately.",
198
+ });
199
+ }
200
+ else if (candidate.local === "corrupt") {
201
+ diagnostics.push({
202
+ class: "local_archive_corrupt",
203
+ message: candidate.localMessage ?? `${candidate.stableId} is not a valid local archive record`,
204
+ recovery: "Preserve the archive bytes, repair the numbered record, and rerun the read-only check.",
205
+ });
206
+ }
207
+ if (git.status !== "verified") {
208
+ diagnostics.push({
209
+ class: git.reason,
210
+ message: `${candidate.stableId} has no verified committed recovery (${git.reason})`,
211
+ recovery: "Treat local archive evidence as authoritative and do not require Git for state writes.",
212
+ });
213
+ }
214
+ return diagnostics;
215
+ }
216
+ function entryStatus(local, git) {
217
+ if (local === "verified" && (git.status === "verified" || git.reason === "non_git"))
218
+ return "complete";
219
+ if (local === "unavailable" && git.status === "unavailable")
220
+ return "unavailable";
221
+ if (local === "corrupt" && git.status === "unavailable")
222
+ return "unavailable";
223
+ return "degraded";
224
+ }
225
+ function buildGitEvidence(candidate, context, afterHead, headChanged) {
226
+ if (!context.available) {
227
+ return { status: "unavailable", reason: context.reason, reachableRecovery: false };
228
+ }
229
+ if (context.probeIssue) {
230
+ return { status: "unavailable", reason: context.probeIssue, reachableRecovery: false };
231
+ }
232
+ if (!context.before || !afterHead) {
233
+ return { status: "unavailable", reason: context.beforeReason, reachableRecovery: false };
234
+ }
235
+ if (headChanged)
236
+ return { status: "degraded", reason: "changed_head", reachableRecovery: false };
237
+ const relative = context.root ? gitRelativePath(candidate.path, context.root) : undefined;
238
+ if (!relative)
239
+ return { status: "unavailable", reason: "project_boundary", reachableRecovery: false };
240
+ const workingTreeStatus = statusForPath(context, relative);
241
+ if (workingTreeStatus === undefined) {
242
+ return { status: "unavailable", reason: "git_unavailable", reachableRecovery: false };
243
+ }
244
+ const committedBytes = blobAtHead(context, relative, context.before);
245
+ const reachable = committedBytes !== undefined;
246
+ if (candidate.local !== "unavailable" && candidate.bytes !== undefined && committedBytes === candidate.bytes) {
247
+ if (workingTreeStatus !== "") {
248
+ return { status: "degraded", reason: "dirty_archive", reachableRecovery: true };
249
+ }
250
+ if (context.shallow)
251
+ return { status: "degraded", reason: "shallow_history", reachableRecovery: true };
252
+ return { status: "verified", reason: "reachable_head", reachableRecovery: true };
253
+ }
254
+ if (candidate.local === "unavailable" && reachable) {
255
+ return { status: "verified", reason: "reachable_head", reachableRecovery: true };
256
+ }
257
+ if (candidate.bytes !== undefined &&
258
+ historyWasRewritten(context, relative, candidate.bytes, context.before)) {
259
+ return { status: "degraded", reason: "history_rewritten", reachableRecovery: false };
260
+ }
261
+ if (context.shallow)
262
+ return { status: "degraded", reason: "shallow_history", reachableRecovery: reachable };
263
+ if (workingTreeStatus !== "")
264
+ return { status: "degraded", reason: "dirty_archive", reachableRecovery: reachable };
265
+ return { status: "unavailable", reason: reachable ? "committed_content_mismatch" : "not_committed", reachableRecovery: reachable };
266
+ }
267
+ function orderedCandidates(projectRoot, contract, artifact, number, limit, sourceRoot) {
268
+ const discovery = discoverNumberedArchives(projectRoot, { sourceRoot, artifactId: artifact ?? undefined });
269
+ if (artifact && number !== undefined) {
270
+ return { candidates: [selectedCandidate(projectRoot, contract, artifact, number, discovery)], rejected: [], discovered: 1 };
271
+ }
272
+ const candidates = discovery.entries
273
+ .filter((entry) => !artifact || entry.artifactId === artifact)
274
+ .map((entry) => {
275
+ try {
276
+ return {
277
+ path: entry.path,
278
+ stableId: entry.stableId,
279
+ artifactId: entry.artifactId,
280
+ entryNumber: entry.entryNumber,
281
+ local: "verified",
282
+ bytes: fs.readFileSync(entry.path, "utf8"),
283
+ };
284
+ }
285
+ catch (error) {
286
+ return {
287
+ path: entry.path,
288
+ stableId: entry.stableId,
289
+ artifactId: entry.artifactId,
290
+ entryNumber: entry.entryNumber,
291
+ local: "corrupt",
292
+ localMessage: `cannot read validated archive: ${error.message}`,
293
+ };
294
+ }
295
+ });
296
+ candidates.sort((a, b) => a.artifactId.localeCompare(b.artifactId) || b.entryNumber - a.entryNumber);
297
+ return {
298
+ candidates: candidates.slice(0, limit),
299
+ rejected: discovery.rejected,
300
+ discovered: candidates.length,
301
+ };
302
+ }
303
+ export function inspectDurability(project, args = {}, options = {}) {
304
+ const sourceRoot = options.sourceRoot ?? resolveSourceRoot();
305
+ const contract = stateDurabilityContract(sourceRoot);
306
+ const projectRoot = resolvePath(project);
307
+ const run = options.runGit ?? defaultGitRunner;
308
+ const git = gitContext(projectRoot, run);
309
+ const artifact = args.artifact ?? null;
310
+ const number = args.number;
311
+ const limit = args.limit ?? contract.defaultLimit;
312
+ if (!Number.isSafeInteger(limit) || limit < 1 || limit > contract.maximumLimit) {
313
+ throw new Error(`durability limit must be between 1 and ${contract.maximumLimit}`);
314
+ }
315
+ if (number !== undefined && (!Number.isSafeInteger(number) || number < 1)) {
316
+ throw new Error("durability number must be a positive integer");
317
+ }
318
+ const archiveContract = artifact
319
+ ? numberedArchiveContract(artifact, sourceRoot)
320
+ : undefined;
321
+ const fallbackContract = archiveContract ?? numberedArchiveContract("progress", sourceRoot);
322
+ const selected = orderedCandidates(projectRoot, fallbackContract, artifact, number, limit, sourceRoot);
323
+ const entries = [];
324
+ const diagnostics = [];
325
+ for (const candidate of selected.candidates) {
326
+ const evidence = buildGitEvidence(candidate, git, git.before, false);
327
+ const status = entryStatus(candidate.local, evidence);
328
+ entries.push({
329
+ stable_id: candidate.stableId,
330
+ artifact_id: candidate.artifactId,
331
+ entry_number: candidate.entryNumber,
332
+ status,
333
+ local: {
334
+ status: candidate.local,
335
+ detail_availability: candidate.local === "verified" ? "full" : "unavailable",
336
+ ...(candidate.localMessage ? { message: candidate.localMessage } : {}),
337
+ },
338
+ git: {
339
+ status: evidence.status,
340
+ reason: evidence.reason,
341
+ reachable_recovery: evidence.reachableRecovery,
342
+ },
343
+ });
344
+ diagnostics.push(...diagnosticsFor(candidate, evidence));
345
+ }
346
+ const ending = git.available && git.root ? readHead(run, git.root) : undefined;
347
+ const after = ending?.value;
348
+ const headChanged = Boolean(git.before && after && git.before !== after);
349
+ const finalHeadUnavailable = Boolean(git.available && git.before && !after);
350
+ if (finalHeadUnavailable) {
351
+ for (const entry of entries) {
352
+ entry.status = "degraded";
353
+ entry.git = { status: "degraded", reason: "final_head_unavailable", reachable_recovery: false };
354
+ }
355
+ diagnostics.push({
356
+ class: "final_head_unavailable",
357
+ message: "repository HEAD could not be captured after the read-only durability check",
358
+ recovery: "Retry the diagnostic after repository activity stops; no committed recovery was claimed.",
359
+ });
360
+ }
361
+ if (headChanged && !finalHeadUnavailable) {
362
+ for (const entry of entries) {
363
+ entry.status = "degraded";
364
+ entry.git = { status: "degraded", reason: "changed_head", reachable_recovery: false };
365
+ }
366
+ diagnostics.push({
367
+ class: "changed_head",
368
+ message: "repository HEAD changed during the read-only durability check",
369
+ recovery: "Retry the diagnostic after repository activity stops; no state was changed.",
370
+ });
371
+ }
372
+ if (selected.candidates.length === 0) {
373
+ diagnostics.push({
374
+ class: "local_recovery_unavailable",
375
+ message: "no numbered archive records matched the durability selection",
376
+ recovery: "Publish or restore a validated numbered archive, then rerun the check.",
377
+ });
378
+ }
379
+ for (const rejection of selected.rejected) {
380
+ if (!artifact || rejection.path.includes(`${path.sep}${artifact}${path.sep}`)) {
381
+ diagnostics.push({
382
+ class: rejection.reason,
383
+ message: rejection.message,
384
+ recovery: "Preserve the bytes, repair the affected archive record, and rerun the read-only check.",
385
+ });
386
+ }
387
+ }
388
+ diagnostics.sort((a, b) => a.class.localeCompare(b.class) || a.message.localeCompare(b.message));
389
+ const localVerified = entries.filter((entry) => entry.local.status === "verified").length;
390
+ const localUnavailable = entries.filter((entry) => entry.local.status === "unavailable").length;
391
+ const localCorrupt = entries.filter((entry) => entry.local.status === "corrupt").length;
392
+ const reachableRecovery = entries.filter((entry) => entry.git.reachable_recovery).length;
393
+ const statuses = entries.map((entry) => entry.status);
394
+ let status;
395
+ if (entries.length === 0 || statuses.every((value) => value === "unavailable"))
396
+ status = "unavailable";
397
+ else if (statuses.some((value) => value === "degraded" || value === "unavailable"))
398
+ status = "degraded";
399
+ else
400
+ status = "complete";
401
+ const headStatus = !git.available || !git.before || !after
402
+ ? "unavailable"
403
+ : headChanged
404
+ ? "changed"
405
+ : "stable";
406
+ return {
407
+ command: contract.command,
408
+ status,
409
+ project: projectRoot,
410
+ read_only: true,
411
+ remote_contact: false,
412
+ head: { status: headStatus },
413
+ counts: {
414
+ discovered: selected.discovered,
415
+ returned: entries.length,
416
+ local_verified: localVerified,
417
+ local_unavailable: localUnavailable,
418
+ local_corrupt: localCorrupt,
419
+ reachable_recovery: reachableRecovery,
420
+ },
421
+ entries,
422
+ diagnostics,
423
+ source_contract: {
424
+ syntax: contract.command,
425
+ status_values: contract.statusValues,
426
+ local_values: contract.localValues,
427
+ git_values: contract.gitValues,
428
+ read_only: true,
429
+ remote_contact: false,
430
+ writes_independent: true,
431
+ },
432
+ };
433
+ }
434
+ export function renderDurabilityText(response, out) {
435
+ out(`status=${response.status} | project=${response.project} | head=${response.head.status}\n`);
436
+ out(`counts=discovered:${response.counts.discovered} returned:${response.counts.returned} ` +
437
+ `local_verified:${response.counts.local_verified} local_unavailable:${response.counts.local_unavailable} ` +
438
+ `local_corrupt:${response.counts.local_corrupt} reachable_recovery:${response.counts.reachable_recovery}\n`);
439
+ for (const entry of response.entries) {
440
+ out(`- ${entry.stable_id} | status=${entry.status} | local=${entry.local.status} ` +
441
+ `| git=${entry.git.status} | reason=${entry.git.reason} | ` +
442
+ `reachable_recovery=${entry.git.reachable_recovery}\n`);
443
+ }
444
+ for (const diagnostic of response.diagnostics) {
445
+ out(`diagnostic=${diagnostic.class} | ${diagnostic.message}\n`);
446
+ }
447
+ }
448
+ export function durabilityAuthority(sourceRoot) {
449
+ return stateDurabilityContract(sourceRoot);
450
+ }
451
+ //# sourceMappingURL=durability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"durability.js","sourceRoot":"","sources":["../../src/state/durability.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ import { createHash } from "node:crypto";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { dumpYamlMapping } from "../core/yaml.js";
5
+ import { assertRealpathBoundary } from "../registries/artifactRegistry.js";
6
+ import { canonicalRecordJson } from "./archiveDiscovery.js";
7
+ import { reject } from "./write/errors.js";
8
+ const AUTHORITY = "references/artifacts/state-storage-authority.yaml";
9
+ export function prepareExperimentArchive(projectRoot, objectivePath, objectiveId, experimentNumber, record) {
10
+ if (record.number !== experimentNumber)
11
+ throw new Error(`experiment archive record number must equal ${experimentNumber}`);
12
+ const stableId = `${objectiveId}/experiment:${experimentNumber}`;
13
+ const target = path.join(path.dirname(objectivePath), "archive", "experiments", `${experimentNumber}.yaml`);
14
+ assertRealpathBoundary(projectRoot, target, "experiment archive");
15
+ const canonical = canonicalRecordJson(record);
16
+ const recordSha256 = createHash("sha256").update(canonical, "utf8").digest("hex");
17
+ const provenance = {
18
+ authority: AUTHORITY,
19
+ objective_id: objectiveId,
20
+ experiment_id: stableId,
21
+ storage_scope: "objective_directory",
22
+ publication_order: "archive_before_projection",
23
+ };
24
+ const envelope = {
25
+ schemaVersion: "agentera.experimentArchive.v1",
26
+ stable_id: stableId,
27
+ objective_id: objectiveId,
28
+ experiment_number: experimentNumber,
29
+ record,
30
+ record_sha256: recordSha256,
31
+ provenance,
32
+ };
33
+ return {
34
+ target,
35
+ directoryDurabilityRoot: path.dirname(objectivePath),
36
+ bytes: dumpYamlMapping(envelope),
37
+ stableId,
38
+ recordSha256,
39
+ provenance,
40
+ };
41
+ }
42
+ export function assertExperimentArchiveReplay(publication) {
43
+ let existing;
44
+ try {
45
+ existing = fs.readFileSync(publication.target);
46
+ }
47
+ catch {
48
+ reject({
49
+ class: "conflict",
50
+ message: `immutable experiment archive '${publication.target}' could not be read; existing state was preserved`,
51
+ violations: [`immutable archive identity: ${publication.stableId}`],
52
+ recovery: "Repair the unreadable archive record before retrying publication.",
53
+ });
54
+ }
55
+ if (existing.equals(Buffer.from(publication.bytes, "utf8")))
56
+ return;
57
+ reject({
58
+ class: "conflict",
59
+ message: `immutable experiment archive '${publication.target}' already exists with different bytes; existing archive and projection were preserved`,
60
+ violations: [`immutable archive identity: ${publication.stableId}`],
61
+ recovery: "Retry only with the byte-equivalent experiment record for this stable identity.",
62
+ });
63
+ }
64
+ //# sourceMappingURL=experimentArchive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"experimentArchive.js","sourceRoot":"","sources":["../../src/state/experimentArchive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,MAAM,SAAS,GAAG,mDAAmD,CAAC;AAWtE,MAAM,UAAU,wBAAwB,CACtC,WAAmB,EACnB,aAAqB,EACrB,WAAmB,EACnB,gBAAwB,EACxB,MAAkB;IAElB,IAAI,MAAM,CAAC,MAAM,KAAK,gBAAgB;QACpC,MAAM,IAAI,KAAK,CAAC,+CAA+C,gBAAgB,EAAE,CAAC,CAAC;IACrF,MAAM,QAAQ,GAAG,GAAG,WAAW,eAAe,gBAAgB,EAAE,CAAC;IACjE,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CACtB,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,EAC3B,SAAS,EACT,aAAa,EACb,GAAG,gBAAgB,OAAO,CAC3B,CAAC;IACF,sBAAsB,CAAC,WAAW,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC;IAClE,MAAM,SAAS,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,YAAY,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAClF,MAAM,UAAU,GAAe;QAC7B,SAAS,EAAE,SAAS;QACpB,YAAY,EAAE,WAAW;QACzB,aAAa,EAAE,QAAQ;QACvB,aAAa,EAAE,qBAAqB;QACpC,iBAAiB,EAAE,2BAA2B;KAC/C,CAAC;IACF,MAAM,QAAQ,GAAe;QAC3B,aAAa,EAAE,+BAA+B;QAC9C,SAAS,EAAE,QAAQ;QACnB,YAAY,EAAE,WAAW;QACzB,iBAAiB,EAAE,gBAAgB;QACnC,MAAM;QACN,aAAa,EAAE,YAAY;QAC3B,UAAU;KACX,CAAC;IACF,OAAO;QACL,MAAM;QACN,uBAAuB,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;QACpD,KAAK,EAAE,eAAe,CAAC,QAAQ,CAAC;QAChC,QAAQ;QACR,YAAY;QACZ,UAAU;KACX,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,WAAyC;IACrF,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QACH,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC;YACL,KAAK,EAAE,UAAU;YACjB,OAAO,EAAE,iCAAiC,WAAW,CAAC,MAAM,mDAAmD;YAC/G,UAAU,EAAE,CAAC,+BAA+B,WAAW,CAAC,QAAQ,EAAE,CAAC;YACnE,QAAQ,EAAE,mEAAmE;SAC9E,CAAC,CAAC;IACL,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAAE,OAAO;IACpE,MAAM,CAAC;QACL,KAAK,EAAE,UAAU;QACjB,OAAO,EAAE,iCAAiC,WAAW,CAAC,MAAM,uFAAuF;QACnJ,UAAU,EAAE,CAAC,+BAA+B,WAAW,CAAC,QAAQ,EAAE,CAAC;QACnE,QAAQ,EAAE,iFAAiF;KAC5F,CAAC,CAAC;AACL,CAAC"}