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.
- package/bundle/CHANGELOG.md +75 -5
- package/bundle/references/adapters/package-publication.json +43 -0
- package/bundle/references/adapters/package-surface-characterization.md +12 -0
- package/bundle/references/analysis/evidence-tier-authority.yaml +23 -21
- package/bundle/references/analysis/verification-policy.yaml +1 -0
- package/bundle/references/artifacts/artifact-registry-interface-model.yaml +11 -2
- package/bundle/references/artifacts/glossary-entry-contract.yaml +1241 -0
- package/bundle/references/artifacts/state-storage-authority.yaml +149 -80
- package/bundle/references/cli/agent-ready-state-contract.yaml +84 -2
- package/bundle/references/cli/audience-namespace-cli-migration.yaml +12 -1
- package/bundle/references/cli/prime-consumer-compatibility.yaml +7 -1
- package/bundle/skills/agentera/SKILL.md +26 -26
- package/bundle/skills/agentera/capabilities/audit/schemas/validation.yaml +26 -8
- package/bundle/skills/agentera/capabilities/build/schemas/artifacts.yaml +21 -4
- package/bundle/skills/agentera/capabilities/build/schemas/exit.yaml +5 -4
- package/bundle/skills/agentera/capabilities/build/schemas/validation.yaml +67 -3
- package/bundle/skills/agentera/capabilities/discuss/schemas/artifacts.yaml +3 -2
- package/bundle/skills/agentera/capabilities/discuss/schemas/validation.yaml +64 -0
- package/bundle/skills/agentera/capabilities/plan/schemas/artifacts.yaml +4 -1
- package/bundle/skills/agentera/capabilities/plan/schemas/validation.yaml +30 -0
- package/bundle/skills/agentera/capabilities/profile/schemas/artifacts.yaml +5 -2
- package/bundle/skills/agentera/capabilities/profile/schemas/exit.yaml +3 -2
- package/bundle/skills/agentera/capabilities/profile/schemas/validation.yaml +30 -0
- package/bundle/skills/agentera/schemas/artifacts/glossary.yaml +82 -0
- package/bundle/skills/agentera/schemas/artifacts/plan.yaml +19 -4
- package/bundle/skills/agentera/schemas/artifacts/progress.yaml +92 -0
- package/dist/analytics/extractCorpus/evidenceTiers.js +46 -3
- package/dist/analytics/extractCorpus/evidenceTiers.js.map +1 -1
- package/dist/analytics/extractCorpus/tierReader.js +1 -1
- package/dist/analytics/extractCorpus/tierReader.js.map +1 -1
- package/dist/analytics/glossaryAdviceResolution.js +167 -0
- package/dist/analytics/glossaryAdviceResolution.js.map +1 -0
- package/dist/analytics/glossaryInputAcquisition.js +320 -0
- package/dist/analytics/glossaryInputAcquisition.js.map +1 -0
- package/dist/analytics/personalGlossaryAdmission.js +134 -0
- package/dist/analytics/personalGlossaryAdmission.js.map +1 -0
- package/dist/analytics/personalGlossaryProfile.js +219 -0
- package/dist/analytics/personalGlossaryProfile.js.map +1 -0
- package/dist/audit/terminologyDrift.js +282 -0
- package/dist/audit/terminologyDrift.js.map +1 -0
- package/dist/capabilities/audit/instructions.js +2 -1
- package/dist/capabilities/audit/instructions.js.map +1 -1
- package/dist/capabilities/build/instructions.js +41 -2
- package/dist/capabilities/build/instructions.js.map +1 -1
- package/dist/capabilities/discuss/instructions.js +14 -1
- package/dist/capabilities/discuss/instructions.js.map +1 -1
- package/dist/capabilities/index.js +1 -1
- package/dist/capabilities/index.js.map +1 -1
- package/dist/capabilities/orchestrate/instructions.js +2 -2
- package/dist/capabilities/plan/instructions.js +19 -2
- package/dist/capabilities/plan/instructions.js.map +1 -1
- package/dist/capabilities/profile/instructions.js +67 -1
- package/dist/capabilities/profile/instructions.js.map +1 -1
- package/dist/cli/capabilityContext/bespoke.js +4 -3
- package/dist/cli/capabilityContext/bespoke.js.map +1 -1
- package/dist/cli/capabilityContext/build.js +77 -24
- package/dist/cli/capabilityContext/build.js.map +1 -1
- package/dist/cli/capabilityContext/closeout.js +2 -2
- package/dist/cli/capabilityContext/closeout.js.map +1 -1
- package/dist/cli/capabilityContext/evidence.js +2 -6
- package/dist/cli/capabilityContext/evidence.js.map +1 -1
- package/dist/cli/capabilityContext/planState.js +59 -78
- package/dist/cli/capabilityContext/planState.js.map +1 -1
- package/dist/cli/capabilityContext/projectVerification.js +410 -0
- package/dist/cli/capabilityContext/projectVerification.js.map +1 -0
- package/dist/cli/capabilityContext/startup.js +21 -4
- package/dist/cli/capabilityContext/startup.js.map +1 -1
- package/dist/cli/commands/glossaryAdvice.js +139 -0
- package/dist/cli/commands/glossaryAdvice.js.map +1 -0
- package/dist/cli/commands/personalGlossary.js +177 -0
- package/dist/cli/commands/personalGlossary.js.map +1 -0
- package/dist/cli/commands/prime/buildExecutionRequest.js +165 -0
- package/dist/cli/commands/prime/buildExecutionRequest.js.map +1 -0
- package/dist/cli/commands/prime/collectEntityOrientation.js +18 -2
- package/dist/cli/commands/prime/collectEntityOrientation.js.map +1 -1
- package/dist/cli/commands/prime/collectOrientationState.js +7 -1
- package/dist/cli/commands/prime/collectOrientationState.js.map +1 -1
- package/dist/cli/commands/prime/orientationOutput.js +12 -2
- package/dist/cli/commands/prime/orientationOutput.js.map +1 -1
- package/dist/cli/commands/prime.js +37 -2
- package/dist/cli/commands/prime.js.map +1 -1
- package/dist/cli/commands/profileGrounding.js +77 -0
- package/dist/cli/commands/profileGrounding.js.map +1 -0
- package/dist/cli/commands/query.js +14 -4
- package/dist/cli/commands/query.js.map +1 -1
- package/dist/cli/commands/schema.js +10 -0
- package/dist/cli/commands/schema.js.map +1 -1
- package/dist/cli/commands/state/write.js +4 -1
- package/dist/cli/commands/state/write.js.map +1 -1
- package/dist/cli/dispatch/lifecycle.js +45 -0
- package/dist/cli/dispatch/lifecycle.js.map +1 -1
- package/dist/cli/dispatch/prime.js +22 -1
- package/dist/cli/dispatch/prime.js.map +1 -1
- package/dist/cli/dispatch/shared.js +1 -1
- package/dist/cli/dispatch/shared.js.map +1 -1
- package/dist/cli/help.js +23 -1
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/migrationRequired.js +2 -0
- package/dist/cli/migrationRequired.js.map +1 -1
- package/dist/cli/orientation/attention.js +3 -1
- package/dist/cli/orientation/attention.js.map +1 -1
- package/dist/cli/orientation.js +2 -2
- package/dist/cli/orientation.js.map +1 -1
- package/dist/registries/artifactProtocolIds.js +2 -0
- package/dist/registries/artifactProtocolIds.js.map +1 -1
- package/dist/registries/artifactRegistry.js +2 -0
- package/dist/registries/artifactRegistry.js.map +1 -1
- package/dist/registries/evidenceTierContract.js +26 -16
- package/dist/registries/evidenceTierContract.js.map +1 -1
- package/dist/registries/glossaryAdviceContract.js +79 -0
- package/dist/registries/glossaryAdviceContract.js.map +1 -0
- package/dist/registries/glossaryCaveatContract.js +68 -0
- package/dist/registries/glossaryCaveatContract.js.map +1 -0
- package/dist/registries/glossaryConsumerContractValidation.js +792 -0
- package/dist/registries/glossaryConsumerContractValidation.js.map +1 -0
- package/dist/registries/glossaryEntryContract.js +747 -0
- package/dist/registries/glossaryEntryContract.js.map +1 -0
- package/dist/registries/glossaryTermIdentity.js +18 -0
- package/dist/registries/glossaryTermIdentity.js.map +1 -0
- package/dist/registries/glossaryTermOccurrence.js +21 -0
- package/dist/registries/glossaryTermOccurrence.js.map +1 -0
- package/dist/state/changelog.js +222 -0
- package/dist/state/changelog.js.map +1 -0
- package/dist/state/decisionEntities.js +18 -11
- package/dist/state/decisionEntities.js.map +1 -1
- package/dist/state/decisionMigrationProvenance.js +84 -1
- package/dist/state/decisionMigrationProvenance.js.map +1 -1
- package/dist/state/decisionOverlay.js +9 -32
- package/dist/state/decisionOverlay.js.map +1 -1
- package/dist/state/decisionRevision.js +69 -444
- package/dist/state/decisionRevision.js.map +1 -1
- package/dist/state/decisionRevisionMigration.js +90 -0
- package/dist/state/decisionRevisionMigration.js.map +1 -0
- package/dist/state/directRetrieval.js +3 -52
- package/dist/state/directRetrieval.js.map +1 -1
- package/dist/state/entityCutover.js +6 -6
- package/dist/state/entityCutover.js.map +1 -1
- package/dist/state/entityGlossaryAuthority.js +14 -0
- package/dist/state/entityGlossaryAuthority.js.map +1 -0
- package/dist/state/entityMigrationIdentity.js +6 -0
- package/dist/state/entityMigrationIdentity.js.map +1 -0
- package/dist/state/entityMigrationPreview.js +14 -23
- package/dist/state/entityMigrationPreview.js.map +1 -1
- package/dist/state/entityPublicationContext.js +374 -71
- package/dist/state/entityPublicationContext.js.map +1 -1
- package/dist/state/entityStorage.js +45 -29
- package/dist/state/entityStorage.js.map +1 -1
- package/dist/state/healthEntities.js +2 -4
- package/dist/state/healthEntities.js.map +1 -1
- package/dist/state/listRetrieval.js +7 -38
- package/dist/state/listRetrieval.js.map +1 -1
- package/dist/state/migrationSourceBinding.js +1 -1
- package/dist/state/migrationSourceBinding.js.map +1 -1
- package/dist/state/objectiveExperimentEntities.js +9 -9
- package/dist/state/objectiveExperimentEntities.js.map +1 -1
- package/dist/state/planEntities.js +57 -16
- package/dist/state/planEntities.js.map +1 -1
- package/dist/state/progressEntities.js +177 -39
- package/dist/state/progressEntities.js.map +1 -1
- package/dist/state/progressGlossaryCaveat.js +169 -0
- package/dist/state/progressGlossaryCaveat.js.map +1 -0
- package/dist/state/progressPublicationOrder.js +20 -0
- package/dist/state/progressPublicationOrder.js.map +1 -0
- package/dist/state/safeProjectFile.js +4 -1
- package/dist/state/safeProjectFile.js.map +1 -1
- package/dist/state/startupProjection.js +2 -70
- package/dist/state/startupProjection.js.map +1 -1
- package/dist/state/stateStorageAuthority.js +48 -0
- package/dist/state/stateStorageAuthority.js.map +1 -0
- package/dist/state/summarySourceRowAuthority.js +1 -1
- package/dist/state/summarySourceRowAuthority.js.map +1 -1
- package/dist/state/todoDocsEntities.js +8 -9
- package/dist/state/todoDocsEntities.js.map +1 -1
- package/dist/state/write/explain.js +101 -92
- package/dist/state/write/explain.js.map +1 -1
- package/dist/state/write/glossaryPublication.js +264 -0
- package/dist/state/write/glossaryPublication.js.map +1 -0
- package/dist/state/write/index.js +1 -0
- package/dist/state/write/index.js.map +1 -1
- package/dist/state/write/operations.js +25 -27
- package/dist/state/write/operations.js.map +1 -1
- package/dist/state/write/planEvaluation.js +6 -2
- package/dist/state/write/planEvaluation.js.map +1 -1
- package/dist/state/write/transaction.js +7 -4
- package/dist/state/write/transaction.js.map +1 -1
- package/dist/upgrade/upgradeOrchestrator.js +15 -10
- package/dist/upgrade/upgradeOrchestrator.js.map +1 -1
- package/dist/validate/crossCapability.js +3 -0
- package/dist/validate/crossCapability.js.map +1 -1
- package/dist/validate/v1LegacyCruft.js +141 -0
- package/dist/validate/v1LegacyCruft.js.map +1 -0
- package/dist/validate/vocabularyAuthority.js +2 -0
- package/dist/validate/vocabularyAuthority.js.map +1 -1
- package/package.json +4 -3
- package/dist/state/decisionRevisionPublication.js +0 -532
- 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
|
|
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
|
|
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),
|