@guuey/chat 0.7.2 → 0.8.1
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/hitl.d.ts +5 -0
- package/dist/hitl.d.ts.map +1 -1
- package/dist/hitl.js +5 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/native/components.d.ts.map +1 -1
- package/dist/native/components.js +5 -5
- package/dist/oauth.d.ts +87 -0
- package/dist/oauth.d.ts.map +1 -0
- package/dist/oauth.js +121 -0
- package/dist/plan.d.ts.map +1 -1
- package/dist/plan.js +4 -1
- package/dist/react/components.d.ts.map +1 -1
- package/dist/react/components.js +7 -5
- package/dist/react/guuey-chat.d.ts +14 -0
- package/dist/react/guuey-chat.d.ts.map +1 -1
- package/dist/react/guuey-chat.js +21 -3
- package/dist/react/oauth-return.d.ts +61 -0
- package/dist/react/oauth-return.d.ts.map +1 -0
- package/dist/react/oauth-return.js +103 -0
- package/dist/react/use-transcript.d.ts +3 -3
- package/dist/react/use-transcript.d.ts.map +1 -1
- package/dist/react/use-transcript.js +4 -27
- package/dist/react.d.ts +1 -0
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +1 -0
- package/dist/strings.d.ts +10 -0
- package/dist/strings.d.ts.map +1 -1
- package/dist/strings.js +4 -0
- package/dist/types.d.ts +25 -11
- package/dist/types.d.ts.map +1 -1
- package/package.json +4 -3
- package/src/corpus/README.md +7 -1
- package/src/corpus/__snapshots__/corpus.test.ts.snap +126 -7
- package/src/corpus/drive.ts +43 -12
- package/src/corpus/fixtures.ts +95 -4
- package/src/hitl.ts +5 -0
- package/src/index.ts +11 -0
- package/src/native/components.tsx +15 -7
- package/src/oauth.ts +157 -0
- package/src/plan.ts +4 -1
- package/src/react/components.tsx +17 -9
- package/src/react/guuey-chat.tsx +49 -1
- package/src/react/oauth-return.ts +129 -0
- package/src/react/use-transcript.ts +7 -32
- package/src/react.tsx +9 -0
- package/src/strings.ts +14 -0
- package/src/types.ts +22 -11
- package/styles.css +26 -0
package/dist/hitl.d.ts
CHANGED
|
@@ -19,6 +19,11 @@
|
|
|
19
19
|
* Answer states encode guuey's ratified dismissal ruling (#16): dismissal
|
|
20
20
|
* maps to `cancelled` (still-pending, re-askable — the card stays
|
|
21
21
|
* answerable), `declined` is the durable explicit deny.
|
|
22
|
+
*
|
|
23
|
+
* The first producer is the guuey runtime's cross-app profile consent
|
|
24
|
+
* (guuey#207): the pod appends a paused turn whose ask declares
|
|
25
|
+
* `grantModes: [always, once?]`; the host delivers the built answer through
|
|
26
|
+
* `@guuey/agent-client`'s `createHitlAnswerRelay` (`POST <pod>/agent/hitl-answer`).
|
|
22
27
|
*/
|
|
23
28
|
import { type AgGrantMode, type AgHitlAnswer, type AgPausedAsk, type AgReduceResult } from "@silverprotocol/core";
|
|
24
29
|
import type { HitlPromptInput } from "./types.js";
|
package/dist/hitl.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hitl.d.ts","sourceRoot":"","sources":["../src/hitl.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"hitl.d.ts","sourceRoot":"","sources":["../src/hitl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,cAAc,EACpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,oFAAoF;AACpF,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,WAAW,CAAC;IAC9C,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,+EAA+E;AAC/E,MAAM,MAAM,gBAAgB,GAAG;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;AAE1F;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAE1D;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,cAAc,GAAG,IAAI,EAC7B,OAAO,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAM,GACvD,eAAe,EAAE,CAiBnB;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,gBAAgB,GAAG,YAAY,CAexF"}
|
package/dist/hitl.js
CHANGED
|
@@ -19,6 +19,11 @@
|
|
|
19
19
|
* Answer states encode guuey's ratified dismissal ruling (#16): dismissal
|
|
20
20
|
* maps to `cancelled` (still-pending, re-askable — the card stays
|
|
21
21
|
* answerable), `declined` is the durable explicit deny.
|
|
22
|
+
*
|
|
23
|
+
* The first producer is the guuey runtime's cross-app profile consent
|
|
24
|
+
* (guuey#207): the pod appends a paused turn whose ask declares
|
|
25
|
+
* `grantModes: [always, once?]`; the host delivers the built answer through
|
|
26
|
+
* `@guuey/agent-client`'s `createHitlAnswerRelay` (`POST <pod>/agent/hitl-answer`).
|
|
22
27
|
*/
|
|
23
28
|
import { validateHitlAnswer, } from "@silverprotocol/core";
|
|
24
29
|
/**
|
package/dist/index.d.ts
CHANGED
|
@@ -15,6 +15,7 @@ export { calmPolicy, debugPolicy, type TranscriptPolicy, } from "./policy.js";
|
|
|
15
15
|
export { defaultChatStrings, humanizeToolName, type ChatStrings, } from "./strings.js";
|
|
16
16
|
export { transcriptInputsFromHistory } from "./history-inputs.js";
|
|
17
17
|
export { buildHitlAnswer, grantModeDisplay, hitlPromptsFromFold, type HitlAnswerRecord, type HitlPromptAction, } from "./hitl.js";
|
|
18
|
+
export { OAUTH_LINK_PARAMS, OAUTH_RETURN_PARAMS, OAUTH_SCHEME, oauthAuthorizeAsk, oauthAuthorizeHref, parseOAuthReturn, stripOAuthReturn, type OAuthAuthorizeAsk, type OAuthReturn, } from "./oauth.js";
|
|
18
19
|
export { DEFAULT_CHAT_THEME, GUUEY_CHAT_THEME, GuueyChatPalette, GuueyChatTheme, resolveTheme, } from "./theme.js";
|
|
19
20
|
export type { ChatDebugEvent, CitationsItem, CodeItem, CompactionItem, DataResultItem, DisplayItem, ErrorItem, HistoryBoundaryItem, ItemKey, HitlPromptInput, HitlPromptItem, MediaItem, NoticeItem, ProfilePromptInput, ProfilePromptItem, PromptItem, PromptItemInput, ReasoningItem, StatusLineItem, TextItem, ToolGroupItem, ToolItem, TranscriptInputs, TranscriptMessage, TranscriptOverrides, TranscriptPlan, UnknownItem, UserMessageItem, ViewMountItem, ViewRefItem, } from "./types.js";
|
|
20
21
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EACL,aAAa,EACb,cAAc,GACf,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,UAAU,EACV,WAAW,EACX,KAAK,gBAAgB,GACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,KAAK,WAAW,GACjB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,GACtB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,cAAc,EACd,aAAa,EACb,QAAQ,EACR,cAAc,EACd,cAAc,EACd,WAAW,EACX,SAAS,EACT,mBAAmB,EACnB,OAAO,EACP,eAAe,EACf,cAAc,EACd,SAAS,EACT,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EACjB,UAAU,EACV,eAAe,EACf,aAAa,EACb,cAAc,EACd,QAAQ,EACR,aAAa,EACb,QAAQ,EACR,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,WAAW,EACX,eAAe,EACf,aAAa,EACb,WAAW,GACZ,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EACL,aAAa,EACb,cAAc,GACf,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,UAAU,EACV,WAAW,EACX,KAAK,gBAAgB,GACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,KAAK,WAAW,GACjB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,GACtB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,KAAK,iBAAiB,EACtB,KAAK,WAAW,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,cAAc,EACd,aAAa,EACb,QAAQ,EACR,cAAc,EACd,cAAc,EACd,WAAW,EACX,SAAS,EACT,mBAAmB,EACnB,OAAO,EACP,eAAe,EACf,cAAc,EACd,SAAS,EACT,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EACjB,UAAU,EACV,eAAe,EACf,aAAa,EACb,cAAc,EACd,QAAQ,EACR,aAAa,EACb,QAAQ,EACR,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,WAAW,EACX,eAAe,EACf,aAAa,EACb,WAAW,GACZ,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -15,4 +15,5 @@ export { calmPolicy, debugPolicy, } from "./policy.js";
|
|
|
15
15
|
export { defaultChatStrings, humanizeToolName, } from "./strings.js";
|
|
16
16
|
export { transcriptInputsFromHistory } from "./history-inputs.js";
|
|
17
17
|
export { buildHitlAnswer, grantModeDisplay, hitlPromptsFromFold, } from "./hitl.js";
|
|
18
|
+
export { OAUTH_LINK_PARAMS, OAUTH_RETURN_PARAMS, OAUTH_SCHEME, oauthAuthorizeAsk, oauthAuthorizeHref, parseOAuthReturn, stripOAuthReturn, } from "./oauth.js";
|
|
18
19
|
export { DEFAULT_CHAT_THEME, GUUEY_CHAT_THEME, GuueyChatPalette, GuueyChatTheme, resolveTheme, } from "./theme.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../../src/native/components.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../../src/native/components.tsx"],"names":[],"mappings":"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"}
|
|
@@ -191,14 +191,16 @@ export function NativePrompt({ item, ctx }) {
|
|
|
191
191
|
if (item.state === "resolved" || item.state === "declined") {
|
|
192
192
|
return (_jsx(MutedText, { ctx: ctx, children: item.state === "resolved"
|
|
193
193
|
? item.chosenModeLabel !== null
|
|
194
|
-
?
|
|
194
|
+
? item.oauth !== null
|
|
195
|
+
? s.promptOAuthSent(item.chosenModeLabel)
|
|
196
|
+
: s.promptAnsweredWith(item.chosenModeLabel)
|
|
195
197
|
: s.promptAccept
|
|
196
198
|
: s.promptDeclinedRecord }));
|
|
197
199
|
}
|
|
198
200
|
// `cancelled` = guuey's re-askable dismissal: a record row that reopens
|
|
199
201
|
// to the actions on toggle (silverprotocol#16 ruling).
|
|
200
202
|
const answerable = item.state === "pending" || (item.state === "cancelled" && item.expanded);
|
|
201
|
-
return (_jsxs(View, { accessibilityLiveRegion: "polite", accessible: true, style: { backgroundColor: tokens.palette.surface, borderRadius: tokens.radius, padding: tokens.pad, gap: 8 }, children: [item.state === "cancelled" && (_jsx(Pressable, { accessibilityRole: "button", accessibilityState: { expanded: item.expanded }, onPress: () => ctx.onToggle(item.key), children: _jsx(Text, { style: { color: tokens.palette.inkMuted, fontSize: tokens.fontSize }, children: s.promptDismissed }) })), answerable && (_jsxs(_Fragment, { children: [item.message !== null && (_jsx(Text, { style: { color: tokens.palette.ink, fontSize: tokens.fontSize, fontFamily: tokens.fontFamily }, children: item.message })), _jsxs(View, { style: { flexDirection: "row", flexWrap: "wrap", gap: 12 }, children: [item.grantModes.length === 0 ? (_jsx(Pressable, { accessibilityRole: "button", onPress: () => ctx.onPromptAction?.(item, "accept"), children: _jsx(Text, { style: { color: tokens.palette.accent, fontWeight: "700", fontSize: tokens.fontSize }, children: s.promptAccept }) })) : (item.grantModes.map((mode) => (_jsx(Pressable, { accessibilityRole: "button", accessibilityHint: mode.description, onPress: () => ctx.onPromptAction?.(item, { grantModeId: mode.id }), children: _jsx(Text, { style: { color: tokens.palette.accent, fontWeight: "700", fontSize: tokens.fontSize }, children: mode.label ?? mode.id }) }, mode.id)))), _jsx(Pressable, { accessibilityRole: "button", onPress: () => ctx.onPromptAction?.(item, "decline"), children: _jsx(Text, { style: { color: tokens.palette.inkMuted, fontSize: tokens.fontSize }, children: s.promptDecline }) })] })] }))] }));
|
|
203
|
+
return (_jsxs(View, { accessibilityLiveRegion: "polite", accessible: true, style: { backgroundColor: tokens.palette.surface, borderRadius: tokens.radius, padding: tokens.pad, gap: 8 }, children: [item.state === "cancelled" && (_jsx(Pressable, { accessibilityRole: "button", accessibilityState: { expanded: item.expanded }, onPress: () => ctx.onToggle(item.key), children: _jsx(Text, { style: { color: tokens.palette.inkMuted, fontSize: tokens.fontSize }, children: s.promptDismissed }) })), answerable && (_jsxs(_Fragment, { children: [item.message !== null && (_jsx(Text, { style: { color: tokens.palette.ink, fontSize: tokens.fontSize, fontFamily: tokens.fontFamily }, children: item.message })), _jsxs(View, { style: { flexDirection: "row", flexWrap: "wrap", gap: 12 }, children: [item.grantModes.length === 0 ? (_jsx(Pressable, { accessibilityRole: "button", onPress: () => ctx.onPromptAction?.(item, "accept"), children: _jsx(Text, { style: { color: tokens.palette.accent, fontWeight: "700", fontSize: tokens.fontSize }, children: s.promptAccept }) })) : (item.grantModes.map((mode) => (_jsx(Pressable, { accessibilityRole: "button", accessibilityHint: mode.description, onPress: () => ctx.onPromptAction?.(item, { grantModeId: mode.id }), children: _jsx(Text, { style: { color: tokens.palette.accent, fontWeight: "700", fontSize: tokens.fontSize }, children: mode.label ?? mode.id }) }, mode.id)))), item.oauth !== null ? (_jsx(Pressable, { accessibilityRole: "button", onPress: () => ctx.onPromptAction?.(item, "dismiss"), children: _jsx(Text, { style: { color: tokens.palette.inkMuted, fontSize: tokens.fontSize }, children: s.promptNotNow }) })) : (_jsx(Pressable, { accessibilityRole: "button", onPress: () => ctx.onPromptAction?.(item, "decline"), children: _jsx(Text, { style: { color: tokens.palette.inkMuted, fontSize: tokens.fontSize }, children: s.promptDecline }) }))] })] }))] }));
|
|
202
204
|
}
|
|
203
205
|
if (item.state !== "pending") {
|
|
204
206
|
return (_jsxs(MutedText, { ctx: ctx, children: [item.promptKind, ": ", item.state] }));
|
|
@@ -209,9 +211,7 @@ export function NativePrompt({ item, ctx }) {
|
|
|
209
211
|
, {
|
|
210
212
|
// RN has no document focus to move; the live region announces the ask
|
|
211
213
|
// (the web kit's focus contract, restated over the platform).
|
|
212
|
-
accessibilityLiveRegion: "polite", accessible: true, style: { backgroundColor: tokens.palette.surface, borderRadius: tokens.radius, padding: tokens.pad, gap: 8 }, children: [_jsx(Text, { style: { color: tokens.palette.ink, fontSize: tokens.fontSize, fontFamily: tokens.fontFamily }, children: item.
|
|
213
|
-
? `${item.appId} requests ${item.requested} access`
|
|
214
|
-
: `Link your account to ${item.appId}` }), _jsxs(View, { style: { flexDirection: "row", gap: 12 }, children: [_jsx(Pressable, { accessibilityRole: "button", onPress: () => ctx.onPromptAction?.(item, "accept"), children: _jsx(Text, { style: { color: tokens.palette.accent, fontWeight: "700", fontSize: tokens.fontSize }, children: "Allow" }) }), _jsx(Pressable, { accessibilityRole: "button", onPress: () => ctx.onPromptAction?.(item, "decline"), children: _jsx(Text, { style: { color: tokens.palette.inkMuted, fontSize: tokens.fontSize }, children: "Decline" }) })] })] }));
|
|
214
|
+
accessibilityLiveRegion: "polite", accessible: true, style: { backgroundColor: tokens.palette.surface, borderRadius: tokens.radius, padding: tokens.pad, gap: 8 }, children: [_jsx(Text, { style: { color: tokens.palette.ink, fontSize: tokens.fontSize, fontFamily: tokens.fontFamily }, children: `Link your account to ${item.appId}` }), _jsxs(View, { style: { flexDirection: "row", gap: 12 }, children: [_jsx(Pressable, { accessibilityRole: "button", onPress: () => ctx.onPromptAction?.(item, "accept"), children: _jsx(Text, { style: { color: tokens.palette.accent, fontWeight: "700", fontSize: tokens.fontSize }, children: "Allow" }) }), _jsx(Pressable, { accessibilityRole: "button", onPress: () => ctx.onPromptAction?.(item, "decline"), children: _jsx(Text, { style: { color: tokens.palette.inkMuted, fontSize: tokens.fontSize }, children: "Decline" }) })] })] }));
|
|
215
215
|
}
|
|
216
216
|
// ─── R16 ──────────────────────────────────────────────────────────────────
|
|
217
217
|
/** The notice row (spec draft.2) — labeled, non-conversational, never agent-voiced. */
|
package/dist/oauth.d.ts
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The "authorize this server" arm of R10 (guuey#178 Slice 4) — the pure
|
|
3
|
+
* helpers every surface (web kit, widget, studio, portal native) uses for a
|
|
4
|
+
* `hitl.ask kind:"auth"` whose `authConfig.scheme` is `oauth2`.
|
|
5
|
+
*
|
|
6
|
+
* The producer is the guuey runtime's MCP OAuth broker: the pod appends a
|
|
7
|
+
* paused turn (`turn.done outcome:"paused"`) whose ask declares
|
|
8
|
+
* `authConfig:{ scheme:"oauth2", authorizationUrl }` + `grantModes:
|
|
9
|
+
* [always, once?]`. Unlike the profile-consent ask there is **no answer
|
|
10
|
+
* door**: the answer IS the redirect. Picking a mode opens
|
|
11
|
+
* `authorizationUrl` with two query params appended by THIS client —
|
|
12
|
+
*
|
|
13
|
+
* - `mode=<grantModeId>` — the pre-chosen grant (recorded by the broker's
|
|
14
|
+
* callback; the mode is fixed BEFORE the identity-provider hop), and
|
|
15
|
+
* - `returnTo=<the surface's own location>` — where the broker 302s back
|
|
16
|
+
* to when the dance ends (`?connected=<serverName>` on success,
|
|
17
|
+
* `?error=<reason>` on failure). The broker allowlists it; the client
|
|
18
|
+
* just says where it lives.
|
|
19
|
+
*
|
|
20
|
+
* On return the surface strips the two params, shows a one-line notice, and
|
|
21
|
+
* does nothing else: the NEXT turn's pre-turn preflight on the pod resolves
|
|
22
|
+
* `connected` (or asks again). No client-side state survives the redirect
|
|
23
|
+
* on purpose. "Not now" is a plain dismissal (`cancelled` — still pending,
|
|
24
|
+
* re-askable); nothing is written anywhere and the ask re-emits next turn.
|
|
25
|
+
*
|
|
26
|
+
* Everything here is string-level (no `URL`/`URLSearchParams`) so it runs
|
|
27
|
+
* identically on React Native, whose URL polyfill is partial.
|
|
28
|
+
*/
|
|
29
|
+
import type { AgPausedAsk } from "@silverprotocol/core";
|
|
30
|
+
/** The `authConfig.scheme` this arm recognises (the spec's OAuth 2 vocabulary). */
|
|
31
|
+
export declare const OAUTH_SCHEME = "oauth2";
|
|
32
|
+
/** The query params THIS client appends to the authorize link. */
|
|
33
|
+
export declare const OAUTH_LINK_PARAMS: {
|
|
34
|
+
readonly mode: "mode";
|
|
35
|
+
readonly returnTo: "returnTo";
|
|
36
|
+
};
|
|
37
|
+
/** The query params the broker's callback appends to `returnTo`. */
|
|
38
|
+
export declare const OAUTH_RETURN_PARAMS: {
|
|
39
|
+
readonly connected: "connected";
|
|
40
|
+
readonly error: "error";
|
|
41
|
+
};
|
|
42
|
+
/** What an auth ask declares once narrowed to the OAuth arm. */
|
|
43
|
+
export interface OAuthAuthorizeAsk {
|
|
44
|
+
authorizationUrl: string;
|
|
45
|
+
scopes: readonly string[];
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Narrow an ask to the OAuth arm: `kind:"auth"` + `authConfig.scheme ===
|
|
49
|
+
* "oauth2"` + an `authorizationUrl` to open. Anything else (a plain
|
|
50
|
+
* approval, an auth ask with another scheme, a URL-less declaration) is
|
|
51
|
+
* `null` and renders as an ordinary hitl card.
|
|
52
|
+
*/
|
|
53
|
+
export declare function oauthAuthorizeAsk(ask: AgPausedAsk): OAuthAuthorizeAsk | null;
|
|
54
|
+
/**
|
|
55
|
+
* The link to open for a mode pick: `authorizationUrl` + `&mode=<grantModeId>`
|
|
56
|
+
* + `&returnTo=<returnTo>` (each value URI-encoded; `?` vs `&` chosen from
|
|
57
|
+
* the URL as declared). `grantModeId` is required iff the ask declares
|
|
58
|
+
* modes (`null` = a plain accept on a mode-less auth ask — no `mode` param).
|
|
59
|
+
* Throws on a mode the ask did not declare — the inputs came from the
|
|
60
|
+
* declaration itself, so a mismatch is a construction bug, never a user
|
|
61
|
+
* state.
|
|
62
|
+
*/
|
|
63
|
+
export declare function oauthAuthorizeHref(ask: AgPausedAsk, grantModeId: string | null, returnTo: string): string;
|
|
64
|
+
/** The broker's answer, lifted off the return location. */
|
|
65
|
+
export type OAuthReturn = {
|
|
66
|
+
kind: "connected";
|
|
67
|
+
serverName: string;
|
|
68
|
+
} | {
|
|
69
|
+
kind: "error";
|
|
70
|
+
reason: string;
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Read the broker's return params off a location (a full URL, a deep link
|
|
74
|
+
* like `guuey://oauth/done?connected=linear`, or a bare `?connected=…`
|
|
75
|
+
* query). `null` when neither param is present. `connected` wins when both
|
|
76
|
+
* appear (the broker never sends both).
|
|
77
|
+
*/
|
|
78
|
+
export declare function parseOAuthReturn(urlOrQuery: string): OAuthReturn | null;
|
|
79
|
+
/**
|
|
80
|
+
* The same location with the broker's return params removed (every other
|
|
81
|
+
* param, and the hash, preserved). Idempotent; a URL without them is
|
|
82
|
+
* returned unchanged. This is what a surface writes back into its address
|
|
83
|
+
* bar (`history.replaceState`) so a reload never re-shows the notice — and
|
|
84
|
+
* what it passes as `returnTo` for the next dance.
|
|
85
|
+
*/
|
|
86
|
+
export declare function stripOAuthReturn(url: string): string;
|
|
87
|
+
//# sourceMappingURL=oauth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,mFAAmF;AACnF,eAAO,MAAM,YAAY,WAAW,CAAC;AAErC,kEAAkE;AAClE,eAAO,MAAM,iBAAiB;;;CAAkD,CAAC;AAEjF,oEAAoE;AACpE,eAAO,MAAM,mBAAmB;;;CAAsD,CAAC;AAEvF,gEAAgE;AAChE,MAAM,WAAW,iBAAiB;IAChC,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3B;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,WAAW,GAAG,iBAAiB,GAAG,IAAI,CAK5E;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAczG;AAED,2DAA2D;AAC3D,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AA4BtC;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAUvE;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAiBpD"}
|
package/dist/oauth.js
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/** The `authConfig.scheme` this arm recognises (the spec's OAuth 2 vocabulary). */
|
|
2
|
+
export const OAUTH_SCHEME = "oauth2";
|
|
3
|
+
/** The query params THIS client appends to the authorize link. */
|
|
4
|
+
export const OAUTH_LINK_PARAMS = { mode: "mode", returnTo: "returnTo" };
|
|
5
|
+
/** The query params the broker's callback appends to `returnTo`. */
|
|
6
|
+
export const OAUTH_RETURN_PARAMS = { connected: "connected", error: "error" };
|
|
7
|
+
/**
|
|
8
|
+
* Narrow an ask to the OAuth arm: `kind:"auth"` + `authConfig.scheme ===
|
|
9
|
+
* "oauth2"` + an `authorizationUrl` to open. Anything else (a plain
|
|
10
|
+
* approval, an auth ask with another scheme, a URL-less declaration) is
|
|
11
|
+
* `null` and renders as an ordinary hitl card.
|
|
12
|
+
*/
|
|
13
|
+
export function oauthAuthorizeAsk(ask) {
|
|
14
|
+
if (ask.kind !== "auth" || ask.authConfig === undefined)
|
|
15
|
+
return null;
|
|
16
|
+
const { scheme, authorizationUrl, scopes } = ask.authConfig;
|
|
17
|
+
if (scheme !== OAUTH_SCHEME || authorizationUrl === undefined || authorizationUrl === "")
|
|
18
|
+
return null;
|
|
19
|
+
return { authorizationUrl, scopes: scopes ?? [] };
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* The link to open for a mode pick: `authorizationUrl` + `&mode=<grantModeId>`
|
|
23
|
+
* + `&returnTo=<returnTo>` (each value URI-encoded; `?` vs `&` chosen from
|
|
24
|
+
* the URL as declared). `grantModeId` is required iff the ask declares
|
|
25
|
+
* modes (`null` = a plain accept on a mode-less auth ask — no `mode` param).
|
|
26
|
+
* Throws on a mode the ask did not declare — the inputs came from the
|
|
27
|
+
* declaration itself, so a mismatch is a construction bug, never a user
|
|
28
|
+
* state.
|
|
29
|
+
*/
|
|
30
|
+
export function oauthAuthorizeHref(ask, grantModeId, returnTo) {
|
|
31
|
+
const oauth = oauthAuthorizeAsk(ask);
|
|
32
|
+
if (oauth === null)
|
|
33
|
+
throw new Error("oauthAuthorizeHref: the ask is not an oauth2 auth ask");
|
|
34
|
+
const declared = ask.grantModes ?? [];
|
|
35
|
+
if (grantModeId === null && declared.length > 0) {
|
|
36
|
+
throw new Error(`oauthAuthorizeHref: ${ask.askId} declares grant modes — a mode is required`);
|
|
37
|
+
}
|
|
38
|
+
if (grantModeId !== null && !declared.some((m) => m.id === grantModeId)) {
|
|
39
|
+
throw new Error(`oauthAuthorizeHref: grant mode "${grantModeId}" is not declared on ${ask.askId}`);
|
|
40
|
+
}
|
|
41
|
+
if (returnTo === "")
|
|
42
|
+
throw new Error("oauthAuthorizeHref: returnTo is required");
|
|
43
|
+
const sep = oauth.authorizationUrl.includes("?") ? "&" : "?";
|
|
44
|
+
const mode = grantModeId === null ? "" : `${OAUTH_LINK_PARAMS.mode}=${encodeURIComponent(grantModeId)}&`;
|
|
45
|
+
return `${oauth.authorizationUrl}${sep}${mode}${OAUTH_LINK_PARAMS.returnTo}=${encodeURIComponent(returnTo)}`;
|
|
46
|
+
}
|
|
47
|
+
/** `decodeURIComponent` that yields the raw text for a malformed escape (a foreign param is not ours to fail on). */
|
|
48
|
+
function safeDecode(s) {
|
|
49
|
+
try {
|
|
50
|
+
return decodeURIComponent(s.replace(/\+/g, " "));
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return s;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/** Split a URL (or bare query) into its query pairs — RN-safe, no `URLSearchParams`. */
|
|
57
|
+
function queryPairs(urlOrQuery) {
|
|
58
|
+
const q = urlOrQuery.indexOf("?");
|
|
59
|
+
let query = q === -1 ? (urlOrQuery.startsWith("&") || !urlOrQuery.includes("=") ? "" : urlOrQuery) : urlOrQuery.slice(q + 1);
|
|
60
|
+
const hash = query.indexOf("#");
|
|
61
|
+
if (hash !== -1)
|
|
62
|
+
query = query.slice(0, hash);
|
|
63
|
+
const pairs = [];
|
|
64
|
+
for (const part of query.split("&")) {
|
|
65
|
+
if (part === "")
|
|
66
|
+
continue;
|
|
67
|
+
const eq = part.indexOf("=");
|
|
68
|
+
const k = eq === -1 ? part : part.slice(0, eq);
|
|
69
|
+
const v = eq === -1 ? "" : part.slice(eq + 1);
|
|
70
|
+
pairs.push([safeDecode(k), safeDecode(v)]);
|
|
71
|
+
}
|
|
72
|
+
return pairs;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Read the broker's return params off a location (a full URL, a deep link
|
|
76
|
+
* like `guuey://oauth/done?connected=linear`, or a bare `?connected=…`
|
|
77
|
+
* query). `null` when neither param is present. `connected` wins when both
|
|
78
|
+
* appear (the broker never sends both).
|
|
79
|
+
*/
|
|
80
|
+
export function parseOAuthReturn(urlOrQuery) {
|
|
81
|
+
let connected;
|
|
82
|
+
let error;
|
|
83
|
+
for (const [k, v] of queryPairs(urlOrQuery)) {
|
|
84
|
+
if (k === OAUTH_RETURN_PARAMS.connected && v !== "")
|
|
85
|
+
connected ??= v;
|
|
86
|
+
else if (k === OAUTH_RETURN_PARAMS.error && v !== "")
|
|
87
|
+
error ??= v;
|
|
88
|
+
}
|
|
89
|
+
if (connected !== undefined)
|
|
90
|
+
return { kind: "connected", serverName: connected };
|
|
91
|
+
if (error !== undefined)
|
|
92
|
+
return { kind: "error", reason: error };
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* The same location with the broker's return params removed (every other
|
|
97
|
+
* param, and the hash, preserved). Idempotent; a URL without them is
|
|
98
|
+
* returned unchanged. This is what a surface writes back into its address
|
|
99
|
+
* bar (`history.replaceState`) so a reload never re-shows the notice — and
|
|
100
|
+
* what it passes as `returnTo` for the next dance.
|
|
101
|
+
*/
|
|
102
|
+
export function stripOAuthReturn(url) {
|
|
103
|
+
const q = url.indexOf("?");
|
|
104
|
+
if (q === -1)
|
|
105
|
+
return url;
|
|
106
|
+
const hashAt = url.indexOf("#", q);
|
|
107
|
+
const base = url.slice(0, q);
|
|
108
|
+
const hash = hashAt === -1 ? "" : url.slice(hashAt);
|
|
109
|
+
const query = hashAt === -1 ? url.slice(q + 1) : url.slice(q + 1, hashAt);
|
|
110
|
+
const kept = query
|
|
111
|
+
.split("&")
|
|
112
|
+
.filter((part) => {
|
|
113
|
+
if (part === "")
|
|
114
|
+
return false;
|
|
115
|
+
const eq = part.indexOf("=");
|
|
116
|
+
const key = safeDecode(eq === -1 ? part : part.slice(0, eq));
|
|
117
|
+
return key !== OAUTH_RETURN_PARAMS.connected && key !== OAUTH_RETURN_PARAMS.error;
|
|
118
|
+
})
|
|
119
|
+
.join("&");
|
|
120
|
+
return kept === "" ? `${base}${hash}` : `${base}?${kept}${hash}`;
|
|
121
|
+
}
|
package/dist/plan.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../src/plan.ts"],"names":[],"mappings":"AAkCA,OAAO,EAKL,KAAK,SAAS,EACf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../src/plan.ts"],"names":[],"mappings":"AAkCA,OAAO,EAKL,KAAK,SAAS,EACf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpD,OAAO,KAAK,EASV,gBAAgB,EAChB,mBAAmB,EACnB,cAAc,EAIf,MAAM,YAAY,CAAC;AA0mBpB,uCAAuC;AACvC,wBAAgB,cAAc,CAC5B,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,gBAAgB,EACxB,SAAS,GAAE,mBAAwB,GAClC,cAAc,CA6QhB;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,IAAI,CAAC,gBAAgB,EAAE,QAAQ,GAAG,cAAc,CAAC,GACxD;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,SAAS,CAAC,SAAS,CAAC,CAAA;CAAE,GAAG,SAAS,CAiB5D"}
|
package/dist/plan.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { snapshotViewMount, toolResultLocator, toolResultViewMount, uiResourceChannel, } from "@guuey/mcp-apps-host";
|
|
2
2
|
import { grantModeDisplay } from "./hitl.js";
|
|
3
|
+
import { oauthAuthorizeAsk } from "./oauth.js";
|
|
3
4
|
/** R5's giant threshold: above this byte count the state is `giant`. */
|
|
4
5
|
const GIANT_RESULT_BYTES = 16_384;
|
|
5
6
|
/** Approximate byte size of a JSON value — deterministic, allocation-bounded. */
|
|
@@ -714,7 +715,8 @@ export function planTranscript(inputs, policy, overrides = {}) {
|
|
|
714
715
|
items.push(view);
|
|
715
716
|
}
|
|
716
717
|
// R10 — prompts, in input order (narrow on `kind`: the guuey-wire
|
|
717
|
-
//
|
|
718
|
+
// link-invite arm vs the AgJSON hitl arm — spec draft.2; consent rides
|
|
719
|
+
// hitl since guuey#207).
|
|
718
720
|
for (const prompt of inputs.prompts) {
|
|
719
721
|
const key = `p.${prompt.id}`;
|
|
720
722
|
if (prompt.kind === "hitl") {
|
|
@@ -733,6 +735,7 @@ export function planTranscript(inputs, policy, overrides = {}) {
|
|
|
733
735
|
message: prompt.ask.message ?? null,
|
|
734
736
|
askKind: prompt.ask.kind,
|
|
735
737
|
grantModes: prompt.ask.grantModes ?? [],
|
|
738
|
+
oauth: oauthAuthorizeAsk(prompt.ask),
|
|
736
739
|
state: prompt.state,
|
|
737
740
|
chosenModeId: prompt.grantModeId ?? null,
|
|
738
741
|
chosenModeLabel: chosen !== undefined ? grantModeDisplay(chosen) : null,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../../src/react/components.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../../src/react/components.tsx"],"names":[],"mappings":"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"}
|
package/dist/react/components.js
CHANGED
|
@@ -182,21 +182,23 @@ export function DefaultPrompt({ item, ctx }) {
|
|
|
182
182
|
// the durable deny. `cancelled` is guuey's re-askable dismissal: it
|
|
183
183
|
// collapses to a record but stays answerable when expanded.
|
|
184
184
|
if (item.state === "resolved" || item.state === "declined") {
|
|
185
|
+
// The OAuth arm's resolved record: the pick SENT the user to the
|
|
186
|
+
// provider (no answer door) — the grant lands on the next turn.
|
|
185
187
|
return (_jsx("p", { className: `guuey-chat-prompt-record guuey-chat-prompt-${item.state}`, children: item.state === "resolved"
|
|
186
188
|
? item.chosenModeLabel !== null
|
|
187
|
-
?
|
|
189
|
+
? item.oauth !== null
|
|
190
|
+
? s.promptOAuthSent(item.chosenModeLabel)
|
|
191
|
+
: s.promptAnsweredWith(item.chosenModeLabel)
|
|
188
192
|
: s.promptAccept
|
|
189
193
|
: s.promptDeclinedRecord }));
|
|
190
194
|
}
|
|
191
195
|
const answerable = item.state === "pending" || (item.state === "cancelled" && item.expanded);
|
|
192
|
-
return (_jsxs("div", { className: "guuey-chat-prompt", role: "group", children: [item.state === "cancelled" && (_jsx("button", { type: "button", className: "guuey-chat-prompt-record guuey-chat-prompt-cancelled", "aria-expanded": item.expanded, onClick: () => ctx.onToggle(item.key), children: s.promptDismissed })), answerable && (_jsxs(_Fragment, { children: [item.message !== null && _jsx("p", { className: "guuey-chat-prompt-ask", children: item.message }), _jsxs("div", { className: "guuey-chat-prompt-actions", children: [item.grantModes.length === 0 ? (_jsx("button", { ref: firstAction, type: "button", className: "guuey-chat-prompt-accept", onClick: () => ctx.onPromptAction?.(item, "accept"), children: s.promptAccept })) : (item.grantModes.map((mode, i) => (_jsx("button", { ref: i === 0 ? firstAction : undefined, type: "button", className: "guuey-chat-prompt-accept", title: mode.description, onClick: () => ctx.onPromptAction?.(item, { grantModeId: mode.id }), children: mode.label ?? mode.id }, mode.id)))), _jsx("button", { type: "button", onClick: () => ctx.onPromptAction?.(item, "decline"), children: s.promptDecline })] })] }))] }));
|
|
196
|
+
return (_jsxs("div", { className: "guuey-chat-prompt", role: "group", children: [item.state === "cancelled" && (_jsx("button", { type: "button", className: "guuey-chat-prompt-record guuey-chat-prompt-cancelled", "aria-expanded": item.expanded, onClick: () => ctx.onToggle(item.key), children: s.promptDismissed })), answerable && (_jsxs(_Fragment, { children: [item.message !== null && _jsx("p", { className: "guuey-chat-prompt-ask", children: item.message }), _jsxs("div", { className: "guuey-chat-prompt-actions", children: [item.grantModes.length === 0 ? (_jsx("button", { ref: firstAction, type: "button", className: "guuey-chat-prompt-accept", onClick: () => ctx.onPromptAction?.(item, "accept"), children: s.promptAccept })) : (item.grantModes.map((mode, i) => (_jsx("button", { ref: i === 0 ? firstAction : undefined, type: "button", className: "guuey-chat-prompt-accept", title: mode.description, onClick: () => ctx.onPromptAction?.(item, { grantModeId: mode.id }), children: mode.label ?? mode.id }, mode.id)))), item.oauth !== null ? (_jsx("button", { type: "button", onClick: () => ctx.onPromptAction?.(item, "dismiss"), children: s.promptNotNow })) : (_jsx("button", { type: "button", onClick: () => ctx.onPromptAction?.(item, "decline"), children: s.promptDecline }))] })] }))] }));
|
|
193
197
|
}
|
|
194
198
|
if (item.state !== "pending") {
|
|
195
199
|
return (_jsxs("p", { className: `guuey-chat-prompt-record guuey-chat-prompt-${item.state}`, children: [item.promptKind, ": ", item.state] }));
|
|
196
200
|
}
|
|
197
|
-
return (_jsxs("div", { className: "guuey-chat-prompt", role: "group", children: [_jsx("p", { className: "guuey-chat-prompt-ask", children: item.
|
|
198
|
-
? `${item.appId} requests ${item.requested} access`
|
|
199
|
-
: `Link your account to ${item.appId}` }), _jsxs("div", { className: "guuey-chat-prompt-actions", children: [_jsx("button", { ref: firstAction, type: "button", className: "guuey-chat-prompt-accept", onClick: () => ctx.onPromptAction?.(item, "accept"), children: "Allow" }), _jsx("button", { type: "button", onClick: () => ctx.onPromptAction?.(item, "decline"), children: "Decline" })] }), item.raw !== null ? (_jsx("pre", { className: "guuey-chat-prompt-raw", children: JSON.stringify(item.raw, null, 2) })) : null] }));
|
|
201
|
+
return (_jsxs("div", { className: "guuey-chat-prompt", role: "group", children: [_jsx("p", { className: "guuey-chat-prompt-ask", children: `Link your account to ${item.appId}` }), _jsxs("div", { className: "guuey-chat-prompt-actions", children: [_jsx("button", { ref: firstAction, type: "button", className: "guuey-chat-prompt-accept", onClick: () => ctx.onPromptAction?.(item, "accept"), children: "Allow" }), _jsx("button", { type: "button", onClick: () => ctx.onPromptAction?.(item, "decline"), children: "Decline" })] }), item.raw !== null ? (_jsx("pre", { className: "guuey-chat-prompt-raw", children: JSON.stringify(item.raw, null, 2) })) : null] }));
|
|
200
202
|
}
|
|
201
203
|
// ─── R16 ──────────────────────────────────────────────────────────────────
|
|
202
204
|
/**
|
|
@@ -163,6 +163,20 @@ export interface GuueyChatProps {
|
|
|
163
163
|
* transport). Fired after the transcript record moves.
|
|
164
164
|
*/
|
|
165
165
|
onHitlAnswer?: (answer: AgHitlAnswer, ask: AgPausedAsk) => void;
|
|
166
|
+
/**
|
|
167
|
+
* The OAuth "authorize this server" arm (guuey#178): where the broker
|
|
168
|
+
* sends the user back after the provider dance. Defaults to this page's
|
|
169
|
+
* own location (stale return params stripped). Pass a value when the
|
|
170
|
+
* chat lives at a URL that is not where the user should land.
|
|
171
|
+
*/
|
|
172
|
+
oauthReturnTo?: string;
|
|
173
|
+
/**
|
|
174
|
+
* How the authorize link is opened. Defaults to `openOAuthAuthorize`
|
|
175
|
+
* (in-place navigation; a new tab when framed). The composite ALSO shows
|
|
176
|
+
* the return notice itself (`useOAuthReturn`) — a host that overrides
|
|
177
|
+
* `open` and lands elsewhere renders its own.
|
|
178
|
+
*/
|
|
179
|
+
onOAuthAuthorize?: (href: string, ask: AgPausedAsk) => void;
|
|
166
180
|
/** R11 action slot (sign-in / retry affordances). */
|
|
167
181
|
onErrorAction?: (item: ErrorItem) => void;
|
|
168
182
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guuey-chat.d.ts","sourceRoot":"","sources":["../../src/react/guuey-chat.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,OAAO,EAQL,KAAK,aAAa,EAEnB,MAAM,OAAO,CAAC;AACf,OAAO,EAGL,KAAK,mBAAmB,EACzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEtE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAA2B,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC9E,OAAO,EAAsB,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,EAAmB,MAAM,aAAa,CAAC;AAC1F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAc,KAAK,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,KAAK,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"guuey-chat.d.ts","sourceRoot":"","sources":["../../src/react/guuey-chat.tsx"],"names":[],"mappings":"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"}
|
package/dist/react/guuey-chat.js
CHANGED
|
@@ -53,13 +53,14 @@ import { defaultChatStrings } from "../strings.js";
|
|
|
53
53
|
import { DEFAULT_CHAT_THEME } from "../theme.js";
|
|
54
54
|
import { Transcript } from "./transcript.js";
|
|
55
55
|
import { useTranscript, useTranscriptInputs } from "./use-transcript.js";
|
|
56
|
+
import { oauthPromptAction, useOAuthReturn } from "./oauth-return.js";
|
|
56
57
|
const PROMPT_STATE = {
|
|
57
58
|
accept: "answered",
|
|
58
59
|
decline: "declined",
|
|
59
60
|
dismiss: "dismissed",
|
|
60
61
|
};
|
|
61
62
|
export const GuueyChat = forwardRef(function GuueyChat(props, ref) {
|
|
62
|
-
const { endpointUrl, appId, apiBaseUrl, getAccessToken, getGuestSecret, adapters: adaptersProp, preset = "calm", policy: policyOverrides, components, strings: stringOverrides, theme = DEFAULT_CHAT_THEME, mode = "light", window: windowing, reader, onDebugEvent, viewProps, onPromptAction, onHitlAnswer, onErrorAction, onReady, onThread, className, style, } = props;
|
|
63
|
+
const { endpointUrl, appId, apiBaseUrl, getAccessToken, getGuestSecret, adapters: adaptersProp, preset = "calm", policy: policyOverrides, components, strings: stringOverrides, theme = DEFAULT_CHAT_THEME, mode = "light", window: windowing, reader, onDebugEvent, viewProps, onPromptAction, onHitlAnswer, oauthReturnTo, onOAuthAuthorize, onErrorAction, onReady, onThread, className, style, } = props;
|
|
63
64
|
const adapters = useMemo(() => adaptersProp ??
|
|
64
65
|
createWebAdapters({
|
|
65
66
|
...(apiBaseUrl !== undefined ? { apiBaseUrl } : {}),
|
|
@@ -199,8 +200,23 @@ export const GuueyChat = forwardRef(function GuueyChat(props, ref) {
|
|
|
199
200
|
// Same contract as submit: the hook owns failure surfacing.
|
|
200
201
|
});
|
|
201
202
|
}, [invoke]);
|
|
203
|
+
// guuey#178: the broker's return notice (`?connected=` / `?error=`), read
|
|
204
|
+
// + stripped off the address bar once on mount.
|
|
205
|
+
const oauthReturn = useOAuthReturn();
|
|
202
206
|
const handlePromptAction = useCallback((item, action) => {
|
|
203
207
|
if (item.promptKind === "hitl") {
|
|
208
|
+
// The OAuth arm: the answer is the redirect (no pod door, no
|
|
209
|
+
// `onHitlAnswer`); the ledger records the pick and the link opens.
|
|
210
|
+
if (oauthPromptAction({
|
|
211
|
+
item,
|
|
212
|
+
action,
|
|
213
|
+
answerHitlPrompt,
|
|
214
|
+
...(oauthReturnTo !== undefined ? { returnTo: oauthReturnTo } : {}),
|
|
215
|
+
...(onOAuthAuthorize !== undefined ? { open: onOAuthAuthorize } : {}),
|
|
216
|
+
})) {
|
|
217
|
+
onPromptAction?.(item, action);
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
204
220
|
const answer = answerHitlPrompt(item.ask, typeof action === "object" ? action : action === "accept" ? "accept" : action);
|
|
205
221
|
onHitlAnswer?.(answer, item.ask);
|
|
206
222
|
onPromptAction?.(item, action);
|
|
@@ -211,9 +227,11 @@ export const GuueyChat = forwardRef(function GuueyChat(props, ref) {
|
|
|
211
227
|
if (typeof action !== "object")
|
|
212
228
|
resolvePrompt(item.promptId, PROMPT_STATE[action]);
|
|
213
229
|
onPromptAction?.(item, action);
|
|
214
|
-
}, [resolvePrompt, answerHitlPrompt, onHitlAnswer, onPromptAction]);
|
|
230
|
+
}, [resolvePrompt, answerHitlPrompt, onHitlAnswer, onPromptAction, oauthReturnTo, onOAuthAuthorize]);
|
|
215
231
|
const strings = policy.strings;
|
|
216
|
-
return (_jsxs("div", { className: `guuey-chat-surface${className !== undefined ? ` ${className}` : ""}`, style: style, children: [_jsx(Transcript, { plan: plan, strings: strings, theme: theme, mode: mode, ...(windowing !== undefined ? { window: windowing } : {}), ...(components !== undefined ? { components } : {}), onToggle: toggle, onRetry: handleRetry, onPromptAction: handlePromptAction, ...(onErrorAction !== undefined ? { onErrorAction } : {}), resolvedMounts: resolvedMounts, onViewPhase: onViewPhase, onViewDiagnosis: onViewDiagnosis, ...(viewProps !== undefined ? { viewProps } : {}) }), _jsxs("
|
|
232
|
+
return (_jsxs("div", { className: `guuey-chat-surface${className !== undefined ? ` ${className}` : ""}`, style: style, children: [_jsx(Transcript, { plan: plan, strings: strings, theme: theme, mode: mode, ...(windowing !== undefined ? { window: windowing } : {}), ...(components !== undefined ? { components } : {}), onToggle: toggle, onRetry: handleRetry, onPromptAction: handlePromptAction, ...(onErrorAction !== undefined ? { onErrorAction } : {}), resolvedMounts: resolvedMounts, onViewPhase: onViewPhase, onViewDiagnosis: onViewDiagnosis, ...(viewProps !== undefined ? { viewProps } : {}) }), oauthReturn.notice !== null && (_jsxs("p", { role: "status", className: `guuey-chat-oauth-notice guuey-chat-oauth-${oauthReturn.notice.kind}`, children: [oauthReturn.notice.kind === "connected"
|
|
233
|
+
? strings.oauthConnected(oauthReturn.notice.serverName)
|
|
234
|
+
: strings.oauthFailed(oauthReturn.notice.reason), _jsx("button", { type: "button", className: "guuey-chat-oauth-dismiss", onClick: oauthReturn.dismiss, children: strings.promptDismissed })] })), _jsxs("form", { className: "guuey-chat-composer", onSubmit: (e) => {
|
|
217
235
|
e.preventDefault();
|
|
218
236
|
submit();
|
|
219
237
|
}, children: [_jsx("textarea", { ref: inputRef, className: "guuey-chat-composer-input", rows: 1, value: input, onChange: (e) => setInput(e.target.value), onKeyDown: (e) => {
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { AgHitlAnswer, AgPausedAsk } from "@silverprotocol/core";
|
|
2
|
+
import type { HitlPromptAction } from "../hitl.js";
|
|
3
|
+
import { type OAuthReturn } from "../oauth.js";
|
|
4
|
+
import type { HitlPromptItem } from "../types.js";
|
|
5
|
+
/** The surface's own location as the next `returnTo` (stale return params stripped). */
|
|
6
|
+
export declare function oauthReturnToHere(): string;
|
|
7
|
+
/** The slice of `window` the opener touches (injectable — jsdom's `location.assign` cannot be spied). */
|
|
8
|
+
export interface OAuthWindow {
|
|
9
|
+
self: object;
|
|
10
|
+
top: object | null;
|
|
11
|
+
open: (url: string, target: string, features: string) => unknown;
|
|
12
|
+
location: {
|
|
13
|
+
assign: (url: string) => void;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Open the authorize link. In place when top-level (the dance ends back on
|
|
18
|
+
* this page); a new tab when framed (the IdP will not render in a frame —
|
|
19
|
+
* `returnTo` then lands the SAME page top-level in that tab, where
|
|
20
|
+
* {@link useOAuthReturn} shows the notice; the embedded chat picks the
|
|
21
|
+
* connection up on its next turn).
|
|
22
|
+
*/
|
|
23
|
+
export declare function openOAuthAuthorize(href: string, win?: OAuthWindow): void;
|
|
24
|
+
export interface UseOAuthReturnResult {
|
|
25
|
+
/** The broker's answer found on the address bar at mount, until dismissed. */
|
|
26
|
+
notice: OAuthReturn | null;
|
|
27
|
+
dismiss: () => void;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Read `?connected=<serverName>` / `?error=<reason>` off the current
|
|
31
|
+
* location ONCE (on mount), strip them from the address bar via
|
|
32
|
+
* `history.replaceState`, and expose the result as a dismissible notice.
|
|
33
|
+
* SSR-safe: nothing runs until the effect.
|
|
34
|
+
*/
|
|
35
|
+
export declare function useOAuthReturn(): UseOAuthReturnResult;
|
|
36
|
+
export interface OAuthPromptActionArgs {
|
|
37
|
+
item: HitlPromptItem;
|
|
38
|
+
action: HitlPromptAction;
|
|
39
|
+
/** The kit's ledger (`useTranscriptInputs().answerHitlPrompt`) — records the pick locally; nothing is delivered. */
|
|
40
|
+
answerHitlPrompt: (ask: AgPausedAsk, action: HitlPromptAction) => AgHitlAnswer;
|
|
41
|
+
/** Where the broker should send the user back; defaults to {@link oauthReturnToHere}. */
|
|
42
|
+
returnTo?: string;
|
|
43
|
+
/** How to open the link; defaults to {@link openOAuthAuthorize}. */
|
|
44
|
+
open?: (href: string, ask: AgPausedAsk) => void;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* The OAuth arm of a prompt action, shared by every web surface. Returns
|
|
48
|
+
* `false` (nothing done) when the item is not an OAuth ask, so a host's
|
|
49
|
+
* #207 hitl branch (build the answer, POST it to the pod door) runs as
|
|
50
|
+
* before. For an OAuth ask:
|
|
51
|
+
*
|
|
52
|
+
* - a mode pick (or a plain accept on a mode-less ask) records the pick in
|
|
53
|
+
* the ledger — the card shows "Connecting — <mode>" — and OPENS
|
|
54
|
+
* `authorizationUrl&mode=<id>&returnTo=<here>`; NOTHING is posted to the
|
|
55
|
+
* pod (there is no answer door — the answer is the redirect);
|
|
56
|
+
* - "Not now" / decline / dismiss all record `cancelled` (still pending,
|
|
57
|
+
* re-askable): nothing is written anywhere and the pod asks again next
|
|
58
|
+
* turn.
|
|
59
|
+
*/
|
|
60
|
+
export declare function oauthPromptAction(args: OAuthPromptActionArgs): boolean;
|
|
61
|
+
//# sourceMappingURL=oauth-return.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-return.d.ts","sourceRoot":"","sources":["../../src/react/oauth-return.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAA0D,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AACvG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,wFAAwF;AACxF,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,yGAAyG;AACzG,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;IACjE,QAAQ,EAAE;QAAE,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,CAAC;CAC7C;AAYD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,WAAoB,GAAG,IAAI,CAMhF;AAED,MAAM,WAAW,oBAAoB;IACnC,8EAA8E;IAC9E,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,IAAI,oBAAoB,CAarD;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,cAAc,CAAC;IACrB,MAAM,EAAE,gBAAgB,CAAC;IACzB,oHAAoH;IACpH,gBAAgB,EAAE,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,gBAAgB,KAAK,YAAY,CAAC;IAC/E,yFAAyF;IACzF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,KAAK,IAAI,CAAC;CACjD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAatE"}
|