@unrdf/knowledge-engine 5.0.1 → 26.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/package.json +23 -17
  2. package/src/ai-enhanced-search.mjs +371 -0
  3. package/src/anomaly-detector.mjs +226 -0
  4. package/src/artifact-generator.mjs +252 -0
  5. package/src/browser.mjs +1 -1
  6. package/src/chatman/disruption-arithmetic.mjs +140 -0
  7. package/src/chatman/market-dynamics.mjs +140 -0
  8. package/src/chatman/organizational-dynamics.mjs +140 -0
  9. package/src/chatman/strategic-dynamics.mjs +140 -0
  10. package/src/chatman-config-loader.mjs +282 -0
  11. package/src/chatman-engine.mjs +435 -0
  12. package/src/chatman-operator.mjs +343 -0
  13. package/src/dark-field-detector.mjs +332 -0
  14. package/src/formation-theorems.mjs +345 -0
  15. package/src/index.mjs +20 -2
  16. package/src/knowledge-hook-manager.mjs +1 -1
  17. package/src/lockchain-writer-browser.mjs +2 -2
  18. package/src/observability.mjs +40 -4
  19. package/src/query-optimizer.mjs +1 -1
  20. package/src/resolution-layer.mjs +1 -1
  21. package/src/transaction.mjs +11 -9
  22. package/README.md +0 -84
  23. package/src/browser-shims.mjs +0 -343
  24. package/src/canonicalize.mjs +0 -414
  25. package/src/condition-cache.mjs +0 -109
  26. package/src/condition-evaluator.mjs +0 -722
  27. package/src/dark-matter-core.mjs +0 -742
  28. package/src/define-hook.mjs +0 -213
  29. package/src/effect-sandbox-browser.mjs +0 -283
  30. package/src/effect-sandbox-worker.mjs +0 -170
  31. package/src/effect-sandbox.mjs +0 -517
  32. package/src/engines/index.mjs +0 -11
  33. package/src/engines/rdf-engine.mjs +0 -299
  34. package/src/file-resolver.mjs +0 -387
  35. package/src/hook-executor-batching.mjs +0 -277
  36. package/src/hook-executor.mjs +0 -870
  37. package/src/hook-management.mjs +0 -150
  38. package/src/ken-parliment.mjs +0 -119
  39. package/src/ken.mjs +0 -149
  40. package/src/knowledge-engine/builtin-rules.mjs +0 -190
  41. package/src/knowledge-engine/inference-engine.mjs +0 -418
  42. package/src/knowledge-engine/knowledge-engine.mjs +0 -317
  43. package/src/knowledge-engine/pattern-dsl.mjs +0 -142
  44. package/src/knowledge-engine/pattern-matcher.mjs +0 -215
  45. package/src/knowledge-engine/rules.mjs +0 -184
  46. package/src/knowledge-engine.mjs +0 -319
  47. package/src/knowledge-hook-engine.mjs +0 -360
  48. package/src/knowledge-substrate-core.mjs +0 -927
  49. package/src/lite.mjs +0 -222
  50. package/src/lockchain-writer.mjs +0 -602
  51. package/src/monitoring/andon-signals.mjs +0 -775
  52. package/src/parse.mjs +0 -290
  53. package/src/performance-optimizer.mjs +0 -678
  54. package/src/policy-pack.mjs +0 -572
  55. package/src/query-cache.mjs +0 -116
  56. package/src/query.mjs +0 -306
  57. package/src/reason.mjs +0 -350
  58. package/src/schemas.mjs +0 -1063
  59. package/src/security/error-sanitizer.mjs +0 -257
  60. package/src/security/path-validator.mjs +0 -194
  61. package/src/security/sandbox-restrictions.mjs +0 -331
  62. package/src/security-validator.mjs +0 -389
  63. package/src/store-cache.mjs +0 -137
  64. package/src/telemetry.mjs +0 -167
  65. package/src/utils/adaptive-monitor.mjs +0 -746
  66. package/src/utils/circuit-breaker.mjs +0 -513
  67. package/src/utils/edge-case-handler.mjs +0 -503
  68. package/src/utils/memory-manager.mjs +0 -498
  69. package/src/utils/ring-buffer.mjs +0 -282
  70. package/src/validate.mjs +0 -319
  71. package/src/validators/index.mjs +0 -338
@@ -0,0 +1,252 @@
1
+ /**
2
+ * @file Artifact Generator - A = μ(O) Calculator
3
+ * @module knowledge-engine/artifact-generator
4
+ *
5
+ * @description
6
+ * Implements the artifact generation function A = μ(O) from the Chatman Equation.
7
+ * Transforms observable patterns into complete artifact spaces including dark field.
8
+ */
9
+
10
+ import { randomUUID } from 'crypto';
11
+ import { z } from 'zod';
12
+ import { ChatmanOperator } from './chatman-operator.mjs';
13
+
14
+ /**
15
+ * Artifact schema
16
+ */
17
+ export const ArtifactSchema = z.object({
18
+ id: z.string().uuid(),
19
+ type: z.enum(['market', 'organizational', 'strategic', 'disruption']),
20
+ observable: z.object({
21
+ patterns: z.array(z.string()),
22
+ visibility: z.number(),
23
+ }),
24
+ darkField: z.object({
25
+ patterns: z.array(z.string()),
26
+ visibility: z.number(),
27
+ coverage: z.number(),
28
+ }),
29
+ totalPatterns: z.number().int().positive(),
30
+ completeness: z.number().min(0).max(1),
31
+ generatedAt: z.number(),
32
+ receipt: z
33
+ .object({
34
+ id: z.string().uuid(),
35
+ operation: z.literal('artifact_generation'),
36
+ timestamp: z.number(),
37
+ })
38
+ .optional(),
39
+ });
40
+
41
+ /**
42
+ * Generation options schema
43
+ */
44
+ export const GenerationOptionsSchema = z.object({
45
+ includeReceipt: z.boolean().default(true),
46
+ observableRatio: z.number().min(0).max(1).default(0.05),
47
+ validate: z.boolean().default(true),
48
+ metadata: z.record(z.unknown()).optional(),
49
+ });
50
+
51
+ /**
52
+ * Artifact generator for Chatman Equation
53
+ */
54
+ export class ArtifactGenerator {
55
+ /**
56
+ * Create a new artifact generator
57
+ * @param {Object} [options] - Generator options
58
+ * @param {Function} [options.tracer] - OTEL tracer function
59
+ * @param {Function} [options.receiptGenerator] - Receipt generation function
60
+ */
61
+ constructor(options = {}) {
62
+ this.tracer = options.tracer;
63
+ this.receiptGenerator = options.receiptGenerator;
64
+ this.operator = new ChatmanOperator({
65
+ tracer: this.tracer,
66
+ observableRatio: options.observableRatio,
67
+ });
68
+ this.metrics = {
69
+ artifactsGenerated: 0,
70
+ averageCompleteness: 0,
71
+ averageDarkFieldSize: 0,
72
+ };
73
+ }
74
+
75
+ /**
76
+ * Generate artifact from observable patterns: A = μ(O)
77
+ * @param {Object} observable - Observable pattern
78
+ * @param {Object} [options] - Generation options
79
+ * @returns {Promise<Object>} Generated artifact
80
+ */
81
+ async generate(observable, options = {}) {
82
+ const span = this.tracer?.startSpan?.('chatman.artifact.generate');
83
+ const startTime = Date.now();
84
+
85
+ try {
86
+ const opts = GenerationOptionsSchema.parse(options);
87
+
88
+ span?.setAttribute?.('observable.type', observable.type);
89
+ span?.setAttribute?.('observable.pattern_count', observable.patterns.length);
90
+ span?.setAttribute?.('options.include_receipt', opts.includeReceipt);
91
+
92
+ // Apply μ operator to compute closure
93
+ const closure = await this.operator.apply(observable);
94
+
95
+ // Generate artifact from closure
96
+ const artifact = {
97
+ id: randomUUID(),
98
+ type: observable.type,
99
+ observable: {
100
+ patterns: closure.observable.patterns,
101
+ visibility: closure.observable.visibility,
102
+ },
103
+ darkField: closure.darkField,
104
+ totalPatterns:
105
+ closure.observable.patterns.length + closure.darkField.patterns.length,
106
+ completeness: closure.completeness,
107
+ generatedAt: Date.now(),
108
+ };
109
+
110
+ // Generate receipt if requested
111
+ if (opts.includeReceipt) {
112
+ artifact.receipt = this._generateReceipt(artifact, closure);
113
+ }
114
+
115
+ // Validate artifact
116
+ if (opts.validate) {
117
+ ArtifactSchema.parse(artifact);
118
+ }
119
+
120
+ // Update metrics
121
+ this.metrics.artifactsGenerated++;
122
+ this.metrics.averageCompleteness =
123
+ (this.metrics.averageCompleteness * (this.metrics.artifactsGenerated - 1) +
124
+ artifact.completeness) /
125
+ this.metrics.artifactsGenerated;
126
+ this.metrics.averageDarkFieldSize =
127
+ (this.metrics.averageDarkFieldSize * (this.metrics.artifactsGenerated - 1) +
128
+ artifact.darkField.patterns.length) /
129
+ this.metrics.artifactsGenerated;
130
+
131
+ span?.addEvent?.('artifact_generated', {
132
+ 'artifact.id': artifact.id,
133
+ 'artifact.completeness': artifact.completeness,
134
+ 'artifact.total_patterns': artifact.totalPatterns,
135
+ 'artifact.duration_ms': Date.now() - startTime,
136
+ });
137
+
138
+ return artifact;
139
+ } catch (error) {
140
+ span?.recordException?.(error);
141
+ span?.setStatus?.({ code: 2, message: error.message });
142
+ throw error;
143
+ } finally {
144
+ span?.end?.();
145
+ }
146
+ }
147
+
148
+ /**
149
+ * Generate multiple artifacts in batch
150
+ * @param {Array<Object>} observables - Array of observable patterns
151
+ * @param {Object} [options] - Generation options
152
+ * @returns {Promise<Array<Object>>} Generated artifacts
153
+ */
154
+ async generateBatch(observables, options = {}) {
155
+ const span = this.tracer?.startSpan?.('chatman.artifact.generate_batch');
156
+
157
+ try {
158
+ span?.setAttribute?.('batch_size', observables.length);
159
+
160
+ const artifacts = await Promise.all(
161
+ observables.map(observable => this.generate(observable, options))
162
+ );
163
+
164
+ span?.addEvent?.('batch_generated', {
165
+ 'batch.count': artifacts.length,
166
+ 'batch.avg_completeness': this._calculateAverageCompleteness(artifacts),
167
+ });
168
+
169
+ return artifacts;
170
+ } catch (error) {
171
+ span?.recordException?.(error);
172
+ span?.setStatus?.({ code: 2, message: error.message });
173
+ throw error;
174
+ } finally {
175
+ span?.end?.();
176
+ }
177
+ }
178
+
179
+ /**
180
+ * Generate receipt for artifact
181
+ * @param {Object} artifact - Generated artifact
182
+ * @param {Object} closure - Closure result
183
+ * @returns {Object} Receipt
184
+ * @private
185
+ */
186
+ _generateReceipt(artifact, closure) {
187
+ if (this.receiptGenerator) {
188
+ return this.receiptGenerator({
189
+ operation: 'artifact_generation',
190
+ entityType: 'ChatmanArtifact',
191
+ entityId: artifact.id,
192
+ data: {
193
+ observableCount: artifact.observable.patterns.length,
194
+ darkFieldCount: artifact.darkField.patterns.length,
195
+ completeness: artifact.completeness,
196
+ operatorId: closure.operatorId,
197
+ },
198
+ });
199
+ }
200
+
201
+ // Default receipt
202
+ return {
203
+ id: randomUUID(),
204
+ operation: 'artifact_generation',
205
+ timestamp: Date.now(),
206
+ };
207
+ }
208
+
209
+ /**
210
+ * Calculate average completeness from artifacts
211
+ * @param {Array<Object>} artifacts - Artifacts
212
+ * @returns {number} Average completeness
213
+ * @private
214
+ */
215
+ _calculateAverageCompleteness(artifacts) {
216
+ if (artifacts.length === 0) return 0;
217
+ const sum = artifacts.reduce((acc, a) => acc + a.completeness, 0);
218
+ return sum / artifacts.length;
219
+ }
220
+
221
+ /**
222
+ * Get generator metrics
223
+ * @returns {Object} Metrics
224
+ */
225
+ getMetrics() {
226
+ return {
227
+ ...this.metrics,
228
+ operator: this.operator.getMetrics(),
229
+ };
230
+ }
231
+
232
+ /**
233
+ * Reset generator metrics
234
+ */
235
+ resetMetrics() {
236
+ this.metrics = {
237
+ artifactsGenerated: 0,
238
+ averageCompleteness: 0,
239
+ averageDarkFieldSize: 0,
240
+ };
241
+ this.operator.resetMetrics();
242
+ }
243
+ }
244
+
245
+ /**
246
+ * Create an artifact generator instance
247
+ * @param {Object} [options] - Generator options
248
+ * @returns {ArtifactGenerator} Generator instance
249
+ */
250
+ export function createArtifactGenerator(options = {}) {
251
+ return new ArtifactGenerator(options);
252
+ }
package/src/browser.mjs CHANGED
@@ -8,7 +8,7 @@
8
8
  */
9
9
 
10
10
  import { _isBrowser } from './browser-shims.mjs';
11
- import { randomUUID, path, _fs } from './browser-shims.mjs';
11
+ import { randomUUID, path, fs } from './browser-shims.mjs';
12
12
  import { process as _browserProcess } from './browser-shims.mjs';
13
13
 
14
14
  // Browser-compatible versions
@@ -0,0 +1,140 @@
1
+ /**
2
+ * @file Disruption Arithmetic Rules
3
+ * @module knowledge-engine/chatman/disruption-arithmetic
4
+ *
5
+ * @description
6
+ * Disruption arithmetic rules for Chatman Equation analysis.
7
+ * Defines patterns for disruption vectors, innovation barriers,
8
+ * adoption triggers, technology convergence, and resistance patterns.
9
+ */
10
+
11
+ import { z } from 'zod';
12
+
13
+ /**
14
+ * Disruption arithmetic rule schema
15
+ */
16
+ export const DisruptionArithmeticRuleSchema = z.object({
17
+ id: z.string(),
18
+ name: z.string(),
19
+ category: z.enum([
20
+ 'disruption_vectors',
21
+ 'innovation_barriers',
22
+ 'adoption_triggers',
23
+ 'technology_convergence',
24
+ 'resistance_patterns',
25
+ ]),
26
+ pattern: z.string(),
27
+ darkFieldMultiplier: z.number().positive().default(19),
28
+ confidence: z.number().min(0).max(1).default(0.8),
29
+ });
30
+
31
+ /**
32
+ * Disruption arithmetic rules
33
+ */
34
+ export const DISRUPTION_ARITHMETIC_RULES = [
35
+ {
36
+ id: 'da-001',
37
+ name: 'Latent Disruption Vectors',
38
+ category: 'disruption_vectors',
39
+ pattern: 'latent_disruption_vectors',
40
+ darkFieldMultiplier: 19,
41
+ confidence: 0.85,
42
+ },
43
+ {
44
+ id: 'da-002',
45
+ name: 'Hidden Innovation Barriers',
46
+ category: 'innovation_barriers',
47
+ pattern: 'hidden_innovation_barriers',
48
+ darkFieldMultiplier: 19,
49
+ confidence: 0.83,
50
+ },
51
+ {
52
+ id: 'da-003',
53
+ name: 'Implicit Adoption Triggers',
54
+ category: 'adoption_triggers',
55
+ pattern: 'implicit_adoption_triggers',
56
+ darkFieldMultiplier: 19,
57
+ confidence: 0.84,
58
+ },
59
+ {
60
+ id: 'da-004',
61
+ name: 'Emergent Technology Convergence',
62
+ category: 'technology_convergence',
63
+ pattern: 'emergent_technology_convergence',
64
+ darkFieldMultiplier: 19,
65
+ confidence: 0.86,
66
+ },
67
+ {
68
+ id: 'da-005',
69
+ name: 'Tacit Resistance Patterns',
70
+ category: 'resistance_patterns',
71
+ pattern: 'tacit_resistance_patterns',
72
+ darkFieldMultiplier: 19,
73
+ confidence: 0.82,
74
+ },
75
+ {
76
+ id: 'da-006',
77
+ name: 'Invisible Tipping Points',
78
+ category: 'disruption_vectors',
79
+ pattern: 'invisible_tipping_points',
80
+ darkFieldMultiplier: 19,
81
+ confidence: 0.87,
82
+ },
83
+ {
84
+ id: 'da-007',
85
+ name: 'Unrecognized Substitutes',
86
+ category: 'innovation_barriers',
87
+ pattern: 'unrecognized_substitutes',
88
+ darkFieldMultiplier: 19,
89
+ confidence: 0.8,
90
+ },
91
+ {
92
+ id: 'da-008',
93
+ name: 'Hidden Value Chain Vulnerabilities',
94
+ category: 'disruption_vectors',
95
+ pattern: 'hidden_value_chain_vulnerabilities',
96
+ darkFieldMultiplier: 19,
97
+ confidence: 0.81,
98
+ },
99
+ ];
100
+
101
+ /**
102
+ * Get disruption arithmetic rules by category
103
+ * @param {string} category - Rule category
104
+ * @returns {Array<Object>} Filtered rules
105
+ */
106
+ export function getRulesByCategory(category) {
107
+ return DISRUPTION_ARITHMETIC_RULES.filter(rule => rule.category === category);
108
+ }
109
+
110
+ /**
111
+ * Get disruption arithmetic rule by ID
112
+ * @param {string} id - Rule ID
113
+ * @returns {Object|undefined} Rule or undefined
114
+ */
115
+ export function getRuleById(id) {
116
+ return DISRUPTION_ARITHMETIC_RULES.find(rule => rule.id === id);
117
+ }
118
+
119
+ /**
120
+ * Validate disruption arithmetic rules
121
+ * @param {Array<Object>} rules - Rules to validate
122
+ * @returns {Object} Validation result
123
+ */
124
+ export function validateRules(rules) {
125
+ const errors = [];
126
+ for (const rule of rules) {
127
+ const result = DisruptionArithmeticRuleSchema.safeParse(rule);
128
+ if (!result.success) {
129
+ errors.push({
130
+ rule: rule.id || 'unknown',
131
+ errors: result.error.errors,
132
+ });
133
+ }
134
+ }
135
+
136
+ return {
137
+ valid: errors.length === 0,
138
+ errors,
139
+ };
140
+ }
@@ -0,0 +1,140 @@
1
+ /**
2
+ * @file Market Dynamics Rules
3
+ * @module knowledge-engine/chatman/market-dynamics
4
+ *
5
+ * @description
6
+ * Market dynamics rules for Chatman Equation analysis.
7
+ * Defines patterns for customer needs, market segments, value drivers,
8
+ * competition, and demand patterns.
9
+ */
10
+
11
+ import { z } from 'zod';
12
+
13
+ /**
14
+ * Market dynamics rule schema
15
+ */
16
+ export const MarketDynamicsRuleSchema = z.object({
17
+ id: z.string(),
18
+ name: z.string(),
19
+ category: z.enum([
20
+ 'customer_needs',
21
+ 'market_segments',
22
+ 'value_drivers',
23
+ 'competition',
24
+ 'demand_patterns',
25
+ ]),
26
+ pattern: z.string(),
27
+ darkFieldMultiplier: z.number().positive().default(19),
28
+ confidence: z.number().min(0).max(1).default(0.8),
29
+ });
30
+
31
+ /**
32
+ * Market dynamics rules
33
+ */
34
+ export const MARKET_DYNAMICS_RULES = [
35
+ {
36
+ id: 'md-001',
37
+ name: 'Hidden Customer Needs Detection',
38
+ category: 'customer_needs',
39
+ pattern: 'hidden_customer_needs',
40
+ darkFieldMultiplier: 19,
41
+ confidence: 0.85,
42
+ },
43
+ {
44
+ id: 'md-002',
45
+ name: 'Latent Market Segments',
46
+ category: 'market_segments',
47
+ pattern: 'latent_market_segments',
48
+ darkFieldMultiplier: 19,
49
+ confidence: 0.82,
50
+ },
51
+ {
52
+ id: 'md-003',
53
+ name: 'Unspoken Value Drivers',
54
+ category: 'value_drivers',
55
+ pattern: 'unspoken_value_drivers',
56
+ darkFieldMultiplier: 19,
57
+ confidence: 0.8,
58
+ },
59
+ {
60
+ id: 'md-004',
61
+ name: 'Invisible Competition',
62
+ category: 'competition',
63
+ pattern: 'invisible_competition',
64
+ darkFieldMultiplier: 19,
65
+ confidence: 0.78,
66
+ },
67
+ {
68
+ id: 'md-005',
69
+ name: 'Emergent Demand Patterns',
70
+ category: 'demand_patterns',
71
+ pattern: 'emergent_demand_patterns',
72
+ darkFieldMultiplier: 19,
73
+ confidence: 0.83,
74
+ },
75
+ {
76
+ id: 'md-006',
77
+ name: 'Tacit Buying Criteria',
78
+ category: 'customer_needs',
79
+ pattern: 'tacit_buying_criteria',
80
+ darkFieldMultiplier: 19,
81
+ confidence: 0.81,
82
+ },
83
+ {
84
+ id: 'md-007',
85
+ name: 'Underground Distribution Channels',
86
+ category: 'market_segments',
87
+ pattern: 'underground_distribution_channels',
88
+ darkFieldMultiplier: 19,
89
+ confidence: 0.77,
90
+ },
91
+ {
92
+ id: 'md-008',
93
+ name: 'Implicit Price Expectations',
94
+ category: 'value_drivers',
95
+ pattern: 'implicit_price_expectations',
96
+ darkFieldMultiplier: 19,
97
+ confidence: 0.79,
98
+ },
99
+ ];
100
+
101
+ /**
102
+ * Get market dynamics rules by category
103
+ * @param {string} category - Rule category
104
+ * @returns {Array<Object>} Filtered rules
105
+ */
106
+ export function getRulesByCategory(category) {
107
+ return MARKET_DYNAMICS_RULES.filter(rule => rule.category === category);
108
+ }
109
+
110
+ /**
111
+ * Get market dynamics rule by ID
112
+ * @param {string} id - Rule ID
113
+ * @returns {Object|undefined} Rule or undefined
114
+ */
115
+ export function getRuleById(id) {
116
+ return MARKET_DYNAMICS_RULES.find(rule => rule.id === id);
117
+ }
118
+
119
+ /**
120
+ * Validate market dynamics rules
121
+ * @param {Array<Object>} rules - Rules to validate
122
+ * @returns {Object} Validation result
123
+ */
124
+ export function validateRules(rules) {
125
+ const errors = [];
126
+ for (const rule of rules) {
127
+ const result = MarketDynamicsRuleSchema.safeParse(rule);
128
+ if (!result.success) {
129
+ errors.push({
130
+ rule: rule.id || 'unknown',
131
+ errors: result.error.errors,
132
+ });
133
+ }
134
+ }
135
+
136
+ return {
137
+ valid: errors.length === 0,
138
+ errors,
139
+ };
140
+ }
@@ -0,0 +1,140 @@
1
+ /**
2
+ * @file Organizational Dynamics Rules
3
+ * @module knowledge-engine/chatman/organizational-dynamics
4
+ *
5
+ * @description
6
+ * Organizational dynamics rules for Chatman Equation analysis.
7
+ * Defines patterns for power structures, knowledge networks, resource flows,
8
+ * decision criteria, and cultural norms.
9
+ */
10
+
11
+ import { z } from 'zod';
12
+
13
+ /**
14
+ * Organizational dynamics rule schema
15
+ */
16
+ export const OrganizationalDynamicsRuleSchema = z.object({
17
+ id: z.string(),
18
+ name: z.string(),
19
+ category: z.enum([
20
+ 'power_structures',
21
+ 'knowledge_networks',
22
+ 'resource_flows',
23
+ 'decision_criteria',
24
+ 'cultural_norms',
25
+ ]),
26
+ pattern: z.string(),
27
+ darkFieldMultiplier: z.number().positive().default(19),
28
+ confidence: z.number().min(0).max(1).default(0.8),
29
+ });
30
+
31
+ /**
32
+ * Organizational dynamics rules
33
+ */
34
+ export const ORGANIZATIONAL_DYNAMICS_RULES = [
35
+ {
36
+ id: 'od-001',
37
+ name: 'Informal Power Structures',
38
+ category: 'power_structures',
39
+ pattern: 'informal_power_structures',
40
+ darkFieldMultiplier: 19,
41
+ confidence: 0.86,
42
+ },
43
+ {
44
+ id: 'od-002',
45
+ name: 'Tacit Knowledge Networks',
46
+ category: 'knowledge_networks',
47
+ pattern: 'tacit_knowledge_networks',
48
+ darkFieldMultiplier: 19,
49
+ confidence: 0.84,
50
+ },
51
+ {
52
+ id: 'od-003',
53
+ name: 'Hidden Resource Flows',
54
+ category: 'resource_flows',
55
+ pattern: 'hidden_resource_flows',
56
+ darkFieldMultiplier: 19,
57
+ confidence: 0.82,
58
+ },
59
+ {
60
+ id: 'od-004',
61
+ name: 'Implicit Decision Criteria',
62
+ category: 'decision_criteria',
63
+ pattern: 'implicit_decision_criteria',
64
+ darkFieldMultiplier: 19,
65
+ confidence: 0.8,
66
+ },
67
+ {
68
+ id: 'od-005',
69
+ name: 'Unwritten Cultural Norms',
70
+ category: 'cultural_norms',
71
+ pattern: 'unwritten_cultural_norms',
72
+ darkFieldMultiplier: 19,
73
+ confidence: 0.85,
74
+ },
75
+ {
76
+ id: 'od-006',
77
+ name: 'Latent Capability Reserves',
78
+ category: 'resource_flows',
79
+ pattern: 'latent_capability_reserves',
80
+ darkFieldMultiplier: 19,
81
+ confidence: 0.79,
82
+ },
83
+ {
84
+ id: 'od-007',
85
+ name: 'Invisible Coordination Mechanisms',
86
+ category: 'power_structures',
87
+ pattern: 'invisible_coordination_mechanisms',
88
+ darkFieldMultiplier: 19,
89
+ confidence: 0.81,
90
+ },
91
+ {
92
+ id: 'od-008',
93
+ name: 'Emergent Collaboration Patterns',
94
+ category: 'knowledge_networks',
95
+ pattern: 'emergent_collaboration_patterns',
96
+ darkFieldMultiplier: 19,
97
+ confidence: 0.83,
98
+ },
99
+ ];
100
+
101
+ /**
102
+ * Get organizational dynamics rules by category
103
+ * @param {string} category - Rule category
104
+ * @returns {Array<Object>} Filtered rules
105
+ */
106
+ export function getRulesByCategory(category) {
107
+ return ORGANIZATIONAL_DYNAMICS_RULES.filter(rule => rule.category === category);
108
+ }
109
+
110
+ /**
111
+ * Get organizational dynamics rule by ID
112
+ * @param {string} id - Rule ID
113
+ * @returns {Object|undefined} Rule or undefined
114
+ */
115
+ export function getRuleById(id) {
116
+ return ORGANIZATIONAL_DYNAMICS_RULES.find(rule => rule.id === id);
117
+ }
118
+
119
+ /**
120
+ * Validate organizational dynamics rules
121
+ * @param {Array<Object>} rules - Rules to validate
122
+ * @returns {Object} Validation result
123
+ */
124
+ export function validateRules(rules) {
125
+ const errors = [];
126
+ for (const rule of rules) {
127
+ const result = OrganizationalDynamicsRuleSchema.safeParse(rule);
128
+ if (!result.success) {
129
+ errors.push({
130
+ rule: rule.id || 'unknown',
131
+ errors: result.error.errors,
132
+ });
133
+ }
134
+ }
135
+
136
+ return {
137
+ valid: errors.length === 0,
138
+ errors,
139
+ };
140
+ }