agentera 3.0.0-dev.32 → 3.0.0-dev.39

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 (196) hide show
  1. package/bundle/CHANGELOG.md +75 -5
  2. package/bundle/references/adapters/package-publication.json +43 -0
  3. package/bundle/references/adapters/package-surface-characterization.md +12 -0
  4. package/bundle/references/analysis/evidence-tier-authority.yaml +23 -21
  5. package/bundle/references/analysis/verification-policy.yaml +1 -0
  6. package/bundle/references/artifacts/artifact-registry-interface-model.yaml +11 -2
  7. package/bundle/references/artifacts/glossary-entry-contract.yaml +1241 -0
  8. package/bundle/references/artifacts/state-storage-authority.yaml +149 -80
  9. package/bundle/references/cli/agent-ready-state-contract.yaml +84 -2
  10. package/bundle/references/cli/audience-namespace-cli-migration.yaml +12 -1
  11. package/bundle/references/cli/prime-consumer-compatibility.yaml +7 -1
  12. package/bundle/skills/agentera/SKILL.md +26 -26
  13. package/bundle/skills/agentera/capabilities/audit/schemas/validation.yaml +26 -8
  14. package/bundle/skills/agentera/capabilities/build/schemas/artifacts.yaml +21 -4
  15. package/bundle/skills/agentera/capabilities/build/schemas/exit.yaml +5 -4
  16. package/bundle/skills/agentera/capabilities/build/schemas/validation.yaml +67 -3
  17. package/bundle/skills/agentera/capabilities/discuss/schemas/artifacts.yaml +3 -2
  18. package/bundle/skills/agentera/capabilities/discuss/schemas/validation.yaml +64 -0
  19. package/bundle/skills/agentera/capabilities/plan/schemas/artifacts.yaml +4 -1
  20. package/bundle/skills/agentera/capabilities/plan/schemas/validation.yaml +30 -0
  21. package/bundle/skills/agentera/capabilities/profile/schemas/artifacts.yaml +5 -2
  22. package/bundle/skills/agentera/capabilities/profile/schemas/exit.yaml +3 -2
  23. package/bundle/skills/agentera/capabilities/profile/schemas/validation.yaml +30 -0
  24. package/bundle/skills/agentera/schemas/artifacts/glossary.yaml +82 -0
  25. package/bundle/skills/agentera/schemas/artifacts/plan.yaml +19 -4
  26. package/bundle/skills/agentera/schemas/artifacts/progress.yaml +92 -0
  27. package/dist/analytics/extractCorpus/evidenceTiers.js +46 -3
  28. package/dist/analytics/extractCorpus/evidenceTiers.js.map +1 -1
  29. package/dist/analytics/extractCorpus/tierReader.js +1 -1
  30. package/dist/analytics/extractCorpus/tierReader.js.map +1 -1
  31. package/dist/analytics/glossaryAdviceResolution.js +167 -0
  32. package/dist/analytics/glossaryAdviceResolution.js.map +1 -0
  33. package/dist/analytics/glossaryInputAcquisition.js +320 -0
  34. package/dist/analytics/glossaryInputAcquisition.js.map +1 -0
  35. package/dist/analytics/personalGlossaryAdmission.js +134 -0
  36. package/dist/analytics/personalGlossaryAdmission.js.map +1 -0
  37. package/dist/analytics/personalGlossaryProfile.js +219 -0
  38. package/dist/analytics/personalGlossaryProfile.js.map +1 -0
  39. package/dist/audit/terminologyDrift.js +282 -0
  40. package/dist/audit/terminologyDrift.js.map +1 -0
  41. package/dist/capabilities/audit/instructions.js +2 -1
  42. package/dist/capabilities/audit/instructions.js.map +1 -1
  43. package/dist/capabilities/build/instructions.js +41 -2
  44. package/dist/capabilities/build/instructions.js.map +1 -1
  45. package/dist/capabilities/discuss/instructions.js +14 -1
  46. package/dist/capabilities/discuss/instructions.js.map +1 -1
  47. package/dist/capabilities/index.js +1 -1
  48. package/dist/capabilities/index.js.map +1 -1
  49. package/dist/capabilities/orchestrate/instructions.js +2 -2
  50. package/dist/capabilities/plan/instructions.js +19 -2
  51. package/dist/capabilities/plan/instructions.js.map +1 -1
  52. package/dist/capabilities/profile/instructions.js +67 -1
  53. package/dist/capabilities/profile/instructions.js.map +1 -1
  54. package/dist/cli/capabilityContext/bespoke.js +4 -3
  55. package/dist/cli/capabilityContext/bespoke.js.map +1 -1
  56. package/dist/cli/capabilityContext/build.js +77 -24
  57. package/dist/cli/capabilityContext/build.js.map +1 -1
  58. package/dist/cli/capabilityContext/closeout.js +2 -2
  59. package/dist/cli/capabilityContext/closeout.js.map +1 -1
  60. package/dist/cli/capabilityContext/evidence.js +2 -6
  61. package/dist/cli/capabilityContext/evidence.js.map +1 -1
  62. package/dist/cli/capabilityContext/planState.js +59 -78
  63. package/dist/cli/capabilityContext/planState.js.map +1 -1
  64. package/dist/cli/capabilityContext/projectVerification.js +410 -0
  65. package/dist/cli/capabilityContext/projectVerification.js.map +1 -0
  66. package/dist/cli/capabilityContext/startup.js +21 -4
  67. package/dist/cli/capabilityContext/startup.js.map +1 -1
  68. package/dist/cli/commands/glossaryAdvice.js +139 -0
  69. package/dist/cli/commands/glossaryAdvice.js.map +1 -0
  70. package/dist/cli/commands/personalGlossary.js +177 -0
  71. package/dist/cli/commands/personalGlossary.js.map +1 -0
  72. package/dist/cli/commands/prime/buildExecutionRequest.js +165 -0
  73. package/dist/cli/commands/prime/buildExecutionRequest.js.map +1 -0
  74. package/dist/cli/commands/prime/collectEntityOrientation.js +18 -2
  75. package/dist/cli/commands/prime/collectEntityOrientation.js.map +1 -1
  76. package/dist/cli/commands/prime/collectOrientationState.js +7 -1
  77. package/dist/cli/commands/prime/collectOrientationState.js.map +1 -1
  78. package/dist/cli/commands/prime/orientationOutput.js +12 -2
  79. package/dist/cli/commands/prime/orientationOutput.js.map +1 -1
  80. package/dist/cli/commands/prime.js +37 -2
  81. package/dist/cli/commands/prime.js.map +1 -1
  82. package/dist/cli/commands/profileGrounding.js +77 -0
  83. package/dist/cli/commands/profileGrounding.js.map +1 -0
  84. package/dist/cli/commands/query.js +14 -4
  85. package/dist/cli/commands/query.js.map +1 -1
  86. package/dist/cli/commands/schema.js +10 -0
  87. package/dist/cli/commands/schema.js.map +1 -1
  88. package/dist/cli/commands/state/write.js +4 -1
  89. package/dist/cli/commands/state/write.js.map +1 -1
  90. package/dist/cli/dispatch/lifecycle.js +45 -0
  91. package/dist/cli/dispatch/lifecycle.js.map +1 -1
  92. package/dist/cli/dispatch/prime.js +22 -1
  93. package/dist/cli/dispatch/prime.js.map +1 -1
  94. package/dist/cli/dispatch/shared.js +1 -1
  95. package/dist/cli/dispatch/shared.js.map +1 -1
  96. package/dist/cli/help.js +23 -1
  97. package/dist/cli/help.js.map +1 -1
  98. package/dist/cli/migrationRequired.js +2 -0
  99. package/dist/cli/migrationRequired.js.map +1 -1
  100. package/dist/cli/orientation/attention.js +3 -1
  101. package/dist/cli/orientation/attention.js.map +1 -1
  102. package/dist/cli/orientation.js +2 -2
  103. package/dist/cli/orientation.js.map +1 -1
  104. package/dist/registries/artifactProtocolIds.js +2 -0
  105. package/dist/registries/artifactProtocolIds.js.map +1 -1
  106. package/dist/registries/artifactRegistry.js +2 -0
  107. package/dist/registries/artifactRegistry.js.map +1 -1
  108. package/dist/registries/evidenceTierContract.js +26 -16
  109. package/dist/registries/evidenceTierContract.js.map +1 -1
  110. package/dist/registries/glossaryAdviceContract.js +79 -0
  111. package/dist/registries/glossaryAdviceContract.js.map +1 -0
  112. package/dist/registries/glossaryCaveatContract.js +68 -0
  113. package/dist/registries/glossaryCaveatContract.js.map +1 -0
  114. package/dist/registries/glossaryConsumerContractValidation.js +792 -0
  115. package/dist/registries/glossaryConsumerContractValidation.js.map +1 -0
  116. package/dist/registries/glossaryEntryContract.js +747 -0
  117. package/dist/registries/glossaryEntryContract.js.map +1 -0
  118. package/dist/registries/glossaryTermIdentity.js +18 -0
  119. package/dist/registries/glossaryTermIdentity.js.map +1 -0
  120. package/dist/registries/glossaryTermOccurrence.js +21 -0
  121. package/dist/registries/glossaryTermOccurrence.js.map +1 -0
  122. package/dist/state/changelog.js +222 -0
  123. package/dist/state/changelog.js.map +1 -0
  124. package/dist/state/decisionEntities.js +18 -11
  125. package/dist/state/decisionEntities.js.map +1 -1
  126. package/dist/state/decisionMigrationProvenance.js +84 -1
  127. package/dist/state/decisionMigrationProvenance.js.map +1 -1
  128. package/dist/state/decisionOverlay.js +9 -32
  129. package/dist/state/decisionOverlay.js.map +1 -1
  130. package/dist/state/decisionRevision.js +69 -444
  131. package/dist/state/decisionRevision.js.map +1 -1
  132. package/dist/state/decisionRevisionMigration.js +90 -0
  133. package/dist/state/decisionRevisionMigration.js.map +1 -0
  134. package/dist/state/directRetrieval.js +3 -52
  135. package/dist/state/directRetrieval.js.map +1 -1
  136. package/dist/state/entityCutover.js +6 -6
  137. package/dist/state/entityCutover.js.map +1 -1
  138. package/dist/state/entityGlossaryAuthority.js +14 -0
  139. package/dist/state/entityGlossaryAuthority.js.map +1 -0
  140. package/dist/state/entityMigrationIdentity.js +6 -0
  141. package/dist/state/entityMigrationIdentity.js.map +1 -0
  142. package/dist/state/entityMigrationPreview.js +14 -23
  143. package/dist/state/entityMigrationPreview.js.map +1 -1
  144. package/dist/state/entityPublicationContext.js +374 -71
  145. package/dist/state/entityPublicationContext.js.map +1 -1
  146. package/dist/state/entityStorage.js +45 -29
  147. package/dist/state/entityStorage.js.map +1 -1
  148. package/dist/state/healthEntities.js +2 -4
  149. package/dist/state/healthEntities.js.map +1 -1
  150. package/dist/state/listRetrieval.js +7 -38
  151. package/dist/state/listRetrieval.js.map +1 -1
  152. package/dist/state/migrationSourceBinding.js +1 -1
  153. package/dist/state/migrationSourceBinding.js.map +1 -1
  154. package/dist/state/objectiveExperimentEntities.js +9 -9
  155. package/dist/state/objectiveExperimentEntities.js.map +1 -1
  156. package/dist/state/planEntities.js +57 -16
  157. package/dist/state/planEntities.js.map +1 -1
  158. package/dist/state/progressEntities.js +177 -39
  159. package/dist/state/progressEntities.js.map +1 -1
  160. package/dist/state/progressGlossaryCaveat.js +169 -0
  161. package/dist/state/progressGlossaryCaveat.js.map +1 -0
  162. package/dist/state/progressPublicationOrder.js +20 -0
  163. package/dist/state/progressPublicationOrder.js.map +1 -0
  164. package/dist/state/safeProjectFile.js +4 -1
  165. package/dist/state/safeProjectFile.js.map +1 -1
  166. package/dist/state/startupProjection.js +2 -70
  167. package/dist/state/startupProjection.js.map +1 -1
  168. package/dist/state/stateStorageAuthority.js +48 -0
  169. package/dist/state/stateStorageAuthority.js.map +1 -0
  170. package/dist/state/summarySourceRowAuthority.js +1 -1
  171. package/dist/state/summarySourceRowAuthority.js.map +1 -1
  172. package/dist/state/todoDocsEntities.js +8 -9
  173. package/dist/state/todoDocsEntities.js.map +1 -1
  174. package/dist/state/write/explain.js +101 -92
  175. package/dist/state/write/explain.js.map +1 -1
  176. package/dist/state/write/glossaryPublication.js +264 -0
  177. package/dist/state/write/glossaryPublication.js.map +1 -0
  178. package/dist/state/write/index.js +1 -0
  179. package/dist/state/write/index.js.map +1 -1
  180. package/dist/state/write/operations.js +25 -27
  181. package/dist/state/write/operations.js.map +1 -1
  182. package/dist/state/write/planEvaluation.js +6 -2
  183. package/dist/state/write/planEvaluation.js.map +1 -1
  184. package/dist/state/write/transaction.js +7 -4
  185. package/dist/state/write/transaction.js.map +1 -1
  186. package/dist/upgrade/upgradeOrchestrator.js +15 -10
  187. package/dist/upgrade/upgradeOrchestrator.js.map +1 -1
  188. package/dist/validate/crossCapability.js +3 -0
  189. package/dist/validate/crossCapability.js.map +1 -1
  190. package/dist/validate/v1LegacyCruft.js +141 -0
  191. package/dist/validate/v1LegacyCruft.js.map +1 -0
  192. package/dist/validate/vocabularyAuthority.js +2 -0
  193. package/dist/validate/vocabularyAuthority.js.map +1 -1
  194. package/package.json +4 -3
  195. package/dist/state/decisionRevisionPublication.js +0 -532
  196. package/dist/state/decisionRevisionPublication.js.map +0 -1
@@ -0,0 +1,139 @@
1
+ import fs from "node:fs";
2
+ import { acquireGlossaryInputs } from "../../analytics/glossaryInputAcquisition.js";
3
+ import { GlossaryAdviceInputError, resolveGlossaryAdvice, } from "../../analytics/glossaryAdviceResolution.js";
4
+ import { loadYamlMapping } from "../../core/yaml.js";
5
+ import { glossaryAdviceContract } from "../../registries/glossaryAdviceContract.js";
6
+ import { discoverSchemasDir } from "../appContext.js";
7
+ import { emitInvalidInput } from "../errors.js";
8
+ import { registryArtifactPath } from "../orientation.js";
9
+ import { emitStructured } from "../structured.js";
10
+ const contract = glossaryAdviceContract();
11
+ const COMMAND = contract.command.replace("REQUEST", "<file|->");
12
+ const RECOVERY = `Correct the bounded request and retry ${COMMAND}; no state was changed.`;
13
+ function mapping(value) {
14
+ return value !== null && typeof value === "object" && !Array.isArray(value)
15
+ ? value
16
+ : null;
17
+ }
18
+ function invalid(io, body) {
19
+ return emitInvalidInput(io, { format: "json", body: { ...body, recovery: RECOVERY } });
20
+ }
21
+ function parseArgs(argv) {
22
+ let input;
23
+ for (let index = 0; index < argv.length; index += 1) {
24
+ const [name, inline] = argv[index].split("=", 2);
25
+ if (name !== "--input" && name !== "--format") {
26
+ return {
27
+ class: "unrecognized_argument",
28
+ message: `unrecognized arguments: ${name}`,
29
+ syntax: COMMAND,
30
+ };
31
+ }
32
+ const value = inline ?? argv[++index];
33
+ if (!value || value.startsWith("--")) {
34
+ return {
35
+ class: "missing_argument",
36
+ message: `${name} requires a value`,
37
+ syntax: `${name} VALUE`,
38
+ };
39
+ }
40
+ if (name === "--format" && value !== "json") {
41
+ return {
42
+ class: "invalid_choice",
43
+ message: "glossary-advice requires --format json",
44
+ valid_values: ["json"],
45
+ };
46
+ }
47
+ if (name === "--input") {
48
+ if (input !== undefined)
49
+ return { class: "mutually_exclusive", message: "--input may only be supplied once" };
50
+ input = value;
51
+ }
52
+ }
53
+ return input ?? { class: "missing_argument", message: "--input is required", syntax: COMMAND };
54
+ }
55
+ function readRequest(source, io) {
56
+ const bytes = source === "-"
57
+ ? Buffer.from(io.stdin ? io.stdin() : fs.readFileSync(0))
58
+ : fs.readFileSync(source);
59
+ if (bytes.length > contract.maxRequestUtf8Bytes)
60
+ throw new Error("over bound");
61
+ const text = new TextDecoder("utf-8", { fatal: true }).decode(bytes);
62
+ const request = mapping(loadYamlMapping(text));
63
+ if (!request)
64
+ throw new Error("not a mapping");
65
+ return request;
66
+ }
67
+ function validatedRequest(request) {
68
+ const keys = Object.keys(request);
69
+ if (keys.some((key) => !contract.requestFields.includes(key)) ||
70
+ contract.requestFields.slice(0, 2).some((key) => !(key in request))) {
71
+ return {
72
+ class: "schema_violation",
73
+ message: "glossary advice request fields are invalid",
74
+ valid_values: contract.requestFields,
75
+ };
76
+ }
77
+ if (request.schema_version !== contract.requestSchemaVersion ||
78
+ typeof request.requested_term !== "string") {
79
+ return {
80
+ class: "schema_violation",
81
+ message: `request must use ${contract.requestSchemaVersion} with one string requested_term`,
82
+ valid_values: [contract.requestSchemaVersion],
83
+ };
84
+ }
85
+ if (request.host_review === undefined || request.host_review === null)
86
+ return { requestedTerm: request.requested_term };
87
+ const review = mapping(request.host_review);
88
+ if (!review ||
89
+ JSON.stringify(Object.keys(review).sort()) !==
90
+ JSON.stringify([...contract.hostReviewFields].sort())) {
91
+ return {
92
+ class: "schema_violation",
93
+ message: "host_review fields are invalid",
94
+ valid_values: contract.hostReviewFields,
95
+ };
96
+ }
97
+ return {
98
+ requestedTerm: request.requested_term,
99
+ hostReview: {
100
+ relation: review.relation,
101
+ candidate_owner: review.candidate_owner,
102
+ candidate_term: review.candidate_term,
103
+ },
104
+ };
105
+ }
106
+ export function runGlossaryAdviceCommand(argv, io) {
107
+ const parsedArgs = parseArgs(argv);
108
+ if (typeof parsedArgs !== "string")
109
+ return invalid(io, parsedArgs);
110
+ let request;
111
+ try {
112
+ request = readRequest(parsedArgs, io);
113
+ }
114
+ catch {
115
+ return invalid(io, {
116
+ class: "invalid_format",
117
+ message: "--input must be one readable bounded UTF-8 YAML or JSON mapping",
118
+ });
119
+ }
120
+ const parsed = validatedRequest(request);
121
+ if ("class" in parsed)
122
+ return invalid(io, parsed);
123
+ try {
124
+ const profilePath = registryArtifactPath("profile", discoverSchemasDir());
125
+ const advice = resolveGlossaryAdvice(parsed.requestedTerm, acquireGlossaryInputs(process.cwd(), profilePath), parsed.hostReview);
126
+ emitStructured({
127
+ schemaVersion: contract.schemaVersion,
128
+ command: "report glossary-advice",
129
+ status: "ok",
130
+ advice,
131
+ }, "json", io.out ?? ((text) => process.stdout.write(text)));
132
+ return 0;
133
+ }
134
+ catch (error) {
135
+ const code = error instanceof GlossaryAdviceInputError ? error.code : "invalid_acquisition";
136
+ return invalid(io, { class: "invalid_request", message: `glossary advice failed: ${code}` });
137
+ }
138
+ }
139
+ //# sourceMappingURL=glossaryAdvice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glossaryAdvice.js","sourceRoot":"","sources":["../../../../../../home/jgabor/git/agentera/packages/cli/src/cli/commands/glossaryAdvice.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,177 @@
1
+ import fs from "node:fs";
2
+ import { updatePersonalGlossaryProfile } from "../../analytics/personalGlossaryProfile.js";
3
+ import { loadYamlMapping } from "../../core/yaml.js";
4
+ import { personalGlossaryOutputContract } from "../../registries/glossaryEntryContract.js";
5
+ import { emitInvalidInput } from "../errors.js";
6
+ import { emitStructured } from "../structured.js";
7
+ const REQUEST_FIELDS = ["schema_version", "profile_path", "as_of", "fresh_entries", "retained_history"];
8
+ const HISTORY_FIELDS = ["source_id", "evidence_anchor", "source_kind", "signal_type"];
9
+ const RECOVERY = "Correct the request and retry the same command; no profile bytes were changed.";
10
+ function mapping(value) {
11
+ return value !== null && typeof value === "object" && !Array.isArray(value) ? value : null;
12
+ }
13
+ function calendarDate(value) {
14
+ if (typeof value !== "string" || !/^\d{4}-\d{2}-\d{2}$/.test(value))
15
+ return false;
16
+ const date = new Date(`${value}T00:00:00.000Z`);
17
+ return !Number.isNaN(date.getTime()) && date.toISOString().slice(0, 10) === value;
18
+ }
19
+ function invalid(io, body) {
20
+ return emitInvalidInput(io, { format: "json", body: { ...body, recovery: body.recovery ?? RECOVERY } });
21
+ }
22
+ function parseArgs(argv) {
23
+ let input;
24
+ let dryRun = false;
25
+ for (let index = 0; index < argv.length; index += 1) {
26
+ const argument = argv[index];
27
+ const [name, inline] = argument.split("=", 2);
28
+ if (name === "--dry-run") {
29
+ if (inline !== undefined)
30
+ return { class: "unrecognized_argument", message: "--dry-run does not accept a value" };
31
+ dryRun = true;
32
+ continue;
33
+ }
34
+ if (name === "--input" || name === "--format") {
35
+ const value = inline ?? argv[++index];
36
+ if (!value || value.startsWith("--"))
37
+ return { class: "missing_argument", message: `${name} requires a value`, syntax: `${name} VALUE` };
38
+ if (name === "--format") {
39
+ if (value !== "json")
40
+ return { class: "invalid_choice", message: `argument --format: invalid choice: '${value}' (choose from 'json')`, valid_values: ["json"] };
41
+ }
42
+ else {
43
+ if (input !== undefined)
44
+ return { class: "mutually_exclusive", message: "--input may only be supplied once" };
45
+ input = value;
46
+ }
47
+ continue;
48
+ }
49
+ return { class: "unrecognized_argument", message: `unrecognized arguments: ${argument}`, syntax: "agentera report profile-glossary --input <file|-> [--dry-run] --format json" };
50
+ }
51
+ if (!input)
52
+ return { class: "missing_argument", message: "--input is required", syntax: "agentera report profile-glossary --input <file|-> [--dry-run] --format json" };
53
+ return { input, dryRun };
54
+ }
55
+ function readRequest(source, io) {
56
+ let bytes;
57
+ if (source === "-")
58
+ bytes = Buffer.from(io.stdin ? io.stdin() : fs.readFileSync(0));
59
+ else
60
+ bytes = fs.readFileSync(source);
61
+ const text = new TextDecoder("utf-8", { fatal: true }).decode(bytes);
62
+ const parsed = mapping(loadYamlMapping(text));
63
+ if (!parsed)
64
+ throw new Error("request is not a mapping");
65
+ return parsed;
66
+ }
67
+ function validateRequest(value) {
68
+ const contract = personalGlossaryOutputContract();
69
+ const keys = Object.keys(value);
70
+ const unsupported = keys.filter((key) => !REQUEST_FIELDS.includes(key));
71
+ const missing = REQUEST_FIELDS.filter((key) => !(key in value));
72
+ if (unsupported.length > 0 || missing.length > 0) {
73
+ return { class: "schema_violation", message: `request fields are invalid${missing.length ? `; missing: ${missing.join(", ")}` : ""}${unsupported.length ? `; unsupported: ${unsupported.join(", ")}` : ""}`, valid_values: REQUEST_FIELDS };
74
+ }
75
+ if (value.schema_version !== contract.requestSchemaVersion) {
76
+ return { class: "schema_violation", message: `schema_version must be ${contract.requestSchemaVersion}`, valid_values: [contract.requestSchemaVersion] };
77
+ }
78
+ if (typeof value.profile_path !== "string" || value.profile_path.trim() === "") {
79
+ return { class: "invalid_request", message: "profile_path must be the exact non-empty path returned by prime profile context", valid_values: ["profile_context.profile.path"] };
80
+ }
81
+ if (!calendarDate(value.as_of)) {
82
+ return { class: "invalid_request", message: "as_of must be an ISO calendar date", valid_values: ["YYYY-MM-DD"] };
83
+ }
84
+ if (!Array.isArray(value.fresh_entries) || value.fresh_entries.some((entry) => !mapping(entry))) {
85
+ return { class: "invalid_request", message: "fresh_entries must be a list of shared personal glossary entries", valid_values: ["fresh_entries: []"] };
86
+ }
87
+ for (const [index, raw] of value.fresh_entries.entries()) {
88
+ const entry = mapping(raw);
89
+ const temporal = mapping(entry.temporal);
90
+ if (!temporal || !calendarDate(temporal.observed_at) || !calendarDate(temporal.last_confirmed_at)) {
91
+ return { class: "invalid_request", message: `fresh_entries[${index}].temporal requires observed_at and last_confirmed_at ISO calendar dates`, valid_values: ["YYYY-MM-DD"] };
92
+ }
93
+ if (!["stable", "durable", "situational"].includes(entry.permanence)) {
94
+ return { class: "invalid_request", message: `fresh_entries[${index}].permanence is invalid`, valid_values: ["stable", "durable", "situational"] };
95
+ }
96
+ const provenance = mapping(entry.provenance);
97
+ if (!provenance || !["personal_explicit_definition", "personal_inferred_usage"].includes(String(provenance.kind))) {
98
+ return { class: "invalid_request", message: `fresh_entries[${index}].provenance.kind is invalid`, valid_values: ["personal_explicit_definition", "personal_inferred_usage"] };
99
+ }
100
+ }
101
+ if (!Array.isArray(value.retained_history) || value.retained_history.some((row) => !mapping(row))) {
102
+ return { class: "invalid_request", message: "retained_history must be a list", valid_values: ["retained_history: []"] };
103
+ }
104
+ for (const [index, raw] of value.retained_history.entries()) {
105
+ const row = mapping(raw);
106
+ if (JSON.stringify(Object.keys(row).sort()) !== JSON.stringify([...HISTORY_FIELDS].sort()) || HISTORY_FIELDS.some((field) => typeof row[field] !== "string" || String(row[field]).trim() === "")) {
107
+ return { class: "invalid_request", message: `retained_history[${index}] must contain exactly ${HISTORY_FIELDS.join(", ")}`, valid_values: HISTORY_FIELDS };
108
+ }
109
+ }
110
+ return null;
111
+ }
112
+ function admissionContext(rows) {
113
+ const retainedHistory = new Map();
114
+ for (const raw of rows) {
115
+ const row = mapping(raw);
116
+ const anchor = String(row.evidence_anchor);
117
+ if (retainedHistory.has(anchor))
118
+ return { class: "conflict", message: `retained_history contains duplicate evidence_anchor '${anchor}'`, valid_values: ["one row per evidence_anchor"] };
119
+ retainedHistory.set(anchor, { sourceId: String(row.source_id), sourceKind: String(row.source_kind), signalType: String(row.signal_type) });
120
+ }
121
+ return { retainedHistory };
122
+ }
123
+ export function runPersonalGlossaryCommand(argv, io) {
124
+ const parsed = parseArgs(argv);
125
+ if ("class" in parsed)
126
+ return invalid(io, parsed);
127
+ let request;
128
+ try {
129
+ request = readRequest(parsed.input, io);
130
+ }
131
+ catch {
132
+ return invalid(io, { class: "invalid_format", message: "--input must be a readable UTF-8 YAML or JSON mapping", valid_values: ["YAML mapping", "JSON object"] });
133
+ }
134
+ const requestError = validateRequest(request);
135
+ if (requestError)
136
+ return invalid(io, requestError);
137
+ const profilePath = String(request.profile_path);
138
+ try {
139
+ if (!fs.statSync(profilePath).isFile())
140
+ throw new Error("not a regular file");
141
+ }
142
+ catch {
143
+ return invalid(io, { class: "invalid_request", message: `profile_path is not an existing readable PROFILE.md file: ${profilePath}`, valid_values: ["existing PROFILE.md path from profile_context.profile.path"] });
144
+ }
145
+ const context = admissionContext(request.retained_history);
146
+ if ("class" in context)
147
+ return invalid(io, context);
148
+ try {
149
+ const result = updatePersonalGlossaryProfile({
150
+ profilePath,
151
+ asOf: String(request.as_of),
152
+ freshEntries: request.fresh_entries,
153
+ retainedHistory: context,
154
+ dryRun: parsed.dryRun,
155
+ });
156
+ const candidateStatus = result.changed ? "changed" : "unchanged";
157
+ emitStructured({
158
+ schemaVersion: "agentera.personalGlossaryUpdate.v1",
159
+ command: "report profile-glossary",
160
+ status: parsed.dryRun ? "dry_run_candidate" : result.changed ? "changed" : "unchanged_replay",
161
+ dry_run: parsed.dryRun,
162
+ candidate_status: candidateStatus,
163
+ profile_path: profilePath,
164
+ entry_count: result.entries.length,
165
+ }, "json", io.out ?? ((text) => process.stdout.write(text)));
166
+ return 0;
167
+ }
168
+ catch (error) {
169
+ const message = error.message;
170
+ return invalid(io, {
171
+ class: /conflict|duplicate|ambiguous/i.test(message) ? "conflict" : "invalid_request",
172
+ message,
173
+ valid_values: ["stable", "durable", "situational", "personal_explicit_definition", "personal_inferred_usage"],
174
+ });
175
+ }
176
+ }
177
+ //# sourceMappingURL=personalGlossary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"personalGlossary.js","sourceRoot":"","sources":["../../../../../../home/jgabor/git/agentera/packages/cli/src/cli/commands/personalGlossary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,165 @@
1
+ import fs from "node:fs";
2
+ import { hasControlChars } from "../../argvalidate.js";
3
+ import { loadYamlMapping } from "../../../core/yaml.js";
4
+ export const BUILD_EXECUTION_REQUEST_SCHEMA = "agentera.buildExecutionRequest.v1";
5
+ export const BUILD_EXECUTION_REQUEST_MAX_UTF8_BYTES = 32 * 1024;
6
+ export const BUILD_EXECUTION_REQUEST_MAX_ITEMS = 12;
7
+ export const BUILD_EXECUTION_REQUEST_MAX_CODE_POINTS = 160;
8
+ const BUILD_EXECUTION_REQUEST_READ_CHUNK_BYTES = 8 * 1024;
9
+ export class BuildExecutionRequestError extends Error {
10
+ body;
11
+ constructor(body) {
12
+ super(body.message);
13
+ this.body = body;
14
+ }
15
+ }
16
+ function fail(body) {
17
+ throw new BuildExecutionRequestError(body);
18
+ }
19
+ function codePointLength(value) {
20
+ return [...value].length;
21
+ }
22
+ function validateText(value, field) {
23
+ if (typeof value !== "string" || value.trim().length === 0) {
24
+ fail({ class: "schema_violation", message: `Build execution request ${field} must be a non-empty string` });
25
+ }
26
+ if (codePointLength(value) > BUILD_EXECUTION_REQUEST_MAX_CODE_POINTS) {
27
+ fail({ class: "schema_violation", message: `Build execution request ${field} exceeds 160 Unicode code points` });
28
+ }
29
+ if (hasControlChars(value)) {
30
+ fail({ class: "schema_violation", message: `Build execution request ${field} contains control characters` });
31
+ }
32
+ return value;
33
+ }
34
+ function unreadableInput() {
35
+ return fail({
36
+ class: "invalid_format",
37
+ message: "Build execution request input must be one readable regular file or bounded stdin stream",
38
+ syntax: "agentera prime --context build --input <file|-> --format json",
39
+ });
40
+ }
41
+ function oversizedInput() {
42
+ return fail({ class: "schema_violation", message: "Build execution request input exceeds the 32768-byte UTF-8 bound" });
43
+ }
44
+ function readBoundedDescriptor(fd) {
45
+ const chunks = [];
46
+ let total = 0;
47
+ while (total <= BUILD_EXECUTION_REQUEST_MAX_UTF8_BYTES) {
48
+ const remaining = BUILD_EXECUTION_REQUEST_MAX_UTF8_BYTES + 1 - total;
49
+ const chunk = Buffer.allocUnsafe(Math.min(BUILD_EXECUTION_REQUEST_READ_CHUNK_BYTES, remaining));
50
+ const count = fs.readSync(fd, chunk, 0, chunk.byteLength, null);
51
+ if (count === 0)
52
+ break;
53
+ chunks.push(chunk.subarray(0, count));
54
+ total += count;
55
+ }
56
+ if (total > BUILD_EXECUTION_REQUEST_MAX_UTF8_BYTES)
57
+ oversizedInput();
58
+ return Buffer.concat(chunks, total);
59
+ }
60
+ function sameIdentity(left, right) {
61
+ return left.dev === right.dev && left.ino === right.ino;
62
+ }
63
+ function readBoundedFile(source) {
64
+ let observed;
65
+ try {
66
+ observed = fs.lstatSync(source, { bigint: true });
67
+ }
68
+ catch {
69
+ return unreadableInput();
70
+ }
71
+ if (observed.isSymbolicLink() || !observed.isFile())
72
+ unreadableInput();
73
+ if (observed.size > BigInt(BUILD_EXECUTION_REQUEST_MAX_UTF8_BYTES))
74
+ oversizedInput();
75
+ let fd = null;
76
+ try {
77
+ fd = fs.openSync(source, fs.constants.O_RDONLY | (fs.constants.O_NOFOLLOW ?? 0));
78
+ const opened = fs.fstatSync(fd, { bigint: true });
79
+ if (!opened.isFile() || !sameIdentity(observed, opened))
80
+ unreadableInput();
81
+ if (opened.size > BigInt(BUILD_EXECUTION_REQUEST_MAX_UTF8_BYTES))
82
+ oversizedInput();
83
+ return readBoundedDescriptor(fd);
84
+ }
85
+ catch (error) {
86
+ if (error instanceof BuildExecutionRequestError)
87
+ throw error;
88
+ return unreadableInput();
89
+ }
90
+ finally {
91
+ if (fd !== null)
92
+ fs.closeSync(fd);
93
+ }
94
+ }
95
+ function readBytes(source, readStdin) {
96
+ if (source !== "-")
97
+ return readBoundedFile(source);
98
+ if (readStdin) {
99
+ let value;
100
+ try {
101
+ value = readStdin();
102
+ }
103
+ catch {
104
+ return unreadableInput();
105
+ }
106
+ const bytes = typeof value === "string" ? Buffer.from(value, "utf8") : value;
107
+ if (bytes.byteLength > BUILD_EXECUTION_REQUEST_MAX_UTF8_BYTES)
108
+ oversizedInput();
109
+ return bytes;
110
+ }
111
+ if (process.stdin.isTTY)
112
+ return Buffer.alloc(0);
113
+ try {
114
+ return readBoundedDescriptor(0);
115
+ }
116
+ catch (error) {
117
+ if (error instanceof BuildExecutionRequestError)
118
+ throw error;
119
+ return unreadableInput();
120
+ }
121
+ }
122
+ export function loadBuildExecutionRequest(source, readStdin) {
123
+ const bytes = readBytes(source, readStdin);
124
+ let input;
125
+ try {
126
+ const text = new TextDecoder("utf-8", { fatal: true }).decode(bytes);
127
+ input = loadYamlMapping(text);
128
+ }
129
+ catch {
130
+ return fail({
131
+ class: "invalid_format",
132
+ message: "Build execution request input must be one valid UTF-8 YAML or JSON mapping",
133
+ });
134
+ }
135
+ const fields = Object.keys(input);
136
+ const expected = ["schema_version", "scope", "acceptance"];
137
+ if (fields.some((field) => !expected.includes(field))) {
138
+ fail({ class: "schema_violation", message: "Build execution request contains unsupported fields" });
139
+ }
140
+ if (fields.length !== expected.length || expected.some((field) => !Object.hasOwn(input, field))) {
141
+ fail({ class: "schema_violation", message: "Build execution request requires exactly schema_version, scope, and acceptance" });
142
+ }
143
+ if (input.schema_version !== BUILD_EXECUTION_REQUEST_SCHEMA) {
144
+ fail({ class: "schema_violation", message: `Build execution request schema_version must be ${BUILD_EXECUTION_REQUEST_SCHEMA}` });
145
+ }
146
+ const scope = validateText(input.scope, "scope");
147
+ if (!Array.isArray(input.acceptance) || input.acceptance.length < 1 || input.acceptance.length > BUILD_EXECUTION_REQUEST_MAX_ITEMS) {
148
+ fail({ class: "schema_violation", message: "Build execution request acceptance must contain 1 to 12 strings" });
149
+ }
150
+ const acceptance = input.acceptance.map((value, index) => validateText(value, `acceptance[${index}]`));
151
+ if (new Set(acceptance).size !== acceptance.length) {
152
+ fail({ class: "schema_violation", message: "Build execution request acceptance must not contain duplicate values" });
153
+ }
154
+ return {
155
+ schema_version: BUILD_EXECUTION_REQUEST_SCHEMA,
156
+ scope,
157
+ acceptance,
158
+ source: {
159
+ kind: source === "-" ? "stdin" : "file",
160
+ schema_version: BUILD_EXECUTION_REQUEST_SCHEMA,
161
+ persisted: false,
162
+ },
163
+ };
164
+ }
165
+ //# sourceMappingURL=buildExecutionRequest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildExecutionRequest.js","sourceRoot":"","sources":["../../../../../../../home/jgabor/git/agentera/packages/cli/src/cli/commands/prime/buildExecutionRequest.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import path from "node:path";
1
2
  import { listProgressEntities } from "../../../state/progressEntities.js";
2
3
  import { listDecisionEntities } from "../../../state/decisionEntities.js";
3
4
  import { listHealthEntities } from "../../../state/healthEntities.js";
@@ -9,8 +10,11 @@ import { discoverEntities } from "../../../state/entityStorage.js";
9
10
  import { summaryCaveat } from "../../../state/summaryEntityRead.js";
10
11
  import { boundStartupValue, STARTUP_ARRAY_LIMIT } from "../../../state/startupProjection.js";
11
12
  import { rememberPlanTaskIndex } from "../../planTaskIndex.js";
13
+ import { firstActionablePlanTask } from "../../capabilityContext/planState.js";
12
14
  import { issueCounts } from "../../orientation.js";
13
15
  import { evaluateTodoReadinessQueue } from "../../todoReadinessSelection.js";
16
+ import { projectCurrentGlossaryCaveats } from "../../../state/progressGlossaryCaveat.js";
17
+ import { glossaryCaveatContract } from "../../../registries/glossaryCaveatContract.js";
14
18
  function entries(payload) {
15
19
  return Array.isArray(payload.entries)
16
20
  ? payload.entries.filter((entry) => Boolean(entry) && typeof entry === "object" && !Array.isArray(entry))
@@ -86,7 +90,14 @@ function selected(entries, artifact) {
86
90
  /** Bounded startup projection built only from canonical entity readers. */
87
91
  export function collectEntityOrientation(projectRoot, sourceRoot) {
88
92
  const discovery = discoverEntities(projectRoot, sourceRoot);
89
- const progressList = listProgressEntities(projectRoot, 10, {}, undefined, { sourceRoot, format: "json", discovery });
93
+ const caveatContract = glossaryCaveatContract(path.join(sourceRoot, "references", "artifacts", "glossary-entry-contract.yaml"));
94
+ const glossaryCaveatProjection = projectCurrentGlossaryCaveats(discovery.entities, caveatContract);
95
+ const invalidProgress = (entity) => (entity.artifact === "progress" || ["progress_cycle", "progress_summary"].includes(entity.boundary ?? "")) &&
96
+ entity.classification !== "valid";
97
+ const progressDiscovery = discovery.entities.some(invalidProgress)
98
+ ? { ...discovery, entities: discovery.entities.filter((entity) => !invalidProgress(entity)) }
99
+ : discovery;
100
+ const progressList = listProgressEntities(projectRoot, 10, {}, undefined, { sourceRoot, format: "json", discovery: progressDiscovery });
90
101
  const decisionList = listDecisionEntities(projectRoot, 10, undefined, undefined, { sourceRoot, format: "json", discovery });
91
102
  const healthList = listHealthEntities(projectRoot, 10, undefined, undefined, { sourceRoot, format: "json", discovery });
92
103
  const planList = listPlanEntities(projectRoot, 2, undefined, { sourceRoot, format: "json", statuses: ["open", "active"], discovery });
@@ -126,7 +137,7 @@ export function collectEntityOrientation(projectRoot, sourceRoot) {
126
137
  .sort((left, right) => left.id.localeCompare(right.id))
127
138
  .map((entry) => ({ ...entry.record, id: entry.id, artifact: entry.artifact, provenance: { storage: "canonical_entity_file", path: entry.relativePath } }))
128
139
  : [];
129
- const firstPending = allTaskEntries.find((entry) => !terminal(entry.status));
140
+ const firstPending = firstActionablePlanTask(allTaskEntries);
130
141
  const taskStatusCounts = allTaskEntries.reduce((counts, entry) => {
131
142
  const status = String(entry.status ?? "pending").toLowerCase();
132
143
  counts[status] = (counts[status] ?? 0) + 1;
@@ -251,6 +262,11 @@ export function collectEntityOrientation(projectRoot, sourceRoot) {
251
262
  const decision = firstDecision ? { object: String(firstDecision.id), title: String(record(firstDecision).question ?? "Decision review") } : null;
252
263
  const projection = bounded({
253
264
  plan, docs, progress, health, objective, todoItems, todoCounts, decision, decisionAttention,
265
+ glossaryCaveatAttention: glossaryCaveatProjection.attention,
266
+ glossaryCaveatAttentionPolicy: glossaryCaveatProjection.attention ? {
267
+ public_limit: glossaryCaveatProjection.publicAttentionLimit,
268
+ reserved_slots: glossaryCaveatProjection.reservedGlossarySlots,
269
+ } : null,
254
270
  history: {
255
271
  progress: projectedHistory(progressList, "progress", progressFullCount, progressSummaryCount, progressHistory),
256
272
  decisions: projectedHistory(decisionList, "decisions", decisionFullCount, decisionSummaryCount, decisionHistory),