@ggui-ai/mcp-server-handlers 0.24.0 → 0.26.0
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/README.md +2 -2
- package/dist/blueprints/search-blueprints.d.ts +5 -5
- package/dist/blueprints/search-blueprints.js +5 -5
- package/dist/credits/index.d.ts +2 -2
- package/dist/credits/index.d.ts.map +1 -1
- package/dist/credits/index.js +1 -1
- package/dist/credits/list-credit-transactions.d.ts +21 -7
- package/dist/credits/list-credit-transactions.d.ts.map +1 -1
- package/dist/credits/list-credit-transactions.js +12 -2
- package/dist/index.d.ts +2 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -9
- package/dist/ops-apps/create-app.d.ts +10 -11
- package/dist/ops-apps/create-app.d.ts.map +1 -1
- package/dist/ops-apps/create-app.js +12 -13
- package/dist/ops-apps/identity.d.ts +9 -8
- package/dist/ops-apps/identity.d.ts.map +1 -1
- package/dist/ops-apps/identity.js +2 -1
- package/dist/ops-apps/index.d.ts +2 -2
- package/dist/ops-apps/index.js +2 -2
- package/dist/ops-apps/list-apps.d.ts +5 -6
- package/dist/ops-apps/list-apps.d.ts.map +1 -1
- package/dist/ops-apps/list-apps.js +6 -7
- package/dist/ops-apps/set-app-theme.d.ts +12 -8
- package/dist/ops-apps/set-app-theme.d.ts.map +1 -1
- package/dist/ops-apps/set-app-theme.js +11 -7
- package/dist/ops-apps/set-default-app.d.ts +1 -2
- package/dist/ops-apps/set-default-app.d.ts.map +1 -1
- package/dist/ops-apps/set-default-app.js +1 -2
- package/dist/ops-apps/types.d.ts +20 -23
- package/dist/ops-apps/types.d.ts.map +1 -1
- package/dist/ops-apps/types.js +4 -6
- package/dist/ops-blueprint/cache-mirror.d.ts +41 -0
- package/dist/ops-blueprint/cache-mirror.d.ts.map +1 -0
- package/dist/ops-blueprint/cache-mirror.js +19 -0
- package/dist/ops-blueprint/delete.d.ts +18 -0
- package/dist/ops-blueprint/delete.d.ts.map +1 -1
- package/dist/ops-blueprint/delete.js +21 -2
- package/dist/ops-blueprint/errors.d.ts +23 -0
- package/dist/ops-blueprint/errors.d.ts.map +1 -1
- package/dist/ops-blueprint/errors.js +29 -0
- package/dist/ops-blueprint/generate.d.ts +1 -3
- package/dist/ops-blueprint/generate.d.ts.map +1 -1
- package/dist/ops-blueprint/generate.js +47 -58
- package/dist/ops-blueprint/index.d.ts +1 -1
- package/dist/ops-blueprint/index.d.ts.map +1 -1
- package/dist/ops-blueprint/index.js +1 -1
- package/dist/ops-blueprint/list.d.ts.map +1 -1
- package/dist/ops-blueprint/list.js +1 -2
- package/dist/ops-blueprint/register.d.ts +83 -6
- package/dist/ops-blueprint/register.d.ts.map +1 -1
- package/dist/ops-blueprint/register.js +261 -158
- package/dist/ops-blueprint/update.d.ts +3 -2
- package/dist/ops-blueprint/update.d.ts.map +1 -1
- package/dist/ops-blueprint/update.js +4 -3
- package/dist/renders/blueprint-coverage.d.ts +23 -4
- package/dist/renders/blueprint-coverage.d.ts.map +1 -1
- package/dist/renders/blueprint-coverage.js +45 -5
- package/dist/renders/blueprint-durability.d.ts.map +1 -1
- package/dist/renders/blueprint-durability.js +36 -21
- package/dist/renders/blueprint-matcher.d.ts +57 -7
- package/dist/renders/blueprint-matcher.d.ts.map +1 -1
- package/dist/renders/blueprint-matcher.js +154 -36
- package/dist/renders/blueprint-registry.d.ts +154 -1
- package/dist/renders/blueprint-registry.d.ts.map +1 -1
- package/dist/renders/blueprint-registry.js +337 -10
- package/dist/renders/build-seed-pool.d.ts.map +1 -1
- package/dist/renders/build-seed-pool.js +6 -0
- package/dist/renders/cache-trace-sink.d.ts +12 -0
- package/dist/renders/cache-trace-sink.d.ts.map +1 -1
- package/dist/renders/cache-trace-sink.js +15 -1
- package/dist/renders/consume.d.ts +3 -2
- package/dist/renders/consume.d.ts.map +1 -1
- package/dist/renders/consume.js +50 -15
- package/dist/renders/cross-app-refused.d.ts +17 -0
- package/dist/renders/cross-app-refused.d.ts.map +1 -0
- package/dist/renders/cross-app-refused.js +23 -0
- package/dist/renders/decide-handshake.d.ts +47 -1
- package/dist/renders/decide-handshake.d.ts.map +1 -1
- package/dist/renders/decide-handshake.js +74 -6
- package/dist/renders/declare-tool-catalog.d.ts.map +1 -1
- package/dist/renders/declare-tool-catalog.js +20 -17
- package/dist/renders/export-registry.d.ts +8 -1
- package/dist/renders/export-registry.d.ts.map +1 -1
- package/dist/renders/export-registry.js +3 -0
- package/dist/renders/fits.d.ts +60 -0
- package/dist/renders/fits.d.ts.map +1 -0
- package/dist/renders/fits.js +114 -0
- package/dist/renders/handshake-generation-inputs.d.ts +89 -0
- package/dist/renders/handshake-generation-inputs.d.ts.map +1 -0
- package/dist/renders/handshake-generation-inputs.js +65 -0
- package/dist/renders/handshake.d.ts +6 -42
- package/dist/renders/handshake.d.ts.map +1 -1
- package/dist/renders/handshake.js +1 -1
- package/dist/renders/index.d.ts +10 -5
- package/dist/renders/index.d.ts.map +1 -1
- package/dist/renders/index.js +10 -3
- package/dist/renders/installed-blueprints-provider.d.ts.map +1 -1
- package/dist/renders/installed-blueprints-provider.js +3 -1
- package/dist/renders/match-precision/pairs.d.ts +6 -5
- package/dist/renders/match-precision/pairs.d.ts.map +1 -1
- package/dist/renders/match-precision/run-probe.js +1 -2
- package/dist/renders/match-precision/topk-probe.js +13 -8
- package/dist/renders/record-committed-one-shot.d.ts +18 -3
- package/dist/renders/record-committed-one-shot.d.ts.map +1 -1
- package/dist/renders/record-committed-one-shot.js +14 -7
- package/dist/renders/refresh-ws-token.d.ts +66 -87
- package/dist/renders/refresh-ws-token.d.ts.map +1 -1
- package/dist/renders/refresh-ws-token.js +93 -89
- package/dist/renders/render-identity.d.ts +16 -5
- package/dist/renders/render-identity.d.ts.map +1 -1
- package/dist/renders/render-identity.js +26 -10
- package/dist/renders/render-read-gate.d.ts +85 -0
- package/dist/renders/render-read-gate.d.ts.map +1 -0
- package/dist/renders/render-read-gate.js +57 -0
- package/dist/renders/render.d.ts +77 -27
- package/dist/renders/render.d.ts.map +1 -1
- package/dist/renders/render.js +269 -95
- package/dist/renders/report-render-failure.d.ts +69 -0
- package/dist/renders/report-render-failure.d.ts.map +1 -0
- package/dist/renders/report-render-failure.js +83 -0
- package/dist/renders/runtime-pull.d.ts.map +1 -1
- package/dist/renders/runtime-pull.js +6 -0
- package/dist/renders/slice-meta-derivation.d.ts +8 -1
- package/dist/renders/slice-meta-derivation.d.ts.map +1 -1
- package/dist/renders/slice-meta-derivation.js +1 -0
- package/dist/renders/submit-action.d.ts +47 -78
- package/dist/renders/submit-action.d.ts.map +1 -1
- package/dist/renders/submit-action.js +312 -84
- package/dist/renders/sync-context.d.ts +3 -1
- package/dist/renders/sync-context.d.ts.map +1 -1
- package/dist/renders/sync-context.js +53 -20
- package/dist/types.d.ts +71 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +32 -0
- package/package.json +8 -20
- package/dist/ops-connector-keys/in-memory-fake.test-util.d.ts +0 -26
- package/dist/ops-connector-keys/in-memory-fake.test-util.d.ts.map +0 -1
- package/dist/ops-connector-keys/in-memory-fake.test-util.js +0 -60
- package/dist/ops-connector-keys/index.d.ts +0 -19
- package/dist/ops-connector-keys/index.d.ts.map +0 -1
- package/dist/ops-connector-keys/index.js +0 -14
- package/dist/ops-connector-keys/issue-connector-key.d.ts +0 -76
- package/dist/ops-connector-keys/issue-connector-key.d.ts.map +0 -1
- package/dist/ops-connector-keys/issue-connector-key.js +0 -84
- package/dist/ops-connector-keys/list-connector-keys.d.ts +0 -58
- package/dist/ops-connector-keys/list-connector-keys.d.ts.map +0 -1
- package/dist/ops-connector-keys/list-connector-keys.js +0 -39
- package/dist/ops-connector-keys/revoke-connector-key.d.ts +0 -32
- package/dist/ops-connector-keys/revoke-connector-key.d.ts.map +0 -1
- package/dist/ops-connector-keys/revoke-connector-key.js +0 -49
- package/dist/ops-connector-keys/types.d.ts +0 -91
- package/dist/ops-connector-keys/types.d.ts.map +0 -1
- package/dist/ops-connector-keys/types.js +0 -24
- package/dist/ops-coupon/in-memory-fake.test-util.d.ts +0 -28
- package/dist/ops-coupon/in-memory-fake.test-util.d.ts.map +0 -1
- package/dist/ops-coupon/in-memory-fake.test-util.js +0 -66
- package/dist/ops-coupon/index.d.ts +0 -15
- package/dist/ops-coupon/index.d.ts.map +0 -1
- package/dist/ops-coupon/index.js +0 -12
- package/dist/ops-coupon/redeem-coupon.d.ts +0 -51
- package/dist/ops-coupon/redeem-coupon.d.ts.map +0 -1
- package/dist/ops-coupon/redeem-coupon.js +0 -61
- package/dist/ops-coupon/types.d.ts +0 -59
- package/dist/ops-coupon/types.d.ts.map +0 -1
- package/dist/ops-coupon/types.js +0 -38
- package/dist/ops-orgs/create-org.d.ts +0 -45
- package/dist/ops-orgs/create-org.d.ts.map +0 -1
- package/dist/ops-orgs/create-org.js +0 -55
- package/dist/ops-orgs/get-org-balance.d.ts +0 -29
- package/dist/ops-orgs/get-org-balance.d.ts.map +0 -1
- package/dist/ops-orgs/get-org-balance.js +0 -45
- package/dist/ops-orgs/in-memory-fake.test-util.d.ts +0 -84
- package/dist/ops-orgs/in-memory-fake.test-util.d.ts.map +0 -1
- package/dist/ops-orgs/in-memory-fake.test-util.js +0 -209
- package/dist/ops-orgs/index.d.ts +0 -33
- package/dist/ops-orgs/index.d.ts.map +0 -1
- package/dist/ops-orgs/index.js +0 -24
- package/dist/ops-orgs/invite-to-org.d.ts +0 -56
- package/dist/ops-orgs/invite-to-org.d.ts.map +0 -1
- package/dist/ops-orgs/invite-to-org.js +0 -72
- package/dist/ops-orgs/list-orgs.d.ts +0 -53
- package/dist/ops-orgs/list-orgs.d.ts.map +0 -1
- package/dist/ops-orgs/list-orgs.js +0 -38
- package/dist/ops-orgs/remove-org-member.d.ts +0 -42
- package/dist/ops-orgs/remove-org-member.d.ts.map +0 -1
- package/dist/ops-orgs/remove-org-member.js +0 -67
- package/dist/ops-orgs/rename-org.d.ts +0 -33
- package/dist/ops-orgs/rename-org.d.ts.map +0 -1
- package/dist/ops-orgs/rename-org.js +0 -57
- package/dist/ops-orgs/revoke-invite.d.ts +0 -38
- package/dist/ops-orgs/revoke-invite.d.ts.map +0 -1
- package/dist/ops-orgs/revoke-invite.js +0 -53
- package/dist/ops-orgs/types.d.ts +0 -209
- package/dist/ops-orgs/types.d.ts.map +0 -1
- package/dist/ops-orgs/types.js +0 -60
|
@@ -3,8 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Patches the two mutable surfaces of a blueprint:
|
|
5
5
|
*
|
|
6
|
-
* 1. `isOperatorDefault` —
|
|
7
|
-
* blueprint's `(appId, contractHash)` group
|
|
6
|
+
* 1. `isOperatorDefault` — mark as the operator default for the
|
|
7
|
+
* blueprint's `(appId, contractHash)` group (orders listings; no
|
|
8
|
+
* render path reads it to choose what serves). The store
|
|
8
9
|
* automatically clears any prior default in the same group
|
|
9
10
|
* (see `BlueprintStore.setOperatorDefault`).
|
|
10
11
|
* 2. `variance` — partial merge into the persisted variance. Keys
|
|
@@ -91,7 +92,7 @@ export function createGguiOpsUpdateBlueprintHandler(deps) {
|
|
|
91
92
|
name: 'ggui_ops_update_blueprint',
|
|
92
93
|
title: 'Update blueprint',
|
|
93
94
|
audience: ['ops'],
|
|
94
|
-
description: 'Patch the mutable surface of an existing blueprint:
|
|
95
|
+
description: 'Patch the mutable surface of an existing blueprint: set the operator-default mark (it orders blueprint listings and is shown to operators; it does not decide which blueprint serves a render) + merge variance tags. Immutable fields (contractHash, appId, codeS3Url, codeHash, source, createdAt, createdBy) are absent from the schema — to "replace" a row, delete + re-generate. Partial-merge semantics: supplied variance keys overwrite, omitted keys preserve. Empty-string persona is removal. App-scoped variant curation for an app you operate — distinct from the personal saved-blueprint library (the _my_ tools).',
|
|
95
96
|
inputSchema: opsInputSchema,
|
|
96
97
|
outputSchema: opsOutputSchema,
|
|
97
98
|
async handler(rawInput, ctx) {
|
|
@@ -23,10 +23,13 @@
|
|
|
23
23
|
* proposed contract is the safety valve when a flagged surface is one
|
|
24
24
|
* the user must directly see or act on.
|
|
25
25
|
*
|
|
26
|
-
* Pure — no store, no LLM. Compares
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
26
|
+
* Pure — no store, no LLM. Compares declared key-SETS, plus ONE thing
|
|
27
|
+
* inside a shared action: the members that change what the runtime does
|
|
28
|
+
* with a gesture ({@link LOAD_BEARING_ACTION_MEMBERS}). Every other
|
|
29
|
+
* difference WITHIN a shared surface (a relabeled action, an `id` vs
|
|
30
|
+
* `id+done` payload schema) is tolerated, because atomic reuse hands the
|
|
31
|
+
* agent the cached contract and it drives that contract, not its own
|
|
32
|
+
* draft.
|
|
30
33
|
*/
|
|
31
34
|
import type { DataContract } from '@ggui-ai/protocol';
|
|
32
35
|
/** The request-declared surfaces a candidate fails to cover. Empty
|
|
@@ -37,7 +40,23 @@ export interface CoverageGap {
|
|
|
37
40
|
readonly context: readonly string[];
|
|
38
41
|
readonly streams: readonly string[];
|
|
39
42
|
readonly gadgets: readonly string[];
|
|
43
|
+
/**
|
|
44
|
+
* `<action>.<member>` for every load-bearing member the request declares
|
|
45
|
+
* on an action BOTH contracts carry, where the candidate's entry does not
|
|
46
|
+
* say the same (ggui#1428). An action the candidate lacks altogether is in
|
|
47
|
+
* {@link actions}, never here.
|
|
48
|
+
*/
|
|
49
|
+
readonly actionMembers: readonly string[];
|
|
40
50
|
}
|
|
51
|
+
/**
|
|
52
|
+
* The action-entry members that change what the runtime DOES with a gesture,
|
|
53
|
+
* as opposed to how the action reads: `oneShot` arms the single-dispatch
|
|
54
|
+
* guard, `confirm` asks before firing, `nextStep` names the tool the agent is
|
|
55
|
+
* routed to. A stored card that lacks one the draft declares serves a card
|
|
56
|
+
* without that behaviour, so the agent is told. `label`, `description`,
|
|
57
|
+
* `icon`, `example` and `schema` stay tolerated differences.
|
|
58
|
+
*/
|
|
59
|
+
export declare const LOAD_BEARING_ACTION_MEMBERS: readonly ["oneShot", "confirm", "nextStep"];
|
|
41
60
|
/**
|
|
42
61
|
* Compute the surfaces the request declares that the candidate does NOT.
|
|
43
62
|
* A wholly-empty gap means the candidate covers the request.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blueprint-coverage.d.ts","sourceRoot":"","sources":["../../src/renders/blueprint-coverage.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"blueprint-coverage.d.ts","sourceRoot":"","sources":["../../src/renders/blueprint-coverage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGtD;4DAC4D;AAC5D,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC;;;;;OAKG;IACH,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3C;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,2BAA2B,6CAA8C,CAAC;AA6CvF;;;GAGG;AACH,wBAAgB,WAAW,CACzB,SAAS,EAAE,YAAY,EACvB,OAAO,EAAE,YAAY,GACpB,WAAW,CAYb;AAED;2DAC2D;AAC3D,wBAAgB,MAAM,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAU9E"}
|
|
@@ -23,12 +23,50 @@
|
|
|
23
23
|
* proposed contract is the safety valve when a flagged surface is one
|
|
24
24
|
* the user must directly see or act on.
|
|
25
25
|
*
|
|
26
|
-
* Pure — no store, no LLM. Compares
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
26
|
+
* Pure — no store, no LLM. Compares declared key-SETS, plus ONE thing
|
|
27
|
+
* inside a shared action: the members that change what the runtime does
|
|
28
|
+
* with a gesture ({@link LOAD_BEARING_ACTION_MEMBERS}). Every other
|
|
29
|
+
* difference WITHIN a shared surface (a relabeled action, an `id` vs
|
|
30
|
+
* `id+done` payload schema) is tolerated, because atomic reuse hands the
|
|
31
|
+
* agent the cached contract and it drives that contract, not its own
|
|
32
|
+
* draft.
|
|
30
33
|
*/
|
|
31
34
|
import { listContractGadgets } from '@ggui-ai/protocol';
|
|
35
|
+
/**
|
|
36
|
+
* The action-entry members that change what the runtime DOES with a gesture,
|
|
37
|
+
* as opposed to how the action reads: `oneShot` arms the single-dispatch
|
|
38
|
+
* guard, `confirm` asks before firing, `nextStep` names the tool the agent is
|
|
39
|
+
* routed to. A stored card that lacks one the draft declares serves a card
|
|
40
|
+
* without that behaviour, so the agent is told. `label`, `description`,
|
|
41
|
+
* `icon`, `example` and `schema` stay tolerated differences.
|
|
42
|
+
*/
|
|
43
|
+
export const LOAD_BEARING_ACTION_MEMBERS = ['oneShot', 'confirm', 'nextStep'];
|
|
44
|
+
/**
|
|
45
|
+
* Members the request DECLARES on `name` that the candidate's entry does not
|
|
46
|
+
* match. One direction, like the rest of coverage: a boolean member counts as
|
|
47
|
+
* declared only when `true` (`false` and absent both mean "off"), `nextStep`
|
|
48
|
+
* when present. A candidate that is stricter than the request (it carries a
|
|
49
|
+
* member the request does not) is not a gap. That holds for `nextStep` too,
|
|
50
|
+
* because the case that would matter there is already refused elsewhere: a
|
|
51
|
+
* stored `nextStep` naming a tool the requesting agent does not declare makes
|
|
52
|
+
* the candidate unfulfillable, and `isFulfillable` declines it before it is
|
|
53
|
+
* ever proposed (`blueprint-fulfillability.ts`).
|
|
54
|
+
*/
|
|
55
|
+
function mismatchedActionMembers(request, candidate) {
|
|
56
|
+
const out = [];
|
|
57
|
+
for (const [name, wanted] of Object.entries(request.actionSpec ?? {})) {
|
|
58
|
+
const stored = candidate.actionSpec?.[name];
|
|
59
|
+
if (stored === undefined)
|
|
60
|
+
continue;
|
|
61
|
+
if (wanted.oneShot === true && stored.oneShot !== true)
|
|
62
|
+
out.push(`${name}.oneShot`);
|
|
63
|
+
if (wanted.confirm === true && stored.confirm !== true)
|
|
64
|
+
out.push(`${name}.confirm`);
|
|
65
|
+
if (wanted.nextStep !== undefined && stored.nextStep !== wanted.nextStep)
|
|
66
|
+
out.push(`${name}.nextStep`);
|
|
67
|
+
}
|
|
68
|
+
return out.sort();
|
|
69
|
+
}
|
|
32
70
|
function keySet(map) {
|
|
33
71
|
return new Set(Object.keys(map ?? {}));
|
|
34
72
|
}
|
|
@@ -51,6 +89,7 @@ export function coverageGap(candidate, request) {
|
|
|
51
89
|
context: missing(keySet(request.contextSpec), keySet(candidate.contextSpec)),
|
|
52
90
|
streams: missing(keySet(request.streamSpec), keySet(candidate.streamSpec)),
|
|
53
91
|
gadgets: missing(gadgetIdSet(request), gadgetIdSet(candidate)),
|
|
92
|
+
actionMembers: mismatchedActionMembers(request, candidate),
|
|
54
93
|
};
|
|
55
94
|
}
|
|
56
95
|
/** True iff `candidate` declares every surface `request` declares —
|
|
@@ -61,5 +100,6 @@ export function covers(candidate, request) {
|
|
|
61
100
|
gap.props.length === 0 &&
|
|
62
101
|
gap.context.length === 0 &&
|
|
63
102
|
gap.streams.length === 0 &&
|
|
64
|
-
gap.gadgets.length === 0
|
|
103
|
+
gap.gadgets.length === 0 &&
|
|
104
|
+
gap.actionMembers.length === 0);
|
|
65
105
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blueprint-durability.d.ts","sourceRoot":"","sources":["../../src/renders/blueprint-durability.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6DG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,KAAK,EAAE,SAAS,IAAI,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,KAAK,EAAE,SAAS,IAAI,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE9E;;;;;GAKG;AACH,MAAM,MAAM,wBAAwB,GAChC,gCAAgC,GAChC,6BAA6B,GAC7B,+BAA+B,CAAC;AAEpC;;;GAGG;AACH,eAAO,MAAM,2BAA2B;IACtC,sEAAsE;;IAEtE,gEAAgE;;IAEhE;;;;;;;OAOG;;CAEwD,CAAC;AAW9D;;;;GAIG;AACH,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC;IACzC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC;CAChC;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,iBAAiB,EAC5B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,SAAS,GAAE,gBAAgB,CAAC,WAAW,CAAW,GACjD,gBAAgB,
|
|
1
|
+
{"version":3,"file":"blueprint-durability.d.ts","sourceRoot":"","sources":["../../src/renders/blueprint-durability.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6DG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,KAAK,EAAE,SAAS,IAAI,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,KAAK,EAAE,SAAS,IAAI,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE9E;;;;;GAKG;AACH,MAAM,MAAM,wBAAwB,GAChC,gCAAgC,GAChC,6BAA6B,GAC7B,+BAA+B,CAAC;AAEpC;;;GAGG;AACH,eAAO,MAAM,2BAA2B;IACtC,sEAAsE;;IAEtE,gEAAgE;;IAEhE;;;;;;;OAOG;;CAEwD,CAAC;AAW9D;;;;GAIG;AACH,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC;IACzC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC;CAChC;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,iBAAiB,EAC5B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,SAAS,GAAE,gBAAgB,CAAC,WAAW,CAAW,GACjD,gBAAgB,CAiClB;AAED;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,uBAAuB,GAAG,SAAS,EACzC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,iBAAiB,EAC5B,SAAS,GAAE,gBAAgB,CAAC,WAAW,CAAW,GACjD,OAAO,CAAC,IAAI,CAAC,CA0Df"}
|
|
@@ -56,6 +56,11 @@ export function projectDurableBlueprint(blueprint, appId, codeHash, createdBy =
|
|
|
56
56
|
...(blueprint.sourceCodeHash !== undefined
|
|
57
57
|
? { sourceCodeHash: blueprint.sourceCodeHash }
|
|
58
58
|
: {}),
|
|
59
|
+
// ggui#1280 — the minting engine's build, admitted at registration.
|
|
60
|
+
// Written once here at mint (a dedup never reaches this projection) and
|
|
61
|
+
// never rewritten. The registry's vector-store row carries the same
|
|
62
|
+
// value (ggui#1476).
|
|
63
|
+
...(blueprint.build !== undefined ? { build: blueprint.build } : {}),
|
|
59
64
|
};
|
|
60
65
|
}
|
|
61
66
|
/**
|
|
@@ -68,12 +73,42 @@ export function projectDurableBlueprint(blueprint, appId, codeHash, createdBy =
|
|
|
68
73
|
*/
|
|
69
74
|
export async function writeBlueprintDurably(deps, appId, blueprint, createdBy = 'agent') {
|
|
70
75
|
const blueprintStore = deps?.blueprintStore;
|
|
76
|
+
const codeStore = deps?.codeStore;
|
|
77
|
+
// Authored source body, own try/catch — a distinct
|
|
78
|
+
// failure mode from the compiled-code write below. `sourceCodeHash`
|
|
79
|
+
// is already decided (computed at registration, already on the
|
|
80
|
+
// vector-store row); this write just persists the body it points at.
|
|
81
|
+
// ggui#1493 — it is written whenever that hash was stamped, WITH OR
|
|
82
|
+
// WITHOUT a durable blueprint store: the cache row's `sourceCodeHash`
|
|
83
|
+
// references it when it is written, so it is not written as an orphan (a
|
|
84
|
+
// later eviction of that capped cache row can still leave it
|
|
85
|
+
// unreferenced in a code-store-only deployment), and gating it on
|
|
86
|
+
// the durable store left a cache row pointing at nothing wherever a
|
|
87
|
+
// code store was bound alone. A failure here does NOT withhold
|
|
88
|
+
// `sourceCodeHash` from the durable row below (contrast `codeHash`,
|
|
89
|
+
// which IS withheld on failure) — see `projectDurableBlueprint`'s
|
|
90
|
+
// comment. The degradation is honest and non-fatal: a reuse read that
|
|
91
|
+
// resolves the hash but finds `codeStore.get(hash) === null`
|
|
92
|
+
// gracefully skips, surfacing as the typed `render_source_unavailable`
|
|
93
|
+
// at the tool layer, never an error.
|
|
94
|
+
if (codeStore &&
|
|
95
|
+
blueprint.sourceCode !== undefined &&
|
|
96
|
+
blueprint.sourceCodeHash !== undefined) {
|
|
97
|
+
try {
|
|
98
|
+
await codeStore.put(blueprint.sourceCodeHash, blueprint.sourceCode);
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
logDurabilityFailure(SOURCE_WRITE_FAILED, blueprint, appId, err);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// The compiled body and the durable row need a durable store: without
|
|
105
|
+
// one, nothing references the compiled body (the cache row carries the
|
|
106
|
+
// code inline), so writing it would be pure orphan.
|
|
71
107
|
if (!blueprintStore)
|
|
72
108
|
return;
|
|
73
109
|
// Body first — see the module docstring on why an orphan body beats a
|
|
74
110
|
// row that points at nothing.
|
|
75
111
|
let codeHash;
|
|
76
|
-
const codeStore = deps?.codeStore;
|
|
77
112
|
if (codeStore && blueprint.componentCode.length > 0) {
|
|
78
113
|
try {
|
|
79
114
|
const hash = codeStore.hashOf(blueprint.componentCode);
|
|
@@ -84,26 +119,6 @@ export async function writeBlueprintDurably(deps, appId, blueprint, createdBy =
|
|
|
84
119
|
logDurabilityFailure(CODE_WRITE_FAILED, blueprint, appId, err);
|
|
85
120
|
}
|
|
86
121
|
}
|
|
87
|
-
// Authored source body, own try/catch — a distinct
|
|
88
|
-
// failure mode from the compiled-code write above. `sourceCodeHash`
|
|
89
|
-
// is already decided (computed at registration, already on the
|
|
90
|
-
// vector-store row); this write just persists the body it points at.
|
|
91
|
-
// A failure here does NOT withhold `sourceCodeHash` from the durable
|
|
92
|
-
// row below (contrast `codeHash`, which IS withheld on failure) — see
|
|
93
|
-
// `projectDurableBlueprint`'s comment. The degradation is honest and
|
|
94
|
-
// non-fatal: a reuse read that resolves the hash but finds
|
|
95
|
-
// `codeStore.get(hash) === null` gracefully skips, surfacing as the
|
|
96
|
-
// typed `render_source_unavailable` at the tool layer, never an error.
|
|
97
|
-
if (codeStore &&
|
|
98
|
-
blueprint.sourceCode !== undefined &&
|
|
99
|
-
blueprint.sourceCodeHash !== undefined) {
|
|
100
|
-
try {
|
|
101
|
-
await codeStore.put(blueprint.sourceCodeHash, blueprint.sourceCode);
|
|
102
|
-
}
|
|
103
|
-
catch (err) {
|
|
104
|
-
logDurabilityFailure(SOURCE_WRITE_FAILED, blueprint, appId, err);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
122
|
try {
|
|
108
123
|
await blueprintStore.put(projectDurableBlueprint(blueprint, appId, codeHash, createdBy));
|
|
109
124
|
}
|
|
@@ -46,6 +46,7 @@
|
|
|
46
46
|
*/
|
|
47
47
|
import type { LLMCaller } from '@ggui-ai/negotiator';
|
|
48
48
|
import { type RerankJudge } from '@ggui-ai/negotiator';
|
|
49
|
+
import { type FitDeclined, type FitVerdict, type RequestFitFacts } from './fits.js';
|
|
49
50
|
import { type DataContract, type BlueprintVariance } from '@ggui-ai/protocol';
|
|
50
51
|
import { type CacheTraceStrategy } from './cache-trace-sink.js';
|
|
51
52
|
import { type Blueprint, type BlueprintCandidate, type BlueprintKind, type BlueprintRegistryDeps } from './blueprint-registry.js';
|
|
@@ -63,6 +64,15 @@ export interface BlueprintMatchHit {
|
|
|
63
64
|
readonly cosine: number;
|
|
64
65
|
/** Free-text reason for trace logs / handshake reason field. */
|
|
65
66
|
readonly reason: string;
|
|
67
|
+
/**
|
|
68
|
+
* ggui#1427 — the served candidate's fit verdict. A semantic hit fits by
|
|
69
|
+
* construction (the judge ranked only fitting candidates). An exact-key
|
|
70
|
+
* hit is OBSERVED, never declined: `fits: false` here is a would-miss,
|
|
71
|
+
* named by kind, for the deployment to count.
|
|
72
|
+
*/
|
|
73
|
+
readonly fit?: FitVerdict;
|
|
74
|
+
/** ggui#1427 — candidates the pre-filter dropped before the judge (semantic path only). */
|
|
75
|
+
readonly fitDeclined?: readonly FitDeclined[];
|
|
66
76
|
/** When strategy='semantic', the LLM judge's confidence; undefined for exact-key. */
|
|
67
77
|
readonly judgeConfidence?: number;
|
|
68
78
|
/**
|
|
@@ -92,9 +102,16 @@ export interface BlueprintMatchMiss {
|
|
|
92
102
|
* when LLM was unavailable or rerank short-circuited.
|
|
93
103
|
*/
|
|
94
104
|
readonly judgeReason?: string;
|
|
105
|
+
/** ggui#1427 — candidates the pre-filter dropped before the judge, named by miss kind (semantic path only). */
|
|
106
|
+
readonly fitDeclined?: readonly FitDeclined[];
|
|
95
107
|
}
|
|
96
108
|
export type BlueprintMatchResult = BlueprintMatchHit | BlueprintMatchMiss;
|
|
97
109
|
/** Compose deps for the matcher. */
|
|
110
|
+
/** A judge with the confidence threshold it was measured on (ggui#1235). */
|
|
111
|
+
export interface RerankPair {
|
|
112
|
+
readonly judge: RerankJudge;
|
|
113
|
+
readonly threshold: number;
|
|
114
|
+
}
|
|
98
115
|
export interface MatchBlueprintDeps {
|
|
99
116
|
readonly registry: BlueprintRegistryDeps;
|
|
100
117
|
/**
|
|
@@ -116,10 +133,7 @@ export interface MatchBlueprintDeps {
|
|
|
116
133
|
* chain) passes `threshold: 0` and declines only with `matchId: null`.
|
|
117
134
|
* Wins over a bare `llm` when both are given.
|
|
118
135
|
*/
|
|
119
|
-
readonly rerank?:
|
|
120
|
-
readonly judge: RerankJudge;
|
|
121
|
-
readonly threshold: number;
|
|
122
|
-
};
|
|
136
|
+
readonly rerank?: RerankPair;
|
|
123
137
|
/**
|
|
124
138
|
* Optional marketplace-install bridge. When set, the matcher STARTS
|
|
125
139
|
* `ensureCached(scope)` and reads the exact key while it runs: a hit
|
|
@@ -143,9 +157,11 @@ export interface MatchBlueprintOptions {
|
|
|
143
157
|
/** RAG top-K. Default 20 — balance between recall and prompt cost. */
|
|
144
158
|
readonly topK?: number;
|
|
145
159
|
/**
|
|
146
|
-
* Minimum cosine a candidate needs to reach the LLM judge. Default
|
|
147
|
-
*
|
|
148
|
-
*
|
|
160
|
+
* Minimum cosine a candidate needs to reach the LLM judge. Default: one
|
|
161
|
+
* floor per query kind — 0.50 when the request carries a contract (its
|
|
162
|
+
* query is composed like the stored vectors), 0.2 when it does not (its
|
|
163
|
+
* query embeds the intent alone, on a lower scale); see the
|
|
164
|
+
* DEFAULT_MIN_COSINE_* note. A value here overrides both. Applied PER CANDIDATE (ggui#1275): a
|
|
149
165
|
* candidate under the floor is never offered to the judge, so it can
|
|
150
166
|
* never become a reuse; when even top-1 is under it, the judge is skipped
|
|
151
167
|
* entirely and the rerank cost is saved.
|
|
@@ -164,7 +180,35 @@ export interface MatchBlueprintOptions {
|
|
|
164
180
|
* stability-sensitive caller cannot afford (ggui#607).
|
|
165
181
|
*/
|
|
166
182
|
readonly disableSemantic?: boolean;
|
|
183
|
+
/**
|
|
184
|
+
* ggui#1568 — WHY `disableSemantic` is set, so the trace never names a
|
|
185
|
+
* cause that did not hold. `'exact-only-policy'` (the default) is the
|
|
186
|
+
* ggui#607 reuse policy. `'exclusion-unavailable'` means the deployment
|
|
187
|
+
* could not say which rows are reserved from the semantic tier
|
|
188
|
+
* ({@link excludeFromSemantic}), so it turned the tier off rather than
|
|
189
|
+
* risk offering one. Read only when `disableSemantic` is true.
|
|
190
|
+
*/
|
|
191
|
+
readonly disableSemanticCause?: 'exact-only-policy' | 'exclusion-unavailable';
|
|
192
|
+
/**
|
|
193
|
+
* ggui#1568 — rows the deployment reserves from the semantic tier, each
|
|
194
|
+
* named by {@link semanticExclusionKey}. A named row is dropped straight
|
|
195
|
+
* after retrieval, so it is never offered to the judge, never returned as
|
|
196
|
+
* a candidate and never reused by similarity. It stays reachable by its
|
|
197
|
+
* exact key: exclusion governs how a row is FOUND, never whether it can be
|
|
198
|
+
* served to a request that names it. Retrieval over-fetches by the set's
|
|
199
|
+
* size, so the pool the judge ranks is still `topK` deep. A vector store
|
|
200
|
+
* that clamps its `topK` returns fewer rows than asked, and the pool is
|
|
201
|
+
* then shallower: fewer reuses, never a reserved row.
|
|
202
|
+
*/
|
|
203
|
+
readonly excludeFromSemantic?: ReadonlySet<string>;
|
|
167
204
|
}
|
|
205
|
+
/**
|
|
206
|
+
* ggui#1568 — the key {@link MatchBlueprintOptions.excludeFromSemantic}
|
|
207
|
+
* names a row by: its `(contractKey, variantKey)` pair, the same pair the
|
|
208
|
+
* exact tier resolves. Unambiguous by construction (JSON array), so no two
|
|
209
|
+
* different pairs share a key.
|
|
210
|
+
*/
|
|
211
|
+
export declare function semanticExclusionKey(contractKey: string, variantKey: string): string;
|
|
168
212
|
/**
|
|
169
213
|
* Walk the matcher and return the decision.
|
|
170
214
|
*
|
|
@@ -177,5 +221,11 @@ export declare function matchBlueprint(deps: MatchBlueprintDeps, scope: string,
|
|
|
177
221
|
readonly intent: string;
|
|
178
222
|
readonly contract?: DataContract;
|
|
179
223
|
readonly variance?: BlueprintVariance;
|
|
224
|
+
/**
|
|
225
|
+
* ggui#1427 — the request's declared fit facts (canvas, aesthetic
|
|
226
|
+
* preset, direction digest). Absent facts evaluate nothing; data-shape
|
|
227
|
+
* runs from `contract` alone.
|
|
228
|
+
*/
|
|
229
|
+
readonly fit?: RequestFitFacts;
|
|
180
230
|
}, options?: MatchBlueprintOptions): Promise<BlueprintMatchResult>;
|
|
181
231
|
//# sourceMappingURL=blueprint-matcher.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blueprint-matcher.d.ts","sourceRoot":"","sources":["../../src/renders/blueprint-matcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACvB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAML,KAAK,kBAAkB,EACxB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAIL,KAAK,SAAS,EACd,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC3B,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AACtF,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"blueprint-matcher.d.ts","sourceRoot":"","sources":["../../src/renders/blueprint-matcher.ts"],"names":[],"mappings":"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"}
|