@mulmoclaude/core 3.11.0 → 3.13.0

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.
@@ -5,7 +5,7 @@ const require_root = require("../../../root-rPH6FGDT.cjs");
5
5
  const require_relPath = require("../../../relPath-CTAjGdCL.cjs");
6
6
  const require_utils_fetch = require("../../../utils/fetch.cjs");
7
7
  const require_discovery = require("../../../discovery-BsXiDZBR.cjs");
8
- const require_server = require("../../../server-X_magqUa.cjs");
8
+ const require_server = require("../../../server-_g1rW-Uc.cjs");
9
9
  const require_templatePath = require("../../../templatePath-27vUZowm.cjs");
10
10
  const require_skill_bridge_index = require("../../../skill-bridge/index.cjs");
11
11
  const require_types = require("../../../types-CNqkLT4M.cjs");
@@ -3,7 +3,7 @@ import { n as writeFileAtomic } from "../../../root-BMroU_mB.js";
3
3
  import { n as toPosixRelPath } from "../../../relPath-DW8MC8VO.js";
4
4
  import { fetchWithTimeout } from "../../../utils/fetch.js";
5
5
  import { $ as collectionsRegistriesConfigPath, G as safeRecordId, ct as projectSkillsDir, mt as skillsStagingDir, nt as getWorkspaceRoot, ot as log, r as loadCollection, s as CollectionSchemaZ, t as acceptParsedSchema } from "../../../discovery-B9zdNkgW.js";
6
- import { g as ONE_SECOND_MS } from "../../../server-zcM1ViCE.js";
6
+ import { g as ONE_SECOND_MS } from "../../../server-DGjmK9vU.js";
7
7
  import { t as isSafeActionTemplatePath } from "../../../templatePath-k_WNbL_Q.js";
8
8
  import { claudeSkillDir, dataSkillDir, mirrorSkillWrite } from "../../../skill-bridge/index.js";
9
9
  import { n as parseRegistryIndex, r as isRecord, t as OFFICIAL_REGISTRY_NAME } from "../../../types-BKVZrtyc.js";
@@ -2,7 +2,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_root = require("../../root-rPH6FGDT.cjs");
3
3
  const require_itemId = require("../../itemId-Dzrr3vs5.cjs");
4
4
  const require_discovery = require("../../discovery-BsXiDZBR.cjs");
5
- const require_server = require("../../server-X_magqUa.cjs");
5
+ const require_server = require("../../server-_g1rW-Uc.cjs");
6
6
  const require_templatePath = require("../../templatePath-27vUZowm.cjs");
7
7
  exports.APPS_COLLECTION = require_server.APPS_COLLECTION;
8
8
  exports.APP_MANIFEST_FILE = require_discovery.APP_MANIFEST_FILE;
@@ -89,6 +89,7 @@ exports.projectDeploy = require_server.projectDeploy;
89
89
  exports.projectItemFields = require_discovery.projectItemFields;
90
90
  exports.projectPublish = require_server.projectPublish;
91
91
  exports.promoteSchema = require_server.promoteSchema;
92
+ exports.promotedRoleProblems = require_server.promotedRoleProblems;
92
93
  exports.promptPathsFor = require_server.promptPathsFor;
93
94
  exports.publishCollectionChange = require_discovery.publishCollectionChange;
94
95
  exports.publishProblems = require_server.publishProblems;
@@ -4,7 +4,7 @@ export { sharedItemsPath } from './firestoreStore';
4
4
  export { loadAppManifest, parseAppManifest, appManifestReason, APP_MANIFEST_FILE, type AppManifest, type AppManifestResult } from './appManifest';
5
5
  export { AuthoredAppZ, parseAuthoredApp, APP_ROLES, type AuthoredApp, type AuthoredCollectionConfig, type AuthoredMail, type AuthoredSubmit, } from './publishManifest';
6
6
  export { projectApp, projectDeploy, projectPublish, stagedRuleConfig, promoteSchema, appStagingPath, APP_SLUGS_COLLECTION, appSlugDoc, type AppSlugDoc, type DeployedApp, type PublishedFace, APPS_COLLECTION, PUBLIC_CONFIG_DOC, appConfigPath, appSchemasPath, type PublishStamp, type PublishedApp, type PublishedConfigDoc, type PublishedSchemaDoc, type StagedSchemaDoc, } from './publishProject';
7
- export { publishProblems, bindsSubmitterIdentity, type PublishableCollection } from './publishChecks';
7
+ export { publishProblems, promotedRoleProblems, bindsSubmitterIdentity, type PublishableCollection } from './publishChecks';
8
8
  export type { LoadedCollection } from './discoveredCollection';
9
9
  export * from './paths';
10
10
  export * from './templatePath';
@@ -1,6 +1,6 @@
1
1
  import { t as canonicalRoot } from "../../root-BMroU_mB.js";
2
2
  import { N as COMPUTED_TYPES } from "../../itemId-DfTm08jm.js";
3
3
  import { A as readItem, B as SCHEMA_FILE, C as CollectionQueryZ, D as generateItemId, E as deleteItem, F as loadAppManifest, G as safeRecordId, H as itemFilePath, I as parseAppManifest, J as isBackendUnavailable, K as safeSlugName, L as sharedItemsPath, M as writeItem, N as APP_MANIFEST_FILE, O as isRegularFile, P as appManifestReason, Q as collectionChangePayload, R as pageFromFullRead, S as compileJsonlQuery, T as MAX_QUERY_ROWS, U as resolveDataDir, V as isContainedInRoot, W as resolveTemplatePath, Y as COLLECTION_ROOT_REQUIRED, Z as collectionChangeKey, _ as dedupeByRecordId, a as toDetail, at as localCollectionKey, d as storeFor, dt as setFirestoreAccessor, et as configureCollectionHost, ft as setSharedCollectionsSupport, g as decodeCsvRecordId, h as csvRowToItem, i as resolvePrimaryField, j as resolveCreateItemId, k as listItems, l as collectionWritable, lt as publishCollectionChange, n as discoverCollections, nt as getWorkspaceRoot, o as toSummary, ot as log, p as MAX_CSV_ROWS, pt as sharedCollectionChangePayload, q as BackendUnavailableError, r as loadCollection, rt as hostSupportsSharedCollections, s as CollectionSchemaZ, st as peekWorkspaceRoot, t as acceptParsedSchema, tt as firestoreHandle, u as readOnlyRefusal, ut as setCollectionChangePublisher, v as encodeCsvRecordId, w as DEFAULT_QUERY_ROWS, x as compileCsvQuery, y as normalizeCsvValue, z as projectItemFields } from "../../discovery-B9zdNkgW.js";
4
- import { $ as parseAuthoredApp, A as runQueryOverRows, B as APP_SLUGS_COLLECTION, C as STORE_UNREADABLE, D as recordFieldProblem, E as compileRecordZ, F as readCustomViewI18n, G as appStagingPath, H as appConfigPath, I as readSkillTemplate, J as projectPublish, K as projectApp, L as bindsSubmitterIdentity, M as buildCollectionActionSeedPrompt, N as promptPathsFor, O as runCollectionQuery, P as readCustomViewHtml, Q as AuthoredAppZ, R as publishProblems, S as MAX_RECORD_ISSUES, T as validateRecordObject, U as appSchemasPath, V as PUBLIC_CONFIG_DOC, W as appSlugDoc, X as stagedRuleConfig, Y as promoteSchema, Z as APP_ROLES, _ as computeCollectionIcon, a as deleteCollection, b as applyMutateAction, c as computeSuccessor, d as isTriggerDue, f as maybeSpawnSuccessor, h as successorId, i as deleteCustomView, j as buildActionSeedPrompt, k as enrichItems, l as daysInMonth, m as resolveEvery, n as MAX_UNSELECTIVE_ITEMS, o as deleteCollectionRefusalMessage, p as parseCivil, q as projectDeploy, r as makeManageCollectionTool, s as advanceTriggerDate, t as MAX_SCHEMA_ISSUES, u as formatCivil, v as buildWorkspaceOntology, w as validateCollectionRecords, x as firstMutateParamProblem, y as schemaRelations, z as APPS_COLLECTION } from "../../server-zcM1ViCE.js";
4
+ import { $ as AuthoredAppZ, A as runQueryOverRows, B as APPS_COLLECTION, C as STORE_UNREADABLE, D as recordFieldProblem, E as compileRecordZ, F as readCustomViewI18n, G as appSlugDoc, H as PUBLIC_CONFIG_DOC, I as readSkillTemplate, J as projectDeploy, K as appStagingPath, L as bindsSubmitterIdentity, M as buildCollectionActionSeedPrompt, N as promptPathsFor, O as runCollectionQuery, P as readCustomViewHtml, Q as APP_ROLES, R as promotedRoleProblems, S as MAX_RECORD_ISSUES, T as validateRecordObject, U as appConfigPath, V as APP_SLUGS_COLLECTION, W as appSchemasPath, X as promoteSchema, Y as projectPublish, Z as stagedRuleConfig, _ as computeCollectionIcon, a as deleteCollection, b as applyMutateAction, c as computeSuccessor, d as isTriggerDue, et as parseAuthoredApp, f as maybeSpawnSuccessor, h as successorId, i as deleteCustomView, j as buildActionSeedPrompt, k as enrichItems, l as daysInMonth, m as resolveEvery, n as MAX_UNSELECTIVE_ITEMS, o as deleteCollectionRefusalMessage, p as parseCivil, q as projectApp, r as makeManageCollectionTool, s as advanceTriggerDate, t as MAX_SCHEMA_ISSUES, u as formatCivil, v as buildWorkspaceOntology, w as validateCollectionRecords, x as firstMutateParamProblem, y as schemaRelations, z as publishProblems } from "../../server-DGjmK9vU.js";
5
5
  import { i as isSafeTemplatePath, n as isSafeCustomViewI18nPath, r as isSafeCustomViewPath, t as isSafeActionTemplatePath } from "../../templatePath-k_WNbL_Q.js";
6
- export { APPS_COLLECTION, APP_MANIFEST_FILE, APP_ROLES, APP_SLUGS_COLLECTION, AuthoredAppZ, BackendUnavailableError, COLLECTION_ROOT_REQUIRED, COMPUTED_TYPES, CollectionQueryZ, CollectionSchemaZ, DEFAULT_QUERY_ROWS, MAX_CSV_ROWS, MAX_QUERY_ROWS, MAX_RECORD_ISSUES, MAX_SCHEMA_ISSUES, MAX_UNSELECTIVE_ITEMS, PUBLIC_CONFIG_DOC, SCHEMA_FILE, STORE_UNREADABLE, acceptParsedSchema, advanceTriggerDate, appConfigPath, appManifestReason, appSchemasPath, appSlugDoc, appStagingPath, applyMutateAction, bindsSubmitterIdentity, buildActionSeedPrompt, buildCollectionActionSeedPrompt, buildWorkspaceOntology, canonicalRoot, collectionChangeKey, collectionChangePayload, collectionWritable, compileCsvQuery, compileJsonlQuery, compileRecordZ, computeCollectionIcon, computeSuccessor, configureCollectionHost, csvRowToItem, daysInMonth, decodeCsvRecordId, dedupeByRecordId, deleteCollection, deleteCollectionRefusalMessage, deleteCustomView, deleteItem, discoverCollections, encodeCsvRecordId, enrichItems, firestoreHandle, firstMutateParamProblem, formatCivil, generateItemId, getWorkspaceRoot, hostSupportsSharedCollections, isBackendUnavailable, isContainedInRoot, isRegularFile, isSafeActionTemplatePath, isSafeCustomViewI18nPath, isSafeCustomViewPath, isSafeTemplatePath, isTriggerDue, itemFilePath, listItems, loadAppManifest, loadCollection, localCollectionKey, log, makeManageCollectionTool, maybeSpawnSuccessor, normalizeCsvValue, pageFromFullRead, parseAppManifest, parseAuthoredApp, parseCivil, peekWorkspaceRoot, projectApp, projectDeploy, projectItemFields, projectPublish, promoteSchema, promptPathsFor, publishCollectionChange, publishProblems, readCustomViewHtml, readCustomViewI18n, readItem, readOnlyRefusal, readSkillTemplate, recordFieldProblem, resolveCreateItemId, resolveDataDir, resolveEvery, resolvePrimaryField, resolveTemplatePath, runCollectionQuery, runQueryOverRows, safeRecordId, safeSlugName, schemaRelations, setCollectionChangePublisher, setFirestoreAccessor, setSharedCollectionsSupport, sharedCollectionChangePayload, sharedItemsPath, stagedRuleConfig, storeFor, successorId, toDetail, toSummary, validateCollectionRecords, validateRecordObject, writeItem };
6
+ export { APPS_COLLECTION, APP_MANIFEST_FILE, APP_ROLES, APP_SLUGS_COLLECTION, AuthoredAppZ, BackendUnavailableError, COLLECTION_ROOT_REQUIRED, COMPUTED_TYPES, CollectionQueryZ, CollectionSchemaZ, DEFAULT_QUERY_ROWS, MAX_CSV_ROWS, MAX_QUERY_ROWS, MAX_RECORD_ISSUES, MAX_SCHEMA_ISSUES, MAX_UNSELECTIVE_ITEMS, PUBLIC_CONFIG_DOC, SCHEMA_FILE, STORE_UNREADABLE, acceptParsedSchema, advanceTriggerDate, appConfigPath, appManifestReason, appSchemasPath, appSlugDoc, appStagingPath, applyMutateAction, bindsSubmitterIdentity, buildActionSeedPrompt, buildCollectionActionSeedPrompt, buildWorkspaceOntology, canonicalRoot, collectionChangeKey, collectionChangePayload, collectionWritable, compileCsvQuery, compileJsonlQuery, compileRecordZ, computeCollectionIcon, computeSuccessor, configureCollectionHost, csvRowToItem, daysInMonth, decodeCsvRecordId, dedupeByRecordId, deleteCollection, deleteCollectionRefusalMessage, deleteCustomView, deleteItem, discoverCollections, encodeCsvRecordId, enrichItems, firestoreHandle, firstMutateParamProblem, formatCivil, generateItemId, getWorkspaceRoot, hostSupportsSharedCollections, isBackendUnavailable, isContainedInRoot, isRegularFile, isSafeActionTemplatePath, isSafeCustomViewI18nPath, isSafeCustomViewPath, isSafeTemplatePath, isTriggerDue, itemFilePath, listItems, loadAppManifest, loadCollection, localCollectionKey, log, makeManageCollectionTool, maybeSpawnSuccessor, normalizeCsvValue, pageFromFullRead, parseAppManifest, parseAuthoredApp, parseCivil, peekWorkspaceRoot, projectApp, projectDeploy, projectItemFields, projectPublish, promoteSchema, promotedRoleProblems, promptPathsFor, publishCollectionChange, publishProblems, readCustomViewHtml, readCustomViewI18n, readItem, readOnlyRefusal, readSkillTemplate, recordFieldProblem, resolveCreateItemId, resolveDataDir, resolveEvery, resolvePrimaryField, resolveTemplatePath, runCollectionQuery, runQueryOverRows, safeRecordId, safeSlugName, schemaRelations, setCollectionChangePublisher, setFirestoreAccessor, setSharedCollectionsSupport, sharedCollectionChangePayload, sharedItemsPath, stagedRuleConfig, storeFor, successorId, toDetail, toSummary, validateCollectionRecords, validateRecordObject, writeItem };
@@ -1,4 +1,5 @@
1
1
  import { AuthoredApp, AuthoredSubmit } from './publishManifest';
2
+ import { StagedSchemaDoc } from './publishProject';
2
3
  /** What publish knows about a shared collection in this repository, as far as
3
4
  * these checks are concerned: its cid and the schema key its records are
4
5
  * identified by. The whole schema is deliberately not threaded in — these
@@ -27,3 +28,31 @@ export declare function bindsSubmitterIdentity(submit: AuthoredSubmit): boolean;
27
28
  * All of them, every time. Publish is a manual step with a human waiting on
28
29
  * it; stopping at the first problem turns one review into five. */
29
30
  export declare function publishProblems(app: AuthoredApp, collections: readonly PublishableCollection[], publisherEmail: string): string[];
31
+ /** What publish will actually promote, checked as the PAIR it becomes.
32
+ *
33
+ * `publishProblems` reads the manifest, where `members` and `collections` sit
34
+ * side by side and agree. Publish does not write that pair. It writes the
35
+ * roster from the manifest and the collection configuration from what DEPLOY
36
+ * staged, so the app that lands is one half of each — and no check has ever
37
+ * looked at that combination.
38
+ *
39
+ * The sequence that gets through: deploy revision A with no `assigneeField`,
40
+ * add the field AND the member in revision B, publish without redeploying.
41
+ * Every manifest-level check passes on a declaration that is internally sound,
42
+ * while what lands is A's field-less configuration beside B's roster — an
43
+ * assignee with nothing to be compared against, refused every write, in an app
44
+ * that keeps working for everybody else. That is the precise trap
45
+ * `assigneeProblems` exists to prevent, reached by the one route it cannot
46
+ * see.
47
+ *
48
+ * Separate from `publishProblems` because it needs what deploy staged, which
49
+ * is a Firestore read the host makes and this package does not. It is checked
50
+ * against `stagedRuleConfig` — the same function the projection uses — rather
51
+ * than against a re-derivation, so the value validated is the value written.
52
+ *
53
+ * Only the staged half can be stale, so only that half is named and the fix is
54
+ * "deploy again" rather than "fix the declaration". */
55
+ export declare function promotedRoleProblems(app: AuthoredApp, staged: {
56
+ cid: string;
57
+ doc: StagedSchemaDoc;
58
+ }[]): string[];
@@ -1,7 +1,23 @@
1
1
  import { z } from 'zod';
2
- /** The four roles the deployed rules understand. `participant` is the layer
3
- * that is NAMED but reads only its own rows — see `readerOf` vs `listedIn`. */
4
- export declare const APP_ROLES: readonly ["owner", "editor", "viewer", "participant"];
2
+ /** The roles the deployed rules understand.
3
+ *
4
+ * Two of them are row-scoped, in opposite directions, and the pair is what
5
+ * the four-way split could not express:
6
+ *
7
+ * `participant` — the layer that is NAMED but reads only its OWN rows (the
8
+ * rows it submitted). See `readerOf` vs `listedIn`.
9
+ *
10
+ * `assignee` — reads EVERY row and writes only the rows ASSIGNED to it. The
11
+ * stylist who approves their own bookings and not a colleague's; the marker
12
+ * who grades their own students. Which rows are theirs is
13
+ * `collections[cid].assigneeField`, a field on the record holding the
14
+ * member's address. Reads are deliberately unscoped: a stylist needs the
15
+ * whole day's schedule, and scoping the read makes the app unusable.
16
+ *
17
+ * The names are permanent. The deployed rules compare these strings directly
18
+ * and they are written into `app.json` files people commit, so a rename is a
19
+ * migration over published apps rather than an edit. */
20
+ export declare const APP_ROLES: readonly ["owner", "editor", "viewer", "participant", "assignee"];
5
21
  /** The declarative mail queue, as the rules re-derive it: a transition of the
6
22
  * status field, a recipient read off the RECORD, and a fixed template. */
7
23
  declare const MailZ: z.ZodObject<{
@@ -19,6 +35,8 @@ declare const CollectionConfigZ: z.ZodObject<{
19
35
  transitions: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>>;
20
36
  immutable: z.ZodOptional<z.ZodBoolean>;
21
37
  submitOnly: z.ZodOptional<z.ZodBoolean>;
38
+ assigneeField: z.ZodOptional<z.ZodString>;
39
+ mirrorOf: z.ZodOptional<z.ZodString>;
22
40
  peerVisibility: z.ZodOptional<z.ZodEnum<{
23
41
  public: "public";
24
42
  hidden: "hidden";
@@ -48,11 +66,20 @@ declare const SubmitZ: z.ZodObject<{
48
66
  createFields: z.ZodArray<z.ZodString>;
49
67
  initialStatus: z.ZodOptional<z.ZodString>;
50
68
  idFrom: z.ZodOptional<z.ZodEnum<{
69
+ field: "field";
51
70
  auto: "auto";
52
71
  "auth.uid": "auth.uid";
53
72
  "auth.uid+field": "auth.uid+field";
54
73
  }>>;
55
74
  idField: z.ZodOptional<z.ZodString>;
75
+ idIn: z.ZodOptional<z.ZodObject<{
76
+ collection: z.ZodString;
77
+ where: z.ZodOptional<z.ZodObject<{
78
+ field: z.ZodString;
79
+ equals: z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>;
80
+ }, z.core.$strict>>;
81
+ }, z.core.$strict>>;
82
+ mirror: z.ZodOptional<z.ZodString>;
56
83
  validate: z.ZodOptional<z.ZodObject<{
57
84
  required: z.ZodOptional<z.ZodArray<z.ZodString>>;
58
85
  keyFields: z.ZodOptional<z.ZodArray<z.ZodObject<{
@@ -63,7 +90,18 @@ declare const SubmitZ: z.ZodObject<{
63
90
  window: z.ZodOptional<z.ZodObject<{
64
91
  from: z.ZodOptional<z.ZodISODateTime>;
65
92
  until: z.ZodOptional<z.ZodISODateTime>;
93
+ fromField: z.ZodOptional<z.ZodObject<{
94
+ ref: z.ZodString;
95
+ collection: z.ZodString;
96
+ field: z.ZodString;
97
+ }, z.core.$strict>>;
98
+ untilField: z.ZodOptional<z.ZodObject<{
99
+ ref: z.ZodString;
100
+ collection: z.ZodString;
101
+ field: z.ZodString;
102
+ }, z.core.$strict>>;
66
103
  }, z.core.$strict>>;
104
+ stampField: z.ZodOptional<z.ZodString>;
67
105
  selfUpdate: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>>;
68
106
  selfTransitions: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>>;
69
107
  finalize: z.ZodOptional<z.ZodBoolean>;
@@ -92,12 +130,15 @@ export declare const AuthoredAppZ: z.ZodObject<{
92
130
  editor: "editor";
93
131
  viewer: "viewer";
94
132
  participant: "participant";
133
+ assignee: "assignee";
95
134
  }>>>;
96
135
  collections: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
97
136
  statusField: z.ZodOptional<z.ZodString>;
98
137
  transitions: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>>;
99
138
  immutable: z.ZodOptional<z.ZodBoolean>;
100
139
  submitOnly: z.ZodOptional<z.ZodBoolean>;
140
+ assigneeField: z.ZodOptional<z.ZodString>;
141
+ mirrorOf: z.ZodOptional<z.ZodString>;
101
142
  peerVisibility: z.ZodOptional<z.ZodEnum<{
102
143
  public: "public";
103
144
  hidden: "hidden";
@@ -121,6 +162,10 @@ export declare const AuthoredAppZ: z.ZodObject<{
121
162
  public: z.ZodOptional<z.ZodObject<{
122
163
  enabled: z.ZodOptional<z.ZodBoolean>;
123
164
  read: z.ZodOptional<z.ZodArray<z.ZodString>>;
165
+ view: z.ZodOptional<z.ZodObject<{
166
+ path: z.ZodString;
167
+ collections: z.ZodArray<z.ZodString>;
168
+ }, z.core.$strict>>;
124
169
  submit: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
125
170
  auth: z.ZodEnum<{
126
171
  none: "none";
@@ -131,11 +176,20 @@ export declare const AuthoredAppZ: z.ZodObject<{
131
176
  createFields: z.ZodArray<z.ZodString>;
132
177
  initialStatus: z.ZodOptional<z.ZodString>;
133
178
  idFrom: z.ZodOptional<z.ZodEnum<{
179
+ field: "field";
134
180
  auto: "auto";
135
181
  "auth.uid": "auth.uid";
136
182
  "auth.uid+field": "auth.uid+field";
137
183
  }>>;
138
184
  idField: z.ZodOptional<z.ZodString>;
185
+ idIn: z.ZodOptional<z.ZodObject<{
186
+ collection: z.ZodString;
187
+ where: z.ZodOptional<z.ZodObject<{
188
+ field: z.ZodString;
189
+ equals: z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>;
190
+ }, z.core.$strict>>;
191
+ }, z.core.$strict>>;
192
+ mirror: z.ZodOptional<z.ZodString>;
139
193
  validate: z.ZodOptional<z.ZodObject<{
140
194
  required: z.ZodOptional<z.ZodArray<z.ZodString>>;
141
195
  keyFields: z.ZodOptional<z.ZodArray<z.ZodObject<{
@@ -146,7 +200,18 @@ export declare const AuthoredAppZ: z.ZodObject<{
146
200
  window: z.ZodOptional<z.ZodObject<{
147
201
  from: z.ZodOptional<z.ZodISODateTime>;
148
202
  until: z.ZodOptional<z.ZodISODateTime>;
203
+ fromField: z.ZodOptional<z.ZodObject<{
204
+ ref: z.ZodString;
205
+ collection: z.ZodString;
206
+ field: z.ZodString;
207
+ }, z.core.$strict>>;
208
+ untilField: z.ZodOptional<z.ZodObject<{
209
+ ref: z.ZodString;
210
+ collection: z.ZodString;
211
+ field: z.ZodString;
212
+ }, z.core.$strict>>;
149
213
  }, z.core.$strict>>;
214
+ stampField: z.ZodOptional<z.ZodString>;
150
215
  selfUpdate: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>>;
151
216
  selfTransitions: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>>;
152
217
  finalize: z.ZodOptional<z.ZodBoolean>;
@@ -80,6 +80,22 @@ export interface PublishedConfigDoc extends Record<string, unknown> {
80
80
  enabled: boolean;
81
81
  read: string[];
82
82
  submit: Record<string, Record<string, unknown>>;
83
+ /** That the app HAS a published view, and which datasets it asked for.
84
+ *
85
+ * This is the only place the public page can learn it: the rules' app
86
+ * document is reader-only and deliberately carries no view, and the HTML
87
+ * itself lands in a SEPARATE document (`config/view`) because a 1 MiB limit
88
+ * applies per document. Omitted here, the page has the HTML and no idea
89
+ * what to send it — the feature does not work at all.
90
+ *
91
+ * The authored PATH is deliberately not published. It names a file in the
92
+ * author's repository, which the browser cannot use and which nobody should
93
+ * be handed on a world-readable document; what the page needs is the
94
+ * dataset list, and `publishedAt` beside it is what pins this declaration
95
+ * to the HTML published in the same run. */
96
+ view?: {
97
+ collections: string[];
98
+ };
83
99
  publishedAt: number;
84
100
  }
85
101
  /** Everything one publish writes. Separate documents because they live at
@@ -4,7 +4,7 @@ const require_itemId = require("../itemId-Dzrr3vs5.cjs");
4
4
  const require_promptSafety = require("../promptSafety-CWqYq-NS.cjs");
5
5
  require("../collection/index.cjs");
6
6
  const require_discovery = require("../discovery-BsXiDZBR.cjs");
7
- const require_server = require("../server-X_magqUa.cjs");
7
+ const require_server = require("../server-_g1rW-Uc.cjs");
8
8
  const require_notifier = require("../notifier-DZJj0sOh.cjs");
9
9
  let node_fs_promises = require("node:fs/promises");
10
10
  //#region src/collection-watchers/config.ts
@@ -3,7 +3,7 @@ import { B as fieldText, x as isValidCollectionName } from "../itemId-DfTm08jm.j
3
3
  import { E as whenMatches, f as itemIsDone } from "../promptSafety-CSdyp7RF.js";
4
4
  import "../collection/index.js";
5
5
  import { H as itemFilePath, Q as collectionChangePayload, d as storeFor, lt as publishCollectionChange, n as discoverCollections, pt as sharedCollectionChangePayload, r as loadCollection, st as peekWorkspaceRoot, tt as firestoreHandle } from "../discovery-B9zdNkgW.js";
6
- import { d as isTriggerDue, f as maybeSpawnSuccessor } from "../server-zcM1ViCE.js";
6
+ import { d as isTriggerDue, f as maybeSpawnSuccessor } from "../server-DGjmK9vU.js";
7
7
  import { d as publish, m as updateForPlugin, n as clear, s as listAll } from "../notifier-DhnwR82U.js";
8
8
  import { access } from "node:fs/promises";
9
9
  //#region src/collection-watchers/config.ts
@@ -5,7 +5,7 @@ const require_root = require("../../root-rPH6FGDT.cjs");
5
5
  const require_itemId = require("../../itemId-Dzrr3vs5.cjs");
6
6
  const require_project = require("../../project-C1ep9pvo.cjs");
7
7
  const require_discovery = require("../../discovery-BsXiDZBR.cjs");
8
- const require_server = require("../../server-X_magqUa.cjs");
8
+ const require_server = require("../../server-_g1rW-Uc.cjs");
9
9
  const require_feeds_paths = require("../paths.cjs");
10
10
  const require_ingestTypes = require("../../ingestTypes-B4XfrUoq.cjs");
11
11
  const require_notifier = require("../../notifier-DZJj0sOh.cjs");
@@ -3,7 +3,7 @@ import { t as canonicalRoot } from "../../root-BMroU_mB.js";
3
3
  import { F as INGEST_KINDS, P as FEED_SCHEDULES } from "../../itemId-DfTm08jm.js";
4
4
  import { t as mergeIntoExisting } from "../../project-B0j_Vf_Q.js";
5
5
  import { K as safeSlugName, U as resolveDataDir, _t as createHostSlot, d as storeFor, gt as createForwardingLogger, k as listItems, n as discoverCollections } from "../../discovery-B9zdNkgW.js";
6
- import { I as readSkillTemplate, M as buildCollectionActionSeedPrompt, N as promptPathsFor } from "../../server-zcM1ViCE.js";
6
+ import { I as readSkillTemplate, M as buildCollectionActionSeedPrompt, N as promptPathsFor } from "../../server-DGjmK9vU.js";
7
7
  import { FEEDS_DIR, feedDir, feedStatePath, feedsRoot, ingestStateDir, ingestStatePath } from "../paths.js";
8
8
  import { n as DEFAULT_FEED_MAX_ITEMS, r as isFeedSchedule, t as AGENT_INGEST_KIND } from "../../ingestTypes-B312BwXg.js";
9
9
  import { d as publish, n as clear } from "../../notifier-DhnwR82U.js";