@c4a/context 0.7.14-beta.1 → 0.7.15

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.
@@ -194,6 +194,48 @@ coverage by mechanically placing every new page under an unrelated catch-all.
194
194
  Build reports missing bindings for the Agent to resolve; it does not classify
195
195
  content. Moving a menu entry does not change the article URL.
196
196
 
197
+ ### Preserve established navigation intent
198
+
199
+ Before placing new knowledge, read the workspace's AGENTS.md, current
200
+ `src/knowledge-map.yaml`, existing overview pages and relevant category/article
201
+ bodies. Reuse any settled directory intent in the current plan. Establish what
202
+ each affected category helps readers do and why adjacent categories are separate;
203
+ do not infer this from labels alone. Read only affected branches and enough
204
+ neighboring content to distinguish them, not the entire library on every update.
205
+ If intent remains ambiguous, state the proposed interpretation in the plan.
206
+
207
+ Prefer, in order: revise an existing article; add a page to a matching category;
208
+ add a coherent child category; propose a top-level change only when existing
209
+ categories cannot serve a distinct, lasting reader need. Do not create a top-level
210
+ category merely because a source, repository, product, team or batch is new.
211
+ For example, a new assistant's usage guide, frontend integration and runtime
212
+ architecture can belong in existing usage, frontend and backend categories, with
213
+ cross-links for the shared product. Keep them together only when the site's
214
+ established organizing principle supports that choice.
215
+
216
+ In the work-start report or current plan, briefly state the affected articles'
217
+ intended placements and reused category intent. For proposed top-level additions,
218
+ renames, removals or changes of purpose, show the before/after tree, why reuse is
219
+ insufficient, affected existing pages and reading order. Present that change for
220
+ human review before applying it. This uses the existing report feedback where
221
+ available; do not add a new CLI state, schema field or routine per-article gate.
222
+ Explicit user approval of that concrete structure is sufficient; do not ask again.
223
+ General permission to write knowledge or organize batches is not approval to
224
+ change the site's top-level organization. If the need emerges after report
225
+ approval, update the same plan and ask about that structural change only; continue
226
+ independent work within the approved organization.
227
+
228
+ Before delivery, compare the resulting map with the approved plan: article
229
+ placement matches its main reader task, titles match the bodies, sibling ordering
230
+ is deliberate, and directories are neither empty nor accidental duplicates.
231
+ Honor the workspace's chosen directory depth and homogeneous sibling convention;
232
+ where it requires directory-only or article-only siblings, do not mix them.
233
+ Use an "Other" group last only for genuinely useful residual content, not to
234
+ avoid classification. Apply supported map adjustments through the current CLI
235
+ flow, retaining article identities and URLs. Record lasting category intent
236
+ briefly in the workspace AGENTS.md or existing organization guide; do not create
237
+ a separate taxonomy ledger or put planning instructions in reader articles.
238
+
197
239
  ### Reader tasks, names and reading order
198
240
 
199
241
  Read the affected articles' bodies before changing their categories or titles.
@@ -251,8 +293,8 @@ change does not require a prose rewrite or file migration; changing its label do
251
293
  not silently rename the approved article. Needed title or content revisions use
252
294
  the existing revision and Review flow. Splits and merges use ordinary article
253
295
  tasks, link repair and any explicit retirement after replacement content is
254
- delivered. These are Agent editorial decisions, not new CLI checks or approval
255
- gates.
296
+ delivered. These are Agent editorial decisions, not new CLI checks or routine per-article
297
+ approval gates. Top-level changes follow the focused review described above.
256
298
 
257
299
  ## Edit one section or review part of a batch
258
300
 
@@ -277,6 +319,12 @@ input without that flag to continue. A preview is not approval and does not make
277
319
  a stale revision valid.
278
320
 
279
321
  Review can approve checked pages while leaving repair pages pending. The HTML
322
+ report shows the current site navigation, candidate changes and expected file
323
+ paths. Unchanged approved pages retain their titles with omitted bodies. Enter
324
+ revision instructions directly in the report; the copied code and following
325
+ instruction lines must be returned together without edits. The CLI binds them to
326
+ the reviewed content and baseline and returns repair commands while leaving
327
+ those pages pending. Changed candidates require a fresh review. The HTML
280
328
  review code includes pending positions; managed Review provides the same current
281
329
  scope as a JSON template. Send decisions only for pages actually reviewed. Omit
282
330
  means a durable exclusion, not repair. Partial approval alone does not build.
@@ -124,3 +124,41 @@ fixed. Accepted failures remain visible as warnings and unavailable-resource
124
124
  notices; they are never represented as downloaded evidence. Review shows
125
125
  available previews, references, and warnings so the human or managed policy can
126
126
  assess the page with its non-text evidence.
127
+
128
+ ## Image choices for a production task
129
+
130
+ The work-start report asks once when a task contains more than 30 distinct images
131
+ and has no explicit image policy. The choices are intelligent conversion and
132
+ inclusion (recommended), include all as images with compression, or include none
133
+ with placeholders. Count the whole task, not each capture or writing batch.
134
+ Review reports show the resulting image handling and any fallbacks.
135
+
136
+ To skip image acquisition while preserving visible source placeholders:
137
+
138
+ ```ts
139
+ captureLark({ source: handbook, resources: { images: "reference-only" } });
140
+ ```
141
+
142
+ To retain static images but exclude GIF files:
143
+
144
+ ```ts
145
+ captureLark({ source: handbook, resources: { gifs: "reference-only" } });
146
+ ```
147
+
148
+ Both fields also accept `bundle`; omitted fields retain normal capture behavior.
149
+ Known GIF metadata avoids downloading; when a source only supplies an opaque
150
+ media token, identification may require downloading the file. Such a GIF is then
151
+ excluded from the snapshot assets and knowledge, rather than decoded or retained.
152
+ Existing evidence is not deleted by changing a policy. Already approved image
153
+ references must be revised through the normal Review flow to change their content.
154
+
155
+ Inclusion does not mean lossless original-byte delivery. The package optimizer
156
+ preserves animations without decoding every frame or silently flattening them.
157
+ Codec failures and images that cannot fit delivery budgets become visible output
158
+ placeholders with a build warning; approved source bytes remain unchanged.
159
+ Do not rewrite approved prose to repair a codec error or disable pixel safety
160
+ limits. The reading meaning of an image is handled in writing and Review.
161
+
162
+ Source document links can be retained for viewing under the reader's permissions.
163
+ Temporary signed media links are not durable image hosting. Do not embed access
164
+ tokens in generated pages or claim that excluded images have been interpreted.
@@ -351,8 +351,10 @@ visible-Skill claim nor the Route report authorizes Bundle materialization.
351
351
  ## Contract overlay validation
352
352
 
353
353
  `validate-indexer-contract-overlays` recomputes the complete data-only overlay
354
- against the exact CLI base and operator contracts. Invalid DSL, executable
355
- fields, identity redefinition, threshold weakening, digest drift or a partial
354
+ against the current CLI base and operator contracts. Contract versions must match;
355
+ historical base/operator digests are provenance, not compatibility pins. Parser
356
+ release changes and unrelated profile changes do not require rebinding. Invalid DSL, executable
357
+ fields, identity redefinition, threshold weakening, invalid payload integrity or a partial
356
358
  Provider identity fails validation. The selected Provider Bundle integrity is
357
359
  an exact input, not a self-reported trust assertion.
358
360
 
package/index.js CHANGED
@@ -23838,11 +23838,11 @@ function validateIndexerContractOverlay(input) {
23838
23838
  if (indexerContractOverlayDigest(overlayPayload) !== overlay.overlay_digest) {
23839
23839
  throw new TypeError("contract overlay digest does not match its canonical payload");
23840
23840
  }
23841
- if (overlay.extends.version !== base.version || overlay.extends.contract_digest !== base.contract_digest) {
23842
- throw new TypeError("contract overlay is bound to another base contract");
23841
+ if (overlay.extends.version !== base.version) {
23842
+ throw new TypeError("contract overlay requires another base contract version");
23843
23843
  }
23844
- if (overlay.operator_contract_version !== operators.version || overlay.operator_contract_digest !== operators.contract_digest) {
23845
- throw new TypeError("contract overlay is bound to another operator contract");
23844
+ if (overlay.operator_contract_version !== operators.version) {
23845
+ throw new TypeError("contract overlay requires another operator contract version");
23846
23846
  }
23847
23847
  const baseProfile = profileById(base, overlay.extends.profile);
23848
23848
  const effectiveProfile = mergeOverlayProfile(baseProfile, overlay);
@@ -31425,6 +31425,12 @@ var captureFile = (definition) => {
31425
31425
  var captureLark = (definition) => {
31426
31426
  const sourceDefinition = bindSourceType(definition.source, "lark", "captureLark source");
31427
31427
  const sourceId = getSourceName(sourceDefinition);
31428
+ for (const key of ["images", "gifs"]) {
31429
+ const value = definition.resources?.[key];
31430
+ if (value !== undefined && value !== "bundle" && value !== "reference-only") {
31431
+ throw new TypeError(`captureLark resources.${key} must be bundle or reference-only`);
31432
+ }
31433
+ }
31428
31434
  const maxBytesPerResource = definition.resources?.maxBytesPerResource ?? 20 * 1024 * 1024;
31429
31435
  const maxTotalBytes = definition.resources?.maxTotalBytes ?? 200 * 1024 * 1024;
31430
31436
  if (!Number.isSafeInteger(maxBytesPerResource) || maxBytesPerResource < 1) {
@@ -31443,6 +31449,8 @@ var captureLark = (definition) => {
31443
31449
  writes: [sourceSnapshotResource(sourceDefinition, "lark")],
31444
31450
  source: sourceDefinition,
31445
31451
  resources: {
31452
+ ...definition.resources?.images === undefined ? {} : { images: definition.resources.images },
31453
+ ...definition.resources?.gifs === undefined ? {} : { gifs: definition.resources.gifs },
31446
31454
  videos: definition.resources?.videos ?? "reference-only",
31447
31455
  maxBytesPerResource,
31448
31456
  maxTotalBytes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@c4a/context",
3
- "version": "0.7.14-beta.1",
3
+ "version": "0.7.15",
4
4
  "type": "module",
5
5
  "description": "Declarative SDK for Context knowledge sources, workflows, review, and package outputs",
6
6
  "license": "MIT",
package/phases.d.ts CHANGED
@@ -50,6 +50,8 @@ export type CaptureLarkPhaseDefinition = {
50
50
  writes: readonly PhaseResourceReference[];
51
51
  source: LarkSourceDefinition | LarkSourceReference;
52
52
  resources: {
53
+ images?: "reference-only" | "bundle";
54
+ gifs?: "reference-only" | "bundle";
53
55
  videos: "reference-only" | "bundle";
54
56
  maxBytesPerResource: number;
55
57
  maxTotalBytes: number;
@@ -76,6 +78,8 @@ export declare const captureFile: (definition: {
76
78
  export declare const captureLark: (definition: {
77
79
  source: LarkSourceDefinition | LarkSourceReference;
78
80
  resources?: {
81
+ images?: "reference-only" | "bundle";
82
+ gifs?: "reference-only" | "bundle";
79
83
  videos?: "reference-only" | "bundle";
80
84
  maxBytesPerResource?: number;
81
85
  maxTotalBytes?: number;