@interchained/portal-agent 0.1.2 → 0.1.4
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/aiassist.d.ts +3 -0
- package/dist/aiassist.d.ts.map +1 -1
- package/dist/aiassist.js +5 -2
- package/dist/aiassist.js.map +1 -1
- package/dist/generate.d.ts +11 -4
- package/dist/generate.d.ts.map +1 -1
- package/dist/generate.js +3 -0
- package/dist/generate.js.map +1 -1
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +3 -2
- package/dist/runner.js.map +1 -1
- package/dist/sentinel.d.ts +36 -18
- package/dist/sentinel.d.ts.map +1 -1
- package/dist/sentinel.js +108 -50
- package/dist/sentinel.js.map +1 -1
- package/package.json +1 -1
package/dist/aiassist.d.ts
CHANGED
|
@@ -24,6 +24,8 @@ export interface AiAssistConfig {
|
|
|
24
24
|
baseUrl?: string;
|
|
25
25
|
/** Model identifier */
|
|
26
26
|
model?: string;
|
|
27
|
+
/** Provider to route through — sent as X-AiAssist-Provider header. Defaults to "anthropic" */
|
|
28
|
+
provider?: string;
|
|
27
29
|
/** Request timeout in ms. Defaults to 60 000 */
|
|
28
30
|
timeoutMs?: number;
|
|
29
31
|
}
|
|
@@ -32,6 +34,7 @@ export declare class AiAssistClient {
|
|
|
32
34
|
private readonly baseUrl;
|
|
33
35
|
private readonly model;
|
|
34
36
|
private readonly timeoutMs;
|
|
37
|
+
private readonly provider;
|
|
35
38
|
constructor(config: AiAssistConfig);
|
|
36
39
|
/** Single-turn completion — convenience wrapper around chat() */
|
|
37
40
|
complete(prompt: string, systemPrompt?: string, options?: CompletionOptions): Promise<string>;
|
package/dist/aiassist.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aiassist.d.ts","sourceRoot":"","sources":["../src/aiassist.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qBAAqB;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAUD,qBAAa,aAAc,SAAQ,KAAK;aAGpB,UAAU,EAAE,MAAM;aAClB,IAAI,CAAC,EAAE,MAAM;gBAF7B,OAAO,EAAE,MAAM,EACC,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,MAAM,YAAA;CAKhC;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uBAAuB;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;
|
|
1
|
+
{"version":3,"file":"aiassist.d.ts","sourceRoot":"","sources":["../src/aiassist.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qBAAqB;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAUD,qBAAa,aAAc,SAAQ,KAAK;aAGpB,UAAU,EAAE,MAAM;aAClB,IAAI,CAAC,EAAE,MAAM;gBAF7B,OAAO,EAAE,MAAM,EACC,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,MAAM,YAAA;CAKhC;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uBAAuB;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8FAA8F;IAC9F,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IAEnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,MAAM,EAAE,cAAc;IAQlC,iEAAiE;IAC3D,QAAQ,CACZ,MAAM,EAAE,MAAM,EACd,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,MAAM,CAAC;IAOlB,iCAAiC;IAC3B,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;IAgD7E,kEAAkE;IAClE,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,cAAc;CAapE"}
|
package/dist/aiassist.js
CHANGED
|
@@ -18,10 +18,12 @@ export class AiAssistClient {
|
|
|
18
18
|
baseUrl;
|
|
19
19
|
model;
|
|
20
20
|
timeoutMs;
|
|
21
|
+
provider;
|
|
21
22
|
constructor(config) {
|
|
22
23
|
this.apiKey = config.apiKey;
|
|
23
24
|
this.baseUrl = (config.baseUrl ?? "https://api.aiassist.net/v1").replace(/\/$/, "");
|
|
24
|
-
this.model = config.model ?? "
|
|
25
|
+
this.model = config.model ?? "claude-haiku-4-5-20251001";
|
|
26
|
+
this.provider = config.provider ?? "anthropic";
|
|
25
27
|
this.timeoutMs = config.timeoutMs ?? 60_000;
|
|
26
28
|
}
|
|
27
29
|
/** Single-turn completion — convenience wrapper around chat() */
|
|
@@ -42,7 +44,8 @@ export class AiAssistClient {
|
|
|
42
44
|
method: "POST",
|
|
43
45
|
headers: {
|
|
44
46
|
"Content-Type": "application/json",
|
|
45
|
-
Authorization: `Bearer ${this.apiKey}`,
|
|
47
|
+
"Authorization": `Bearer ${this.apiKey}`,
|
|
48
|
+
"X-AiAssist-Provider": this.provider,
|
|
46
49
|
},
|
|
47
50
|
body: JSON.stringify({
|
|
48
51
|
model: this.model,
|
package/dist/aiassist.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aiassist.js","sourceRoot":"","sources":["../src/aiassist.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAsBH,MAAM,OAAO,aAAc,SAAQ,KAAK;IAGpB;IACA;IAHlB,YACE,OAAe,EACC,UAAkB,EAClB,IAAa;QAE7B,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,eAAU,GAAV,UAAU,CAAQ;QAClB,SAAI,GAAJ,IAAI,CAAS;QAG7B,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;
|
|
1
|
+
{"version":3,"file":"aiassist.js","sourceRoot":"","sources":["../src/aiassist.ts"],"names":[],"mappings":"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"}
|
package/dist/generate.d.ts
CHANGED
|
@@ -22,14 +22,21 @@ export interface GenerateOptions {
|
|
|
22
22
|
}
|
|
23
23
|
export interface GenerateResult {
|
|
24
24
|
patch: Patch;
|
|
25
|
-
/** Set whenever a Sentinel ran
|
|
25
|
+
/** Set whenever a Sentinel ran */
|
|
26
26
|
sentinelReview?: SentinelReview;
|
|
27
27
|
/**
|
|
28
|
-
* True when the Sentinel
|
|
29
|
-
* False when sentinel
|
|
30
|
-
* The CLI uses this to skip / show the human approval prompt.
|
|
28
|
+
* True when the Sentinel applied the patch (clean or self-corrected).
|
|
29
|
+
* False when no sentinel ran — human approval prompt shown instead.
|
|
31
30
|
*/
|
|
32
31
|
sentinelApplied: boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Populated when the Sentinel had to self-correct the patch before applying.
|
|
34
|
+
* Undefined when the patch was clean.
|
|
35
|
+
*/
|
|
36
|
+
sentinelFix?: {
|
|
37
|
+
summary: string;
|
|
38
|
+
changes: string[];
|
|
39
|
+
};
|
|
33
40
|
}
|
|
34
41
|
/**
|
|
35
42
|
* Generate a new page component from a PageContract.
|
package/dist/generate.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC/E,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAe,UAAU,EAAE,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjE,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,QAAQ,EAAE,WAAW,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,KAAK,CAAC;IACb,
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC/E,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAe,UAAU,EAAE,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjE,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,QAAQ,EAAE,WAAW,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,KAAK,CAAC;IACb,kCAAkC;IAClC,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC;;;OAGG;IACH,eAAe,EAAE,OAAO,CAAC;IACzB;;;OAGG;IACH,WAAW,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CACtD;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,YAAY,GAAG;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EAC7C,IAAI,EAAE,eAAe,EACrB,KAAK,EAAE,UAAU,GAChB,OAAO,CAAC,cAAc,CAAC,CAyDzB;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,eAAe,EACrB,KAAK,CAAC,EAAE,UAAU,GACjB,OAAO,CAAC,cAAc,CAAC,CAUzB"}
|
package/dist/generate.js
CHANGED
|
@@ -55,6 +55,9 @@ export async function generatePage(page, opts, store) {
|
|
|
55
55
|
patch,
|
|
56
56
|
sentinelReview: result.review,
|
|
57
57
|
sentinelApplied: result.applied,
|
|
58
|
+
sentinelFix: result.fix
|
|
59
|
+
? { summary: result.fix.summary, changes: result.fix.changes }
|
|
60
|
+
: undefined,
|
|
58
61
|
};
|
|
59
62
|
}
|
|
60
63
|
// ── No sentinel — patch stays "pending", human decides ────────────────────
|
package/dist/generate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIjC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAc,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"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"}
|
package/dist/runner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAkB,KAAK,cAAc,EAAgB,MAAM,eAAe,CAAC;AAElF,MAAM,WAAW,YAAa,SAAQ,OAAO,CAAC,cAAc,CAAC;IAC3D,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAiB;gBAEnB,MAAM,GAAE,YAAiB;
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAkB,KAAK,cAAc,EAAgB,MAAM,eAAe,CAAC;AAElF,MAAM,WAAW,YAAa,SAAQ,OAAO,CAAC,cAAc,CAAC;IAC3D,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAiB;gBAEnB,MAAM,GAAE,YAAiB;IAU/B,GAAG,CACP,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC;IAYlB,sCAAsC;IAChC,iBAAiB,CAAC,IAAI,EAAE;QAC5B,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAClB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,GAAG,OAAO,CAAC,MAAM,CAAC;IAmBnB,sCAAsC;IAChC,WAAW,CAAC,IAAI,EAAE;QACtB,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC,MAAM,CAAC;IAiBnB,yDAAyD;IACnD,aAAa,CAAC,IAAI,EAAE;QACxB,QAAQ,EAAE,MAAM,CAAC;QACjB,eAAe,EAAE,MAAM,CAAC;QACxB,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC,MAAM,CAAC;CAoBpB"}
|
package/dist/runner.js
CHANGED
|
@@ -10,8 +10,9 @@ export class Runner {
|
|
|
10
10
|
this.client = new AiAssistClient({
|
|
11
11
|
apiKey: config.apiKey ?? process.env["AIASSIST_API_KEY"] ?? process.env["VITE_AIAS_API_KEY"] ?? "",
|
|
12
12
|
baseUrl: config.baseUrl,
|
|
13
|
-
model: config.model ?? "
|
|
14
|
-
|
|
13
|
+
model: config.model ?? "claude-haiku-4-5-20251001",
|
|
14
|
+
provider: "anthropic",
|
|
15
|
+
timeoutMs: config.timeoutMs ?? 60_000,
|
|
15
16
|
});
|
|
16
17
|
}
|
|
17
18
|
async run(task, context, systemPrompt) {
|
package/dist/runner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAqC,MAAM,eAAe,CAAC;AAOlF,MAAM,OAAO,MAAM;IACT,MAAM,CAAiB;IAE/B,YAAY,SAAuB,EAAE;QACnC,IAAI,CAAC,MAAM,GAAG,IAAI,cAAc,CAAC;YAC/B,MAAM,
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAqC,MAAM,eAAe,CAAC;AAOlF,MAAM,OAAO,MAAM;IACT,MAAM,CAAiB;IAE/B,YAAY,SAAuB,EAAE;QACnC,IAAI,CAAC,MAAM,GAAG,IAAI,cAAc,CAAC;YAC/B,MAAM,EAAK,MAAM,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,EAAE;YACrG,OAAO,EAAI,MAAM,CAAC,OAAO;YACzB,KAAK,EAAM,MAAM,CAAC,KAAK,IAAI,2BAA2B;YACtD,QAAQ,EAAG,WAAW;YACtB,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,MAAM;SACtC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,GAAG,CACP,IAAY,EACZ,OAAe,EACf,YAAqB;QAErB,MAAM,QAAQ,GAAc,EAAE,CAAC;QAC/B,IAAI,YAAY,EAAE,CAAC;YACjB,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,GAAG,OAAO,kBAAkB,IAAI,EAAE;SAC5C,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,sCAAsC;IACtC,KAAK,CAAC,iBAAiB,CAAC,IAQvB;QACC,MAAM,YAAY,GAAG;;;;;YAKb,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,sBAAsB;gBAC7C,IAAI,CAAC,UAAU,IAAI,wBAAwB;wBACnC,CAAC;QAErB,MAAM,MAAM,GAAG,kDAAkD,IAAI,CAAC,KAAK;WACpE,IAAI,CAAC,OAAO;EACrB,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE;EACjD,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,mBAAmB,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE;sFACmB,CAAC;QAEnF,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,sCAAsC;IACtC,KAAK,CAAC,WAAW,CAAC,IAKjB;QACC,MAAM,MAAM,GAAG,+CAA+C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;;;EAGtF,IAAI,CAAC,QAAQ;;QAEP,IAAI,CAAC,QAAQ;;EAEnB,IAAI,CAAC,OAAO;;;;kIAIoH,CAAC;QAE/H,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,yDAAyD;IACzD,KAAK,CAAC,aAAa,CAAC,IAKnB;QACC,MAAM,YAAY,GAAG;gFACuD,CAAC;QAE7E,MAAM,MAAM,GAAG;;SAEV,IAAI,CAAC,OAAO;;;EAGnB,IAAI,CAAC,QAAQ;;QAEP,IAAI,CAAC,QAAQ;;EAEnB,IAAI,CAAC,eAAe;;;oFAG8D,CAAC;QAEjF,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5F,CAAC;CACF"}
|
package/dist/sentinel.d.ts
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Sentinel — reviews
|
|
2
|
+
* Sentinel — reviews, auto-corrects, and applies patches.
|
|
3
3
|
*
|
|
4
|
-
* The Sentinel
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* The Sentinel never just rejects. Its contract:
|
|
5
|
+
* 1. Review the Runner's output against the app contract
|
|
6
|
+
* 2. If clean → apply as-is
|
|
7
|
+
* 3. If issues → self-correct (call AI to fix the violations)
|
|
8
|
+
* 4. Apply the corrected version
|
|
9
|
+
* 5. Report what was fixed
|
|
7
10
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* regressions, and contract drift.
|
|
11
|
+
* The human always sees a result, never a gate.
|
|
12
|
+
* The only terminal failure is an unrecoverable AI error.
|
|
11
13
|
*/
|
|
12
14
|
import { type AiAssistConfig } from "./aiassist.js";
|
|
13
15
|
import type { AppContract } from "@interchained/portal-contract";
|
|
@@ -16,17 +18,29 @@ export interface SentinelReview {
|
|
|
16
18
|
approved: boolean;
|
|
17
19
|
summary: string;
|
|
18
20
|
violations: string[];
|
|
19
|
-
/** Diff-friendly line annotations */
|
|
20
21
|
annotations: Array<{
|
|
21
22
|
line?: number;
|
|
22
23
|
type: "ok" | "warning" | "violation";
|
|
23
24
|
note: string;
|
|
24
25
|
}>;
|
|
25
26
|
}
|
|
27
|
+
export interface SentinelFix {
|
|
28
|
+
/** Plain-English summary of what the sentinel changed */
|
|
29
|
+
summary: string;
|
|
30
|
+
/** Each item is one fix the sentinel applied */
|
|
31
|
+
changes: string[];
|
|
32
|
+
/** The corrected file content */
|
|
33
|
+
correctedContent: string;
|
|
34
|
+
}
|
|
26
35
|
export interface SentinelResult {
|
|
27
36
|
review: SentinelReview;
|
|
28
|
-
/**
|
|
29
|
-
applied:
|
|
37
|
+
/** Always true — sentinel either applied clean or applied its own fix */
|
|
38
|
+
applied: true;
|
|
39
|
+
/**
|
|
40
|
+
* Populated when the sentinel had to self-correct.
|
|
41
|
+
* Undefined when the patch was clean and applied as-is.
|
|
42
|
+
*/
|
|
43
|
+
fix?: SentinelFix;
|
|
30
44
|
}
|
|
31
45
|
export declare class Sentinel {
|
|
32
46
|
private client;
|
|
@@ -38,15 +52,20 @@ export declare class Sentinel {
|
|
|
38
52
|
proposed: string;
|
|
39
53
|
agentTask: string;
|
|
40
54
|
}): Promise<SentinelReview>;
|
|
55
|
+
fix(opts: {
|
|
56
|
+
contract: AppContract;
|
|
57
|
+
filePath: string;
|
|
58
|
+
original: string;
|
|
59
|
+
proposed: string;
|
|
60
|
+
violations: string[];
|
|
61
|
+
agentTask: string;
|
|
62
|
+
}): Promise<SentinelFix>;
|
|
41
63
|
/**
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
* This is the primary entry point. The Sentinel is both judge and executor:
|
|
45
|
-
* - Approved → patch is written to disk, status set to "applied"
|
|
46
|
-
* - Rejected → nothing is written, violations are surfaced to the caller
|
|
64
|
+
* The primary entry point.
|
|
47
65
|
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
66
|
+
* Always applies something to disk. Never rejects to the caller.
|
|
67
|
+
* - Clean patch → apply as-is, fix undefined
|
|
68
|
+
* - Dirty patch → self-correct → apply corrected version, fix populated
|
|
50
69
|
*/
|
|
51
70
|
reviewAndApply(opts: {
|
|
52
71
|
patch: Patch;
|
|
@@ -54,7 +73,6 @@ export declare class Sentinel {
|
|
|
54
73
|
store: PatchStore;
|
|
55
74
|
contract: AppContract;
|
|
56
75
|
agentTask: string;
|
|
57
|
-
overrideApply?: boolean;
|
|
58
76
|
}): Promise<SentinelResult>;
|
|
59
77
|
}
|
|
60
78
|
//# sourceMappingURL=sentinel.d.ts.map
|
package/dist/sentinel.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sentinel.d.ts","sourceRoot":"","sources":["../src/sentinel.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"sentinel.d.ts","sourceRoot":"","sources":["../src/sentinel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAc,KAAK,KAAK,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAIrE,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE,KAAK,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,IAAI,GAAG,SAAS,GAAG,WAAW,CAAC;QACrC,IAAI,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,WAAW;IAC1B,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,iCAAiC;IACjC,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,cAAc,CAAC;IACvB,yEAAyE;IACzE,OAAO,EAAE,IAAI,CAAC;IACd;;;OAGG;IACH,GAAG,CAAC,EAAE,WAAW,CAAC;CACnB;AAID,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAiB;gBAEnB,MAAM,GAAE,OAAO,CAAC,cAAc,CAAM;IAY1C,MAAM,CAAC,IAAI,EAAE;QACjB,QAAQ,EAAE,WAAW,CAAC;QACtB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,cAAc,CAAC;IA0DrB,GAAG,CAAC,IAAI,EAAE;QACd,QAAQ,EAAE,WAAW,CAAC;QACtB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,WAAW,CAAC;IAqDxB;;;;;;OAMG;IACG,cAAc,CAAC,IAAI,EAAE;QACzB,KAAK,EAAE,KAAK,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,UAAU,CAAC;QAClB,QAAQ,EAAE,WAAW,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,cAAc,CAAC;CA2C5B"}
|
package/dist/sentinel.js
CHANGED
|
@@ -1,38 +1,38 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Sentinel — reviews
|
|
2
|
+
* Sentinel — reviews, auto-corrects, and applies patches.
|
|
3
3
|
*
|
|
4
|
-
* The Sentinel
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* The Sentinel never just rejects. Its contract:
|
|
5
|
+
* 1. Review the Runner's output against the app contract
|
|
6
|
+
* 2. If clean → apply as-is
|
|
7
|
+
* 3. If issues → self-correct (call AI to fix the violations)
|
|
8
|
+
* 4. Apply the corrected version
|
|
9
|
+
* 5. Report what was fixed
|
|
7
10
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* regressions, and contract drift.
|
|
11
|
+
* The human always sees a result, never a gate.
|
|
12
|
+
* The only terminal failure is an unrecoverable AI error.
|
|
11
13
|
*/
|
|
12
14
|
import { AiAssistClient } from "./aiassist.js";
|
|
13
15
|
import { applyPatch } from "./patch.js";
|
|
16
|
+
// ── Sentinel ──────────────────────────────────────────────────────────────────
|
|
14
17
|
export class Sentinel {
|
|
15
18
|
client;
|
|
16
19
|
constructor(config = {}) {
|
|
17
20
|
this.client = new AiAssistClient({
|
|
18
|
-
apiKey: config.apiKey ??
|
|
19
|
-
process.env["AIASSIST_API_KEY"] ??
|
|
20
|
-
process.env["VITE_AIAS_API_KEY"] ??
|
|
21
|
-
"",
|
|
21
|
+
apiKey: config.apiKey ?? process.env["AIASSIST_API_KEY"] ?? process.env["VITE_AIAS_API_KEY"] ?? "",
|
|
22
22
|
baseUrl: config.baseUrl,
|
|
23
|
-
model: config.model ?? "
|
|
24
|
-
|
|
23
|
+
model: config.model ?? "claude-opus-4-6",
|
|
24
|
+
provider: "anthropic",
|
|
25
|
+
timeoutMs: config.timeoutMs ?? 120_000,
|
|
25
26
|
});
|
|
26
27
|
}
|
|
27
|
-
// ──
|
|
28
|
+
// ── 1. Review ───────────────────────────────────────────────────────────────
|
|
28
29
|
async review(opts) {
|
|
29
|
-
const contractStr = JSON.stringify(opts.contract, null, 2);
|
|
30
30
|
const prompt = `You are a code sentinel reviewing an AI-generated patch.
|
|
31
|
-
|
|
31
|
+
Verify the patch is safe, faithful to the app contract, and actually solves the task.
|
|
32
32
|
|
|
33
33
|
App Contract:
|
|
34
34
|
\`\`\`json
|
|
35
|
-
${
|
|
35
|
+
${JSON.stringify(opts.contract, null, 2)}
|
|
36
36
|
\`\`\`
|
|
37
37
|
|
|
38
38
|
Agent task: ${opts.agentTask}
|
|
@@ -49,53 +49,97 @@ ${opts.proposed}
|
|
|
49
49
|
\`\`\`
|
|
50
50
|
|
|
51
51
|
Check for:
|
|
52
|
-
1. Forbidden claims
|
|
53
|
-
2. Forbidden phrases
|
|
54
|
-
3.
|
|
55
|
-
4. Hallucinated data (
|
|
56
|
-
5. Whether the patch
|
|
57
|
-
6.
|
|
58
|
-
7. Any obvious regressions or broken imports
|
|
52
|
+
1. Forbidden claims (contract.policies.forbiddenClaims)
|
|
53
|
+
2. Forbidden phrases (contract.brand.forbiddenPhrases)
|
|
54
|
+
3. Unauthorised brand color changes
|
|
55
|
+
4. Hallucinated data (numbers, prices, names not in data sources)
|
|
56
|
+
5. Whether the patch actually solves the task
|
|
57
|
+
6. Obvious regressions or broken imports
|
|
59
58
|
|
|
60
|
-
Respond as JSON:
|
|
59
|
+
Respond as JSON only — no markdown fences:
|
|
61
60
|
{
|
|
62
|
-
"approved": true
|
|
63
|
-
"summary": "one sentence
|
|
64
|
-
"violations": [
|
|
65
|
-
"annotations": [
|
|
61
|
+
"approved": true,
|
|
62
|
+
"summary": "one sentence",
|
|
63
|
+
"violations": [],
|
|
64
|
+
"annotations": []
|
|
66
65
|
}`;
|
|
67
66
|
const raw = await this.client.complete(prompt, undefined, {
|
|
68
67
|
temperature: 0.1,
|
|
69
68
|
maxTokens: 2_000,
|
|
70
69
|
});
|
|
71
70
|
try {
|
|
72
|
-
const
|
|
73
|
-
|
|
74
|
-
.replace(/\s*```$/, "")
|
|
75
|
-
.trim();
|
|
76
|
-
return JSON.parse(jsonStr);
|
|
71
|
+
const cleaned = raw.replace(/^```json\s*/i, "").replace(/\s*```$/, "").trim();
|
|
72
|
+
return JSON.parse(cleaned);
|
|
77
73
|
}
|
|
78
74
|
catch {
|
|
79
75
|
return {
|
|
80
76
|
approved: false,
|
|
81
|
-
summary: "Sentinel could not parse its
|
|
77
|
+
summary: "Sentinel could not parse its review — will attempt self-correction.",
|
|
82
78
|
violations: ["Unparseable sentinel response"],
|
|
83
79
|
annotations: [],
|
|
84
80
|
};
|
|
85
81
|
}
|
|
86
82
|
}
|
|
87
|
-
// ──
|
|
83
|
+
// ── 2. Self-correct ─────────────────────────────────────────────────────────
|
|
84
|
+
async fix(opts) {
|
|
85
|
+
const prompt = `You are a code sentinel. An AI agent generated a patch that has the following issues:
|
|
86
|
+
|
|
87
|
+
${opts.violations.map((v, i) => `${i + 1}. ${v}`).join("\n")}
|
|
88
|
+
|
|
89
|
+
Your job: rewrite the proposed file to fix ALL of these issues while still fulfilling the original task.
|
|
90
|
+
Keep every part of the patch that was correct. Only change what violates the rules.
|
|
91
|
+
|
|
92
|
+
Original task: ${opts.agentTask}
|
|
93
|
+
File: ${opts.filePath}
|
|
94
|
+
|
|
95
|
+
App Contract (source of truth for brand, policies, data):
|
|
96
|
+
\`\`\`json
|
|
97
|
+
${JSON.stringify(opts.contract, null, 2)}
|
|
98
|
+
\`\`\`
|
|
99
|
+
|
|
100
|
+
ORIGINAL FILE:
|
|
101
|
+
\`\`\`tsx
|
|
102
|
+
${opts.original}
|
|
103
|
+
\`\`\`
|
|
104
|
+
|
|
105
|
+
PROPOSED (with violations):
|
|
106
|
+
\`\`\`tsx
|
|
107
|
+
${opts.proposed}
|
|
108
|
+
\`\`\`
|
|
109
|
+
|
|
110
|
+
Respond as JSON only — no markdown fences:
|
|
111
|
+
{
|
|
112
|
+
"correctedContent": "<full corrected file content as a string>",
|
|
113
|
+
"changes": ["Fixed: ...", "Removed: ...", "Replaced: ..."],
|
|
114
|
+
"summary": "one sentence describing what was corrected"
|
|
115
|
+
}`;
|
|
116
|
+
const raw = await this.client.complete(prompt, undefined, {
|
|
117
|
+
temperature: 0.2,
|
|
118
|
+
maxTokens: 8_000,
|
|
119
|
+
});
|
|
120
|
+
try {
|
|
121
|
+
const cleaned = raw.replace(/^```json\s*/i, "").replace(/\s*```$/, "").trim();
|
|
122
|
+
return JSON.parse(cleaned);
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
// Last resort: return the proposed content unchanged with a note
|
|
126
|
+
return {
|
|
127
|
+
correctedContent: opts.proposed,
|
|
128
|
+
changes: ["Sentinel could not parse its own correction — applied original patch."],
|
|
129
|
+
summary: "Correction parse failed; original patch applied.",
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// ── 3. Review → fix if needed → apply ──────────────────────────────────────
|
|
88
134
|
/**
|
|
89
|
-
*
|
|
90
|
-
*
|
|
91
|
-
* This is the primary entry point. The Sentinel is both judge and executor:
|
|
92
|
-
* - Approved → patch is written to disk, status set to "applied"
|
|
93
|
-
* - Rejected → nothing is written, violations are surfaced to the caller
|
|
135
|
+
* The primary entry point.
|
|
94
136
|
*
|
|
95
|
-
*
|
|
96
|
-
*
|
|
137
|
+
* Always applies something to disk. Never rejects to the caller.
|
|
138
|
+
* - Clean patch → apply as-is, fix undefined
|
|
139
|
+
* - Dirty patch → self-correct → apply corrected version, fix populated
|
|
97
140
|
*/
|
|
98
141
|
async reviewAndApply(opts) {
|
|
142
|
+
// Step 1 — review
|
|
99
143
|
const review = await this.review({
|
|
100
144
|
contract: opts.contract,
|
|
101
145
|
filePath: opts.patch.file,
|
|
@@ -103,19 +147,33 @@ Respond as JSON:
|
|
|
103
147
|
proposed: opts.patch.proposed,
|
|
104
148
|
agentTask: opts.agentTask,
|
|
105
149
|
});
|
|
106
|
-
// Persist sentinel verdict onto the patch record
|
|
107
150
|
await opts.store.update(opts.patch.id, {
|
|
108
151
|
sentinelApproved: review.approved,
|
|
109
152
|
sentinelSummary: review.summary,
|
|
110
153
|
sentinelViolations: review.violations,
|
|
111
154
|
});
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
155
|
+
// Step 2 — self-correct if needed
|
|
156
|
+
let finalContent = opts.patch.proposed;
|
|
157
|
+
let fix;
|
|
158
|
+
if (!review.approved && review.violations.length > 0) {
|
|
159
|
+
fix = await this.fix({
|
|
160
|
+
contract: opts.contract,
|
|
161
|
+
filePath: opts.patch.file,
|
|
162
|
+
original: opts.patch.original,
|
|
163
|
+
proposed: opts.patch.proposed,
|
|
164
|
+
violations: review.violations,
|
|
165
|
+
agentTask: opts.agentTask,
|
|
166
|
+
});
|
|
167
|
+
finalContent = fix.correctedContent;
|
|
168
|
+
await opts.store.update(opts.patch.id, {
|
|
169
|
+
sentinelSummary: fix.summary,
|
|
170
|
+
});
|
|
117
171
|
}
|
|
118
|
-
|
|
172
|
+
// Step 3 — apply (original or corrected)
|
|
173
|
+
const patchToApply = { ...opts.patch, proposed: finalContent, status: "approved" };
|
|
174
|
+
await opts.store.update(opts.patch.id, { status: "approved", proposed: finalContent });
|
|
175
|
+
await applyPatch(patchToApply, opts.projectRoot, opts.store);
|
|
176
|
+
return { review, applied: true, fix };
|
|
119
177
|
}
|
|
120
178
|
}
|
|
121
179
|
//# sourceMappingURL=sentinel.js.map
|
package/dist/sentinel.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sentinel.js","sourceRoot":"","sources":["../src/sentinel.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"sentinel.js","sourceRoot":"","sources":["../src/sentinel.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@interchained/portal-agent",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"description": "Agent runtime for Portal — AiAssist.net runner/sentinel, audit, generate, improve, guard",
|
|
5
5
|
"license": "GPL-3.0-or-later",
|
|
6
6
|
"author": "Interchained <dev@interchained.org>",
|