instar 0.28.49 → 0.28.51
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/commands/init.js +93 -93
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +61 -31
- package/dist/commands/server.js.map +1 -1
- package/dist/core/InputGuard.d.ts +29 -3
- package/dist/core/InputGuard.d.ts.map +1 -1
- package/dist/core/InputGuard.js +73 -45
- package/dist/core/InputGuard.js.map +1 -1
- package/dist/core/PostUpdateMigrator.d.ts +14 -0
- package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
- package/dist/core/PostUpdateMigrator.js +46 -0
- package/dist/core/PostUpdateMigrator.js.map +1 -1
- package/dist/messaging/shared/isSystemOrProxyMessage.d.ts +41 -0
- package/dist/messaging/shared/isSystemOrProxyMessage.d.ts.map +1 -0
- package/dist/messaging/shared/isSystemOrProxyMessage.js +64 -0
- package/dist/messaging/shared/isSystemOrProxyMessage.js.map +1 -0
- package/dist/monitoring/PresenceProxy.d.ts +3 -1
- package/dist/monitoring/PresenceProxy.d.ts.map +1 -1
- package/dist/monitoring/PresenceProxy.js +5 -16
- package/dist/monitoring/PresenceProxy.js.map +1 -1
- package/package.json +1 -1
- package/scripts/pre-push-gate.js +6 -3
- package/src/data/builtin-manifest.json +43 -43
- package/upgrades/0.28.50.md +59 -0
- package/upgrades/0.28.51.md +31 -0
- package/upgrades/0.28.52.md +82 -0
- package/upgrades/side-effects/0.28.49.md +90 -0
- package/upgrades/side-effects/0.28.50.md +104 -0
- package/upgrades/side-effects/0.28.51.md +145 -0
- package/upgrades/side-effects/0.28.52.md +276 -0
- package/upgrades/side-effects/pre-push-gate-ci-scope.md +104 -0
- package/upgrades/side-effects/skill-port-dynamic-resolution.md +104 -0
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
* Hard requirement: NEVER fail silently. Every fallback, timeout, or
|
|
16
16
|
* degradation must be logged and surfaced via the attention queue.
|
|
17
17
|
*/
|
|
18
|
+
import type { IntelligenceProvider } from './types.js';
|
|
18
19
|
export interface InputGuardConfig {
|
|
19
20
|
/** Whether the Input Guard is enabled */
|
|
20
21
|
enabled: boolean;
|
|
@@ -26,7 +27,13 @@ export interface InputGuardConfig {
|
|
|
26
27
|
topicCoherenceReview?: boolean;
|
|
27
28
|
/** Action on suspicious messages: 'warn' (default), 'block', 'log' */
|
|
28
29
|
action?: 'warn' | 'block' | 'log';
|
|
29
|
-
/**
|
|
30
|
+
/**
|
|
31
|
+
* Timeout for LLM review in ms. Values below 8000 are clamped up to 8000
|
|
32
|
+
* — the CLI-subscription provider spawns a subprocess per call whose
|
|
33
|
+
* cold-start p99 can exceed 3000ms, so a below-floor value would silently
|
|
34
|
+
* regress Layer 2 from "review ran" to "review timed out." Explicit values
|
|
35
|
+
* above 8000 take effect as-configured. Default: 8000 (the floor).
|
|
36
|
+
*/
|
|
30
37
|
reviewTimeout?: number;
|
|
31
38
|
}
|
|
32
39
|
export interface TopicBinding {
|
|
@@ -52,7 +59,7 @@ export declare class InputGuard {
|
|
|
52
59
|
private config;
|
|
53
60
|
private stateDir;
|
|
54
61
|
private securityLogPath;
|
|
55
|
-
private
|
|
62
|
+
private intelligence;
|
|
56
63
|
private attentionQueueFn;
|
|
57
64
|
private topicMemoryFn;
|
|
58
65
|
private sessionCreationTimes;
|
|
@@ -61,7 +68,13 @@ export declare class InputGuard {
|
|
|
61
68
|
constructor(options: {
|
|
62
69
|
config: InputGuardConfig;
|
|
63
70
|
stateDir: string;
|
|
64
|
-
|
|
71
|
+
/**
|
|
72
|
+
* Shared IntelligenceProvider. Layer 2 topic-coherence review runs exclusively
|
|
73
|
+
* through this abstraction — InputGuard does not call the Anthropic API
|
|
74
|
+
* directly. When absent, Layer 2 fails closed-to-warn (a degradation log is
|
|
75
|
+
* emitted) and the session continues without topic-coherence supervision.
|
|
76
|
+
*/
|
|
77
|
+
intelligence?: IntelligenceProvider;
|
|
65
78
|
});
|
|
66
79
|
/** Set the attention queue callback for surfacing degradation */
|
|
67
80
|
setAttentionQueue(fn: (title: string, body: string) => void): void;
|
|
@@ -84,6 +97,19 @@ export declare class InputGuard {
|
|
|
84
97
|
* Uses Haiku for fast, low-cost classification.
|
|
85
98
|
*/
|
|
86
99
|
reviewTopicCoherence(text: string, binding: TopicBinding): Promise<InputReviewResult>;
|
|
100
|
+
/**
|
|
101
|
+
* Parse the LLM's raw response into an InputReviewResult.
|
|
102
|
+
*
|
|
103
|
+
* Fail-mode policy:
|
|
104
|
+
* - Empty response → coherent (authority declined; indistinguishable from
|
|
105
|
+
* transport absence, which is already logged elsewhere).
|
|
106
|
+
* - Valid JSON → parsed verdict/reason/confidence.
|
|
107
|
+
* - Malformed JSON → suspicious with low confidence AND a degradation log.
|
|
108
|
+
* Rationale: under warn-only action, fail-closed-to-warn surfaces a
|
|
109
|
+
* non-blocking system-reminder rather than silently passing content that
|
|
110
|
+
* may have been crafted to produce malformed authority output.
|
|
111
|
+
*/
|
|
112
|
+
private parseReviewResponse;
|
|
87
113
|
/**
|
|
88
114
|
* Build a system-reminder warning for suspicious messages.
|
|
89
115
|
* Uses <system-reminder> tags which occupy a structurally privileged
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InputGuard.d.ts","sourceRoot":"","sources":["../../src/core/InputGuard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;
|
|
1
|
+
{"version":3,"file":"InputGuard.d.ts","sourceRoot":"","sources":["../../src/core/InputGuard.ts"],"names":[],"mappings":"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"}
|
package/dist/core/InputGuard.js
CHANGED
|
@@ -80,7 +80,7 @@ export class InputGuard {
|
|
|
80
80
|
config;
|
|
81
81
|
stateDir;
|
|
82
82
|
securityLogPath;
|
|
83
|
-
|
|
83
|
+
intelligence;
|
|
84
84
|
attentionQueueFn = null;
|
|
85
85
|
topicMemoryFn = null;
|
|
86
86
|
sessionCreationTimes = new Map();
|
|
@@ -89,7 +89,7 @@ export class InputGuard {
|
|
|
89
89
|
constructor(options) {
|
|
90
90
|
this.config = options.config;
|
|
91
91
|
this.stateDir = options.stateDir;
|
|
92
|
-
this.
|
|
92
|
+
this.intelligence = options.intelligence ?? null;
|
|
93
93
|
this.securityLogPath = path.join(options.stateDir, 'security.jsonl');
|
|
94
94
|
}
|
|
95
95
|
/** Set the attention queue callback for surfacing degradation */
|
|
@@ -173,8 +173,15 @@ export class InputGuard {
|
|
|
173
173
|
* Uses Haiku for fast, low-cost classification.
|
|
174
174
|
*/
|
|
175
175
|
async reviewTopicCoherence(text, binding) {
|
|
176
|
-
if (!this.config.topicCoherenceReview
|
|
177
|
-
return { verdict: 'coherent', reason: 'review disabled
|
|
176
|
+
if (!this.config.topicCoherenceReview) {
|
|
177
|
+
return { verdict: 'coherent', reason: 'review disabled', confidence: 0, layer: 'topic-coherence' };
|
|
178
|
+
}
|
|
179
|
+
if (!this.intelligence) {
|
|
180
|
+
// No LLM transport available — visible degradation instead of silent no-op.
|
|
181
|
+
// Subscription-first: the Anthropic API is only reachable through the shared
|
|
182
|
+
// provider abstraction; InputGuard no longer carries its own direct transport.
|
|
183
|
+
this.logDegradation('topic coherence review skipped: no IntelligenceProvider');
|
|
184
|
+
return { verdict: 'coherent', reason: 'no LLM available — review skipped', confidence: 0, layer: 'topic-coherence' };
|
|
178
185
|
}
|
|
179
186
|
// Get recent messages for context
|
|
180
187
|
let recentContext = 'No recent messages available';
|
|
@@ -209,58 +216,79 @@ Evaluate:
|
|
|
209
216
|
|
|
210
217
|
Respond with ONLY valid JSON (no markdown, no explanation):
|
|
211
218
|
{"verdict": "COHERENT" or "SUSPICIOUS", "reason": "Brief explanation", "confidence": 0.0 to 1.0}`;
|
|
212
|
-
|
|
219
|
+
// Effective timeout is a FLOOR, not a hard default: `max(config, 8000ms)`.
|
|
220
|
+
// Rationale: the CLI-subscription provider spawns a subprocess per call whose
|
|
221
|
+
// cold-start p99 can exceed 3000ms. Honoring a user-configured value below
|
|
222
|
+
// the floor would silently regress Layer 2 from "LLM review ran" to "LLM
|
|
223
|
+
// review timed out" on the subscription path. The floor is intentional: a
|
|
224
|
+
// below-floor config value is clamped up. Explicit config above 8s raises it.
|
|
225
|
+
// (Warn-only action makes a longer review benign — no user-visible latency.)
|
|
226
|
+
const FLOOR_MS = 8000;
|
|
227
|
+
const timeout = Math.max(this.config.reviewTimeout ?? 0, FLOOR_MS);
|
|
213
228
|
try {
|
|
214
|
-
const
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
headers: {
|
|
219
|
-
'Content-Type': 'application/json',
|
|
220
|
-
'x-api-key': this.apiKey,
|
|
221
|
-
'anthropic-version': '2023-06-01',
|
|
222
|
-
},
|
|
223
|
-
body: JSON.stringify({
|
|
224
|
-
model: 'claude-haiku-4-5-20251001',
|
|
225
|
-
max_tokens: 150,
|
|
229
|
+
const rawText = await Promise.race([
|
|
230
|
+
this.intelligence.evaluate(prompt, {
|
|
231
|
+
model: 'fast',
|
|
232
|
+
maxTokens: 150,
|
|
226
233
|
temperature: 0,
|
|
227
|
-
messages: [{ role: 'user', content: prompt }],
|
|
228
234
|
}),
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
if (!response.ok) {
|
|
233
|
-
const errorText = await response.text().catch(() => 'unknown');
|
|
234
|
-
throw new Error(`API ${response.status}: ${errorText}`);
|
|
235
|
-
}
|
|
236
|
-
const data = await response.json();
|
|
237
|
-
const textBlock = data.content?.find(b => b.type === 'text');
|
|
238
|
-
if (!textBlock?.text) {
|
|
239
|
-
return { verdict: 'coherent', reason: 'Empty response', confidence: 0, layer: 'topic-coherence' };
|
|
240
|
-
}
|
|
241
|
-
try {
|
|
242
|
-
const parsed = JSON.parse(textBlock.text);
|
|
243
|
-
return {
|
|
244
|
-
verdict: parsed.verdict?.toLowerCase() === 'suspicious' ? 'suspicious' : 'coherent',
|
|
245
|
-
reason: parsed.reason || 'No reason provided',
|
|
246
|
-
confidence: typeof parsed.confidence === 'number' ? parsed.confidence : 0.5,
|
|
247
|
-
layer: 'topic-coherence',
|
|
248
|
-
};
|
|
249
|
-
}
|
|
250
|
-
catch {
|
|
251
|
-
// JSON parse failed — fail open
|
|
252
|
-
this.logDegradation('LLM response was not valid JSON', textBlock.text.slice(0, 100));
|
|
253
|
-
return { verdict: 'coherent', reason: 'Parse error — fail open', confidence: 0, layer: 'topic-coherence' };
|
|
254
|
-
}
|
|
235
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error(`Review timeout after ${timeout}ms`)), timeout)),
|
|
236
|
+
]);
|
|
237
|
+
return this.parseReviewResponse(rawText);
|
|
255
238
|
}
|
|
256
239
|
catch (err) {
|
|
257
|
-
//
|
|
240
|
+
// Transport flake (timeout, network, subprocess failure) — fail open at the
|
|
241
|
+
// transport boundary so routine infrastructure hiccups don't produce warn-spam.
|
|
242
|
+
// Authority-level dissent (suspicious verdict) would have come through the
|
|
243
|
+
// parse path above. Degradation logging + error tracking surfaces persistent
|
|
244
|
+
// transport failure via the attention queue.
|
|
258
245
|
const msg = err instanceof Error ? err.message : String(err);
|
|
259
246
|
this.logDegradation(`LLM review failed: ${msg}`);
|
|
260
247
|
this.trackErrors();
|
|
261
248
|
return { verdict: 'coherent', reason: `Review failed: ${msg} — fail open`, confidence: 0, layer: 'topic-coherence' };
|
|
262
249
|
}
|
|
263
250
|
}
|
|
251
|
+
/**
|
|
252
|
+
* Parse the LLM's raw response into an InputReviewResult.
|
|
253
|
+
*
|
|
254
|
+
* Fail-mode policy:
|
|
255
|
+
* - Empty response → coherent (authority declined; indistinguishable from
|
|
256
|
+
* transport absence, which is already logged elsewhere).
|
|
257
|
+
* - Valid JSON → parsed verdict/reason/confidence.
|
|
258
|
+
* - Malformed JSON → suspicious with low confidence AND a degradation log.
|
|
259
|
+
* Rationale: under warn-only action, fail-closed-to-warn surfaces a
|
|
260
|
+
* non-blocking system-reminder rather than silently passing content that
|
|
261
|
+
* may have been crafted to produce malformed authority output.
|
|
262
|
+
*/
|
|
263
|
+
parseReviewResponse(rawText) {
|
|
264
|
+
if (!rawText || rawText.trim().length === 0) {
|
|
265
|
+
return { verdict: 'coherent', reason: 'Empty response', confidence: 0, layer: 'topic-coherence' };
|
|
266
|
+
}
|
|
267
|
+
let cleaned = rawText.trim();
|
|
268
|
+
if (cleaned.startsWith('```')) {
|
|
269
|
+
cleaned = cleaned.replace(/^```(?:json)?\n?/, '').replace(/\n?```$/, '');
|
|
270
|
+
}
|
|
271
|
+
const jsonMatch = cleaned.match(/\{[\s\S]*\}/);
|
|
272
|
+
const jsonText = jsonMatch ? jsonMatch[0] : cleaned;
|
|
273
|
+
try {
|
|
274
|
+
const parsed = JSON.parse(jsonText);
|
|
275
|
+
return {
|
|
276
|
+
verdict: parsed.verdict?.toLowerCase() === 'suspicious' ? 'suspicious' : 'coherent',
|
|
277
|
+
reason: parsed.reason || 'No reason provided',
|
|
278
|
+
confidence: typeof parsed.confidence === 'number' ? parsed.confidence : 0.5,
|
|
279
|
+
layer: 'topic-coherence',
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
catch {
|
|
283
|
+
this.logDegradation('LLM response was not valid JSON', rawText.slice(0, 100));
|
|
284
|
+
return {
|
|
285
|
+
verdict: 'suspicious',
|
|
286
|
+
reason: 'Parse error — fail-closed-to-warn',
|
|
287
|
+
confidence: 0.3,
|
|
288
|
+
layer: 'topic-coherence',
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
}
|
|
264
292
|
// ── Warning Builder ─────────────────────────────────────────────
|
|
265
293
|
/**
|
|
266
294
|
* Build a system-reminder warning for suspicious messages.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InputGuard.js","sourceRoot":"","sources":["../../src/core/InputGuard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"InputGuard.js","sourceRoot":"","sources":["../../src/core/InputGuard.ts"],"names":[],"mappings":"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"}
|
|
@@ -41,6 +41,20 @@ export declare class PostUpdateMigrator {
|
|
|
41
41
|
* each migration is idempotent.
|
|
42
42
|
*/
|
|
43
43
|
migrate(): MigrationResult;
|
|
44
|
+
/**
|
|
45
|
+
* Upgrade built-in skills that hardcoded a localhost port at install time
|
|
46
|
+
* to use a runtime-expandable ${INSTAR_PORT:-PORT} pattern.
|
|
47
|
+
*
|
|
48
|
+
* Background: installBuiltinSkills used to template the port at install.
|
|
49
|
+
* Users who later changed their server port ended up with stale URLs in
|
|
50
|
+
* their skills. This migration rewrites `http://localhost:NNNN/` to
|
|
51
|
+
* `http://localhost:${INSTAR_PORT:-NNNN}/` in the known-default skill set.
|
|
52
|
+
*
|
|
53
|
+
* Idempotent: skips files that already use the dynamic pattern.
|
|
54
|
+
* Scoped: only touches skills from the installBuiltinSkills set — custom
|
|
55
|
+
* skills are never modified.
|
|
56
|
+
*/
|
|
57
|
+
private migrateSkillPortHardcoding;
|
|
44
58
|
/**
|
|
45
59
|
* Deploy any missing built-in skills (e.g., guardian job skills added after initial setup).
|
|
46
60
|
* Non-destructive — only writes SKILL.md files that don't already exist.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostUpdateMigrator.d.ts","sourceRoot":"","sources":["../../src/core/PostUpdateMigrator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAYH,MAAM,WAAW,eAAe;IAC9B,wBAAwB;IACxB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,kCAAkC;IAClC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,2CAA2C;IAC3C,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAiB;gBAEnB,MAAM,EAAE,cAAc;IAIlC;;;OAGG;IACH,OAAO,IAAI,eAAe;
|
|
1
|
+
{"version":3,"file":"PostUpdateMigrator.d.ts","sourceRoot":"","sources":["../../src/core/PostUpdateMigrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -48,11 +48,57 @@ export class PostUpdateMigrator {
|
|
|
48
48
|
this.migrateConfig(result);
|
|
49
49
|
this.migrateGitignore(result);
|
|
50
50
|
this.migrateBuiltinSkills(result);
|
|
51
|
+
this.migrateSkillPortHardcoding(result);
|
|
51
52
|
this.migrateSelfKnowledgeTree(result);
|
|
52
53
|
this.migrateSoulMd(result);
|
|
53
54
|
this.migrateAgentMdSections(result);
|
|
54
55
|
return result;
|
|
55
56
|
}
|
|
57
|
+
/**
|
|
58
|
+
* Upgrade built-in skills that hardcoded a localhost port at install time
|
|
59
|
+
* to use a runtime-expandable ${INSTAR_PORT:-PORT} pattern.
|
|
60
|
+
*
|
|
61
|
+
* Background: installBuiltinSkills used to template the port at install.
|
|
62
|
+
* Users who later changed their server port ended up with stale URLs in
|
|
63
|
+
* their skills. This migration rewrites `http://localhost:NNNN/` to
|
|
64
|
+
* `http://localhost:${INSTAR_PORT:-NNNN}/` in the known-default skill set.
|
|
65
|
+
*
|
|
66
|
+
* Idempotent: skips files that already use the dynamic pattern.
|
|
67
|
+
* Scoped: only touches skills from the installBuiltinSkills set — custom
|
|
68
|
+
* skills are never modified.
|
|
69
|
+
*/
|
|
70
|
+
migrateSkillPortHardcoding(result) {
|
|
71
|
+
const defaultSkills = [
|
|
72
|
+
'evolve', 'learn', 'gaps', 'commit-action', 'feedback',
|
|
73
|
+
'triage-findings', 'reflect', 'coherence-audit', 'degradation-digest',
|
|
74
|
+
'state-integrity-check', 'memory-hygiene', 'guardian-pulse',
|
|
75
|
+
'session-continuity-check', 'git-sync',
|
|
76
|
+
];
|
|
77
|
+
const skillsDir = path.join(this.config.projectDir, '.claude', 'skills');
|
|
78
|
+
const hardcodedRe = /http:\/\/localhost:(\d+)\//g;
|
|
79
|
+
const dynamicMarker = '${INSTAR_PORT:-';
|
|
80
|
+
for (const name of defaultSkills) {
|
|
81
|
+
const skillFile = path.join(skillsDir, name, 'SKILL.md');
|
|
82
|
+
if (!fs.existsSync(skillFile))
|
|
83
|
+
continue;
|
|
84
|
+
try {
|
|
85
|
+
const original = fs.readFileSync(skillFile, 'utf8');
|
|
86
|
+
if (original.includes(dynamicMarker))
|
|
87
|
+
continue;
|
|
88
|
+
if (!hardcodedRe.test(original))
|
|
89
|
+
continue;
|
|
90
|
+
hardcodedRe.lastIndex = 0;
|
|
91
|
+
const updated = original.replace(hardcodedRe, (_m, p) => `http://localhost:\${INSTAR_PORT:-${p}}/`);
|
|
92
|
+
if (updated !== original) {
|
|
93
|
+
fs.writeFileSync(skillFile, updated);
|
|
94
|
+
result.upgraded.push(`skills/${name}/SKILL.md (hardcoded port -> \${INSTAR_PORT:-NNNN})`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
result.errors.push(`skills/${name}/SKILL.md port migration: ${err instanceof Error ? err.message : String(err)}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
56
102
|
/**
|
|
57
103
|
* Deploy any missing built-in skills (e.g., guardian job skills added after initial setup).
|
|
58
104
|
* Non-destructive — only writes SKILL.md files that don't already exist.
|