@cxtms/cx-schema 1.9.261 → 1.9.263

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/dist/index.d.ts CHANGED
@@ -3,5 +3,6 @@
3
3
  */
4
4
  export { ModuleValidator } from './validator';
5
5
  export { WorkflowValidator } from './workflowValidator';
6
+ export { validateQuickSearch, QuickSearchKind, QuickSearchKinds } from './quickSearchValidator';
6
7
  export { ValidationResult, ValidationError, ValidationWarning, ValidationSummary, ValidatorOptions, WorkflowValidatorOptions, YAMLModule, YAMLWorkflow, WorkflowErrorType } from './types';
7
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,wBAAwB,EACxB,UAAU,EACV,YAAY,EACZ,iBAAiB,EAClB,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAChG,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,wBAAwB,EACxB,UAAU,EACV,YAAY,EACZ,iBAAiB,EAClB,MAAM,SAAS,CAAC"}
package/dist/index.js CHANGED
@@ -3,9 +3,11 @@
3
3
  * CX Schema Validator - Main entry point
4
4
  */
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.WorkflowValidator = exports.ModuleValidator = void 0;
6
+ exports.validateQuickSearch = exports.WorkflowValidator = exports.ModuleValidator = void 0;
7
7
  var validator_1 = require("./validator");
8
8
  Object.defineProperty(exports, "ModuleValidator", { enumerable: true, get: function () { return validator_1.ModuleValidator; } });
9
9
  var workflowValidator_1 = require("./workflowValidator");
10
10
  Object.defineProperty(exports, "WorkflowValidator", { enumerable: true, get: function () { return workflowValidator_1.WorkflowValidator; } });
11
+ var quickSearchValidator_1 = require("./quickSearchValidator");
12
+ Object.defineProperty(exports, "validateQuickSearch", { enumerable: true, get: function () { return quickSearchValidator_1.validateQuickSearch; } });
11
13
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,yCAA8C;AAArC,4GAAA,eAAe,OAAA;AACxB,yDAAwD;AAA/C,sHAAA,iBAAiB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,yCAA8C;AAArC,4GAAA,eAAe,OAAA;AACxB,yDAAwD;AAA/C,sHAAA,iBAAiB,OAAA;AAC1B,+DAAgG;AAAvF,2HAAA,mBAAmB,OAAA"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Semantic rules for entity quickSearch blocks. Mirrors the backend's
3
+ * QuickSearchConfigValidator (tms-backend-api), except `filter`, which only
4
+ * the backend can check.
5
+ */
6
+ export interface QuickSearchKind {
7
+ key: string;
8
+ matchFields: string[];
9
+ select: string[];
10
+ }
11
+ export type QuickSearchKinds = Record<string, QuickSearchKind>;
12
+ export declare function validateQuickSearch(entityName: string, entityKind: string | undefined | null, config: any, kinds: QuickSearchKinds): string[];
13
+ //# sourceMappingURL=quickSearchValidator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quickSearchValidator.d.ts","sourceRoot":"","sources":["../src/quickSearchValidator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;AAQ/D,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,EACrC,MAAM,EAAE,GAAG,EACX,KAAK,EAAE,gBAAgB,GACtB,MAAM,EAAE,CAmDV"}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ /**
3
+ * Semantic rules for entity quickSearch blocks. Mirrors the backend's
4
+ * QuickSearchConfigValidator (tms-backend-api), except `filter`, which only
5
+ * the backend can check.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.validateQuickSearch = validateQuickSearch;
9
+ const CUSTOM_VALUES_PREFIX = 'customValues.';
10
+ // {{ path }} or {{helper path }}
11
+ const TEMPLATE_PATH = /\{\{\s*(?:[A-Za-z]+\s+)?([A-Za-z_][\w.]*)\s*\}\}/g;
12
+ // Component name, e.g. Orders/UpdateOrder
13
+ const DIALOG_COMPONENT = /^[A-Za-z0-9]+(\/[A-Za-z0-9]+)+$/;
14
+ function validateQuickSearch(entityName, entityKind, config, kinds) {
15
+ if (!config || config.enabled !== true)
16
+ return [];
17
+ const prefix = `Entity '${entityName}' quickSearch:`;
18
+ const kind = entityKind ? kinds[entityKind] : undefined;
19
+ if (!kind) {
20
+ return [`${prefix} entityKind must be one of ${Object.keys(kinds).join(', ')}.`];
21
+ }
22
+ const errors = [];
23
+ const match = Array.isArray(config.matchFields) ? config.matchFields : [];
24
+ const select = Array.isArray(config.select) ? config.select : [];
25
+ if (match.length === 0)
26
+ errors.push(`${prefix} matchFields must list at least one field.`);
27
+ for (const f of match) {
28
+ if (!kind.matchFields.includes(f)) {
29
+ errors.push(`${prefix} matchFields '${f}' is not searchable for ${entityKind}. Allowed: ${kind.matchFields.join(', ')}.`);
30
+ }
31
+ }
32
+ if (select.length === 0)
33
+ errors.push(`${prefix} select must list at least one path.`);
34
+ for (const p of select) {
35
+ if (!isSelectable(kind, p))
36
+ errors.push(`${prefix} select '${p}' is not available for ${entityKind}.`);
37
+ }
38
+ if (!config.display?.title || !String(config.display.title).trim())
39
+ errors.push(`${prefix} display.title is required.`);
40
+ if (!config.icon || !String(config.icon).trim())
41
+ errors.push(`${prefix} icon is required.`);
42
+ const open = config.open && typeof config.open === 'object' ? config.open : {};
43
+ const actions = ['navigate', 'dialog'].filter(a => a in open).length;
44
+ if (actions !== 1)
45
+ errors.push(`${prefix} open must define exactly one of navigate or dialog.`);
46
+ if ('dialog' in open && (typeof open.dialog !== 'string' || !DIALOG_COMPONENT.test(open.dialog))) {
47
+ errors.push(`${prefix} open.dialog must be a component name like 'Orders/UpdateOrder'.`);
48
+ }
49
+ if ('navigate' in open && typeof open.navigate !== 'string') {
50
+ errors.push(`${prefix} open.navigate must be a route path.`);
51
+ }
52
+ const allowed = new Set([...select, kind.key]);
53
+ const templates = [config.display?.title, config.display?.subtitle, config.display?.badge, open.navigate]
54
+ .filter((t) => typeof t === 'string');
55
+ const missing = new Set();
56
+ for (const t of templates) {
57
+ for (const m of t.matchAll(TEMPLATE_PATH)) {
58
+ if (!allowed.has(m[1]))
59
+ missing.add(m[1]);
60
+ }
61
+ }
62
+ for (const p of missing)
63
+ errors.push(`${prefix} template path '${p}' must be listed in select.`);
64
+ return errors;
65
+ }
66
+ function isSelectable(kind, path) {
67
+ if (path === `${CUSTOM_VALUES_PREFIX}*`)
68
+ return false;
69
+ if (kind.select.includes(path))
70
+ return true;
71
+ return path.startsWith(CUSTOM_VALUES_PREFIX)
72
+ && path.length > CUSTOM_VALUES_PREFIX.length
73
+ && kind.select.includes(`${CUSTOM_VALUES_PREFIX}*`);
74
+ }
75
+ //# sourceMappingURL=quickSearchValidator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quickSearchValidator.js","sourceRoot":"","sources":["../src/quickSearchValidator.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,8 @@ export declare class ModuleValidator {
7
7
  private schemas;
8
8
  private schemasDir;
9
9
  private options;
10
+ private quickSearchKinds;
11
+ private quickSearchKindsError;
10
12
  constructor(options?: ValidatorOptions);
11
13
  /**
12
14
  * Register all loaded schemas with Ajv
@@ -56,6 +58,11 @@ export declare class ModuleValidator {
56
58
  * Validate entities array
57
59
  */
58
60
  private validateEntities;
61
+ /**
62
+ * Validate an entity's quickSearch block: shape via schemas.json#/definitions/quickSearch,
63
+ * then the semantic rules the backend also enforces at module save.
64
+ */
65
+ private validateQuickSearch;
59
66
  /**
60
67
  * Validate configurations array
61
68
  */
@@ -1 +1 @@
1
- {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../src/validator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,EACL,gBAAgB,EAGhB,gBAAgB,EAGjB,MAAM,SAAS,CAAC;AAOjB,qBAAa,eAAe;IAC1B,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAA6B;gBAEhC,OAAO,GAAE,gBAAqB;IA2B1C;;OAEG;IACH,OAAO,CAAC,eAAe;IAYvB;;OAEG;IACH,OAAO,CAAC,WAAW;IAOnB;;OAEG;IACG,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAgEjE;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAyE/B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAW1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAsCzB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAwD/B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAuB9B;;OAEG;IACH,OAAO,CAAC,YAAY;IAkBpB;;OAEG;IACH,OAAO,CAAC,cAAc;IAwBtB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAiBxB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAwB9B;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAqBjC;;OAEG;IACH,OAAO,CAAC,YAAY;CAwBrB"}
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../src/validator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,EACL,gBAAgB,EAGhB,gBAAgB,EAGjB,MAAM,SAAS,CAAC;AAQjB,qBAAa,eAAe;IAC1B,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,gBAAgB,CAA0B;IAClD,OAAO,CAAC,qBAAqB,CAAgB;gBAEjC,OAAO,GAAE,gBAAqB;IAsC1C;;OAEG;IACH,OAAO,CAAC,eAAe;IAYvB;;OAEG;IACH,OAAO,CAAC,WAAW;IAOnB;;OAEG;IACG,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAgEjE;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAyE/B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAW1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAsCzB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAwD/B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAuB9B;;OAEG;IACH,OAAO,CAAC,YAAY;IAkBpB;;OAEG;IACH,OAAO,CAAC,cAAc;IAwBtB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAqBxB;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAuB3B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAwB9B;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAqBjC;;OAEG;IACH,OAAO,CAAC,YAAY;CAwBrB"}
package/dist/validator.js CHANGED
@@ -46,6 +46,7 @@ const fs = __importStar(require("fs"));
46
46
  const path = __importStar(require("path"));
47
47
  const yaml_1 = __importDefault(require("yaml"));
48
48
  const schemaLoader_1 = require("./utils/schemaLoader");
49
+ const quickSearchValidator_1 = require("./quickSearchValidator");
49
50
  class ModuleValidator {
50
51
  constructor(options = {}) {
51
52
  this.schemasDir = options.schemasPath || path.join(__dirname, '../schemas');
@@ -68,6 +69,17 @@ class ModuleValidator {
68
69
  this.schemas = (0, schemaLoader_1.loadSchemas)(this.schemasDir);
69
70
  // Register schemas with Ajv
70
71
  this.registerSchemas();
72
+ const kindsPath = path.join(this.schemasDir, 'quick-search-kinds.json');
73
+ this.quickSearchKinds = null;
74
+ this.quickSearchKindsError = null;
75
+ if (fs.existsSync(kindsPath)) {
76
+ try {
77
+ this.quickSearchKinds = JSON.parse(fs.readFileSync(kindsPath, 'utf-8'));
78
+ }
79
+ catch (error) {
80
+ this.quickSearchKindsError = `quick-search-kinds.json in ${this.schemasDir} is invalid (${error.message}). Reinstall @cxtms/cx-schema.`;
81
+ }
82
+ }
71
83
  }
72
84
  /**
73
85
  * Register all loaded schemas with Ajv
@@ -363,8 +375,35 @@ class ModuleValidator {
363
375
  message: 'Entity must have a name property'
364
376
  });
365
377
  }
378
+ if (entity.quickSearch !== undefined) {
379
+ this.validateQuickSearch(entity, `${entityPath}.quickSearch`, errors);
380
+ }
366
381
  });
367
382
  }
383
+ /**
384
+ * Validate an entity's quickSearch block: shape via schemas.json#/definitions/quickSearch,
385
+ * then the semantic rules the backend also enforces at module save.
386
+ */
387
+ validateQuickSearch(entity, basePath, errors) {
388
+ const validate = this.ajv.getSchema('schemas.json#/definitions/quickSearch');
389
+ if (validate && !validate(entity.quickSearch)) {
390
+ this.addAjvErrors(validate.errors, basePath, errors);
391
+ return;
392
+ }
393
+ if (!this.quickSearchKinds) {
394
+ const reason = this.quickSearchKindsError
395
+ ?? `quick-search-kinds.json not found in ${this.schemasDir}. Reinstall @cxtms/cx-schema.`;
396
+ errors.push({
397
+ type: 'invalid_quick_search',
398
+ path: basePath,
399
+ message: `Cannot validate quickSearch: ${reason}`
400
+ });
401
+ return;
402
+ }
403
+ for (const message of (0, quickSearchValidator_1.validateQuickSearch)(entity.name, entity.entityKind, entity.quickSearch, this.quickSearchKinds)) {
404
+ errors.push({ type: 'invalid_quick_search', path: basePath, message });
405
+ }
406
+ }
368
407
  /**
369
408
  * Validate configurations array
370
409
  */
@@ -1 +1 @@
1
- {"version":3,"file":"validator.js","sourceRoot":"","sources":["../src/validator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validator.js","sourceRoot":"","sources":["../src/validator.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cxtms/cx-schema",
3
- "version": "1.9.261",
3
+ "version": "1.9.263",
4
4
  "description": "Schema validation package for CXTMS YAML modules",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -0,0 +1,27 @@
1
+ {
2
+ "AccountingTransaction": {
3
+ "key": "accountingTransactionId",
4
+ "matchFields": ["transactionNumber"],
5
+ "select": ["accountingTransactionStatus", "accountingTransactionType", "applyToContact.name", "created", "customValues.*", "dueDate", "transactionDate", "transactionNumber"]
6
+ },
7
+ "Commodity": {
8
+ "key": "commodityId",
9
+ "matchFields": ["description", "serialNumber", "trackingNumbers.trackingNumber"],
10
+ "select": ["billToContact.name", "commodityStatus.statusName", "created", "customValues.*", "description", "serialNumber"]
11
+ },
12
+ "Contact": {
13
+ "key": "contactId",
14
+ "matchFields": ["accountNumber", "name"],
15
+ "select": ["accountNumber", "contactStatus.statusName", "contactType", "created", "customValues.*", "name"]
16
+ },
17
+ "Job": {
18
+ "key": "jobId",
19
+ "matchFields": ["jobNumber"],
20
+ "select": ["created", "customValues.*", "customer.name", "description", "employee.name", "jobNumber", "jobStatus.jobStatusName"]
21
+ },
22
+ "Order": {
23
+ "key": "orderId",
24
+ "matchFields": ["orderNumber", "trackingNumber"],
25
+ "select": ["billToContact.name", "created", "customValues.*", "employeeContact.name", "orderNumber", "orderStatus.orderStatusName", "orderType", "salespersonContact.name", "trackingNumber"]
26
+ }
27
+ }
@@ -10807,6 +10807,70 @@ scalar TimeSpanScalar
10807
10807
 
10808
10808
  scalar UUID @specifiedBy(url: "https://tools.ietf.org/html/rfc4122")
10809
10809
 
10810
+ scalar Long
10811
+
10812
+ extend type Query {
10813
+ quickSearch(organizationId: Int!, query: String!, entityNames: [String!], take: Int! = 5): QuickSearchResult!
10814
+ quickSearchEntities(organizationId: Int!): [QuickSearchEntity!]!
10815
+ agentSessionAttachments(skip: Int, take: Int, organizationId: Int!, agentSessionId: UUID, contentKind: AttachmentContentKind): AgentSessionAttachmentsCollectionSegment @cost(weight: "10")
10816
+ }
10817
+
10818
+ type QuickSearchResult {
10819
+ groups: [QuickSearchGroup!]!
10820
+ }
10821
+
10822
+ type QuickSearchGroup {
10823
+ entityName: String!
10824
+ items: [QuickSearchItem!]!
10825
+ total: Int!
10826
+ hasMore: Boolean!
10827
+ partial: Boolean!
10828
+ }
10829
+
10830
+ type QuickSearchItem {
10831
+ key: String!
10832
+ matchRank: Int!
10833
+ data: MapOfObject
10834
+ }
10835
+
10836
+ type QuickSearchEntity {
10837
+ entityName: String!
10838
+ entityKind: String!
10839
+ groupLabel: MapOfObject
10840
+ icon: String!
10841
+ order: Int!
10842
+ display: MapOfObject
10843
+ open: MapOfObject
10844
+ }
10845
+
10846
+ type AgentSessionAttachmentGqlDto {
10847
+ attachmentId: Int!
10848
+ fileName: String!
10849
+ contentType: String
10850
+ size: Long
10851
+ origin: AgentSessionAttachmentOrigin!
10852
+ createdAt: DateTime!
10853
+ agentSessionId: UUID!
10854
+ sessionTitle: String
10855
+ workflowId: UUID!
10856
+ }
10857
+
10858
+ type AgentSessionAttachmentsCollectionSegment {
10859
+ pageInfo: CollectionSegmentInfo!
10860
+ items: [AgentSessionAttachmentGqlDto!]
10861
+ totalCount: Int! @cost(weight: "10")
10862
+ }
10863
+
10864
+ enum AttachmentContentKind {
10865
+ Image
10866
+ Document
10867
+ }
10868
+
10869
+ enum AgentSessionAttachmentOrigin {
10870
+ Uploaded
10871
+ Produced
10872
+ }
10873
+
10810
10874
  extend type Query {
10811
10875
  dispatchRouteStopStatus(
10812
10876
  organizationId: Int!
@@ -541,7 +541,7 @@
541
541
  "name": { "type": "string" },
542
542
  "entityKind": {
543
543
  "type": "string",
544
- "enum": ["Order", "Contact", "OrderEntity", "AccountingTransaction", "Calendar", "CalendarEvent", "Other"]
544
+ "enum": ["Order", "Contact", "OrderEntity", "AccountingTransaction", "Calendar", "CalendarEvent", "CalendarAvailabilityBlock", "Other", "AuditChangeEntry", "Job", "Commodity"]
545
545
  },
546
546
  "extension": { "type": "boolean", "description": "Whether this entity extends an existing type" },
547
547
  "displayName": { "$ref": "#/definitions/localized" },
@@ -549,11 +549,51 @@
549
549
  "fields": {
550
550
  "type": "array",
551
551
  "items": { "$ref": "#/definitions/entityField" }
552
- }
552
+ },
553
+ "quickSearch": { "$ref": "#/definitions/quickSearch" }
553
554
  },
554
555
  "required": ["name", "entityKind"]
555
556
  },
556
557
 
558
+ "quickSearch": {
559
+ "type": "object",
560
+ "description": "Opts the entity into the global quick search (Ctrl+K). The backend validates the same rules at module save; see skills/cxtms-module-builder.",
561
+ "properties": {
562
+ "enabled": { "type": "boolean" },
563
+ "filter": { "type": "string", "description": "Lucene filter narrowing the kind's table to this entity, e.g. 'orderType: AirShipmentOrder'." },
564
+ "permission": { "type": "string", "description": "Permission required to see this group. Not enforced by the backend yet (HasPermission stub)." },
565
+ "matchFields": { "type": "array", "items": { "type": "string" }, "description": "Identifier fields matched exact > prefix > contains. Allowed values per entityKind: schemas/quick-search-kinds.json." },
566
+ "select": { "type": "array", "items": { "type": "string" }, "description": "Dotted paths fetched for display/open templates; customValues.<key> allowed." },
567
+ "groupLabel": { "$ref": "#/definitions/localized", "description": "Defaults to the entity displayName." },
568
+ "icon": { "type": "string", "description": "Tabler icon class as used by the web app, e.g. tabler-plane." },
569
+ "order": { "type": "integer", "description": "Tab/group position, ascending; default 100." },
570
+ "display": {
571
+ "type": "object",
572
+ "properties": {
573
+ "title": { "type": "string" },
574
+ "subtitle": { "type": "string" },
575
+ "badge": { "type": "string" }
576
+ },
577
+ "additionalProperties": false
578
+ },
579
+ "open": {
580
+ "type": "object",
581
+ "description": "Exactly one of navigate (route path template, unchanged) or dialog (component name opened in a dialog, e.g. Orders/UpdateOrder).",
582
+ "properties": {
583
+ "navigate": { "type": "string" },
584
+ "dialog": {
585
+ "type": "string",
586
+ "pattern": "^[A-Za-z0-9]+(/[A-Za-z0-9]+)+$",
587
+ "description": "Component name opened in a dialog, e.g. Orders/UpdateOrder. It receives the record key (e.g. orderId), organizationId and the title."
588
+ }
589
+ },
590
+ "additionalProperties": false
591
+ }
592
+ },
593
+ "required": ["enabled"],
594
+ "additionalProperties": false
595
+ },
596
+
557
597
  "calendarEvent": {
558
598
  "type": "object",
559
599
  "description": "Calendar event object structure",
@@ -123,6 +123,7 @@ Used in module `entityKind` and Flow workflow `entity.name`:
123
123
  | `OrderEntity` | OrderEntity (Shipper, Consignee, Carrier roles on an order) |
124
124
  | `AccountingTransaction` | Invoice, Bill, CreditMemo |
125
125
  | `Commodity` | Commodity |
126
+ | `Job` | Job |
126
127
  | `Calendar` | CalendarEntity |
127
128
  | `CalendarEvent` | CalendarEvent |
128
129
  | `Other` | Any custom entity |
@@ -38,6 +38,14 @@ Order quick search (`orders.search` and `orderGroupBy.search`) matches order num
38
38
 
39
39
  Order-move quick search (`orderMoves.search`) matches the move name plus its owning order's tracking number and JSON custom values (for example, a container number). Matching is case-insensitive and accepts partial text.
40
40
 
41
+ ## Cross-entity quick search
42
+
43
+ `quickSearchEntities(organizationId)` returns the organization's searchable entity configuration: entity name/kind, localized group label, icon and ordering, display templates, and the route or dialog used to open a result. Load this configuration before rendering a search palette.
44
+
45
+ `quickSearch(organizationId, query, entityNames?, take: 5)` searches all configured entities or an optional subset. Results are grouped by `entityName`; each group includes `total`, `hasMore`, `partial`, and ranked items with a stable string `key` and `data` map. Apply the matching entity configuration's display and open templates to `data`.
46
+
47
+ `agentSessionAttachments(organizationId, agentSessionId?, contentKind?, skip?, take?)` lists attachments from agent sessions visible to the caller. Omit the session id for an all-visible-sessions library; filter `contentKind` by `Image` or `Document`. Each item identifies its attachment, source session/workflow, file metadata, and whether its `origin` is `Uploaded` or `Produced`.
48
+
41
49
  ## App Module Metadata Visibility
42
50
 
43
51
  GraphQL metadata queries hide rows attached to soft-deleted app modules:
@@ -216,7 +216,7 @@ module:
216
216
 
217
217
  entities:
218
218
  - name: <EntityName>
219
- entityKind: Order | Contact | OrderEntity | AccountingTransaction | Calendar | CalendarEvent | Other
219
+ entityKind: Order | Contact | OrderEntity | AccountingTransaction | Job | Commodity | Calendar | CalendarEvent | CalendarAvailabilityBlock | AuditChangeEntry | Other
220
220
  extension: false # true if extending existing entity
221
221
  displayName: { en-US: "..." }
222
222
  fields:
@@ -234,6 +234,22 @@ entities:
234
234
  filter: "contactType: Customer"
235
235
  options: { baseName: "contactId" }
236
236
 
237
+ quickSearch: # Optional: show this entity in the global quick search (Ctrl+K)
238
+ enabled: true
239
+ filter: "orderType: AirShipmentOrder" # Lucene, same syntax as grid filters
240
+ permission: AirShipments/Read # Not enforced by the backend yet
241
+ matchFields: [orderNumber, trackingNumber] # Allowed per entityKind: .cx-schema/quick-search-kinds.json
242
+ select: [orderNumber, trackingNumber, billToContact.name, orderStatus.orderStatusName, customValues.hawb]
243
+ groupLabel: { en-US: "Air Shipments" } # Defaults to displayName
244
+ icon: tabler-plane
245
+ order: 20
246
+ display:
247
+ title: "{{ orderNumber }}" # Templates may use only select paths and the key (orderId)
248
+ subtitle: "{{ billToContact.name }} · {{ trackingNumber }}"
249
+ badge: "{{ orderStatus.orderStatusName }}"
250
+ open:
251
+ navigate: "consolidatedShipments/AirShipmentOrder/{{ orderId }}" # or dialog: Module/Component (opened in a dialog with the record key)
252
+
237
253
  permissions:
238
254
  - name: "ModuleName/Read" # PascalCase with slashes
239
255
  displayName: { en-US: "..." }
@@ -267,6 +283,8 @@ components:
267
283
  # ... component tree
268
284
  ```
269
285
 
286
+ **Quick search (`quickSearch`).** Supported `entityKind` values: `Order`, `Contact`, `AccountingTransaction`, `Job`, `Commodity`. `matchFields` must come from that kind's list in `.cx-schema/quick-search-kinds.json` (copied into your project at install; also available at `node_modules/@cxtms/cx-schema/schemas/quick-search-kinds.json`) — identifier columns only; `customValues` cannot be matched. `select` from the same file, plus any `customValues.<key>`. `display.title`, `icon` and exactly one of `open.navigate` / `open.dialog` are required. `npx cxtms` checks all of this; the backend additionally rejects an invalid `filter` when the module is saved. To change how a core entity opens (or hide it with `enabled: false`), redeclare the entity in your app module with its own full `quickSearch` block — the most recently saved block wins.
287
+
270
288
  ## Action Types
271
289
 
272
290
  Actions are used in event handlers (onClick, onSubmit, etc.) as arrays:
@@ -555,7 +573,7 @@ npx cxtms app release -m "Add warehouse locations module" --org 42
555
573
  - Permission names: PascalCase with slashes (e.g., `WarehouseLocations/Read`, `System/Contacts/Update`)
556
574
  4. **Template expressions** use `{{ expression }}` syntax (double curly braces); prefer built-in functions (`isEqual`, `any`, `isNullOrEmpty`, `format`, …) over `eval`, and write non-trivial `eval` expressions as multiline block scalars (`>-`) — see Template expressions
557
575
  5. **Include filePath** property pointing to the YAML file location
558
- 6. **Set proper entityKind** when defining entities (Order, Contact, OrderEntity, AccountingTransaction, Calendar, CalendarEvent, Other)
576
+ 6. **Set proper entityKind** when defining entities (Order, Contact, OrderEntity, AccountingTransaction, Job, Commodity, Calendar, CalendarEvent, CalendarAvailabilityBlock, AuditChangeEntry, Other); it is required for `quickSearch`
559
577
  7. **DataGrid options** requires ALL properties: query, rootEntityName, entityKeys, navigationType, enableDynamicGrid, enableViews, enableSearch, enablePagination, enableColumns, enableFilter, defaultView, onRowClick
560
578
  8. **Form component** requires `validationSchema` in props
561
579
  9. **Adaptive (mobile/tablet/desktop) design by default** — every form and layout must work on phones (`xs`), tablets (`sm`/`md`), and desktops (`lg+`):
@@ -12,6 +12,7 @@
12
12
  - Tool approval (`tools[].mode`) and the chat's Ask/Auto approval mode
13
13
  - Built-in data tools (`tools[].builtin`): `data.query`, `data.schema`, `data.type`
14
14
  - History compression
15
+ - Files in chat: what the model receives, and the model config's `supportsFiles` flag
15
16
  - Session ownership and live events
16
17
  - Triggers: synchronous execution and lock behavior for trigger-bound agents
17
18
  - The `ai.default` organization config shape
@@ -212,6 +213,41 @@ Each chat turn adds to a growing conversation history, bounded by the model's co
212
213
  - On the client side, the internal Responses route announces a compression with a `response.tms.history_compressed` stream event; the transcript (GraphQL) always shows the `summary` message and a `usage` entry with `kind: "summary"`, on both routes.
213
214
  - If an agent frequently needs long conversations against a small model, either raise `model.contextWindow` to match the model actually in use (see the property table above) or keep `agent.instructions` terse so more of the window is available for turns.
214
215
 
216
+ ## Files in Chat
217
+
218
+ People can attach files to a chat message in the AI Assistant: up to 5 per message, 25 MB each, of these types:
219
+
220
+ | Kind | Types | What the model receives |
221
+ |---|---|---|
222
+ | Documents | PDF | The file itself: inline bytes up to 4 MB, above that a presigned URL (PDF URLs only for the `anthropic` provider — other providers refuse a PDF over 4 MB) |
223
+ | Images | PNG, JPG/JPEG | The image: inline bytes up to 4 MB, above that a presigned URL |
224
+ | Text | TXT, CSV, JSON, MD | The text, decoded as UTF-8 and cut at 200,000 characters with a truncation note |
225
+
226
+ Nothing in `agent:` YAML opts in or out — every chat agent accepts files, and there is no YAML schema change. What
227
+ the agent sees:
228
+
229
+ - Each file arrives in the user's turn after a label such as `[Attached file: bol.pdf (PDF, 1.2 MB)]`, so the model
230
+ can refer to it by name. Text content is fenced as data, not instructions — like a tool result — so a file that
231
+ says "ignore your instructions" is just text in a file.
232
+ - Files stay in the conversation: every later turn can still read them (they are re-sent on each model call, within a
233
+ 16 MB inline budget per call; older files beyond it go by URL or as a note asking the user to attach them again).
234
+ When history is compressed, the summary names the files but their content leaves the history.
235
+ - A file that can't be read when a turn runs reaches the model as `[File <name> could not be read.]` instead of
236
+ failing the turn.
237
+ - Every chat upload becomes an Attachment linked to the session (parent type `AgentSession`, category
238
+ `AgentSession`), visible only to people who can see the chat, and listed in the AI Assistant's Library. Task
239
+ sessions (workflow runs) never receive files.
240
+
241
+ **Which models read PDFs and images** is decided by the model config's `supportsFiles` flag (see
242
+ [The `ai.default` Organization Config](#the-aidefault-organization-config)). When it is `false`, the chat refuses PDFs
243
+ and images when they are attached — before the message is sent — and text files still work. `GET .../ai/models`
244
+ reports it per agent as `supports_files`, which the chat uses to validate a file before uploading it.
245
+
246
+ Write `agent.instructions` for chat agents that will receive documents to say what to do with them (e.g. "When the
247
+ user attaches a bill of lading, read the shipper, consignee and pallet count from it"), and to answer only from
248
+ what the file shows. Full request shapes and error messages are in `docs/agent-api.md` §4 "Attaching files" in
249
+ `tms-backend-api`.
250
+
215
251
  ## Session Ownership and Live Events
216
252
 
217
253
  Every agent session (task or chat) has an owner scope — `User`, `Division`, or `Organization` — that governs who may see it, continue it, decide its approvals, and watch it live. A chat session defaults to `User` (its starter); a task session defaults to `Organization` (it has no starter). Ownership can be changed afterward (e.g. shared with a division) via a GraphQL mutation, and every session change publishes a live event.
@@ -237,10 +273,16 @@ For a trigger-bound agent, either:
237
273
  "model": "claude-sonnet-4-5",
238
274
  "apiKey": "...",
239
275
  "endpoint": "https://api.anthropic.com",
240
- "contextWindow": 200000
276
+ "contextWindow": 200000,
277
+ "supportsFiles": true
241
278
  }
242
279
  ```
243
280
 
281
+ `supportsFiles` (optional) says whether the model reads PDFs and images attached in chat (see
282
+ [Files in chat](#files-in-chat)). When it is absent, it defaults to `true` for the `anthropic` and `openai`
283
+ providers and to `false` for any other provider. Set it to `false` for a model without vision or PDF support, and
284
+ to `true` for a file-capable model behind another provider. Text attachments work either way.
285
+
244
286
  Set up this config once per organization (or per named config for `model.fromConfig` overrides); every Agent workflow that doesn't override `model.name`/`model.temperature` shares it. The config's own `contextWindow` (if set) is the fallback used when the agent's YAML doesn't declare `model.contextWindow` — but only while the agent doesn't also override `model.name`; overriding the model name without also setting `agent.model.contextWindow` falls straight through to the runtime default of 256,000 tokens, since the config's window describes the config's model, not the override.
245
287
 
246
288
  ## Tool Name Derivation (Workflow Name → Tool Name)
@@ -257,6 +299,7 @@ When a workflow is exposed as a tool (via another agent's `tools[].workflow`, or
257
299
  - **Use `mode: always` for actions a person must confirm every time.** `approval` tools run unattended once a user switches the chat to Auto; `always` tools never do.
258
300
  - **Give chat agents `agent.ui`.** A `shortDescription`, an `icon`, a `color` and a few `prompts` make the agent recognizable in the AI Assistant's agent menu and empty state.
259
301
  - **Set `model.contextWindow` whenever you set `model.name`.** Otherwise a smaller model than the org default silently gets the 256K default window, and history compression won't kick in until it's already over budget (or a larger model gets compressed too eagerly). See the `model.contextWindow` row above.
302
+ - **Set `supportsFiles` on the model config to match the model.** A model that can't read PDFs or images should say so (`"supportsFiles": false`), so the chat refuses those files up front instead of the provider failing the turn. See [Files in chat](#files-in-chat).
260
303
  - **Design `agent.result`/`agent.instructions` around whichever session type(s) the agent is actually used in.** A chat-only agent doesn't need `agent.result` (it has no `set_result` tool); a task-only agent should tell the model explicitly to call `set_result` exactly once (the scaffolded template's instructions already do this).
261
304
  - **Keep trigger-bound agents fast**, or move them off the triggering request entirely (see [Triggers](#triggers)) — a slow agent session holds the entity's workflow lock for its whole duration.
262
305