@pleri/olam-cli 0.1.199 → 0.1.201

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 (59) hide show
  1. package/dist/ask/knowledge-pack.generated.d.ts.map +1 -1
  2. package/dist/ask/knowledge-pack.generated.js +3 -1
  3. package/dist/ask/knowledge-pack.generated.js.map +1 -1
  4. package/dist/commands/auth.d.ts.map +1 -1
  5. package/dist/commands/auth.js +23 -8
  6. package/dist/commands/auth.js.map +1 -1
  7. package/dist/commands/create.d.ts.map +1 -1
  8. package/dist/commands/create.js +3 -0
  9. package/dist/commands/create.js.map +1 -1
  10. package/dist/commands/flywheel/diversity-check.d.ts +1 -1
  11. package/dist/commands/flywheel/diversity-check.js +1 -1
  12. package/dist/commands/flywheel/k5-score.d.ts +1 -1
  13. package/dist/commands/flywheel/k5-score.js +1 -1
  14. package/dist/commands/flywheel/k5-validate.d.ts +1 -1
  15. package/dist/commands/init.js +1 -1
  16. package/dist/commands/init.js.map +1 -1
  17. package/dist/commands/kg-mirror.d.ts +16 -0
  18. package/dist/commands/kg-mirror.d.ts.map +1 -1
  19. package/dist/commands/kg-mirror.js +94 -0
  20. package/dist/commands/kg-mirror.js.map +1 -1
  21. package/dist/commands/ps.d.ts.map +1 -1
  22. package/dist/commands/ps.js +7 -3
  23. package/dist/commands/ps.js.map +1 -1
  24. package/dist/commands/refresh.js +1 -1
  25. package/dist/commands/refresh.js.map +1 -1
  26. package/dist/commands/skills-100x.d.ts +34 -0
  27. package/dist/commands/skills-100x.d.ts.map +1 -0
  28. package/dist/commands/{skills-10x.js → skills-100x.js} +138 -41
  29. package/dist/commands/skills-100x.js.map +1 -0
  30. package/dist/commands/skills-install-model-router.d.ts +20 -0
  31. package/dist/commands/skills-install-model-router.d.ts.map +1 -0
  32. package/dist/commands/skills-install-model-router.js +55 -0
  33. package/dist/commands/skills-install-model-router.js.map +1 -0
  34. package/dist/commands/skills.d.ts.map +1 -1
  35. package/dist/commands/skills.js +2 -0
  36. package/dist/commands/skills.js.map +1 -1
  37. package/dist/commands/status.d.ts.map +1 -1
  38. package/dist/commands/status.js +0 -1
  39. package/dist/commands/status.js.map +1 -1
  40. package/dist/commands/workspace.d.ts.map +1 -1
  41. package/dist/commands/workspace.js +1 -2
  42. package/dist/commands/workspace.js.map +1 -1
  43. package/dist/image-digests.json +8 -8
  44. package/dist/index.js +1127 -716
  45. package/dist/index.js.map +1 -1
  46. package/dist/lib/help-groups.js +1 -1
  47. package/dist/lib/help-groups.js.map +1 -1
  48. package/dist/mcp-server.js +547 -346
  49. package/hermes-bundle/version.json +1 -1
  50. package/hooks/model-router.py +445 -0
  51. package/host-cp/k8s/manifests/50-deployment.yaml +1 -1
  52. package/host-cp/k8s/manifests/auth-service/50-deployment.yaml +1 -1
  53. package/host-cp/k8s/manifests/kg-service/50-deployment.yaml +1 -1
  54. package/host-cp/k8s/manifests/mcp-auth-service/50-deployment.yaml +1 -1
  55. package/host-cp/k8s/manifests/memory-service/50-deployment.yaml +1 -1
  56. package/package.json +2 -1
  57. package/dist/commands/skills-10x.d.ts +0 -23
  58. package/dist/commands/skills-10x.d.ts.map +0 -1
  59. package/dist/commands/skills-10x.js.map +0 -1
@@ -1,4 +1,4 @@
1
1
  {
2
- "bundledAt": "2026-05-29T08:51:46.076Z",
2
+ "bundledAt": "2026-05-29T18:19:49.024Z",
3
3
  "kgFirstSha": "29a9ccce1b115d049e375c4a90eb5cf7c123e610e2d0590270a4db2cdbc64a28"
4
4
  }
@@ -0,0 +1,445 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Model Router hook (advisory mode) — classifier v2 (weighted scoring).
4
+
5
+ Pipeline:
6
+ 1. Collect rule matches as (tier, weight) pairs.
7
+ 2. Apply scoring modifiers:
8
+ - BULK_INDICATORS boost CHEAP when paired with a cheap-verb match.
9
+ - BOUNDED_INDICATORS suppress HARD when present, lift MAIN.
10
+ - NEGATION preceding a HARD keyword cancels that HARD weight,
11
+ lifts CHEAP by a small amount.
12
+ 3. Decide: highest total wins; ties resolve toward HARD (escalation-biased
13
+ — false-Opus is cheap insurance vs false-Haiku). All-zero → MAIN default.
14
+
15
+ Mode: ADVISORY. Logs every decision to /tmp/model-router.log. Hook MUST
16
+ never break a session — all I/O wrapped in try/except.
17
+ """
18
+
19
+ import json
20
+ import re
21
+ import sys
22
+ from datetime import datetime, timezone
23
+ from pathlib import Path
24
+
25
+ LOG_PATH = Path("/tmp/model-router.log")
26
+
27
+ # Each rule: (tier, weight, regex_pattern)
28
+ RULES = [
29
+ # ============================================================
30
+ # CHEAP — mechanical / deterministic transforms
31
+ # ============================================================
32
+ ("cheap", 5, r"\brename\b"),
33
+ ("cheap", 4, r"\bformat\s+(?:this|the|all|every|our)\b"),
34
+ ("cheap", 4, r"\bformat\s+\S+\.(?:json|ya?ml|md|css|s?css|html|toml|sql|js|ts|tsx|jsx|py|rb|go|rs)\b"),
35
+ ("cheap", 4, r"\bsort\s+(?:the\s+)?(?:entries|keys|values|list|imports|deps|devdependencies)\b"),
36
+ ("cheap", 4, r"\bbump\s+(?:all\s+|every\s+)?(?:internal\s+)?\S+\s+(?:dep|deps|dependenc|version|engines)"),
37
+ ("cheap", 4, r"\bbump\s+every\s+package\.json"),
38
+ ("cheap", 5, r"\blist\s+(?:every|all)\s+(?:todo|fixme)"),
39
+ ("cheap", 4, r"\btranslate\s+(?:every|the|this|all)\b"),
40
+ ("cheap", 5, r"\badd\s+jsdoc\b"),
41
+ ("cheap", 5, r"\badd\s+docstrings?\b"),
42
+ ("cheap", 5, r"\badd\s+(?:precise\s+)?(?:typescript\s+)?type\s+annotations\b"),
43
+ ("cheap", 4, r"\badd\s+explicit\s+return\s+types?\b"),
44
+ ("cheap", 4, r"\bgenerate\s+(?:empty\s+)?[\w/,\s]{0,40}\bstubs?\b"),
45
+ ("cheap", 5, r"\bupdate\s+(?:the\s+)?copyright\s+year\b"),
46
+ ("cheap", 4, r"\bnpm\s+run\s+lint\s*--?\s*fix\b"),
47
+ ("cheap", 5, r"\bprettier\s+--write\b"),
48
+ ("cheap", 5, r"\beslint\s+--fix\b"),
49
+ ("cheap", 5, r"\bbiome\s+format\b"),
50
+
51
+ # Cheap "transform every X" verbs
52
+ ("cheap", 3, r"\bconvert\b[^\n]{0,80}\b(?:to|from)\s+(?:async|await|camel|snake|kebab|pascal|f[-\s]string|format|template|sha256|sha512|esm|cjs|https?|json|yaml|screaming)"),
53
+ ("cheap", 4, r"\bconvert\s+every\b"),
54
+ ("cheap", 4, r"\breplace\s+every\b"),
55
+ ("cheap", 4, r"\breplace\s+all\s+(?:hardcoded|inline|magic|the)\b"),
56
+ ("cheap", 4, r"\bstrip\s+(?:every|all|trailing|leading)\b"),
57
+ ("cheap", 4, r"\bdrop\s+(?:every|all|the\s+)?unused\b"),
58
+ ("cheap", 4, r"\bswap\s+(?:every|all|them)\b"),
59
+ ("cheap", 4, r"\brewrite\s+(?:the\s+)?(?:file[-\s]extension|imports?|requires?)\b"),
60
+ ("cheap", 3, r"\binline\s+the\s+\S+\s+helper\b"),
61
+ ("cheap", 4, r"\bstandardise\s+(?:the\s+)?(?:test\s+file\s+naming|imports?|file\s+headers?|json|trailing|newline)\b"),
62
+ ("cheap", 5, r"\bun-?skip\b"),
63
+ ("cheap", 4, r"\badd\s+(?:a\s+)?trailing\s+(?:newline|semicolon|comma)\b"),
64
+ ("cheap", 5, r"\bfind\s+(?:and\s+)?replace\b"),
65
+ ("cheap", 5, r"\bmass[-\s]substitute\b"),
66
+ ("cheap", 4, r"\bpure\s+substitution\b"),
67
+ ("cheap", 3, r"\balphabetic(?:al(?:ly)?)?\b"),
68
+ ("cheap", 4, r"\bchange\s+every\b"),
69
+ ("cheap", 4, r"\bupdate\s+every\s+(?:\S+\s+){0,2}(?:to|with|from)\b"),
70
+ ("cheap", 3, r"\b(?:swap|change)\s+them\s+to\b"),
71
+ ("cheap", 4, r"\bone[-\s]line\s+change\s+per\s+file\b"),
72
+ ("cheap", 5, r"\bjust\s+rename\b"),
73
+ ("cheap", 5, r"\bpurely\s+mechanical\b"),
74
+ ("cheap", 5, r"\bno\s+(?:logic|behavioural?|behavioral|other)\s+changes?\b"),
75
+ ("cheap", 5, r"\bpreserve\s+behaviou?r\s+exactly\b"),
76
+ ("cheap", 4, r"\bfix\s+(?:the\s+)?relative\s+paths\b"),
77
+ ("cheap", 4, r"\bremove\s+the\s+\.\w+\s+modifier\b"),
78
+ # "every <thing>" + directive patterns (mass-operation prose)
79
+ ("cheap", 5, r"\bfind\s+every\b"),
80
+ ("cheap", 5, r"\bupdate\s+all\s+the\b"),
81
+ ("cheap", 4, r"\bupdate\s+every\b"),
82
+ ("cheap", 5, r"\badd\s+\S+(?:\s+\S+)?\s+(?:to|in)\s+every\b"),
83
+ ("cheap", 5, r"\badd\s+(?:them|it|these)\s+(?:back|where\s+missing|here)\b"),
84
+ ("cheap", 4, r"\badd\s+it\s+where\s+missing\b"),
85
+ ("cheap", 4, r"\bstandardi[sz]e[\s:]"),
86
+ ("cheap", 3, r"\bone[-\s]line\s+change\s+per\s+file\b"),
87
+ ("cheap", 4, r"\b(?:dbt[-\s]style|fyi|cleanup\s+pass|cleanup\s+task)\s*[:—]"),
88
+ ("cheap", 3, r"\bevery\s+(?:\.\w+\s+file|\S+\s+(?:file|files|component|components|import|imports|importer|module|modules|test|tests|header|headers|line|lines|string|strings|env|var|vars|variable|variables|key|keys))\b"),
89
+ ("cheap", 3, r"\bevery\s+\S+\s+(?:should\s+be|should\s+have|should\s+end|needs\s+a?|that's\s+only)\b"),
90
+ ("cheap", 4, r"\bevery\s+\S+\s*[→]\s*\S+"),
91
+ ("cheap", 3, r"\bjust\s+the\s+year"),
92
+
93
+ # ============================================================
94
+ # MAIN — anti-CHEAP for bounded feature-adds
95
+ # ============================================================
96
+ ("main", 5, r"\badd\s+an?\s+(?:\S+\s+){0,3}(?:flag|field|route|endpoint|column|badge|button|hook|provider|middleware|option|feature\s+flag\s+check|rule|debounce|cache|progress\s+bar|modal|toast|notification)\b"),
97
+
98
+ # ============================================================
99
+ # HARD — architecture / migration / cross-service / deep investigation
100
+ # ============================================================
101
+ # Verbs / decision asks
102
+ ("hard", 6, r"\bdesign\s+(?:a\s+|the\s+)?(?:feature[-\s]flag\s+system|migration|data\s+model|architecture|rollout|unified|API\s+versioning|backwards?[-\s]compatible)"),
103
+ ("hard", 5, r"\bpropose\s+(?:an?\s+)?(?:architectural|backwards?[-\s]compatible|migration|deprecation|rollout|unified|strategy|path)"),
104
+ ("hard", 5, r"\barchitect(?:ure)?\b"),
105
+ ("hard", 5, r"\barchitect\s+the\s+fix\b"),
106
+ ("hard", 4, r"\binvestigate\b"),
107
+ ("hard", 5, r"\baudit\s+(?:all|every|across|retry|logging|all\s+\d+\s+services?)\b"),
108
+ ("hard", 6, r"\bunify\b[^\n]{0,80}\bacross\b"),
109
+ ("hard", 6, r"\brefactor\s+(?:cross[-\s]cutting|every\s+service)"),
110
+ ("hard", 6, r"\brefactor\b[^\n]{0,80}\bacross\s+(?:every|all|the\s+monorepo)"),
111
+ ("hard", 6, r"\bplan\s+(?:the\s+|a\s+)?(?:rollout|migration|deprecation|sharding|cutover|sunset|deploy|deployment)"),
112
+
113
+ # Architectural concept nouns
114
+ ("hard", 6, r"\bzero[-\s]downtime\b"),
115
+ ("hard", 6, r"\bmulti[-\s]tenant\b"),
116
+ ("hard", 6, r"\bsharding\b"),
117
+ ("hard", 5, r"\brace\s+condition\b"),
118
+ ("hard", 5, r"\bp99\b|\bp95\b|\bp999\b"),
119
+ ("hard", 5, r"\blatency\s+spike"),
120
+ ("hard", 5, r"\btail\s+latenc"),
121
+ ("hard", 5, r"\bmemory\s+leak\b"),
122
+ ("hard", 4, r"\btradeoffs?\b"),
123
+ ("hard", 5, r"\bsaga\b"),
124
+ ("hard", 5, r"\b2pc\b|\btwo[-\s]phase\s+commit\b"),
125
+ ("hard", 6, r"\bmonorepo[-\s]wide\b"),
126
+ ("hard", 5, r"\bstart\s+from\b[^\n]{0,100}\bend\s+with\b"),
127
+ ("hard", 5, r"\bcross[-\s]service\b"),
128
+ ("hard", 6, r"\bbackwards[-\s]compatible\s+(?:api|migration|strategy|versioning)"),
129
+ ("hard", 4, r"\bbackwards[-\s]compatible\b"),
130
+ ("hard", 5, r"\bmigrate\s+every\b"),
131
+ ("hard", 4, r"\bevery\s+endpoint\b"),
132
+ ("hard", 6, r"\bpool\s+exhaustion\b"),
133
+ ("hard", 6, r"\bfeature[-\s]flag\s+system\b"),
134
+ ("hard", 5, r"\bevery\s+(?:service|repo|package|microservice|public\s+endpoint|mutating\s+endpoint)\b"),
135
+ ("hard", 4, r"\bcross[-\s]cutting\b"),
136
+ ("hard", 5, r"\bunified\s+(?:middleware|layer|policy|contract|approach)\b"),
137
+ ("hard", 6, r"\bcircular\s+depend"),
138
+ ("hard", 6, r"\bdata\s+residency\b"),
139
+ ("hard", 6, r"\baudit\s+log\b"),
140
+ ("hard", 6, r"\bidempotency\s+layer\b"),
141
+ ("hard", 6, r"\bevent\s+sourcing\b"),
142
+ ("hard", 6, r"\bdrift\s+detection\b"),
143
+ ("hard", 6, r"\bbottleneck\s+analysis\b"),
144
+ ("hard", 5, r"\bpermanent\s+fix\b"),
145
+ ("hard", 5, r"\bdual[-\s]write\b"),
146
+ ("hard", 5, r"\bself[-\s]healing\b"),
147
+ ("hard", 5, r"\bsoc\s?2\b"),
148
+ ("hard", 4, r"\bpii\s+(?:write|data|field|column|store|storage|audit)\b"),
149
+ ("hard", 5, r"\bttfb\b"),
150
+ ("hard", 4, r"\bdata\s+model\b"),
151
+ ("hard", 4, r"\bauth\s+systems?\b"),
152
+ ("hard", 5, r"\bdeadlock"),
153
+ ("hard", 5, r"\bdeploy\s+pipeline\b"),
154
+ ("hard", 5, r"\bthroughput\s+stall"),
155
+ ("hard", 4, r"\bdesync\b"),
156
+ ("hard", 5, r"\bfile\s+descriptors?\b|\bfd\s+leak\b"),
157
+ ("hard", 5, r"\boperationally\s+serious\b"),
158
+ ("hard", 5, r"\breal[-\s]time\s+chat\b"),
159
+ ("hard", 5, r"\binfra\s+(?:bill|cost)\b|\bci\s+cost\b"),
160
+ ("hard", 5, r"\boncall\s+(?:is\s+)?(?:getting\s+)?paged\b"),
161
+ ("hard", 4, r"\bdrift(?:ed)?\s+(?:in|from|across|over)\b"),
162
+ ("hard", 5, r"\bstandardise\s+(?:the\s+)?(?:error|contract|response)\s+(?:across|and\s+migrate)"),
163
+ ("hard", 5, r"\bstandardize\s+(?:the\s+)?(?:error|contract|response)\s+(?:across|and\s+migrate)"),
164
+
165
+ # Cross-system / scale signals
166
+ ("hard", 5, r"\b\d+\s+(?:packages|services|microservices|consumers|regions|bindings|tenants|language\s+bindings)\b"),
167
+ ("hard", 5, r"\b\$\d+[Kk]?\s*/\s*month\b"),
168
+ ("hard", 5, r"\b\d+[KkMmBb]?\s+(?:events|jobs|rows|requests|RPS|qps)\s*(?:/\s*(?:year|day|sec|s))?\b"),
169
+ ("hard", 5, r"\b(?:replace|rewrite|untangle)\s+(?:our|the|them)?\s*(?:background\s+job|job\s+system|queue|auth|infrastructure|stack)?"),
170
+ ("hard", 5, r"\bbundle\s+is\s+\d+(?:\.\d+)?\s?[KkMm]B\s+(?:gzipped|min\w*)"),
171
+ ("hard", 4, r"\bcrud\s+(?:vs|or)\b|\bevent\s+sourcing\s+(?:vs|or)\b"),
172
+ ("hard", 4, r"\bcdn\s*/\s*origin\b"),
173
+ ("hard", 4, r"\bdata\s+residency\b"),
174
+ ("hard", 4, r"\bnetwork\s+blip\b"),
175
+ ("hard", 4, r"\bgrpc\s+(?:for|vs)\b|\bkafka\b"),
176
+ ("hard", 4, r"\bcompliance\s+req"),
177
+ ("hard", 4, r"\bgradually\s+drift"),
178
+ ("hard", 5, r"\bgoing\s+forward\b.*?(?:sdk|drift|sync)"),
179
+ ("hard", 4, r"\bevery\s+pii\b"),
180
+ ]
181
+
182
+ # Bulk indicators — if present alongside a cheap-verb match, boost CHEAP.
183
+ BULK_INDICATORS = re.compile(
184
+ r"\b(?:every|all|each|whole|entire|across\s+(?:our\s+)?(?:the\s+)?"
185
+ r"(?:codebase|repo|monorepo|packages?|test\s+suite))\b",
186
+ re.IGNORECASE,
187
+ )
188
+
189
+ # Action verbs that mark a mass-operation when bulk indicators are present.
190
+ MASS_OP_VERBS = re.compile(
191
+ r"\b(?:add|find|update|change|fix|drop|strip|swap|remove|move|replace|"
192
+ r"rewrite|wrap(?:ped)?|standardi[sz]e|preserve|set|insert)\b",
193
+ re.IGNORECASE,
194
+ )
195
+
196
+ # Bounded scope markers — suppress HARD signals, lift MAIN.
197
+ BOUNDED_INDICATORS = re.compile(
198
+ r"\b("
199
+ r"single\s+(?:test|file|component|hook|endpoint|query|class|function|variable|form|field)"
200
+ r"|just\s+(?:this|one)\s+(?:file|test|component|hook|endpoint|class|variable|function|module)"
201
+ r"|this\s+specific"
202
+ r"|this\s+one\s+file"
203
+ r"|in\s+`[^`]+`"
204
+ r"|in\s+\S+\.[a-z]{2,5}\b"
205
+ r"|single\s+(?:react\s+)?hook"
206
+ r"|one\s+(?:hook|file|component|query|function|module)"
207
+ r"|small[-\s]d|\(small\s*d?\)|small\s+d\b|design\s+\(small\)"
208
+ r"|two\s+(?:components|services)\b"
209
+ r"|\bone\s+endpoint\b"
210
+ r"|single\s+component"
211
+ r"|in\s+a\s+single\s+file"
212
+ r"|one\s+variable"
213
+ r"|design\s+a\s+small\b"
214
+ r"|propose\s+(?:a\s+)?better\s+name\b"
215
+ r")",
216
+ re.IGNORECASE,
217
+ )
218
+
219
+ # Negation patterns that, when appearing within ~80 chars before a HARD
220
+ # keyword, cancel that HARD signal.
221
+ NEGATION = re.compile(
222
+ r"(?:don'?t|do\s+not|no\s+(?:design|architecture|need\s+to|logic|behavioural?|behavioral)"
223
+ r"|avoid|skip|it'?s\s+tempting\s+to|we'?re\s+not"
224
+ r"|i\s+know\s+this\s+looks\s+like"
225
+ r"|but\s+(?:it'?s\s+not|really)\b"
226
+ r"|no\s+\S+\s+(?:decisions?|changes?)"
227
+ r"|already\s+designed)",
228
+ re.IGNORECASE,
229
+ )
230
+
231
+
232
+ def collect_matches(prompt):
233
+ matches = [] # (tier, weight, regex, span_text, start_idx)
234
+ for tier, weight, regex in RULES:
235
+ for m in re.finditer(regex, prompt, re.IGNORECASE):
236
+ matches.append((tier, weight, regex, m.group(0), m.start()))
237
+ return matches
238
+
239
+
240
+ def apply_negation(prompt, matches):
241
+ """Cancel HARD matches whose preceding 80 chars contain a negation."""
242
+ suppressed = []
243
+ for tier, weight, regex, span, start in matches:
244
+ if tier != "hard":
245
+ suppressed.append((tier, weight, regex, span, start, False))
246
+ continue
247
+ window = prompt[max(0, start - 100):start]
248
+ if NEGATION.search(window):
249
+ suppressed.append((tier, weight, regex, span, start, True))
250
+ else:
251
+ suppressed.append((tier, weight, regex, span, start, False))
252
+ return suppressed
253
+
254
+
255
+ def classify(prompt):
256
+ scores = {"cheap": 0, "main": 0, "hard": 0}
257
+ triggered = []
258
+
259
+ matches = collect_matches(prompt)
260
+ annotated = apply_negation(prompt, matches)
261
+
262
+ for tier, weight, regex, span, start, negated in annotated:
263
+ if negated:
264
+ triggered.append({"tier": tier, "weight": 0, "span": span, "neg": True})
265
+ # Negated HARD → strong cheap signal, since prompt is *correcting*
266
+ # the impression that this is architectural.
267
+ scores["cheap"] += 3
268
+ continue
269
+ scores[tier] += weight
270
+ triggered.append({"tier": tier, "weight": weight, "span": span, "neg": False})
271
+
272
+ # Bulk-indicator boost: if any cheap-verb match exists AND bulk indicators
273
+ # are present, add a structural +4 to CHEAP. Helps "Across the whole
274
+ # codebase, replace X with Y" beat HARD trap "across".
275
+ has_cheap = any(t["tier"] == "cheap" and not t["neg"] for t in triggered)
276
+ if has_cheap and BULK_INDICATORS.search(prompt):
277
+ scores["cheap"] += 4
278
+ triggered.append({"tier": "cheap", "weight": 4, "span": "[bulk-boost]", "neg": False})
279
+
280
+ # Mass-operation meta-rule: when bulk indicators ("every|all|each") +
281
+ # action verb (add|find|update|change|fix|...) coexist AND no HARD signal
282
+ # is present, lift CHEAP by +4. Catches "every <thing> should ..." prose
283
+ # without a named verb-noun pair in the rule list.
284
+ if (
285
+ scores["hard"] == 0
286
+ and BULK_INDICATORS.search(prompt)
287
+ and MASS_OP_VERBS.search(prompt)
288
+ ):
289
+ scores["cheap"] += 4
290
+ triggered.append({"tier": "cheap", "weight": 4, "span": "[mass-op]", "neg": False})
291
+
292
+ # Bounded-scope suppression: if HARD signals exist but bounded markers
293
+ # are present, subtract from HARD and add to MAIN. Helps "Investigate
294
+ # this specific test (file:line)" become MAIN, not HARD.
295
+ if scores["hard"] > 0 and BOUNDED_INDICATORS.search(prompt):
296
+ scores["hard"] = max(0, scores["hard"] - 6)
297
+ scores["main"] += 4
298
+ triggered.append({"tier": "main", "weight": 4, "span": "[bounded-scope]", "neg": False})
299
+
300
+ # Decision: highest score wins; tie → HARD (escalation-biased).
301
+ # All-zero → MAIN default.
302
+ if scores["cheap"] == 0 and scores["hard"] == 0:
303
+ return "main", scores, triggered
304
+
305
+ if scores["hard"] > scores["cheap"] and scores["hard"] > scores["main"]:
306
+ return "hard", scores, triggered
307
+ if scores["cheap"] > scores["hard"] and scores["cheap"] > scores["main"]:
308
+ return "cheap", scores, triggered
309
+ if scores["main"] > scores["cheap"] and scores["main"] > scores["hard"]:
310
+ return "main", scores, triggered
311
+
312
+ # Tie path
313
+ if scores["hard"] == max(scores.values()):
314
+ return "hard", scores, triggered
315
+ if scores["cheap"] == max(scores.values()):
316
+ return "cheap", scores, triggered
317
+ return "main", scores, triggered
318
+
319
+
320
+ TIER_REMINDERS = {
321
+ "cheap": (
322
+ "═════════════════════════════════════════════════════════════\n"
323
+ "MODEL SWAP RECOMMENDED: opus → haiku (≈ 15× cost reduction)\n"
324
+ "═════════════════════════════════════════════════════════════\n\n"
325
+ "**Dispatch directive:** Do NOT execute this turn on the current model. "
326
+ "Invoke the Agent tool with `subagent_type: \"100x-trooper\"` "
327
+ "(pins `model: haiku`).\n\n"
328
+ "**Write a THICK, self-contained dispatch prompt.** The sub-agent starts "
329
+ "cold with no access to this conversation. Include inline:\n"
330
+ "- Exact file path(s) to operate on\n"
331
+ "- Exact symbol / pattern to find and what to replace it with\n"
332
+ "- Any code snippet or context the sub-agent needs to act correctly\n"
333
+ "Do NOT write 'see conversation above' or pass the raw user message verbatim "
334
+ "if it lacks file paths or context — synthesise a precise, standalone task.\n\n"
335
+ "Why: classifier sees a mechanical / deterministic transform — "
336
+ "Haiku 4.5 is ~90% as good as Sonnet here at roughly 1/15 the cost. "
337
+ "If the cheap-tier executor finds the task is actually ambiguous, it "
338
+ "will emit `[100x-trooper] escalate: <reason>` — re-dispatch then to "
339
+ "`100x-specialist` or `100x-officer`."
340
+ ),
341
+ "main": (
342
+ "═════════════════════════════════════════════════════════════\n"
343
+ "MODEL SWAP RECOMMENDED: opus → sonnet (≈ 5× cost reduction)\n"
344
+ "═════════════════════════════════════════════════════════════\n\n"
345
+ "**Dispatch directive:** Bounded feature/bug-fix work. Invoke the "
346
+ "Agent tool with `subagent_type: \"100x-specialist\"` (pins `model: sonnet`).\n\n"
347
+ "**Write a focused task description with key pointers.** The sub-agent "
348
+ "inherits project conventions from the system prompt — you don't need to "
349
+ "re-explain the codebase. Include only what the system prompt cannot supply:\n"
350
+ "- Exact file path(s) and the specific function / line to change\n"
351
+ "- The goal in one sentence and any non-obvious constraint\n"
352
+ "- Any decision already made in this conversation that affects the task\n"
353
+ "Do NOT paste entire files or conversation summaries — precision beats volume.\n\n"
354
+ "If the work spawns clearly mechanical subtasks (renames, bulk type "
355
+ "annotations, formatting), dispatch THOSE to `100x-trooper`. Escalate "
356
+ "to `100x-officer` only if architectural scope reveals itself."
357
+ ),
358
+ "hard": (
359
+ "═════════════════════════════════════════════════════════════\n"
360
+ "MODEL ROUTING: stay on opus (architectural work)\n"
361
+ "═════════════════════════════════════════════════════════════\n\n"
362
+ "**Dispatch directive:** Architecture / migration / cross-service / "
363
+ "deep investigation. Invoke `100x-officer` (pins `model: opus`) so the "
364
+ "transcript marker `[100x-officer @ opus]` makes the routing decision "
365
+ "auditable.\n\n"
366
+ "**Write a precise architectural question with key pointers.** The "
367
+ "sub-agent inherits project conventions from the system prompt. Add only "
368
+ "what the system prompt cannot supply:\n"
369
+ "- The specific decision or design question to answer\n"
370
+ "- Constraints and rejected alternatives established in this conversation\n"
371
+ "- Repo paths for the 2–3 most relevant files (don't narrate the whole tree)\n"
372
+ "Compression risk: summarising complex context loses nuance. Prefer sharp "
373
+ "pointers over prose summaries — the sub-agent can read the files it needs.\n\n"
374
+ "Decompose aggressively: mechanical subtasks → `100x-trooper`, bounded "
375
+ "implementation subtasks → `100x-specialist`. "
376
+ "Spend Opus tokens on reasoning, not editing."
377
+ ),
378
+ }
379
+
380
+ DOMAIN_FLAGS = {
381
+ "auth": r"\b(?:auth|authn|authz|login|session|jwt|oauth|sso|password|credential)\b",
382
+ "payment": r"\b(?:payment|billing|invoice|charge|refund|stripe|checkout)\b",
383
+ "migration": r"\b(?:migration|migrate|schema\s+change|backfill)\b",
384
+ "security": r"\b(?:security|vulnerability|cve|xss|sqli|injection|exploit|secret\s+leak)\b",
385
+ }
386
+
387
+
388
+ def emit_log(record):
389
+ try:
390
+ LOG_PATH.parent.mkdir(parents=True, exist_ok=True)
391
+ with LOG_PATH.open("a", encoding="utf-8") as fh:
392
+ fh.write(json.dumps(record, ensure_ascii=False) + "\n")
393
+ except Exception:
394
+ pass
395
+
396
+
397
+ def main():
398
+ try:
399
+ payload = json.load(sys.stdin)
400
+ except Exception:
401
+ return 0
402
+
403
+ prompt = (payload.get("prompt") or "").strip()
404
+ if not prompt:
405
+ return 0
406
+
407
+ tier, scores, triggered = classify(prompt)
408
+ flags = [
409
+ name for name, pat in DOMAIN_FLAGS.items()
410
+ if re.search(pat, prompt, re.IGNORECASE)
411
+ ]
412
+ word_count = len(prompt.split())
413
+
414
+ record = {
415
+ "ts": datetime.now(timezone.utc).isoformat(),
416
+ "session_id": payload.get("session_id"),
417
+ "cwd": payload.get("cwd"),
418
+ "tier": tier,
419
+ "scores": scores,
420
+ "triggered": [{"t": t["tier"], "w": t["weight"], "s": t["span"], "n": t["neg"]} for t in triggered],
421
+ "word_count": word_count,
422
+ "domain_flags": flags,
423
+ "prompt_head": prompt[:160],
424
+ }
425
+ emit_log(record)
426
+
427
+ body = TIER_REMINDERS[tier]
428
+ score_str = f"cheap={scores['cheap']},main={scores['main']},hard={scores['hard']}"
429
+ header = (
430
+ f"[model-router] tier={tier} scores=({score_str}) "
431
+ f"words={word_count} domains={flags or 'none'}"
432
+ )
433
+
434
+ output = {
435
+ "hookSpecificOutput": {
436
+ "hookEventName": "UserPromptSubmit",
437
+ "additionalContext": f"{header}\n\n{body}",
438
+ }
439
+ }
440
+ sys.stdout.write(json.dumps(output))
441
+ return 0
442
+
443
+
444
+ if __name__ == "__main__":
445
+ sys.exit(main())
@@ -118,7 +118,7 @@ spec:
118
118
  # k3d), started by `olam upgrade` Step 0.7 — not inside this Pod.
119
119
  containers:
120
120
  - name: olam-host-cp
121
- image: ghcr.io/pleri/olam-host-cp@sha256:7c2fed77a185a47910466e19c540eb8c48a51152d88e8acc23455af60af4d491
121
+ image: ghcr.io/pleri/olam-host-cp@sha256:3c601e4ea81d49e0c494c132dbf34aeffffedf37f9f09d4877b0d3139341bc50
122
122
  imagePullPolicy: IfNotPresent
123
123
  securityContext:
124
124
  runAsNonRoot: true
@@ -70,7 +70,7 @@ spec:
70
70
  mountPath: /data
71
71
  containers:
72
72
  - name: olam-auth-service
73
- image: ghcr.io/pleri/olam-auth@sha256:80f084e36c94002c0047f9724ea9a236dbcad3fc2c3fb7642a97d29ffecef085
73
+ image: ghcr.io/pleri/olam-auth@sha256:3f46d206ae15e4cdad15adeaf2e0f0da8367a3292f3c9e80f7e1a12b4d73580b
74
74
  imagePullPolicy: IfNotPresent
75
75
  securityContext:
76
76
  runAsNonRoot: true
@@ -61,7 +61,7 @@ spec:
61
61
  mountPath: /data
62
62
  containers:
63
63
  - name: olam-kg-service
64
- image: ghcr.io/pleri/olam-kg-service@sha256:6f8f51d88d76ed37b8acd7e515217f6546ada721fbfbc79a5081946dfbe1bb5a
64
+ image: ghcr.io/pleri/olam-kg-service@sha256:47f6a594ef402b92032560afd8e6ed4758223d8c8d09f24ede8eff436dc3a31a
65
65
  imagePullPolicy: IfNotPresent
66
66
  securityContext:
67
67
  runAsNonRoot: true
@@ -68,7 +68,7 @@ spec:
68
68
  mountPath: /data
69
69
  containers:
70
70
  - name: olam-mcp-auth-service
71
- image: ghcr.io/pleri/olam-mcp-auth@sha256:bb447b49ed377e2e91ce36b79515451bfefac48892f9138fb24a28746f0157a2
71
+ image: ghcr.io/pleri/olam-mcp-auth@sha256:a97684d8d69922d4ce35af45700e15973a7463f088516a4383b6b6022bc37a16
72
72
  imagePullPolicy: IfNotPresent
73
73
  securityContext:
74
74
  runAsNonRoot: true
@@ -70,7 +70,7 @@ spec:
70
70
  # bootstrap-placeholder comment + run `npm run refresh:manifest-digests`
71
71
  # once ghcr.io/pleri/olam-memory-service has a real published digest.
72
72
  # bootstrap-placeholder: pre-publish; refresh after first release
73
- image: ghcr.io/pleri/olam-memory-service@sha256:0d7bfa12f705cdca4d4489b0ea62269fff36afae43f32405108eb3604297e612
73
+ image: ghcr.io/pleri/olam-memory-service@sha256:6bfa2209ff735728457e155031c526008acd53276f2026ffa95905a301e414bb
74
74
  imagePullPolicy: IfNotPresent
75
75
  securityContext:
76
76
  runAsNonRoot: true
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pleri/olam-cli",
3
- "version": "0.1.199",
3
+ "version": "0.1.201",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "olam": "./bin/olam.cjs"
@@ -9,6 +9,7 @@
9
9
  "bin",
10
10
  "dist",
11
11
  "hermes-bundle",
12
+ "hooks",
12
13
  "host-cp",
13
14
  "plugin",
14
15
  "README.md"
@@ -1,23 +0,0 @@
1
- /**
2
- * olam skills 10x — sub-namespace for managing the /10x: planning chain
3
- * skills + beads (bd) integration.
4
- *
5
- * olam skills 10x install [--no-beads] Sync chain skills via existing
6
- * syncSkills() machinery + auto-
7
- * bootstrap beads.
8
- * olam skills 10x uninstall Remove /10x: chain skill symlinks.
9
- * olam skills 10x doctor Health probe: chain skill presence
10
- * + beads CLI + beads project init +
11
- * beads Claude hooks.
12
- * olam skills 10x version Show olam-cli version + registered
13
- * skill source identities.
14
- *
15
- * Per Pass 3.1 scope-reduction (olam-harness-flywheel.md): this is a thin
16
- * wrapper over the existing `olam skills` surface (skills.ts, skills-hook.ts,
17
- * skills-doctor.ts). The 10x sub-namespace gives /10x: chain skills their own
18
- * verb without colliding with `olam install` (which provisions worlds, not
19
- * skills).
20
- */
21
- import type { Command } from 'commander';
22
- export declare function registerSkills10x(program: Command): void;
23
- //# sourceMappingURL=skills-10x.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skills-10x.d.ts","sourceRoot":"","sources":["../../src/commands/skills-10x.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4KzC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsLxD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"skills-10x.js","sourceRoot":"","sources":["../../src/commands/skills-10x.ts"],"names":[],"mappings":"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"}