instar 1.3.755 → 1.3.757
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 +0 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/scripts/lint-model-registry-freshness.mjs +77 -11
- package/scripts/model-registry-freshness.manifest.json +34 -28
- package/src/data/builtin-manifest.json +2 -2
- package/upgrades/1.3.756.md +27 -0
- package/upgrades/1.3.757.md +29 -0
- package/upgrades/side-effects/doorway-model-registry-inc1.md +89 -0
- package/upgrades/side-effects/keyword-lint-enforce.md +113 -0
- package/dist/core/AutonomySkill.d.ts +0 -98
- package/dist/core/AutonomySkill.d.ts.map +0 -1
- package/dist/core/AutonomySkill.js +0 -497
- package/dist/core/AutonomySkill.js.map +0 -1
- package/dist/core/TopicClassifier.d.ts +0 -54
- package/dist/core/TopicClassifier.d.ts.map +0 -1
- package/dist/core/TopicClassifier.js +0 -144
- package/dist/core/TopicClassifier.js.map +0 -1
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* TopicClassifier — Deterministic, rule-based topic classification.
|
|
3
|
-
*
|
|
4
|
-
* Part of the Consent & Discovery Framework (Round 2 hardening).
|
|
5
|
-
*
|
|
6
|
-
* Why not LLM-based:
|
|
7
|
-
* Adversarial reviewer flagged that LLM-based topic extraction reintroduces
|
|
8
|
-
* prompt injection risk into the discovery pipeline. A user could craft input
|
|
9
|
-
* that manipulates the topic classifier to trigger specific feature surfacing.
|
|
10
|
-
*
|
|
11
|
-
* This classifier uses keyword matching against a fixed taxonomy. It's less
|
|
12
|
-
* nuanced than an LLM classifier but has zero injection surface. The evaluator
|
|
13
|
-
* (which IS LLM-based) receives these labels as sanitized input.
|
|
14
|
-
*
|
|
15
|
-
* Design:
|
|
16
|
-
* - Fixed taxonomy of ~15 topic categories
|
|
17
|
-
* - Keyword sets per category, scored by match density
|
|
18
|
-
* - Returns top category + confidence score
|
|
19
|
-
* - Also classifies conversation intent (same approach)
|
|
20
|
-
* - Input sanitized: lowercased, truncated, non-alpha stripped
|
|
21
|
-
*/
|
|
22
|
-
// ── Keyword Taxonomy ─────────────────────────────────────────────────
|
|
23
|
-
const TOPIC_KEYWORDS = {
|
|
24
|
-
debugging: ['bug', 'error', 'fix', 'broken', 'crash', 'fail', 'exception', 'stack trace', 'debug', 'issue', 'wrong', 'not working', 'undefined', 'null', 'timeout', 'hang', 'stuck'],
|
|
25
|
-
configuration: ['config', 'setting', 'enable', 'disable', 'toggle', 'option', 'preference', 'setup', 'configure', 'turn on', 'turn off', 'activate', 'deactivate', 'parameter'],
|
|
26
|
-
deployment: ['deploy', 'ship', 'release', 'publish', 'build', 'ci', 'cd', 'pipeline', 'production', 'staging', 'rollback', 'version', 'upgrade'],
|
|
27
|
-
security: ['security', 'auth', 'token', 'secret', 'permission', 'access', 'encrypt', 'credential', 'password', 'vulnerability', 'trust', 'certificate'],
|
|
28
|
-
communication: ['message', 'telegram', 'email', 'notify', 'alert', 'send', 'reply', 'chat', 'notification', 'whatsapp', 'slack'],
|
|
29
|
-
monitoring: ['monitor', 'health', 'status', 'metric', 'log', 'dashboard', 'alert', 'uptime', 'latency', 'memory', 'disk', 'cpu', 'usage'],
|
|
30
|
-
development: ['code', 'implement', 'function', 'class', 'test', 'refactor', 'api', 'endpoint', 'module', 'type', 'interface', 'typescript', 'javascript'],
|
|
31
|
-
documentation: ['doc', 'readme', 'spec', 'document', 'explain', 'comment', 'description', 'guide', 'tutorial', 'wiki'],
|
|
32
|
-
collaboration: ['agent', 'threadline', 'network', 'machine', 'sync', 'share', 'collaborate', 'peer', 'relay', 'handshake', 'discover'],
|
|
33
|
-
'data-management': ['database', 'sqlite', 'backup', 'restore', 'snapshot', 'migrate', 'data', 'storage', 'file', 'persist', 'cache'],
|
|
34
|
-
automation: ['job', 'schedule', 'cron', 'automate', 'workflow', 'task', 'recurring', 'trigger', 'hook', 'event'],
|
|
35
|
-
performance: ['slow', 'fast', 'performance', 'optimize', 'speed', 'efficient', 'bottleneck', 'profil', 'memory leak', 'resource'],
|
|
36
|
-
architecture: ['architecture', 'design', 'pattern', 'structure', 'system', 'framework', 'component', 'layer', 'module', 'principle'],
|
|
37
|
-
onboarding: ['new', 'start', 'begin', 'init', 'first', 'getting started', 'install', 'setup', 'introduction', 'welcome'],
|
|
38
|
-
general: [],
|
|
39
|
-
};
|
|
40
|
-
const INTENT_KEYWORDS = {
|
|
41
|
-
debugging: ['bug', 'error', 'fix', 'broken', 'crash', 'fail', 'not working', 'wrong', 'issue', 'debug', 'trace'],
|
|
42
|
-
configuring: ['config', 'setting', 'enable', 'disable', 'setup', 'configure', 'option', 'toggle', 'turn on', 'turn off'],
|
|
43
|
-
exploring: ['what', 'how', 'why', 'show', 'list', 'tell me', 'capabilities', 'features', 'can you', 'do you'],
|
|
44
|
-
building: ['build', 'create', 'implement', 'add', 'make', 'write', 'develop', 'code', 'new feature', 'spec'],
|
|
45
|
-
asking: ['question', 'help', 'explain', 'clarify', 'understand', 'meaning', 'difference', 'purpose'],
|
|
46
|
-
monitoring: ['check', 'status', 'health', 'monitor', 'watch', 'track', 'log', 'dashboard', 'metric'],
|
|
47
|
-
unknown: [],
|
|
48
|
-
};
|
|
49
|
-
const PROBLEM_KEYWORDS = {
|
|
50
|
-
'connectivity': ['connect', 'network', 'timeout', 'offline', 'unreachable', 'dns', 'tunnel'],
|
|
51
|
-
'authentication': ['auth', 'login', '401', '403', 'forbidden', 'unauthorized', 'token expired'],
|
|
52
|
-
'data-loss': ['lost', 'missing', 'deleted', 'gone', 'disappeared', 'corrupted', 'empty'],
|
|
53
|
-
'resource-exhaustion': ['memory', 'disk full', 'out of space', 'quota', 'limit', 'exceeded', 'oom'],
|
|
54
|
-
'permission': ['permission', 'denied', 'access', 'readonly', 'write', 'forbidden'],
|
|
55
|
-
};
|
|
56
|
-
// ── Classifier ───────────────────────────────────────────────────────
|
|
57
|
-
const MAX_INPUT_LENGTH = 500;
|
|
58
|
-
/**
|
|
59
|
-
* Sanitize input text for classification.
|
|
60
|
-
* Strips control characters, lowercases, truncates.
|
|
61
|
-
*/
|
|
62
|
-
export function sanitizeInput(text) {
|
|
63
|
-
return text
|
|
64
|
-
.slice(0, MAX_INPUT_LENGTH)
|
|
65
|
-
.toLowerCase()
|
|
66
|
-
.replace(/[^\w\s\-'.?!]/g, ' ')
|
|
67
|
-
.replace(/\s+/g, ' ')
|
|
68
|
-
.trim();
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Score a text against a keyword set.
|
|
72
|
-
* Returns 0-1 based on match density.
|
|
73
|
-
*/
|
|
74
|
-
function scoreKeywords(text, keywords) {
|
|
75
|
-
if (keywords.length === 0)
|
|
76
|
-
return 0;
|
|
77
|
-
let matches = 0;
|
|
78
|
-
for (const kw of keywords) {
|
|
79
|
-
if (text.includes(kw))
|
|
80
|
-
matches++;
|
|
81
|
-
}
|
|
82
|
-
return matches / keywords.length;
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Classify a text into topic category and conversation intent.
|
|
86
|
-
* Purely deterministic — no LLM, no injection surface.
|
|
87
|
-
*/
|
|
88
|
-
export function classify(rawText) {
|
|
89
|
-
const text = sanitizeInput(rawText);
|
|
90
|
-
// Score topics
|
|
91
|
-
let bestTopic = 'general';
|
|
92
|
-
let bestTopicScore = 0;
|
|
93
|
-
for (const [category, keywords] of Object.entries(TOPIC_KEYWORDS)) {
|
|
94
|
-
if (category === 'general')
|
|
95
|
-
continue;
|
|
96
|
-
const score = scoreKeywords(text, keywords);
|
|
97
|
-
if (score > bestTopicScore) {
|
|
98
|
-
bestTopicScore = score;
|
|
99
|
-
bestTopic = category;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
// Score intents
|
|
103
|
-
let bestIntent = 'unknown';
|
|
104
|
-
let bestIntentScore = 0;
|
|
105
|
-
for (const [intent, keywords] of Object.entries(INTENT_KEYWORDS)) {
|
|
106
|
-
if (intent === 'unknown')
|
|
107
|
-
continue;
|
|
108
|
-
const score = scoreKeywords(text, keywords);
|
|
109
|
-
if (score > bestIntentScore) {
|
|
110
|
-
bestIntentScore = score;
|
|
111
|
-
bestIntent = intent;
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
// Detect problem categories
|
|
115
|
-
const problemCategories = [];
|
|
116
|
-
for (const [problem, keywords] of Object.entries(PROBLEM_KEYWORDS)) {
|
|
117
|
-
if (scoreKeywords(text, keywords) > 0) {
|
|
118
|
-
problemCategories.push(problem);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
return {
|
|
122
|
-
topicCategory: bestTopic,
|
|
123
|
-
topicConfidence: Math.min(bestTopicScore * 5, 1), // Scale up for useful range
|
|
124
|
-
conversationIntent: bestIntent,
|
|
125
|
-
intentConfidence: Math.min(bestIntentScore * 5, 1),
|
|
126
|
-
problemCategories,
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* Classify and return a sanitized DiscoveryContext-compatible object.
|
|
131
|
-
* This is the main entry point for the discovery pipeline.
|
|
132
|
-
*/
|
|
133
|
-
export function classifyForDiscovery(rawText, autonomyProfile, enabledFeatures, userId) {
|
|
134
|
-
const result = classify(rawText);
|
|
135
|
-
return {
|
|
136
|
-
topicCategory: result.topicCategory,
|
|
137
|
-
conversationIntent: result.conversationIntent,
|
|
138
|
-
problemCategories: result.problemCategories,
|
|
139
|
-
autonomyProfile,
|
|
140
|
-
enabledFeatures,
|
|
141
|
-
userId: userId || 'default',
|
|
142
|
-
};
|
|
143
|
-
}
|
|
144
|
-
//# sourceMappingURL=TopicClassifier.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TopicClassifier.js","sourceRoot":"","sources":["../../src/core/TopicClassifier.ts"],"names":[],"mappings":"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"}
|