@unrdf/knowledge-engine 5.0.1 → 26.4.3
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/package.json +13 -7
- package/src/ai-enhanced-search.mjs +371 -0
- package/src/anomaly-detector.mjs +226 -0
- package/src/artifact-generator.mjs +251 -0
- package/src/browser.mjs +1 -1
- package/src/chatman/disruption-arithmetic.mjs +140 -0
- package/src/chatman/market-dynamics.mjs +140 -0
- package/src/chatman/organizational-dynamics.mjs +140 -0
- package/src/chatman/strategic-dynamics.mjs +140 -0
- package/src/chatman-config-loader.mjs +282 -0
- package/src/chatman-engine.mjs +431 -0
- package/src/chatman-operator.mjs +342 -0
- package/src/dark-field-detector.mjs +312 -0
- package/src/formation-theorems.mjs +345 -0
- package/src/index.mjs +20 -2
- package/src/knowledge-hook-manager.mjs +1 -1
- package/src/lockchain-writer-browser.mjs +2 -2
- package/src/observability.mjs +40 -4
- package/src/query-optimizer.mjs +1 -1
- package/src/resolution-layer.mjs +1 -1
- package/src/transaction.mjs +11 -9
- package/README.md +0 -84
- package/src/browser-shims.mjs +0 -343
- package/src/canonicalize.mjs +0 -414
- package/src/condition-cache.mjs +0 -109
- package/src/condition-evaluator.mjs +0 -722
- package/src/dark-matter-core.mjs +0 -742
- package/src/define-hook.mjs +0 -213
- package/src/effect-sandbox-browser.mjs +0 -283
- package/src/effect-sandbox-worker.mjs +0 -170
- package/src/effect-sandbox.mjs +0 -517
- package/src/engines/index.mjs +0 -11
- package/src/engines/rdf-engine.mjs +0 -299
- package/src/file-resolver.mjs +0 -387
- package/src/hook-executor-batching.mjs +0 -277
- package/src/hook-executor.mjs +0 -870
- package/src/hook-management.mjs +0 -150
- package/src/ken-parliment.mjs +0 -119
- package/src/ken.mjs +0 -149
- package/src/knowledge-engine/builtin-rules.mjs +0 -190
- package/src/knowledge-engine/inference-engine.mjs +0 -418
- package/src/knowledge-engine/knowledge-engine.mjs +0 -317
- package/src/knowledge-engine/pattern-dsl.mjs +0 -142
- package/src/knowledge-engine/pattern-matcher.mjs +0 -215
- package/src/knowledge-engine/rules.mjs +0 -184
- package/src/knowledge-engine.mjs +0 -319
- package/src/knowledge-hook-engine.mjs +0 -360
- package/src/knowledge-substrate-core.mjs +0 -927
- package/src/lite.mjs +0 -222
- package/src/lockchain-writer.mjs +0 -602
- package/src/monitoring/andon-signals.mjs +0 -775
- package/src/parse.mjs +0 -290
- package/src/performance-optimizer.mjs +0 -678
- package/src/policy-pack.mjs +0 -572
- package/src/query-cache.mjs +0 -116
- package/src/query.mjs +0 -306
- package/src/reason.mjs +0 -350
- package/src/schemas.mjs +0 -1063
- package/src/security/error-sanitizer.mjs +0 -257
- package/src/security/path-validator.mjs +0 -194
- package/src/security/sandbox-restrictions.mjs +0 -331
- package/src/security-validator.mjs +0 -389
- package/src/store-cache.mjs +0 -137
- package/src/telemetry.mjs +0 -167
- package/src/utils/adaptive-monitor.mjs +0 -746
- package/src/utils/circuit-breaker.mjs +0 -513
- package/src/utils/edge-case-handler.mjs +0 -503
- package/src/utils/memory-manager.mjs +0 -498
- package/src/utils/ring-buffer.mjs +0 -282
- package/src/validate.mjs +0 -319
- package/src/validators/index.mjs +0 -338
|
@@ -0,0 +1,251 @@
|
|
|
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: closure.observable.patterns.length + closure.darkField.patterns.length,
|
|
105
|
+
completeness: closure.completeness,
|
|
106
|
+
generatedAt: Date.now(),
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
// Generate receipt if requested
|
|
110
|
+
if (opts.includeReceipt) {
|
|
111
|
+
artifact.receipt = this._generateReceipt(artifact, closure);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Validate artifact
|
|
115
|
+
if (opts.validate) {
|
|
116
|
+
ArtifactSchema.parse(artifact);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Update metrics
|
|
120
|
+
this.metrics.artifactsGenerated++;
|
|
121
|
+
this.metrics.averageCompleteness =
|
|
122
|
+
(this.metrics.averageCompleteness * (this.metrics.artifactsGenerated - 1) +
|
|
123
|
+
artifact.completeness) /
|
|
124
|
+
this.metrics.artifactsGenerated;
|
|
125
|
+
this.metrics.averageDarkFieldSize =
|
|
126
|
+
(this.metrics.averageDarkFieldSize * (this.metrics.artifactsGenerated - 1) +
|
|
127
|
+
artifact.darkField.patterns.length) /
|
|
128
|
+
this.metrics.artifactsGenerated;
|
|
129
|
+
|
|
130
|
+
span?.addEvent?.('artifact_generated', {
|
|
131
|
+
'artifact.id': artifact.id,
|
|
132
|
+
'artifact.completeness': artifact.completeness,
|
|
133
|
+
'artifact.total_patterns': artifact.totalPatterns,
|
|
134
|
+
'artifact.duration_ms': Date.now() - startTime,
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
return artifact;
|
|
138
|
+
} catch (error) {
|
|
139
|
+
span?.recordException?.(error);
|
|
140
|
+
span?.setStatus?.({ code: 2, message: error.message });
|
|
141
|
+
throw error;
|
|
142
|
+
} finally {
|
|
143
|
+
span?.end?.();
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Generate multiple artifacts in batch
|
|
149
|
+
* @param {Array<Object>} observables - Array of observable patterns
|
|
150
|
+
* @param {Object} [options] - Generation options
|
|
151
|
+
* @returns {Promise<Array<Object>>} Generated artifacts
|
|
152
|
+
*/
|
|
153
|
+
async generateBatch(observables, options = {}) {
|
|
154
|
+
const span = this.tracer?.startSpan?.('chatman.artifact.generate_batch');
|
|
155
|
+
|
|
156
|
+
try {
|
|
157
|
+
span?.setAttribute?.('batch_size', observables.length);
|
|
158
|
+
|
|
159
|
+
const artifacts = await Promise.all(
|
|
160
|
+
observables.map(observable => this.generate(observable, options))
|
|
161
|
+
);
|
|
162
|
+
|
|
163
|
+
span?.addEvent?.('batch_generated', {
|
|
164
|
+
'batch.count': artifacts.length,
|
|
165
|
+
'batch.avg_completeness': this._calculateAverageCompleteness(artifacts),
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
return artifacts;
|
|
169
|
+
} catch (error) {
|
|
170
|
+
span?.recordException?.(error);
|
|
171
|
+
span?.setStatus?.({ code: 2, message: error.message });
|
|
172
|
+
throw error;
|
|
173
|
+
} finally {
|
|
174
|
+
span?.end?.();
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Generate receipt for artifact
|
|
180
|
+
* @param {Object} artifact - Generated artifact
|
|
181
|
+
* @param {Object} closure - Closure result
|
|
182
|
+
* @returns {Object} Receipt
|
|
183
|
+
* @private
|
|
184
|
+
*/
|
|
185
|
+
_generateReceipt(artifact, closure) {
|
|
186
|
+
if (this.receiptGenerator) {
|
|
187
|
+
return this.receiptGenerator({
|
|
188
|
+
operation: 'artifact_generation',
|
|
189
|
+
entityType: 'ChatmanArtifact',
|
|
190
|
+
entityId: artifact.id,
|
|
191
|
+
data: {
|
|
192
|
+
observableCount: artifact.observable.patterns.length,
|
|
193
|
+
darkFieldCount: artifact.darkField.patterns.length,
|
|
194
|
+
completeness: artifact.completeness,
|
|
195
|
+
operatorId: closure.operatorId,
|
|
196
|
+
},
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// Default receipt
|
|
201
|
+
return {
|
|
202
|
+
id: randomUUID(),
|
|
203
|
+
operation: 'artifact_generation',
|
|
204
|
+
timestamp: Date.now(),
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Calculate average completeness from artifacts
|
|
210
|
+
* @param {Array<Object>} artifacts - Artifacts
|
|
211
|
+
* @returns {number} Average completeness
|
|
212
|
+
* @private
|
|
213
|
+
*/
|
|
214
|
+
_calculateAverageCompleteness(artifacts) {
|
|
215
|
+
if (artifacts.length === 0) return 0;
|
|
216
|
+
const sum = artifacts.reduce((acc, a) => acc + a.completeness, 0);
|
|
217
|
+
return sum / artifacts.length;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Get generator metrics
|
|
222
|
+
* @returns {Object} Metrics
|
|
223
|
+
*/
|
|
224
|
+
getMetrics() {
|
|
225
|
+
return {
|
|
226
|
+
...this.metrics,
|
|
227
|
+
operator: this.operator.getMetrics(),
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Reset generator metrics
|
|
233
|
+
*/
|
|
234
|
+
resetMetrics() {
|
|
235
|
+
this.metrics = {
|
|
236
|
+
artifactsGenerated: 0,
|
|
237
|
+
averageCompleteness: 0,
|
|
238
|
+
averageDarkFieldSize: 0,
|
|
239
|
+
};
|
|
240
|
+
this.operator.resetMetrics();
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Create an artifact generator instance
|
|
246
|
+
* @param {Object} [options] - Generator options
|
|
247
|
+
* @returns {ArtifactGenerator} Generator instance
|
|
248
|
+
*/
|
|
249
|
+
export function createArtifactGenerator(options = {}) {
|
|
250
|
+
return new ArtifactGenerator(options);
|
|
251
|
+
}
|
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,
|
|
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
|
+
}
|