@tangle-network/agent-app 0.60.167 → 0.60.169
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/agent-profiles/d1.js +3 -3
- package/dist/agent-profiles/index.js +3 -3
- package/dist/assistant/index.js +1 -1
- package/dist/channels/index.js +22 -6
- package/dist/channels/index.js.map +1 -1
- package/dist/chat-routes/index.js +4 -4
- package/dist/{chunk-KFHLPQBY.js → chunk-74WXGIEK.js} +4 -4
- package/dist/{chunk-AC3UE5JG.js → chunk-CCTQQ45L.js} +3 -2
- package/dist/chunk-CCTQQ45L.js.map +1 -0
- package/dist/{chunk-I5NRQZHR.js → chunk-GV7UGCKR.js} +3 -3
- package/dist/{chunk-URV33P74.js → chunk-MJ4PW262.js} +2 -2
- package/dist/{chunk-LM5AXKKO.js → chunk-N537SNWU.js} +2 -2
- package/dist/{chunk-UGKGZHKA.js → chunk-UK4PVX2T.js} +5 -5
- package/dist/{chunk-UGKGZHKA.js.map → chunk-UK4PVX2T.js.map} +1 -1
- package/dist/hosted-agent/react/contracts.d.ts +1 -1
- package/dist/hosted-agent/react/index.js +14 -9
- package/dist/hosted-agent/react/index.js.map +1 -1
- package/dist/preset-cloudflare/index.js +2 -2
- package/dist/public-consultation/index.d.ts +1 -1
- package/dist/sandbox/index.js +4 -4
- package/dist/tools/index.js +4 -4
- package/dist/web-react/agent-profile-editor.d.ts +1 -1
- package/dist/web-react/agent-profile-editor.js +1 -1
- package/dist/web-react/index.js +1 -1
- package/dist/work-product/index.js +2 -2
- package/package.json +22 -22
- package/dist/chunk-AC3UE5JG.js.map +0 -1
- /package/dist/{chunk-KFHLPQBY.js.map → chunk-74WXGIEK.js.map} +0 -0
- /package/dist/{chunk-I5NRQZHR.js.map → chunk-GV7UGCKR.js.map} +0 -0
- /package/dist/{chunk-URV33P74.js.map → chunk-MJ4PW262.js.map} +0 -0
- /package/dist/{chunk-LM5AXKKO.js.map → chunk-N537SNWU.js.map} +0 -0
|
@@ -38,7 +38,7 @@ export type LineLastTurn = {
|
|
|
38
38
|
export interface LineSetupLine extends Pick<Line, 'id' | 'connectionId' | 'transport' | 'address' | 'connect' | 'routerAddress' | 'providerNumberId' | 'status'> {
|
|
39
39
|
/** The attachment shown to the user; hosts can reject a stale disconnect. */
|
|
40
40
|
attachmentId?: string | null;
|
|
41
|
-
/** True only while
|
|
41
|
+
/** True only while the host confirms routing to an agent or box; voice also needs enabled call routing. */
|
|
42
42
|
answering: boolean;
|
|
43
43
|
/** The viewer may disconnect this line. A workspace list can include other agents' lines. */
|
|
44
44
|
canDisconnect: boolean;
|
|
@@ -6,10 +6,12 @@ var TRANSPORT = {
|
|
|
6
6
|
imessage: "iMessage",
|
|
7
7
|
sms: "SMS",
|
|
8
8
|
whatsapp: "WhatsApp",
|
|
9
|
-
email: "Email"
|
|
9
|
+
email: "Email",
|
|
10
|
+
telegram: "Telegram",
|
|
11
|
+
voice: "Voice"
|
|
10
12
|
};
|
|
11
13
|
var IDENTITY = {
|
|
12
|
-
handle: "
|
|
14
|
+
handle: "Handle",
|
|
13
15
|
number: "Dedicated number",
|
|
14
16
|
email: "Email line"
|
|
15
17
|
};
|
|
@@ -35,14 +37,17 @@ function choicesFor(snapshot) {
|
|
|
35
37
|
identity
|
|
36
38
|
})));
|
|
37
39
|
}
|
|
40
|
+
function requiresNumber(identity) {
|
|
41
|
+
return identity.transport === "whatsapp" || identity.transport === "sms" || identity.transport === "voice" || identity.requiresPhoneNumberId === true;
|
|
42
|
+
}
|
|
38
43
|
function canOfferReconnect(line, choice) {
|
|
39
44
|
if (line.connectionId !== choice.connection.id || line.transport !== choice.identity.transport || line.targetId !== null) return false;
|
|
40
|
-
if (line.providerNumberId === null) return
|
|
41
|
-
return choice.identity.phoneNumberId === line.providerNumberId || !choice.identity.phoneNumberId && choice.identity
|
|
45
|
+
if (line.providerNumberId === null) return !choice.identity.phoneNumberId && !requiresNumber(choice.identity);
|
|
46
|
+
return choice.identity.phoneNumberId === line.providerNumberId || !choice.identity.phoneNumberId && requiresNumber(choice.identity);
|
|
42
47
|
}
|
|
43
48
|
function matchesLineIdentity(line, identity, numberId) {
|
|
44
49
|
if (line.transport !== identity.transport) return false;
|
|
45
|
-
if (line.providerNumberId === null) return
|
|
50
|
+
if (line.providerNumberId === null) return !identity.phoneNumberId && !requiresNumber(identity);
|
|
46
51
|
return numberId === line.providerNumberId;
|
|
47
52
|
}
|
|
48
53
|
function LineSetup({ client, scopeKey, initialTargetId, targetLabel, canManage, canConnect = canManage, showConnectionSetup = true, connectPrerequisite, setupDescription, emptyConnectionsMessage, onNotice }) {
|
|
@@ -151,8 +156,8 @@ function LineSetup({ client, scopeKey, initialTargetId, targetLabel, canManage,
|
|
|
151
156
|
const SetupHeading = showExisting ? "h3" : "h2";
|
|
152
157
|
const selectedTarget = snapshot?.targets.find((target) => target.id === targetId);
|
|
153
158
|
const selectedMode = selectedTarget?.modes.includes(boxMode) ? boxMode : selectedTarget?.modes[0];
|
|
154
|
-
const enteredNumber = selected?.identity.phoneNumberId ?? phoneNumberId.trim();
|
|
155
|
-
const needsNumber = selected
|
|
159
|
+
const enteredNumber = (selected?.identity.phoneNumberId ?? phoneNumberId).trim();
|
|
160
|
+
const needsNumber = selected && requiresNumber(selected.identity);
|
|
156
161
|
const occupied = selected && snapshot?.lines.filter((line) => line.status !== "released" && line.transport === selected.identity.transport);
|
|
157
162
|
const [occupiedLine] = occupied || [];
|
|
158
163
|
const reconnectChoice = Boolean(selected && occupied?.length === 1 && occupiedLine && canOfferReconnect(occupiedLine, selected));
|
|
@@ -183,7 +188,7 @@ function LineSetup({ client, scopeKey, initialTargetId, targetLabel, canManage,
|
|
|
183
188
|
return;
|
|
184
189
|
}
|
|
185
190
|
const line = updated.lines.find((item) => item.status !== "released" && item.connectionId === selected.connection.id && item.transport === selected.identity.transport && item.providerNumberId === (enteredNumber || null));
|
|
186
|
-
onNotice?.({ kind: "success", message: line?.answering ? "The line is answering." : "Line connected. Add a member to start answers." });
|
|
191
|
+
onNotice?.({ kind: "success", message: line?.answering ? "The line is answering." : selected.identity.transport === "voice" ? "Voice line connected. Configure calls and verify prior member consent in your host." : "Line connected. Add a member to start answers." });
|
|
187
192
|
} catch (cause) {
|
|
188
193
|
if (!stillCurrent(requestIncarnation)) return;
|
|
189
194
|
const detail = message(cause);
|
|
@@ -247,7 +252,7 @@ function LineSetup({ client, scopeKey, initialTargetId, targetLabel, canManage,
|
|
|
247
252
|
/* @__PURE__ */ jsxs("div", { className: "tangle-lines__row-main", children: [
|
|
248
253
|
/* @__PURE__ */ jsxs("div", { className: "tangle-lines__row-heading", children: [
|
|
249
254
|
/* @__PURE__ */ jsx("span", { className: "tangle-lines__transport", children: TRANSPORT[line.transport] }),
|
|
250
|
-
/* @__PURE__ */ jsx("span", { className: `tangle-lines__status${line.answering ? " tangle-lines__status--answering" : ""}`, children: line.answering ? "Answering" : line.targetId === null ? "Disconnected" : line.status === "active" ? "Awaiting member" : line.status })
|
|
255
|
+
/* @__PURE__ */ jsx("span", { className: `tangle-lines__status${line.answering ? " tangle-lines__status--answering" : ""}`, children: line.answering ? "Answering" : line.targetId === null ? "Disconnected" : line.status === "active" ? line.transport === "voice" ? "Not answering" : "Awaiting member" : line.status })
|
|
251
256
|
] }),
|
|
252
257
|
/* @__PURE__ */ jsx("strong", { children: line.address }),
|
|
253
258
|
line.transport === "imessage" && line.connect && line.routerAddress && line.targetId !== null && /* @__PURE__ */ jsxs("p", { children: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/hosted-agent/react/LineSetup.tsx","../../../src/hosted-agent/react/LineMembers.tsx","../../../src/hosted-agent/react/LineBilling.tsx","../../../src/hosted-agent/react/ApplicationLineSetup.tsx","../../../src/hosted-agent/react/SharedLineAppNotice.tsx"],"sourcesContent":["import { useEffect, useLayoutEffect, useRef, useState } from 'react'\nimport type { Line } from '@tangle-network/sandbox'\nimport type {\n LineBoxMode, LineConnectInput, LineConnectionOption, LineIdentityKind, LineIdentityOption,\n LineSetupLine, LineSetupProps, LineSetupSnapshot,\n} from './contracts'\n\nconst useBrowserLayoutEffect = typeof document !== 'undefined' ? useLayoutEffect : useEffect\n\nconst TRANSPORT: Record<Line['transport'], string> = {\n imessage: 'iMessage', sms: 'SMS', whatsapp: 'WhatsApp', email: 'Email',\n}\nconst IDENTITY: Record<LineIdentityKind, string> = {\n handle: 'Inkbox handle', number: 'Dedicated number', email: 'Email line',\n}\n\ntype Choice = { key: string; connection: LineConnectionOption; identity: LineIdentityOption }\n\nfunction LineMessageAction({ line }: { line: LineSetupLine }) {\n if (line.transport !== 'imessage' || line.targetId === null || line.status !== 'active') return null\n if (!!line.connect !== !!line.routerAddress) return null\n const shared = !!line.connect && !!line.routerAddress\n const number = shared ? line.routerAddress : line.address\n if (!number || !/^\\+[1-9]\\d{7,14}$/.test(number)) return null\n return <a className=\"tangle-lines__primary tangle-lines__message-action\" href={`sms:${number}?body=${encodeURIComponent(shared ? line.connect ?? '' : 'Hello')}`}>\n {shared ? 'Connect iMessage' : 'Text it now'}\n </a>\n}\n\nfunction message(error: unknown): string {\n return error instanceof Error ? error.message : 'The line request failed. Try again.'\n}\n\nfunction dateTime(value: string): string {\n const date = new Date(value)\n return Number.isNaN(date.getTime()) ? value : date.toLocaleString()\n}\n\nfunction choicesFor(snapshot: LineSetupSnapshot): Choice[] {\n return (snapshot.connections ?? []).flatMap(connection => connection.identities.map((identity, index) => ({\n key: `${connection.id}:${index}`,\n connection,\n identity,\n })))\n}\n\nfunction canOfferReconnect(line: LineSetupLine, choice: Choice): boolean {\n if (line.connectionId !== choice.connection.id || line.transport !== choice.identity.transport || line.targetId !== null) return false\n if (line.providerNumberId === null) return line.transport !== 'whatsapp' && !choice.identity.phoneNumberId && !choice.identity.requiresPhoneNumberId\n return choice.identity.phoneNumberId === line.providerNumberId ||\n (!choice.identity.phoneNumberId && choice.identity.requiresPhoneNumberId === true)\n}\n\nfunction matchesLineIdentity(line: LineSetupLine, identity: LineIdentityOption, numberId: string): boolean {\n if (line.transport !== identity.transport) return false\n if (line.providerNumberId === null) return line.transport !== 'whatsapp' && !identity.phoneNumberId && !identity.requiresPhoneNumberId\n return numberId === line.providerNumberId\n}\n\n/** Set up an owned identity through a host route backed by sandbox.lines and Hub. */\nexport function LineSetup({ client, scopeKey, initialTargetId, targetLabel, canManage, canConnect = canManage, showConnectionSetup = true, connectPrerequisite, setupDescription, emptyConnectionsMessage, onNotice }: LineSetupProps) {\n const clientRef = useRef(client)\n clientRef.current = client\n const sequence = useRef(0)\n const incarnation = useRef(0)\n const confirmButton = useRef<HTMLButtonElement>(null)\n const heading = useRef<HTMLHeadingElement>(null)\n const setupHeading = useRef<HTMLHeadingElement>(null)\n const disconnectTriggers = useRef(new Map<string, HTMLButtonElement>())\n const restoreFocusTo = useRef<string | null>(null)\n useBrowserLayoutEffect(() => {\n incarnation.current++\n return () => { incarnation.current++ }\n }, [scopeKey, initialTargetId])\n const [loadedSnapshot, setLoadedSnapshot] = useState<{ scopeKey: string; initialTargetId: string | undefined; value: LineSetupSnapshot } | null>(null)\n const snapshot = loadedSnapshot?.scopeKey === scopeKey && loadedSnapshot.initialTargetId === initialTargetId ? loadedSnapshot.value : null\n const [loading, setLoading] = useState(true)\n const [refreshFailed, setRefreshFailed] = useState(false)\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [kind, setKind] = useState<LineIdentityKind>('handle')\n const [choiceKey, setChoiceKey] = useState('')\n const [targetId, setTargetId] = useState(initialTargetId ?? '')\n const [boxMode, setBoxMode] = useState<LineBoxMode>('per-member')\n const [phoneNumberId, setPhoneNumberId] = useState('')\n const [confirmation, setConfirmation] = useState<{ lineId: string; attachmentId: string | undefined } | null>(null)\n const confirmLineId = confirmation?.lineId ?? null\n\n function stillCurrent(requestIncarnation: number): boolean {\n return requestIncarnation === incarnation.current\n }\n\n async function reload(requestIncarnation: number): Promise<LineSetupSnapshot | null> {\n const request = ++sequence.current\n try {\n const next = await clientRef.current.load()\n if (request !== sequence.current || !stillCurrent(requestIncarnation)) return null\n setLoadedSnapshot({ scopeKey, initialTargetId, value: next })\n setError(null)\n setRefreshFailed(false)\n setTargetId(current => next.targets.some(target => target.id === current)\n ? current : next.targets.find(target => target.id === initialTargetId)?.id ?? next.targets[0]?.id ?? '')\n setLoading(false)\n return next\n } catch (cause) {\n if (request !== sequence.current || !stillCurrent(requestIncarnation)) return null\n setError(message(cause))\n setRefreshFailed(true)\n setLoading(false)\n return null\n }\n }\n\n function retry() {\n if (loading) return\n setLoading(true)\n void reload(incarnation.current)\n }\n\n function closeConfirmation(lineId: string) {\n restoreFocusTo.current = lineId\n setConfirmation(null)\n }\n\n useEffect(() => {\n setLoading(true)\n setLoadedSnapshot(null)\n setError(null)\n setRefreshFailed(false)\n setBusy(false)\n setKind('handle')\n setChoiceKey('')\n setTargetId(initialTargetId ?? '')\n setBoxMode('per-member')\n setPhoneNumberId('')\n setConfirmation(null)\n restoreFocusTo.current = null\n void reload(incarnation.current)\n return () => { sequence.current++ }\n }, [scopeKey, initialTargetId])\n\n useEffect(() => {\n if (confirmLineId) confirmButton.current?.focus()\n }, [confirmLineId])\n\n useEffect(() => {\n const lineId = restoreFocusTo.current\n if (confirmLineId !== null || lineId === null) return\n restoreFocusTo.current = null\n const trigger = disconnectTriggers.current.get(lineId)\n if (trigger && !trigger.disabled) trigger.focus()\n else (heading.current ?? setupHeading.current)?.focus()\n }, [confirmLineId, snapshot, refreshFailed])\n\n const allChoices = snapshot ? choicesFor(snapshot) : []\n const choices = snapshot ? allChoices.filter(choice => {\n const occupied = snapshot.lines.filter(line => line.status !== 'released' && line.transport === choice.identity.transport)\n const [line] = occupied\n return occupied.length === 0 || (occupied.length === 1 && line !== undefined && canOfferReconnect(line, choice))\n }) : []\n const availableKinds = (['handle', 'number', 'email'] as const).filter(value => choices.some(choice => choice.identity.kind === value))\n const selectedKind = availableKinds.includes(kind) ? kind : availableKinds[0]\n const kindChoices = choices.filter(choice => choice.identity.kind === selectedKind)\n const selected = kindChoices.find(choice => choice.key === choiceKey) ?? kindChoices[0]\n const visibleLines = snapshot?.lines.filter(line => line.status !== 'released') ?? []\n const showSetup = Boolean(snapshot && canManage && showConnectionSetup &&\n (snapshot.connections === null || choices.length > 0 || allChoices.length === 0))\n const showExisting = snapshot ? visibleLines.length > 0 || !showSetup : !(canManage && showConnectionSetup)\n const hasSeveralChoices = availableKinds.length > 1 || kindChoices.length > 1 || (snapshot?.targets.length ?? 0) > 1\n const SetupHeading = showExisting ? 'h3' : 'h2'\n const selectedTarget = snapshot?.targets.find(target => target.id === targetId)\n const selectedMode = selectedTarget?.modes.includes(boxMode) ? boxMode : selectedTarget?.modes[0]\n const enteredNumber = selected?.identity.phoneNumberId ?? phoneNumberId.trim()\n const needsNumber = selected?.identity.transport === 'whatsapp' || selected?.identity.requiresPhoneNumberId\n const occupied = selected && snapshot?.lines.filter(line => line.status !== 'released' && line.transport === selected.identity.transport)\n const [occupiedLine] = occupied || []\n const reconnectChoice = Boolean(selected && occupied?.length === 1 && occupiedLine && canOfferReconnect(occupiedLine, selected))\n const reconnecting = Boolean(reconnectChoice && selected && occupiedLine &&\n matchesLineIdentity(occupiedLine, selected.identity, enteredNumber))\n const blockedByExistingLine = Boolean(occupied?.length && !reconnecting)\n const answeringCount = snapshot?.lines.filter(line => line.answering).length ?? 0\n const draft: LineConnectInput | null = selected && selectedTarget && selectedMode\n ? {\n connectionId: selected.connection.id,\n transport: selected.identity.transport,\n ...(enteredNumber ? { phoneNumberId: enteredNumber } : {}),\n targetId: selectedTarget.id,\n boxMode: selectedMode,\n } : null\n const prerequisite = draft ? connectPrerequisite?.(draft) : null\n const connectReady = Boolean(canManage && canConnect && draft && (prerequisite?.ready ?? true)\n && !(needsNumber && !enteredNumber) && !blockedByExistingLine && !busy && !loading && !refreshFailed)\n\n async function connect() {\n if (!connectReady || !draft || !selected) return\n const requestIncarnation = incarnation.current\n setBusy(true)\n setError(null)\n try {\n await clientRef.current.connect(draft)\n if (!stillCurrent(requestIncarnation)) return\n const updated = await reload(requestIncarnation)\n if (!stillCurrent(requestIncarnation)) return\n if (!updated) {\n onNotice?.({ kind: 'error', message: 'Line connected, but its current status could not be loaded.' })\n return\n }\n const line = updated.lines.find(item => item.status !== 'released' && item.connectionId === selected.connection.id &&\n item.transport === selected.identity.transport && item.providerNumberId === (enteredNumber || null))\n onNotice?.({ kind: 'success', message: line?.answering ? 'The line is answering.' : 'Line connected. Add a member to start answers.' })\n } catch (cause) {\n if (!stillCurrent(requestIncarnation)) return\n const detail = message(cause)\n setError(detail)\n onNotice?.({ kind: 'error', message: detail })\n } finally {\n if (stillCurrent(requestIncarnation)) setBusy(false)\n }\n }\n\n async function disconnect() {\n if (!confirmation || busy || loading || refreshFailed) return\n const { lineId, attachmentId: expectedAttachmentId } = confirmation\n const requestIncarnation = incarnation.current\n setBusy(true)\n setError(null)\n try {\n await clientRef.current.disconnect(lineId, expectedAttachmentId)\n if (!stillCurrent(requestIncarnation)) return\n const updated = await reload(requestIncarnation)\n if (!stillCurrent(requestIncarnation)) return\n closeConfirmation(lineId)\n onNotice?.(updated\n ? { kind: 'success', message: 'The line stopped answering.' }\n : { kind: 'error', message: 'Line disconnected, but its current status could not be loaded.' })\n } catch (cause) {\n if (!stillCurrent(requestIncarnation)) return\n const detail = message(cause)\n setError(detail)\n onNotice?.({ kind: 'error', message: detail })\n } finally {\n if (stillCurrent(requestIncarnation)) setBusy(false)\n }\n }\n\n return <section className=\"tangle-lines\" aria-label=\"Agent lines\">\n {showExisting && <header className=\"tangle-lines__heading\">\n <div>\n <h2 ref={heading} tabIndex={-1}>Lines</h2>\n {snapshot && <p>{snapshot.workspaceName} can use one line per transport.</p>}\n </div>\n {answeringCount > 1 && <span className=\"tangle-lines__count\">{answeringCount} answering</span>}\n </header>}\n\n {error && <div className=\"tangle-lines__error\" role=\"alert\">\n <div><strong>{refreshFailed ? 'Lines are unavailable' : 'Line action failed'}</strong><p>{error}</p></div>\n {(!snapshot || refreshFailed) && <button type=\"button\" disabled={loading} onClick={retry}>Retry</button>}\n </div>}\n {loading && <p className=\"tangle-lines__muted\" role=\"status\">Loading lines…</p>}\n\n {snapshot && <>\n {showExisting && <div className=\"tangle-lines__list\">\n {visibleLines.length === 0 &&\n <div className=\"tangle-lines__empty\"><strong>No lines connected</strong><p>{canManage && showConnectionSetup\n ? 'Connect an owned identity below to let this workspace answer messages.'\n : 'There are no connected lines in this workspace.'}</p></div>}\n {visibleLines.map(line =>\n <div className=\"tangle-lines__row\" key={line.id}>\n <div className=\"tangle-lines__row-main\">\n <div className=\"tangle-lines__row-heading\"><span className=\"tangle-lines__transport\">{TRANSPORT[line.transport]}</span><span className={`tangle-lines__status${line.answering ? ' tangle-lines__status--answering' : ''}`}>{line.answering ? 'Answering' : line.targetId === null ? 'Disconnected' : line.status === 'active' ? 'Awaiting member' : line.status}</span></div>\n <strong>{line.address}</strong>\n {line.transport === 'imessage' && line.connect && line.routerAddress && line.targetId !== null && <p>Send <code>{line.connect}</code> to {line.routerAddress}. Then message the number Inkbox sends you.</p>}\n <LineMessageAction line={line} />\n <p>{line.targetLabel ?? 'No agent or box assigned'}{line.boxMode && ` · ${line.boxMode === 'per-member' ? 'one box per member' : 'shared box'}`}</p>\n {line.lastTurn.kind === 'latest' ? <p>Last turn: {line.lastTurn.status} · {dateTime(line.lastTurn.at)}</p>\n : <p>{line.lastTurn.kind === 'none' ? 'No turns yet.' : 'Turn history unavailable.'}</p>}\n </div>\n {canManage && line.canDisconnect && line.targetId !== null && line.status === 'active' && <div className=\"tangle-lines__row-actions\">\n {confirmLineId === line.id ? <div className=\"tangle-lines__confirm\" role=\"group\" aria-label={`Disconnect ${line.address}?`}>\n <span>Disconnect this line?</span>\n <button ref={confirmButton} type=\"button\" className=\"tangle-lines__danger\" disabled={busy || loading || refreshFailed} onClick={() => void disconnect()}>Disconnect</button>\n <button type=\"button\" disabled={busy} onClick={() => closeConfirmation(line.id)}>Keep line</button>\n </div> : <button ref={node => { if (node) disconnectTriggers.current.set(line.id, node); else disconnectTriggers.current.delete(line.id) }} type=\"button\" className=\"tangle-lines__quiet\" disabled={busy || loading || refreshFailed} onClick={() => setConfirmation({ lineId: line.id, attachmentId: line.attachmentId ?? undefined })}>Disconnect line</button>}\n </div>}\n </div>)}\n </div>}\n\n {showSetup && <div className={`tangle-lines__setup${showExisting ? '' : ' tangle-lines__setup--first'}`}>\n <SetupHeading ref={setupHeading} tabIndex={-1}>Connect a line</SetupHeading>\n {hasSeveralChoices && setupDescription && <p>{setupDescription}</p>}\n {snapshot.connections === null ? <div className=\"tangle-lines__error\" role=\"status\">\n <span>Hub connections could not be read. Check Hub access and try again.</span>\n <button type=\"button\" disabled={loading} onClick={retry}>Retry</button>\n </div>\n : availableKinds.length === 0 ? <p className=\"tangle-lines__empty\">\n {emptyConnectionsMessage ?? 'Connect an owned handle, number, or mailbox in Hub, then'} <button type=\"button\" disabled={loading} onClick={retry}>reload</button>.\n </p>\n : <>\n {availableKinds.length > 1 && <div className=\"tangle-lines__kinds\" role=\"group\" aria-label=\"Identity type\">\n {availableKinds.map(value => <button key={value} type=\"button\" aria-pressed={selectedKind === value} onClick={() => { setKind(value); setChoiceKey(''); setPhoneNumberId('') }}>{IDENTITY[value]}</button>)}\n </div>}\n <div className=\"tangle-lines__fields\">\n {kindChoices.length > 1 ? <label>Line\n <select value={selected?.key ?? ''} onChange={event => { setChoiceKey(event.target.value); setPhoneNumberId('') }}>\n {kindChoices.map(choice => <option key={choice.key} value={choice.key}>{choice.identity.label} · {TRANSPORT[choice.identity.transport]} via {choice.connection.label}</option>)}\n </select>\n </label> : selected && <div className=\"tangle-lines__fixed-choice\">\n <span>Line</span>\n <strong>{selected.identity.label}</strong>\n <small>{TRANSPORT[selected.identity.transport]} via {selected.connection.label}</small>\n </div>}\n {snapshot.targets.length > 1 ? <label>{targetLabel ?? 'Agent or box'}\n <select value={selectedTarget?.id ?? ''} onChange={event => setTargetId(event.target.value)}>\n {snapshot.targets.map(target => <option key={target.id} value={target.id}>{target.label}{targetLabel ? '' : ` · ${target.kind}`}</option>)}\n </select>\n </label> : selectedTarget && <div className=\"tangle-lines__fixed-choice\">\n <span>{targetLabel ?? 'Agent or box'}</span>\n <strong>{selectedTarget.label}{targetLabel ? '' : ` · ${selectedTarget.kind}`}</strong>\n </div>}\n {selectedTarget && selectedTarget.modes.length > 1 && <fieldset>\n <legend>Conversation space</legend>\n <label><input type=\"radio\" name={`line-box-mode-${scopeKey}`} value=\"per-member\" checked={selectedMode === 'per-member'} disabled={!selectedTarget?.modes.includes('per-member')} onChange={() => setBoxMode('per-member')} /> One box per member</label>\n <label><input type=\"radio\" name={`line-box-mode-${scopeKey}`} value=\"shared\" checked={selectedMode === 'shared'} disabled={!selectedTarget?.modes.includes('shared')} onChange={() => setBoxMode('shared')} /> Shared box for a team</label>\n </fieldset>}\n {needsNumber && !selected?.identity.phoneNumberId && <label>Existing provider number ID\n <input value={phoneNumberId} onChange={event => setPhoneNumberId(event.target.value)} autoComplete=\"off\" placeholder=\"Number ID from Hub\" />\n </label>}\n </div>\n {reconnectChoice && blockedByExistingLine && <p className=\"tangle-lines__warning\">Enter this line's current provider number ID to reconnect.</p>}\n {prerequisite?.content}\n <button className=\"tangle-lines__primary\" type=\"button\" disabled={!connectReady} onClick={() => void connect()}>\n {busy ? (reconnectChoice ? 'Reconnecting…' : 'Connecting…') : `${reconnectChoice ? 'Reconnect' : 'Connect'} ${selected ? TRANSPORT[selected.identity.transport] : 'line'}`}\n </button>\n </>}\n </div>}\n </>}\n </section>\n}\n","import { useEffect, useLayoutEffect, useRef, useState } from 'react'\nimport type { LineMember } from '@tangle-network/sandbox'\nimport type { LineMembersProps } from './contracts'\n\nconst useBrowserLayoutEffect = typeof document !== 'undefined' ? useLayoutEffect : useEffect\n\nconst STATUS: Record<LineMember['status'], { label: string; detail: string }> = {\n invited: { label: 'Awaiting consent', detail: 'The first message from this address confirms consent.' },\n active: { label: 'Consented', detail: 'This member has sent a message to the line.' },\n stopped: { label: 'Stopped', detail: 'The member texted STOP. Only a message from them with START resumes replies.' },\n removed: { label: 'Removed', detail: 'This address no longer has access to the line.' },\n}\n\nfunction errorMessage(cause: unknown): string {\n return cause instanceof Error ? cause.message : 'The member request failed. Try again.'\n}\n\n/** Manage Hub line members while keeping consent and STOP authority with the sender. */\nexport function LineMembers({ lineId, scopeKey, client, roles, canManage, canAdd = true, maxMembers, allowRoleChange = true, allowRemoveLastOwner = false, onNotice }: LineMembersProps) {\n const clientRef = useRef(client)\n clientRef.current = client\n const sequence = useRef(0)\n const incarnation = useRef(0)\n const confirmButton = useRef<HTMLButtonElement>(null)\n const heading = useRef<HTMLHeadingElement>(null)\n const removeTriggers = useRef(new Map<string, HTMLButtonElement>())\n const restoreFocusTo = useRef<string | null>(null)\n useBrowserLayoutEffect(() => {\n incarnation.current++\n return () => { incarnation.current++ }\n }, [lineId, scopeKey])\n const [memberSnapshot, setMemberSnapshot] = useState<{ lineId: string; scopeKey: string; members: LineMember[] } | null>(null)\n const [error, setError] = useState<string | null>(null)\n const [refreshFailed, setRefreshFailed] = useState(false)\n const [address, setAddress] = useState('')\n const [label, setLabel] = useState('')\n const [role, setRole] = useState('member')\n const [busy, setBusy] = useState<string | null>(null)\n const [confirmId, setConfirmId] = useState<string | null>(null)\n const members = memberSnapshot?.lineId === lineId && memberSnapshot.scopeKey === scopeKey ? memberSnapshot.members : null\n\n function stillCurrent(requestIncarnation: number): boolean {\n return requestIncarnation === incarnation.current\n }\n\n async function reload(requestIncarnation: number): Promise<boolean> {\n const request = ++sequence.current\n try {\n const next = await clientRef.current.list(lineId)\n if (request !== sequence.current || !stillCurrent(requestIncarnation)) return false\n setMemberSnapshot({ lineId, scopeKey, members: next })\n setError(null)\n setRefreshFailed(false)\n return true\n } catch (cause) {\n if (request !== sequence.current || !stillCurrent(requestIncarnation)) return false\n setError(errorMessage(cause))\n setRefreshFailed(true)\n return false\n }\n }\n\n async function retry() {\n if (busy) return\n const requestIncarnation = incarnation.current\n setBusy('refresh')\n try { await reload(requestIncarnation) }\n finally { if (stillCurrent(requestIncarnation)) setBusy(null) }\n }\n\n function closeConfirmation(memberId: string) {\n restoreFocusTo.current = memberId\n setConfirmId(null)\n }\n\n useEffect(() => {\n setMemberSnapshot(null)\n setError(null)\n setRefreshFailed(false)\n setAddress('')\n setLabel('')\n setRole('member')\n setConfirmId(null)\n restoreFocusTo.current = null\n setBusy(null)\n void reload(incarnation.current)\n return () => { sequence.current++ }\n }, [lineId, scopeKey])\n\n useEffect(() => {\n if (confirmId) confirmButton.current?.focus()\n }, [confirmId])\n\n useEffect(() => {\n const memberId = restoreFocusTo.current\n if (confirmId !== null || memberId === null) return\n restoreFocusTo.current = null\n const trigger = removeTriggers.current.get(memberId)\n if (trigger && !trigger.disabled) trigger.focus()\n else heading.current?.focus()\n }, [confirmId, members, refreshFailed])\n\n const selectedRole = roles.some(item => item.value === role) ? role : roles.find(item => item.value === 'member')?.value ?? roles[0]?.value ?? ''\n const activeMembers = members?.filter(member => member.status !== 'removed').length ?? 0\n const activeOwners = members?.filter(member => member.role === 'owner' && member.status !== 'removed').length ?? 0\n\n async function mutate(key: string, action: () => Promise<void>, success: string, onSuccess?: () => void) {\n if (busy || refreshFailed) return\n const requestIncarnation = incarnation.current\n setBusy(key)\n setError(null)\n try {\n await action()\n if (!stillCurrent(requestIncarnation)) return\n const refreshed = await reload(requestIncarnation)\n if (!stillCurrent(requestIncarnation)) return\n onSuccess?.()\n onNotice?.(refreshed\n ? { kind: 'success', message: success }\n : { kind: 'error', message: 'Member updated, but the current member list could not be loaded.' })\n } catch (cause) {\n if (!stillCurrent(requestIncarnation)) return\n const detail = errorMessage(cause)\n setError(detail)\n onNotice?.({ kind: 'error', message: detail })\n } finally {\n if (stillCurrent(requestIncarnation)) setBusy(null)\n }\n }\n\n function add() {\n const trimmed = address.trim()\n if (!trimmed || !selectedRole || members === null || (maxMembers !== undefined && activeMembers >= maxMembers)) return\n void mutate('add', () => clientRef.current.add(lineId, { address: trimmed, role: selectedRole, ...(label.trim() ? { label: label.trim() } : {}) }), 'Member invited. Their first message confirms consent.', () => {\n setAddress('')\n setLabel('')\n })\n }\n\n return <section className=\"tangle-lines\" aria-label=\"Line members\">\n <header className=\"tangle-lines__heading\">\n <div><h2 ref={heading} tabIndex={-1}>Members</h2><p>Each address controls its own consent and STOP state.</p></div>\n {members && <span className=\"tangle-lines__count\">{activeMembers} {activeMembers === 1 ? 'member' : 'members'}</span>}\n </header>\n {error && <div className=\"tangle-lines__error\" role=\"alert\">\n <span>{error}</span>\n {(members === null || refreshFailed) && <button type=\"button\" disabled={busy !== null} onClick={() => void retry()}>Retry</button>}\n </div>}\n {members === null ? !error && <p className=\"tangle-lines__muted\" role=\"status\">Loading members…</p> : <div className=\"tangle-lines__list\">\n {members.length === 0 && <p className=\"tangle-lines__empty\">{canAdd ? 'No members yet. Invite an address that you own or have permission to add.' : 'No members yet.'}</p>}\n {members.map(member => {\n const lastOwner = member.role === 'owner' && activeOwners <= 1\n const editable = canManage && member.status !== 'removed' && (!lastOwner || allowRemoveLastOwner)\n return <div className=\"tangle-lines__row\" key={member.id}>\n <div className=\"tangle-lines__row-main\">\n <span className={`tangle-lines__state tangle-lines__state--${member.status}`}>{STATUS[member.status].label}</span>\n <strong>{member.label || member.address}</strong>\n {member.label && <p>{member.address}</p>}\n <p>{STATUS[member.status].detail}</p>\n </div>\n <div className=\"tangle-lines__row-actions\">\n {editable ? <>\n {allowRoleChange && !lastOwner ? <label className=\"tangle-lines__compact-label\">Role\n <select value={member.role} disabled={busy !== null || refreshFailed} onChange={event => void mutate(member.id, () => clientRef.current.update(lineId, member.id, { role: event.target.value }), 'Role updated.')}>\n {!roles.some(item => item.value === member.role) && <option value={member.role}>{member.role}</option>}\n {roles.map(item => <option key={item.value} value={item.value}>{item.label}{item.tools === 'chat' ? ' · chat only' : ''}</option>)}\n </select>\n </label> : <span className=\"tangle-lines__role\">{roles.find(item => item.value === member.role)?.label ?? member.role}</span>}\n {confirmId === member.id ? <div className=\"tangle-lines__confirm\" role=\"group\" aria-label={`Remove ${member.label || member.address}?`}>\n <span>Remove {member.label || member.address}?</span>\n <button ref={confirmButton} type=\"button\" className=\"tangle-lines__danger\" disabled={busy !== null || refreshFailed} onClick={() => void mutate(member.id, () => clientRef.current.remove(lineId, member.id), 'Member removed.', () => closeConfirmation(member.id))}>Remove</button>\n <button type=\"button\" disabled={busy !== null} onClick={() => closeConfirmation(member.id)}>Keep</button>\n </div> : <button ref={node => { if (node) removeTriggers.current.set(member.id, node); else removeTriggers.current.delete(member.id) }} type=\"button\" className=\"tangle-lines__quiet\" disabled={busy !== null || refreshFailed} onClick={() => setConfirmId(member.id)}>Remove</button>}\n </> : <span className=\"tangle-lines__role\">{roles.find(item => item.value === member.role)?.label ?? member.role}</span>}\n </div>\n </div>\n })}\n </div>}\n\n {canManage && canAdd && members !== null && (maxMembers === undefined || activeMembers < maxMembers) && <div className=\"tangle-lines__setup\">\n <h3>Invite a member</h3>\n <p>Hub marks the address as invited. The member confirms by messaging the line.</p>\n <div className=\"tangle-lines__fields\">\n <label>Phone number or email\n <input value={address} onChange={event => setAddress(event.target.value)} autoComplete=\"off\" placeholder=\"+15551234567 or name@example.com\" />\n </label>\n <label>Name (optional)\n <input value={label} onChange={event => setLabel(event.target.value)} placeholder=\"Member name\" />\n </label>\n <label>Role\n <select value={selectedRole} disabled={roles.length === 0} onChange={event => setRole(event.target.value)}>\n {roles.map(item => <option key={item.value} value={item.value}>{item.label}{item.tools === 'chat' ? ' · chat only' : ''}</option>)}\n </select>\n </label>\n </div>\n <button type=\"button\" className=\"tangle-lines__primary\" disabled={busy !== null || refreshFailed || !address.trim() || !selectedRole} onClick={add}>\n {busy === 'add' ? 'Inviting…' : 'Invite member'}\n </button>\n </div>}\n </section>\n}\n","import type { LineBillingProps } from './contracts'\n\nfunction resetTime(value: string): string {\n const date = new Date(value)\n return Number.isNaN(date.getTime()) ? value : date.toLocaleString()\n}\n\n/** Read-only billing facts from the line attachment and Hub allowance status. */\nexport function LineBilling({ view }: LineBillingProps) {\n return <section className=\"tangle-lines\" aria-label=\"Line billing\">\n <header className=\"tangle-lines__heading\">\n <div><h2>Billing</h2><p>{view.lineAddress}</p></div>\n </header>\n <dl className=\"tangle-lines__billing\">\n <div>\n <dt>Line</dt>\n <dd>{view.linePayer.kind === 'workspace' ? view.linePayer.label : 'Payer not verified'}</dd>\n {view.linePayer.kind === 'workspace' && <dd className=\"tangle-lines__billing-detail\">Charged to {view.workspaceName}.</dd>}\n </div>\n <div>\n <dt>Agent turns</dt>\n <dd>{view.turnPayer.kind === 'unverified' ? 'Payer not verified' : view.turnPayer.label}</dd>\n {view.turnPayer.kind === 'member' && <dd className=\"tangle-lines__billing-detail\">Each member pays for their own admitted turns.</dd>}\n </div>\n <div>\n <dt>Allowance</dt>\n {view.allowance ? <>\n <dd>{view.allowance.turnsPerMemberPerDay} turns per member each day</dd>\n {view.allowance.used !== undefined && view.allowance.limit !== undefined &&\n <dd className=\"tangle-lines__billing-detail\">{view.allowance.used} of {view.allowance.limit} turns used{view.allowance.resetsAt ? ` · resets ${resetTime(view.allowance.resetsAt)}` : ''}</dd>}\n </> : <dd>No allowance reported</dd>}\n </div>\n </dl>\n </section>\n}\n","import { useEffect, useMemo, useState } from 'react'\nimport type { ApplicationSenderVerification, ApplicationSenderVerificationStart } from '../application-verification'\nimport { LineSetup } from './LineSetup'\nimport type { LineConnectInput, LineSetupClient, LineSetupProps } from './contracts'\n\nexport type { ApplicationSenderVerification, ApplicationSenderVerificationStart } from '../application-verification'\n\nexport interface ApplicationLineConnectInput extends LineConnectInput {\n senderVerificationId: string\n turnsPerDay: number\n}\n\nexport interface ApplicationLineSetupClient extends Omit<LineSetupClient, 'connect'> {\n /** Host creates or finds the selected owned line, then starts TEST with its owner key. */\n startSenderVerification(input: LineConnectInput): Promise<ApplicationSenderVerificationStart>\n /** Host returns only public fields. approvedSender never reaches the browser. */\n getSenderVerification(lineId: string, testId: string): Promise<ApplicationSenderVerification>\n /** Host rechecks owner authority and consumes the proof during attach. */\n connect(input: ApplicationLineConnectInput): Promise<void>\n}\n\nexport interface ApplicationLineSetupProps extends Omit<LineSetupProps, 'client' | 'canConnect' | 'connectPrerequisite'> {\n client: ApplicationLineSetupClient\n /** Disable new grants without preventing disconnection of an existing line. */\n enabled: boolean\n}\n\nfunction verificationError(cause: unknown): string {\n return cause instanceof Error ? cause.message : 'The phone test could not be checked. Try again.'\n}\n\nfunction draftKey(input: LineConnectInput): string {\n return JSON.stringify(input)\n}\n\nfunction expiry(value: string): number {\n const time = new Date(value).getTime()\n return Number.isFinite(time) ? time : 0\n}\n\nfunction supportsSenderVerification(providerId: string, transport: LineConnectInput['transport']): boolean {\n return (providerId === 'inkbox' && transport === 'imessage')\n || (providerId === 'linq-whatsapp' && transport === 'whatsapp')\n}\n\nfunction hasTestIdentity(input: LineConnectInput): boolean {\n return input.transport === 'imessage' || (input.transport === 'whatsapp' && Boolean(input.phoneNumberId))\n}\n\n/** Verify an owned handset before connecting its supported line to an application. */\nexport function ApplicationLineSetup(props: ApplicationLineSetupProps) {\n return <ApplicationLineSetupScope key={props.scopeKey} {...props} />\n}\n\nfunction ApplicationLineSetupScope({ client, enabled, ...props }: ApplicationLineSetupProps) {\n const [limit, setLimit] = useState('20')\n const [session, setSession] = useState<{\n draftKey: string\n start: ApplicationSenderVerificationStart\n status: ApplicationSenderVerification\n } | null>(null)\n const [pending, setPending] = useState<{ kind: 'start' | 'check'; draftKey: string } | null>(null)\n const [error, setError] = useState<string | null>(null)\n const [needsStatusRefresh, setNeedsStatusRefresh] = useState(false)\n const [now, setNow] = useState(() => Date.now())\n const turnsPerDay = Number(limit)\n const validLimit = Number.isSafeInteger(turnsPerDay) && turnsPerDay >= 1 && turnsPerDay <= 10_000\n\n useEffect(() => {\n const timer = setInterval(() => setNow(Date.now()), 1_000)\n return () => clearInterval(timer)\n }, [])\n\n function activeFor(input: LineConnectInput) {\n return session?.draftKey === draftKey(input) ? session : null\n }\n\n function verifiedFor(input: LineConnectInput, time: number): boolean {\n const active = activeFor(input)\n return Boolean(active && !needsStatusRefresh && !pending && active.status.state === 'verified'\n && active.status.proof.signedInboundTestAt && active.status.proof.providerReplyAcknowledgedAt\n && active.status.proof.signedInboundConfirmAt && expiry(active.status.expiresAt) > time)\n }\n\n async function start(input: LineConnectInput) {\n const key = draftKey(input)\n if (!enabled || !props.canManage || !validLimit || pending || !hasTestIdentity(input)) return\n setPending({ kind: 'start', draftKey: key })\n setError(null)\n setNeedsStatusRefresh(true)\n try {\n const result = await client.startSenderVerification(input)\n if (!result.lineId || !result.testId || !result.testText || result.state !== 'awaiting_test'\n || expiry(result.expiresAt) <= Date.now()) throw new Error('The phone test could not be started. Try again.')\n setSession({\n draftKey: key,\n start: result,\n status: {\n lineId: result.lineId, testId: result.testId, state: result.state, expiresAt: result.expiresAt,\n proof: { signedInboundTestAt: null, providerReplyAcknowledgedAt: null, signedInboundConfirmAt: null },\n },\n })\n setNow(Date.now())\n } catch (cause) {\n setError(verificationError(cause))\n } finally {\n setPending(null)\n }\n }\n\n async function check(active: NonNullable<typeof session>) {\n if (pending) return\n setPending({ kind: 'check', draftKey: active.draftKey })\n setError(null)\n setNeedsStatusRefresh(true)\n try {\n const result = await client.getSenderVerification(active.start.lineId, active.start.testId)\n if (result.lineId !== active.start.lineId || result.testId !== active.start.testId)\n throw new Error('The phone test changed. Start a new test.')\n // Copy only public fields even if a host accidentally returns an SDK owner read.\n const status: ApplicationSenderVerification = {\n lineId: result.lineId, testId: result.testId, state: result.state, expiresAt: result.expiresAt,\n proof: {\n signedInboundTestAt: result.proof.signedInboundTestAt,\n providerReplyAcknowledgedAt: result.proof.providerReplyAcknowledgedAt,\n signedInboundConfirmAt: result.proof.signedInboundConfirmAt,\n },\n }\n setSession(current => current?.start.testId === active.start.testId ? { ...current, status } : current)\n setNeedsStatusRefresh(false)\n setNow(Date.now())\n } catch (cause) {\n setError(verificationError(cause))\n } finally {\n setPending(null)\n }\n }\n\n const lineClient = useMemo<LineSetupClient>(() => ({\n async load() {\n const snapshot = await client.load()\n return {\n ...snapshot,\n connections: snapshot.connections?.map(connection => ({\n ...connection,\n identities: connection.identities.filter(identity =>\n supportsSenderVerification(connection.providerId, identity.transport)),\n })).filter(connection => connection.identities.length > 0) ?? null,\n }\n },\n disconnect: (id, expectedAttachmentId) => client.disconnect(id, expectedAttachmentId),\n async connect(input) {\n const active = activeFor(input)\n if (!enabled || !props.canManage || !validLimit || !verifiedFor(input, Date.now()) || !active)\n throw new Error('Verify the selected phone before connecting this line')\n try {\n await client.connect({ ...input, senderVerificationId: active.start.testId, turnsPerDay })\n setSession(null)\n } catch (cause) {\n setNeedsStatusRefresh(true)\n throw cause\n }\n },\n }), [client, enabled, props.canManage, session, turnsPerDay, validLimit, needsStatusRefresh, pending])\n\n function prerequisite(input: LineConnectInput) {\n const key = draftKey(input)\n const active = activeFor(input)\n const expired = Boolean(active && expiry(active.status.expiresAt) <= now)\n const verified = verifiedFor(input, now)\n const inProgress = active && !expired && ['awaiting_test', 'sending', 'challenge_sent'].includes(active.status.state)\n const busy = pending?.draftKey === key\n const canStart = enabled && props.canManage && validLimit && !pending && hasTestIdentity(input)\n const canCheck = Boolean((inProgress || active?.status.state === 'verified') && !pending)\n\n return {\n ready: validLimit && verified,\n content: <div className=\"tangle-lines__verification\" aria-label=\"Phone verification\">\n <h4>Verify your phone</h4>\n <p>Use the phone that will send commands to this line. Connection opens after that phone is verified.</p>\n {!validLimit && <p className=\"tangle-lines__warning\">Enter a daily message limit from 1 to 10,000 first.</p>}\n {(!active || expired || ['consumed', 'cancelled', 'superseded', 'failed', 'expired'].includes(active.status.state))\n ? <>\n {active && <p role=\"status\">This phone test can no longer connect the line. Start a new test.</p>}\n <button type=\"button\" className=\"tangle-lines__secondary\" disabled={!canStart}\n onClick={() => void start(input)}>{busy && pending?.kind === 'start' ? 'Starting test…' : 'Start phone test'}</button>\n </> : <>\n <p>Text this exact message to the selected line from your phone:</p>\n <code className=\"tangle-lines__test-text\">{active.start.testText}</code>\n <p>Follow the private reply on your phone. No confirmation code is entered here.</p>\n <p className=\"tangle-lines__verification-expiry\">Test expires at {new Date(active.status.expiresAt).toLocaleTimeString()}.</p>\n {verified && <p className=\"tangle-lines__verified\" role=\"status\">Phone verified. You can connect this line.</p>}\n <div className=\"tangle-lines__verification-actions\">\n {!verified && <span role=\"status\">{active.status.state === 'verified'\n ? 'Check verification again before connecting.'\n : active.status.state === 'challenge_sent'\n ? 'Confirmation sent. Reply from the same phone, then check again.'\n : active.status.state === 'sending' ? 'Sending confirmation…' : 'Waiting for your test message.'}</span>}\n <button type=\"button\" className=\"tangle-lines__secondary\" disabled={!canCheck}\n onClick={() => void check(active)}>{busy && pending?.kind === 'check' ? 'Checking…' : 'Check verification'}</button>\n </div>\n </>}\n {error && <p className=\"tangle-lines__verification-error\" role=\"alert\">{error}</p>}\n </div>,\n }\n }\n\n return <>\n {props.canManage && <section className=\"tangle-lines tangle-lines--application\" aria-label=\"Application access\">\n <header className=\"tangle-lines__application-heading\">\n <h2>Text your workspace</h2>\n <p>Connect an owned iMessage or WhatsApp line to a conversation. Verify your phone before it can use application access and compute.</p>\n </header>\n {!enabled ? <div className=\"tangle-lines__notice\" role=\"status\">\n <strong>New connections are disabled</strong>\n <p>You can still review and disconnect an existing line below.</p>\n </div> : <div className=\"tangle-lines__authorization\">\n <label className=\"tangle-lines__limit\">Maximum messages per day\n <input type=\"number\" min={1} max={10_000} step={1} value={limit}\n onChange={event => setLimit(event.target.value)} />\n </label>\n <p className=\"tangle-lines__fine-print\">The message limit is not a dollar cap. STOP stops replies, not an already accepted task; cancel that task in the application.</p>\n </div>}\n </section>}\n <LineSetup {...props} targetLabel={props.targetLabel ?? 'Conversation'} client={lineClient}\n canConnect={props.canManage && enabled} showConnectionSetup={enabled}\n connectPrerequisite={prerequisite}\n setupDescription=\"Choose an owned iMessage or WhatsApp line and the conversation it will answer.\"\n emptyConnectionsMessage=\"Add an owned Inkbox iMessage handle or Linq WhatsApp number in Hub, then\" />\n </>\n}\n","import { useId } from 'react'\n\nexport interface SharedLineApp {\n /** Stable app identity used to collapse duplicate registrations. */\n id: string\n name: string\n}\n\nexport interface SharedLineAppNoticeProps {\n /** Apps the host has verified can handle this same phone conversation. */\n apps: readonly SharedLineApp[]\n /** The host controls dismissal so the choice can persist with its own policy. */\n open: boolean\n onKeepSharing(): void\n /** Omit when the host has no supported dedicated-number flow. */\n onRequestDedicatedNumber?: () => void\n}\n\nfunction distinctApps(apps: readonly SharedLineApp[]): SharedLineApp[] {\n const seen = new Set<string>()\n const result: SharedLineApp[] = []\n\n for (const app of apps) {\n const id = app.id.trim()\n if (!id || seen.has(id)) continue\n seen.add(id)\n result.push({ id, name: app.name.trim() || 'Unnamed app' })\n }\n\n return result\n}\n\n/** A quiet, dismissible notice for apps that the host verified share a phone thread. */\nexport function SharedLineAppNotice({\n apps,\n open,\n onKeepSharing,\n onRequestDedicatedNumber,\n}: SharedLineAppNoticeProps) {\n const titleId = useId()\n const sharingApps = distinctApps(apps)\n if (!open || sharingApps.length < 2) return null\n\n return (\n <section className=\"tangle-lines agent-shared-line-notice\" aria-labelledby={titleId}>\n <div className=\"agent-shared-line-notice__copy\">\n <h2 id={titleId}>These apps share one text conversation</h2>\n <p>Each app keeps its own history here. Their replies appear together in the same conversation on your phone.</p>\n <ul className=\"agent-shared-line-notice__apps\" aria-label=\"Apps sharing this conversation\">\n {sharingApps.map(app => <li key={app.id}>{app.name}</li>)}\n </ul>\n </div>\n <div className=\"agent-shared-line-notice__actions\">\n {onRequestDedicatedNumber && (\n <button\n className=\"agent-shared-line-notice__secondary\"\n type=\"button\"\n onClick={onRequestDedicatedNumber}\n >\n Get a dedicated number\n </button>\n )}\n <button className=\"agent-shared-line-notice__primary\" type=\"button\" onClick={onKeepSharing}>\n Keep sharing\n </button>\n </div>\n </section>\n )\n}\n"],"mappings":"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","names":["occupied","line","useEffect","useLayoutEffect","useRef","useState","Fragment","jsx","jsxs","useBrowserLayoutEffect","Fragment","jsx","jsxs","useEffect","useState","Fragment","jsx","jsxs","useState","useEffect","jsx","jsxs"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/hosted-agent/react/LineSetup.tsx","../../../src/hosted-agent/react/LineMembers.tsx","../../../src/hosted-agent/react/LineBilling.tsx","../../../src/hosted-agent/react/ApplicationLineSetup.tsx","../../../src/hosted-agent/react/SharedLineAppNotice.tsx"],"sourcesContent":["import { useEffect, useLayoutEffect, useRef, useState } from 'react'\nimport type { Line } from '@tangle-network/sandbox'\nimport type {\n LineBoxMode, LineConnectInput, LineConnectionOption, LineIdentityKind, LineIdentityOption,\n LineSetupLine, LineSetupProps, LineSetupSnapshot,\n} from './contracts'\n\nconst useBrowserLayoutEffect = typeof document !== 'undefined' ? useLayoutEffect : useEffect\n\nconst TRANSPORT: Record<Line['transport'], string> = {\n imessage: 'iMessage', sms: 'SMS', whatsapp: 'WhatsApp', email: 'Email', telegram: 'Telegram', voice: 'Voice',\n}\nconst IDENTITY: Record<LineIdentityKind, string> = {\n handle: 'Handle', number: 'Dedicated number', email: 'Email line',\n}\n\ntype Choice = { key: string; connection: LineConnectionOption; identity: LineIdentityOption }\n\nfunction LineMessageAction({ line }: { line: LineSetupLine }) {\n if (line.transport !== 'imessage' || line.targetId === null || line.status !== 'active') return null\n if (!!line.connect !== !!line.routerAddress) return null\n const shared = !!line.connect && !!line.routerAddress\n const number = shared ? line.routerAddress : line.address\n if (!number || !/^\\+[1-9]\\d{7,14}$/.test(number)) return null\n return <a className=\"tangle-lines__primary tangle-lines__message-action\" href={`sms:${number}?body=${encodeURIComponent(shared ? line.connect ?? '' : 'Hello')}`}>\n {shared ? 'Connect iMessage' : 'Text it now'}\n </a>\n}\n\nfunction message(error: unknown): string {\n return error instanceof Error ? error.message : 'The line request failed. Try again.'\n}\n\nfunction dateTime(value: string): string {\n const date = new Date(value)\n return Number.isNaN(date.getTime()) ? value : date.toLocaleString()\n}\n\nfunction choicesFor(snapshot: LineSetupSnapshot): Choice[] {\n return (snapshot.connections ?? []).flatMap(connection => connection.identities.map((identity, index) => ({\n key: `${connection.id}:${index}`,\n connection,\n identity,\n })))\n}\n\nfunction requiresNumber(identity: LineIdentityOption): boolean {\n return identity.transport === 'whatsapp' || identity.transport === 'sms' || identity.transport === 'voice' || identity.requiresPhoneNumberId === true\n}\n\nfunction canOfferReconnect(line: LineSetupLine, choice: Choice): boolean {\n if (line.connectionId !== choice.connection.id || line.transport !== choice.identity.transport || line.targetId !== null) return false\n if (line.providerNumberId === null) return !choice.identity.phoneNumberId && !requiresNumber(choice.identity)\n return choice.identity.phoneNumberId === line.providerNumberId ||\n (!choice.identity.phoneNumberId && requiresNumber(choice.identity))\n}\n\nfunction matchesLineIdentity(line: LineSetupLine, identity: LineIdentityOption, numberId: string): boolean {\n if (line.transport !== identity.transport) return false\n if (line.providerNumberId === null) return !identity.phoneNumberId && !requiresNumber(identity)\n return numberId === line.providerNumberId\n}\n\n/** Set up an owned identity through a host route backed by sandbox.lines and Hub. */\nexport function LineSetup({ client, scopeKey, initialTargetId, targetLabel, canManage, canConnect = canManage, showConnectionSetup = true, connectPrerequisite, setupDescription, emptyConnectionsMessage, onNotice }: LineSetupProps) {\n const clientRef = useRef(client)\n clientRef.current = client\n const sequence = useRef(0)\n const incarnation = useRef(0)\n const confirmButton = useRef<HTMLButtonElement>(null)\n const heading = useRef<HTMLHeadingElement>(null)\n const setupHeading = useRef<HTMLHeadingElement>(null)\n const disconnectTriggers = useRef(new Map<string, HTMLButtonElement>())\n const restoreFocusTo = useRef<string | null>(null)\n useBrowserLayoutEffect(() => {\n incarnation.current++\n return () => { incarnation.current++ }\n }, [scopeKey, initialTargetId])\n const [loadedSnapshot, setLoadedSnapshot] = useState<{ scopeKey: string; initialTargetId: string | undefined; value: LineSetupSnapshot } | null>(null)\n const snapshot = loadedSnapshot?.scopeKey === scopeKey && loadedSnapshot.initialTargetId === initialTargetId ? loadedSnapshot.value : null\n const [loading, setLoading] = useState(true)\n const [refreshFailed, setRefreshFailed] = useState(false)\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [kind, setKind] = useState<LineIdentityKind>('handle')\n const [choiceKey, setChoiceKey] = useState('')\n const [targetId, setTargetId] = useState(initialTargetId ?? '')\n const [boxMode, setBoxMode] = useState<LineBoxMode>('per-member')\n const [phoneNumberId, setPhoneNumberId] = useState('')\n const [confirmation, setConfirmation] = useState<{ lineId: string; attachmentId: string | undefined } | null>(null)\n const confirmLineId = confirmation?.lineId ?? null\n\n function stillCurrent(requestIncarnation: number): boolean {\n return requestIncarnation === incarnation.current\n }\n\n async function reload(requestIncarnation: number): Promise<LineSetupSnapshot | null> {\n const request = ++sequence.current\n try {\n const next = await clientRef.current.load()\n if (request !== sequence.current || !stillCurrent(requestIncarnation)) return null\n setLoadedSnapshot({ scopeKey, initialTargetId, value: next })\n setError(null)\n setRefreshFailed(false)\n setTargetId(current => next.targets.some(target => target.id === current)\n ? current : next.targets.find(target => target.id === initialTargetId)?.id ?? next.targets[0]?.id ?? '')\n setLoading(false)\n return next\n } catch (cause) {\n if (request !== sequence.current || !stillCurrent(requestIncarnation)) return null\n setError(message(cause))\n setRefreshFailed(true)\n setLoading(false)\n return null\n }\n }\n\n function retry() {\n if (loading) return\n setLoading(true)\n void reload(incarnation.current)\n }\n\n function closeConfirmation(lineId: string) {\n restoreFocusTo.current = lineId\n setConfirmation(null)\n }\n\n useEffect(() => {\n setLoading(true)\n setLoadedSnapshot(null)\n setError(null)\n setRefreshFailed(false)\n setBusy(false)\n setKind('handle')\n setChoiceKey('')\n setTargetId(initialTargetId ?? '')\n setBoxMode('per-member')\n setPhoneNumberId('')\n setConfirmation(null)\n restoreFocusTo.current = null\n void reload(incarnation.current)\n return () => { sequence.current++ }\n }, [scopeKey, initialTargetId])\n\n useEffect(() => {\n if (confirmLineId) confirmButton.current?.focus()\n }, [confirmLineId])\n\n useEffect(() => {\n const lineId = restoreFocusTo.current\n if (confirmLineId !== null || lineId === null) return\n restoreFocusTo.current = null\n const trigger = disconnectTriggers.current.get(lineId)\n if (trigger && !trigger.disabled) trigger.focus()\n else (heading.current ?? setupHeading.current)?.focus()\n }, [confirmLineId, snapshot, refreshFailed])\n\n const allChoices = snapshot ? choicesFor(snapshot) : []\n const choices = snapshot ? allChoices.filter(choice => {\n const occupied = snapshot.lines.filter(line => line.status !== 'released' && line.transport === choice.identity.transport)\n const [line] = occupied\n return occupied.length === 0 || (occupied.length === 1 && line !== undefined && canOfferReconnect(line, choice))\n }) : []\n const availableKinds = (['handle', 'number', 'email'] as const).filter(value => choices.some(choice => choice.identity.kind === value))\n const selectedKind = availableKinds.includes(kind) ? kind : availableKinds[0]\n const kindChoices = choices.filter(choice => choice.identity.kind === selectedKind)\n const selected = kindChoices.find(choice => choice.key === choiceKey) ?? kindChoices[0]\n const visibleLines = snapshot?.lines.filter(line => line.status !== 'released') ?? []\n const showSetup = Boolean(snapshot && canManage && showConnectionSetup &&\n (snapshot.connections === null || choices.length > 0 || allChoices.length === 0))\n const showExisting = snapshot ? visibleLines.length > 0 || !showSetup : !(canManage && showConnectionSetup)\n const hasSeveralChoices = availableKinds.length > 1 || kindChoices.length > 1 || (snapshot?.targets.length ?? 0) > 1\n const SetupHeading = showExisting ? 'h3' : 'h2'\n const selectedTarget = snapshot?.targets.find(target => target.id === targetId)\n const selectedMode = selectedTarget?.modes.includes(boxMode) ? boxMode : selectedTarget?.modes[0]\n const enteredNumber = (selected?.identity.phoneNumberId ?? phoneNumberId).trim()\n const needsNumber = selected && requiresNumber(selected.identity)\n const occupied = selected && snapshot?.lines.filter(line => line.status !== 'released' && line.transport === selected.identity.transport)\n const [occupiedLine] = occupied || []\n const reconnectChoice = Boolean(selected && occupied?.length === 1 && occupiedLine && canOfferReconnect(occupiedLine, selected))\n const reconnecting = Boolean(reconnectChoice && selected && occupiedLine &&\n matchesLineIdentity(occupiedLine, selected.identity, enteredNumber))\n const blockedByExistingLine = Boolean(occupied?.length && !reconnecting)\n const answeringCount = snapshot?.lines.filter(line => line.answering).length ?? 0\n const draft: LineConnectInput | null = selected && selectedTarget && selectedMode\n ? {\n connectionId: selected.connection.id,\n transport: selected.identity.transport,\n ...(enteredNumber ? { phoneNumberId: enteredNumber } : {}),\n targetId: selectedTarget.id,\n boxMode: selectedMode,\n } : null\n const prerequisite = draft ? connectPrerequisite?.(draft) : null\n const connectReady = Boolean(canManage && canConnect && draft && (prerequisite?.ready ?? true)\n && !(needsNumber && !enteredNumber) && !blockedByExistingLine && !busy && !loading && !refreshFailed)\n\n async function connect() {\n if (!connectReady || !draft || !selected) return\n const requestIncarnation = incarnation.current\n setBusy(true)\n setError(null)\n try {\n await clientRef.current.connect(draft)\n if (!stillCurrent(requestIncarnation)) return\n const updated = await reload(requestIncarnation)\n if (!stillCurrent(requestIncarnation)) return\n if (!updated) {\n onNotice?.({ kind: 'error', message: 'Line connected, but its current status could not be loaded.' })\n return\n }\n const line = updated.lines.find(item => item.status !== 'released' && item.connectionId === selected.connection.id &&\n item.transport === selected.identity.transport && item.providerNumberId === (enteredNumber || null))\n onNotice?.({ kind: 'success', message: line?.answering ? 'The line is answering.' : selected.identity.transport === 'voice'\n ? 'Voice line connected. Configure calls and verify prior member consent in your host.'\n : 'Line connected. Add a member to start answers.' })\n } catch (cause) {\n if (!stillCurrent(requestIncarnation)) return\n const detail = message(cause)\n setError(detail)\n onNotice?.({ kind: 'error', message: detail })\n } finally {\n if (stillCurrent(requestIncarnation)) setBusy(false)\n }\n }\n\n async function disconnect() {\n if (!confirmation || busy || loading || refreshFailed) return\n const { lineId, attachmentId: expectedAttachmentId } = confirmation\n const requestIncarnation = incarnation.current\n setBusy(true)\n setError(null)\n try {\n await clientRef.current.disconnect(lineId, expectedAttachmentId)\n if (!stillCurrent(requestIncarnation)) return\n const updated = await reload(requestIncarnation)\n if (!stillCurrent(requestIncarnation)) return\n closeConfirmation(lineId)\n onNotice?.(updated\n ? { kind: 'success', message: 'The line stopped answering.' }\n : { kind: 'error', message: 'Line disconnected, but its current status could not be loaded.' })\n } catch (cause) {\n if (!stillCurrent(requestIncarnation)) return\n const detail = message(cause)\n setError(detail)\n onNotice?.({ kind: 'error', message: detail })\n } finally {\n if (stillCurrent(requestIncarnation)) setBusy(false)\n }\n }\n\n return <section className=\"tangle-lines\" aria-label=\"Agent lines\">\n {showExisting && <header className=\"tangle-lines__heading\">\n <div>\n <h2 ref={heading} tabIndex={-1}>Lines</h2>\n {snapshot && <p>{snapshot.workspaceName} can use one line per transport.</p>}\n </div>\n {answeringCount > 1 && <span className=\"tangle-lines__count\">{answeringCount} answering</span>}\n </header>}\n\n {error && <div className=\"tangle-lines__error\" role=\"alert\">\n <div><strong>{refreshFailed ? 'Lines are unavailable' : 'Line action failed'}</strong><p>{error}</p></div>\n {(!snapshot || refreshFailed) && <button type=\"button\" disabled={loading} onClick={retry}>Retry</button>}\n </div>}\n {loading && <p className=\"tangle-lines__muted\" role=\"status\">Loading lines…</p>}\n\n {snapshot && <>\n {showExisting && <div className=\"tangle-lines__list\">\n {visibleLines.length === 0 &&\n <div className=\"tangle-lines__empty\"><strong>No lines connected</strong><p>{canManage && showConnectionSetup\n ? 'Connect an owned identity below to let this workspace answer messages.'\n : 'There are no connected lines in this workspace.'}</p></div>}\n {visibleLines.map(line =>\n <div className=\"tangle-lines__row\" key={line.id}>\n <div className=\"tangle-lines__row-main\">\n <div className=\"tangle-lines__row-heading\"><span className=\"tangle-lines__transport\">{TRANSPORT[line.transport]}</span><span className={`tangle-lines__status${line.answering ? ' tangle-lines__status--answering' : ''}`}>{line.answering ? 'Answering' : line.targetId === null ? 'Disconnected' : line.status === 'active' ? line.transport === 'voice' ? 'Not answering' : 'Awaiting member' : line.status}</span></div>\n <strong>{line.address}</strong>\n {line.transport === 'imessage' && line.connect && line.routerAddress && line.targetId !== null && <p>Send <code>{line.connect}</code> to {line.routerAddress}. Then message the number Inkbox sends you.</p>}\n <LineMessageAction line={line} />\n <p>{line.targetLabel ?? 'No agent or box assigned'}{line.boxMode && ` · ${line.boxMode === 'per-member' ? 'one box per member' : 'shared box'}`}</p>\n {line.lastTurn.kind === 'latest' ? <p>Last turn: {line.lastTurn.status} · {dateTime(line.lastTurn.at)}</p>\n : <p>{line.lastTurn.kind === 'none' ? 'No turns yet.' : 'Turn history unavailable.'}</p>}\n </div>\n {canManage && line.canDisconnect && line.targetId !== null && line.status === 'active' && <div className=\"tangle-lines__row-actions\">\n {confirmLineId === line.id ? <div className=\"tangle-lines__confirm\" role=\"group\" aria-label={`Disconnect ${line.address}?`}>\n <span>Disconnect this line?</span>\n <button ref={confirmButton} type=\"button\" className=\"tangle-lines__danger\" disabled={busy || loading || refreshFailed} onClick={() => void disconnect()}>Disconnect</button>\n <button type=\"button\" disabled={busy} onClick={() => closeConfirmation(line.id)}>Keep line</button>\n </div> : <button ref={node => { if (node) disconnectTriggers.current.set(line.id, node); else disconnectTriggers.current.delete(line.id) }} type=\"button\" className=\"tangle-lines__quiet\" disabled={busy || loading || refreshFailed} onClick={() => setConfirmation({ lineId: line.id, attachmentId: line.attachmentId ?? undefined })}>Disconnect line</button>}\n </div>}\n </div>)}\n </div>}\n\n {showSetup && <div className={`tangle-lines__setup${showExisting ? '' : ' tangle-lines__setup--first'}`}>\n <SetupHeading ref={setupHeading} tabIndex={-1}>Connect a line</SetupHeading>\n {hasSeveralChoices && setupDescription && <p>{setupDescription}</p>}\n {snapshot.connections === null ? <div className=\"tangle-lines__error\" role=\"status\">\n <span>Hub connections could not be read. Check Hub access and try again.</span>\n <button type=\"button\" disabled={loading} onClick={retry}>Retry</button>\n </div>\n : availableKinds.length === 0 ? <p className=\"tangle-lines__empty\">\n {emptyConnectionsMessage ?? 'Connect an owned handle, number, or mailbox in Hub, then'} <button type=\"button\" disabled={loading} onClick={retry}>reload</button>.\n </p>\n : <>\n {availableKinds.length > 1 && <div className=\"tangle-lines__kinds\" role=\"group\" aria-label=\"Identity type\">\n {availableKinds.map(value => <button key={value} type=\"button\" aria-pressed={selectedKind === value} onClick={() => { setKind(value); setChoiceKey(''); setPhoneNumberId('') }}>{IDENTITY[value]}</button>)}\n </div>}\n <div className=\"tangle-lines__fields\">\n {kindChoices.length > 1 ? <label>Line\n <select value={selected?.key ?? ''} onChange={event => { setChoiceKey(event.target.value); setPhoneNumberId('') }}>\n {kindChoices.map(choice => <option key={choice.key} value={choice.key}>{choice.identity.label} · {TRANSPORT[choice.identity.transport]} via {choice.connection.label}</option>)}\n </select>\n </label> : selected && <div className=\"tangle-lines__fixed-choice\">\n <span>Line</span>\n <strong>{selected.identity.label}</strong>\n <small>{TRANSPORT[selected.identity.transport]} via {selected.connection.label}</small>\n </div>}\n {snapshot.targets.length > 1 ? <label>{targetLabel ?? 'Agent or box'}\n <select value={selectedTarget?.id ?? ''} onChange={event => setTargetId(event.target.value)}>\n {snapshot.targets.map(target => <option key={target.id} value={target.id}>{target.label}{targetLabel ? '' : ` · ${target.kind}`}</option>)}\n </select>\n </label> : selectedTarget && <div className=\"tangle-lines__fixed-choice\">\n <span>{targetLabel ?? 'Agent or box'}</span>\n <strong>{selectedTarget.label}{targetLabel ? '' : ` · ${selectedTarget.kind}`}</strong>\n </div>}\n {selectedTarget && selectedTarget.modes.length > 1 && <fieldset>\n <legend>Conversation space</legend>\n <label><input type=\"radio\" name={`line-box-mode-${scopeKey}`} value=\"per-member\" checked={selectedMode === 'per-member'} disabled={!selectedTarget?.modes.includes('per-member')} onChange={() => setBoxMode('per-member')} /> One box per member</label>\n <label><input type=\"radio\" name={`line-box-mode-${scopeKey}`} value=\"shared\" checked={selectedMode === 'shared'} disabled={!selectedTarget?.modes.includes('shared')} onChange={() => setBoxMode('shared')} /> Shared box for a team</label>\n </fieldset>}\n {needsNumber && !selected?.identity.phoneNumberId && <label>Existing provider number ID\n <input value={phoneNumberId} onChange={event => setPhoneNumberId(event.target.value)} autoComplete=\"off\" placeholder=\"Number ID from Hub\" />\n </label>}\n </div>\n {reconnectChoice && blockedByExistingLine && <p className=\"tangle-lines__warning\">Enter this line's current provider number ID to reconnect.</p>}\n {prerequisite?.content}\n <button className=\"tangle-lines__primary\" type=\"button\" disabled={!connectReady} onClick={() => void connect()}>\n {busy ? (reconnectChoice ? 'Reconnecting…' : 'Connecting…') : `${reconnectChoice ? 'Reconnect' : 'Connect'} ${selected ? TRANSPORT[selected.identity.transport] : 'line'}`}\n </button>\n </>}\n </div>}\n </>}\n </section>\n}\n","import { useEffect, useLayoutEffect, useRef, useState } from 'react'\nimport type { LineMember } from '@tangle-network/sandbox'\nimport type { LineMembersProps } from './contracts'\n\nconst useBrowserLayoutEffect = typeof document !== 'undefined' ? useLayoutEffect : useEffect\n\nconst STATUS: Record<LineMember['status'], { label: string; detail: string }> = {\n invited: { label: 'Awaiting consent', detail: 'The first message from this address confirms consent.' },\n active: { label: 'Consented', detail: 'This member has sent a message to the line.' },\n stopped: { label: 'Stopped', detail: 'The member texted STOP. Only a message from them with START resumes replies.' },\n removed: { label: 'Removed', detail: 'This address no longer has access to the line.' },\n}\n\nfunction errorMessage(cause: unknown): string {\n return cause instanceof Error ? cause.message : 'The member request failed. Try again.'\n}\n\n/** Manage Hub line members while keeping consent and STOP authority with the sender. */\nexport function LineMembers({ lineId, scopeKey, client, roles, canManage, canAdd = true, maxMembers, allowRoleChange = true, allowRemoveLastOwner = false, onNotice }: LineMembersProps) {\n const clientRef = useRef(client)\n clientRef.current = client\n const sequence = useRef(0)\n const incarnation = useRef(0)\n const confirmButton = useRef<HTMLButtonElement>(null)\n const heading = useRef<HTMLHeadingElement>(null)\n const removeTriggers = useRef(new Map<string, HTMLButtonElement>())\n const restoreFocusTo = useRef<string | null>(null)\n useBrowserLayoutEffect(() => {\n incarnation.current++\n return () => { incarnation.current++ }\n }, [lineId, scopeKey])\n const [memberSnapshot, setMemberSnapshot] = useState<{ lineId: string; scopeKey: string; members: LineMember[] } | null>(null)\n const [error, setError] = useState<string | null>(null)\n const [refreshFailed, setRefreshFailed] = useState(false)\n const [address, setAddress] = useState('')\n const [label, setLabel] = useState('')\n const [role, setRole] = useState('member')\n const [busy, setBusy] = useState<string | null>(null)\n const [confirmId, setConfirmId] = useState<string | null>(null)\n const members = memberSnapshot?.lineId === lineId && memberSnapshot.scopeKey === scopeKey ? memberSnapshot.members : null\n\n function stillCurrent(requestIncarnation: number): boolean {\n return requestIncarnation === incarnation.current\n }\n\n async function reload(requestIncarnation: number): Promise<boolean> {\n const request = ++sequence.current\n try {\n const next = await clientRef.current.list(lineId)\n if (request !== sequence.current || !stillCurrent(requestIncarnation)) return false\n setMemberSnapshot({ lineId, scopeKey, members: next })\n setError(null)\n setRefreshFailed(false)\n return true\n } catch (cause) {\n if (request !== sequence.current || !stillCurrent(requestIncarnation)) return false\n setError(errorMessage(cause))\n setRefreshFailed(true)\n return false\n }\n }\n\n async function retry() {\n if (busy) return\n const requestIncarnation = incarnation.current\n setBusy('refresh')\n try { await reload(requestIncarnation) }\n finally { if (stillCurrent(requestIncarnation)) setBusy(null) }\n }\n\n function closeConfirmation(memberId: string) {\n restoreFocusTo.current = memberId\n setConfirmId(null)\n }\n\n useEffect(() => {\n setMemberSnapshot(null)\n setError(null)\n setRefreshFailed(false)\n setAddress('')\n setLabel('')\n setRole('member')\n setConfirmId(null)\n restoreFocusTo.current = null\n setBusy(null)\n void reload(incarnation.current)\n return () => { sequence.current++ }\n }, [lineId, scopeKey])\n\n useEffect(() => {\n if (confirmId) confirmButton.current?.focus()\n }, [confirmId])\n\n useEffect(() => {\n const memberId = restoreFocusTo.current\n if (confirmId !== null || memberId === null) return\n restoreFocusTo.current = null\n const trigger = removeTriggers.current.get(memberId)\n if (trigger && !trigger.disabled) trigger.focus()\n else heading.current?.focus()\n }, [confirmId, members, refreshFailed])\n\n const selectedRole = roles.some(item => item.value === role) ? role : roles.find(item => item.value === 'member')?.value ?? roles[0]?.value ?? ''\n const activeMembers = members?.filter(member => member.status !== 'removed').length ?? 0\n const activeOwners = members?.filter(member => member.role === 'owner' && member.status !== 'removed').length ?? 0\n\n async function mutate(key: string, action: () => Promise<void>, success: string, onSuccess?: () => void) {\n if (busy || refreshFailed) return\n const requestIncarnation = incarnation.current\n setBusy(key)\n setError(null)\n try {\n await action()\n if (!stillCurrent(requestIncarnation)) return\n const refreshed = await reload(requestIncarnation)\n if (!stillCurrent(requestIncarnation)) return\n onSuccess?.()\n onNotice?.(refreshed\n ? { kind: 'success', message: success }\n : { kind: 'error', message: 'Member updated, but the current member list could not be loaded.' })\n } catch (cause) {\n if (!stillCurrent(requestIncarnation)) return\n const detail = errorMessage(cause)\n setError(detail)\n onNotice?.({ kind: 'error', message: detail })\n } finally {\n if (stillCurrent(requestIncarnation)) setBusy(null)\n }\n }\n\n function add() {\n const trimmed = address.trim()\n if (!trimmed || !selectedRole || members === null || (maxMembers !== undefined && activeMembers >= maxMembers)) return\n void mutate('add', () => clientRef.current.add(lineId, { address: trimmed, role: selectedRole, ...(label.trim() ? { label: label.trim() } : {}) }), 'Member invited. Their first message confirms consent.', () => {\n setAddress('')\n setLabel('')\n })\n }\n\n return <section className=\"tangle-lines\" aria-label=\"Line members\">\n <header className=\"tangle-lines__heading\">\n <div><h2 ref={heading} tabIndex={-1}>Members</h2><p>Each address controls its own consent and STOP state.</p></div>\n {members && <span className=\"tangle-lines__count\">{activeMembers} {activeMembers === 1 ? 'member' : 'members'}</span>}\n </header>\n {error && <div className=\"tangle-lines__error\" role=\"alert\">\n <span>{error}</span>\n {(members === null || refreshFailed) && <button type=\"button\" disabled={busy !== null} onClick={() => void retry()}>Retry</button>}\n </div>}\n {members === null ? !error && <p className=\"tangle-lines__muted\" role=\"status\">Loading members…</p> : <div className=\"tangle-lines__list\">\n {members.length === 0 && <p className=\"tangle-lines__empty\">{canAdd ? 'No members yet. Invite an address that you own or have permission to add.' : 'No members yet.'}</p>}\n {members.map(member => {\n const lastOwner = member.role === 'owner' && activeOwners <= 1\n const editable = canManage && member.status !== 'removed' && (!lastOwner || allowRemoveLastOwner)\n return <div className=\"tangle-lines__row\" key={member.id}>\n <div className=\"tangle-lines__row-main\">\n <span className={`tangle-lines__state tangle-lines__state--${member.status}`}>{STATUS[member.status].label}</span>\n <strong>{member.label || member.address}</strong>\n {member.label && <p>{member.address}</p>}\n <p>{STATUS[member.status].detail}</p>\n </div>\n <div className=\"tangle-lines__row-actions\">\n {editable ? <>\n {allowRoleChange && !lastOwner ? <label className=\"tangle-lines__compact-label\">Role\n <select value={member.role} disabled={busy !== null || refreshFailed} onChange={event => void mutate(member.id, () => clientRef.current.update(lineId, member.id, { role: event.target.value }), 'Role updated.')}>\n {!roles.some(item => item.value === member.role) && <option value={member.role}>{member.role}</option>}\n {roles.map(item => <option key={item.value} value={item.value}>{item.label}{item.tools === 'chat' ? ' · chat only' : ''}</option>)}\n </select>\n </label> : <span className=\"tangle-lines__role\">{roles.find(item => item.value === member.role)?.label ?? member.role}</span>}\n {confirmId === member.id ? <div className=\"tangle-lines__confirm\" role=\"group\" aria-label={`Remove ${member.label || member.address}?`}>\n <span>Remove {member.label || member.address}?</span>\n <button ref={confirmButton} type=\"button\" className=\"tangle-lines__danger\" disabled={busy !== null || refreshFailed} onClick={() => void mutate(member.id, () => clientRef.current.remove(lineId, member.id), 'Member removed.', () => closeConfirmation(member.id))}>Remove</button>\n <button type=\"button\" disabled={busy !== null} onClick={() => closeConfirmation(member.id)}>Keep</button>\n </div> : <button ref={node => { if (node) removeTriggers.current.set(member.id, node); else removeTriggers.current.delete(member.id) }} type=\"button\" className=\"tangle-lines__quiet\" disabled={busy !== null || refreshFailed} onClick={() => setConfirmId(member.id)}>Remove</button>}\n </> : <span className=\"tangle-lines__role\">{roles.find(item => item.value === member.role)?.label ?? member.role}</span>}\n </div>\n </div>\n })}\n </div>}\n\n {canManage && canAdd && members !== null && (maxMembers === undefined || activeMembers < maxMembers) && <div className=\"tangle-lines__setup\">\n <h3>Invite a member</h3>\n <p>Hub marks the address as invited. The member confirms by messaging the line.</p>\n <div className=\"tangle-lines__fields\">\n <label>Phone number or email\n <input value={address} onChange={event => setAddress(event.target.value)} autoComplete=\"off\" placeholder=\"+15551234567 or name@example.com\" />\n </label>\n <label>Name (optional)\n <input value={label} onChange={event => setLabel(event.target.value)} placeholder=\"Member name\" />\n </label>\n <label>Role\n <select value={selectedRole} disabled={roles.length === 0} onChange={event => setRole(event.target.value)}>\n {roles.map(item => <option key={item.value} value={item.value}>{item.label}{item.tools === 'chat' ? ' · chat only' : ''}</option>)}\n </select>\n </label>\n </div>\n <button type=\"button\" className=\"tangle-lines__primary\" disabled={busy !== null || refreshFailed || !address.trim() || !selectedRole} onClick={add}>\n {busy === 'add' ? 'Inviting…' : 'Invite member'}\n </button>\n </div>}\n </section>\n}\n","import type { LineBillingProps } from './contracts'\n\nfunction resetTime(value: string): string {\n const date = new Date(value)\n return Number.isNaN(date.getTime()) ? value : date.toLocaleString()\n}\n\n/** Read-only billing facts from the line attachment and Hub allowance status. */\nexport function LineBilling({ view }: LineBillingProps) {\n return <section className=\"tangle-lines\" aria-label=\"Line billing\">\n <header className=\"tangle-lines__heading\">\n <div><h2>Billing</h2><p>{view.lineAddress}</p></div>\n </header>\n <dl className=\"tangle-lines__billing\">\n <div>\n <dt>Line</dt>\n <dd>{view.linePayer.kind === 'workspace' ? view.linePayer.label : 'Payer not verified'}</dd>\n {view.linePayer.kind === 'workspace' && <dd className=\"tangle-lines__billing-detail\">Charged to {view.workspaceName}.</dd>}\n </div>\n <div>\n <dt>Agent turns</dt>\n <dd>{view.turnPayer.kind === 'unverified' ? 'Payer not verified' : view.turnPayer.label}</dd>\n {view.turnPayer.kind === 'member' && <dd className=\"tangle-lines__billing-detail\">Each member pays for their own admitted turns.</dd>}\n </div>\n <div>\n <dt>Allowance</dt>\n {view.allowance ? <>\n <dd>{view.allowance.turnsPerMemberPerDay} turns per member each day</dd>\n {view.allowance.used !== undefined && view.allowance.limit !== undefined &&\n <dd className=\"tangle-lines__billing-detail\">{view.allowance.used} of {view.allowance.limit} turns used{view.allowance.resetsAt ? ` · resets ${resetTime(view.allowance.resetsAt)}` : ''}</dd>}\n </> : <dd>No allowance reported</dd>}\n </div>\n </dl>\n </section>\n}\n","import { useEffect, useMemo, useState } from 'react'\nimport type { ApplicationSenderVerification, ApplicationSenderVerificationStart } from '../application-verification'\nimport { LineSetup } from './LineSetup'\nimport type { LineConnectInput, LineSetupClient, LineSetupProps } from './contracts'\n\nexport type { ApplicationSenderVerification, ApplicationSenderVerificationStart } from '../application-verification'\n\nexport interface ApplicationLineConnectInput extends LineConnectInput {\n senderVerificationId: string\n turnsPerDay: number\n}\n\nexport interface ApplicationLineSetupClient extends Omit<LineSetupClient, 'connect'> {\n /** Host creates or finds the selected owned line, then starts TEST with its owner key. */\n startSenderVerification(input: LineConnectInput): Promise<ApplicationSenderVerificationStart>\n /** Host returns only public fields. approvedSender never reaches the browser. */\n getSenderVerification(lineId: string, testId: string): Promise<ApplicationSenderVerification>\n /** Host rechecks owner authority and consumes the proof during attach. */\n connect(input: ApplicationLineConnectInput): Promise<void>\n}\n\nexport interface ApplicationLineSetupProps extends Omit<LineSetupProps, 'client' | 'canConnect' | 'connectPrerequisite'> {\n client: ApplicationLineSetupClient\n /** Disable new grants without preventing disconnection of an existing line. */\n enabled: boolean\n}\n\nfunction verificationError(cause: unknown): string {\n return cause instanceof Error ? cause.message : 'The phone test could not be checked. Try again.'\n}\n\nfunction draftKey(input: LineConnectInput): string {\n return JSON.stringify(input)\n}\n\nfunction expiry(value: string): number {\n const time = new Date(value).getTime()\n return Number.isFinite(time) ? time : 0\n}\n\nfunction supportsSenderVerification(providerId: string, transport: LineConnectInput['transport']): boolean {\n return (providerId === 'inkbox' && transport === 'imessage')\n || (providerId === 'linq-whatsapp' && transport === 'whatsapp')\n}\n\nfunction hasTestIdentity(input: LineConnectInput): boolean {\n return input.transport === 'imessage' || (input.transport === 'whatsapp' && Boolean(input.phoneNumberId))\n}\n\n/** Verify an owned handset before connecting its supported line to an application. */\nexport function ApplicationLineSetup(props: ApplicationLineSetupProps) {\n return <ApplicationLineSetupScope key={props.scopeKey} {...props} />\n}\n\nfunction ApplicationLineSetupScope({ client, enabled, ...props }: ApplicationLineSetupProps) {\n const [limit, setLimit] = useState('20')\n const [session, setSession] = useState<{\n draftKey: string\n start: ApplicationSenderVerificationStart\n status: ApplicationSenderVerification\n } | null>(null)\n const [pending, setPending] = useState<{ kind: 'start' | 'check'; draftKey: string } | null>(null)\n const [error, setError] = useState<string | null>(null)\n const [needsStatusRefresh, setNeedsStatusRefresh] = useState(false)\n const [now, setNow] = useState(() => Date.now())\n const turnsPerDay = Number(limit)\n const validLimit = Number.isSafeInteger(turnsPerDay) && turnsPerDay >= 1 && turnsPerDay <= 10_000\n\n useEffect(() => {\n const timer = setInterval(() => setNow(Date.now()), 1_000)\n return () => clearInterval(timer)\n }, [])\n\n function activeFor(input: LineConnectInput) {\n return session?.draftKey === draftKey(input) ? session : null\n }\n\n function verifiedFor(input: LineConnectInput, time: number): boolean {\n const active = activeFor(input)\n return Boolean(active && !needsStatusRefresh && !pending && active.status.state === 'verified'\n && active.status.proof.signedInboundTestAt && active.status.proof.providerReplyAcknowledgedAt\n && active.status.proof.signedInboundConfirmAt && expiry(active.status.expiresAt) > time)\n }\n\n async function start(input: LineConnectInput) {\n const key = draftKey(input)\n if (!enabled || !props.canManage || !validLimit || pending || !hasTestIdentity(input)) return\n setPending({ kind: 'start', draftKey: key })\n setError(null)\n setNeedsStatusRefresh(true)\n try {\n const result = await client.startSenderVerification(input)\n if (!result.lineId || !result.testId || !result.testText || result.state !== 'awaiting_test'\n || expiry(result.expiresAt) <= Date.now()) throw new Error('The phone test could not be started. Try again.')\n setSession({\n draftKey: key,\n start: result,\n status: {\n lineId: result.lineId, testId: result.testId, state: result.state, expiresAt: result.expiresAt,\n proof: { signedInboundTestAt: null, providerReplyAcknowledgedAt: null, signedInboundConfirmAt: null },\n },\n })\n setNow(Date.now())\n } catch (cause) {\n setError(verificationError(cause))\n } finally {\n setPending(null)\n }\n }\n\n async function check(active: NonNullable<typeof session>) {\n if (pending) return\n setPending({ kind: 'check', draftKey: active.draftKey })\n setError(null)\n setNeedsStatusRefresh(true)\n try {\n const result = await client.getSenderVerification(active.start.lineId, active.start.testId)\n if (result.lineId !== active.start.lineId || result.testId !== active.start.testId)\n throw new Error('The phone test changed. Start a new test.')\n // Copy only public fields even if a host accidentally returns an SDK owner read.\n const status: ApplicationSenderVerification = {\n lineId: result.lineId, testId: result.testId, state: result.state, expiresAt: result.expiresAt,\n proof: {\n signedInboundTestAt: result.proof.signedInboundTestAt,\n providerReplyAcknowledgedAt: result.proof.providerReplyAcknowledgedAt,\n signedInboundConfirmAt: result.proof.signedInboundConfirmAt,\n },\n }\n setSession(current => current?.start.testId === active.start.testId ? { ...current, status } : current)\n setNeedsStatusRefresh(false)\n setNow(Date.now())\n } catch (cause) {\n setError(verificationError(cause))\n } finally {\n setPending(null)\n }\n }\n\n const lineClient = useMemo<LineSetupClient>(() => ({\n async load() {\n const snapshot = await client.load()\n return {\n ...snapshot,\n connections: snapshot.connections?.map(connection => ({\n ...connection,\n identities: connection.identities.filter(identity =>\n supportsSenderVerification(connection.providerId, identity.transport)),\n })).filter(connection => connection.identities.length > 0) ?? null,\n }\n },\n disconnect: (id, expectedAttachmentId) => client.disconnect(id, expectedAttachmentId),\n async connect(input) {\n const active = activeFor(input)\n if (!enabled || !props.canManage || !validLimit || !verifiedFor(input, Date.now()) || !active)\n throw new Error('Verify the selected phone before connecting this line')\n try {\n await client.connect({ ...input, senderVerificationId: active.start.testId, turnsPerDay })\n setSession(null)\n } catch (cause) {\n setNeedsStatusRefresh(true)\n throw cause\n }\n },\n }), [client, enabled, props.canManage, session, turnsPerDay, validLimit, needsStatusRefresh, pending])\n\n function prerequisite(input: LineConnectInput) {\n const key = draftKey(input)\n const active = activeFor(input)\n const expired = Boolean(active && expiry(active.status.expiresAt) <= now)\n const verified = verifiedFor(input, now)\n const inProgress = active && !expired && ['awaiting_test', 'sending', 'challenge_sent'].includes(active.status.state)\n const busy = pending?.draftKey === key\n const canStart = enabled && props.canManage && validLimit && !pending && hasTestIdentity(input)\n const canCheck = Boolean((inProgress || active?.status.state === 'verified') && !pending)\n\n return {\n ready: validLimit && verified,\n content: <div className=\"tangle-lines__verification\" aria-label=\"Phone verification\">\n <h4>Verify your phone</h4>\n <p>Use the phone that will send commands to this line. Connection opens after that phone is verified.</p>\n {!validLimit && <p className=\"tangle-lines__warning\">Enter a daily message limit from 1 to 10,000 first.</p>}\n {(!active || expired || ['consumed', 'cancelled', 'superseded', 'failed', 'expired'].includes(active.status.state))\n ? <>\n {active && <p role=\"status\">This phone test can no longer connect the line. Start a new test.</p>}\n <button type=\"button\" className=\"tangle-lines__secondary\" disabled={!canStart}\n onClick={() => void start(input)}>{busy && pending?.kind === 'start' ? 'Starting test…' : 'Start phone test'}</button>\n </> : <>\n <p>Text this exact message to the selected line from your phone:</p>\n <code className=\"tangle-lines__test-text\">{active.start.testText}</code>\n <p>Follow the private reply on your phone. No confirmation code is entered here.</p>\n <p className=\"tangle-lines__verification-expiry\">Test expires at {new Date(active.status.expiresAt).toLocaleTimeString()}.</p>\n {verified && <p className=\"tangle-lines__verified\" role=\"status\">Phone verified. You can connect this line.</p>}\n <div className=\"tangle-lines__verification-actions\">\n {!verified && <span role=\"status\">{active.status.state === 'verified'\n ? 'Check verification again before connecting.'\n : active.status.state === 'challenge_sent'\n ? 'Confirmation sent. Reply from the same phone, then check again.'\n : active.status.state === 'sending' ? 'Sending confirmation…' : 'Waiting for your test message.'}</span>}\n <button type=\"button\" className=\"tangle-lines__secondary\" disabled={!canCheck}\n onClick={() => void check(active)}>{busy && pending?.kind === 'check' ? 'Checking…' : 'Check verification'}</button>\n </div>\n </>}\n {error && <p className=\"tangle-lines__verification-error\" role=\"alert\">{error}</p>}\n </div>,\n }\n }\n\n return <>\n {props.canManage && <section className=\"tangle-lines tangle-lines--application\" aria-label=\"Application access\">\n <header className=\"tangle-lines__application-heading\">\n <h2>Text your workspace</h2>\n <p>Connect an owned iMessage or WhatsApp line to a conversation. Verify your phone before it can use application access and compute.</p>\n </header>\n {!enabled ? <div className=\"tangle-lines__notice\" role=\"status\">\n <strong>New connections are disabled</strong>\n <p>You can still review and disconnect an existing line below.</p>\n </div> : <div className=\"tangle-lines__authorization\">\n <label className=\"tangle-lines__limit\">Maximum messages per day\n <input type=\"number\" min={1} max={10_000} step={1} value={limit}\n onChange={event => setLimit(event.target.value)} />\n </label>\n <p className=\"tangle-lines__fine-print\">The message limit is not a dollar cap. STOP stops replies, not an already accepted task; cancel that task in the application.</p>\n </div>}\n </section>}\n <LineSetup {...props} targetLabel={props.targetLabel ?? 'Conversation'} client={lineClient}\n canConnect={props.canManage && enabled} showConnectionSetup={enabled}\n connectPrerequisite={prerequisite}\n setupDescription=\"Choose an owned iMessage or WhatsApp line and the conversation it will answer.\"\n emptyConnectionsMessage=\"Add an owned Inkbox iMessage handle or Linq WhatsApp number in Hub, then\" />\n </>\n}\n","import { useId } from 'react'\n\nexport interface SharedLineApp {\n /** Stable app identity used to collapse duplicate registrations. */\n id: string\n name: string\n}\n\nexport interface SharedLineAppNoticeProps {\n /** Apps the host has verified can handle this same phone conversation. */\n apps: readonly SharedLineApp[]\n /** The host controls dismissal so the choice can persist with its own policy. */\n open: boolean\n onKeepSharing(): void\n /** Omit when the host has no supported dedicated-number flow. */\n onRequestDedicatedNumber?: () => void\n}\n\nfunction distinctApps(apps: readonly SharedLineApp[]): SharedLineApp[] {\n const seen = new Set<string>()\n const result: SharedLineApp[] = []\n\n for (const app of apps) {\n const id = app.id.trim()\n if (!id || seen.has(id)) continue\n seen.add(id)\n result.push({ id, name: app.name.trim() || 'Unnamed app' })\n }\n\n return result\n}\n\n/** A quiet, dismissible notice for apps that the host verified share a phone thread. */\nexport function SharedLineAppNotice({\n apps,\n open,\n onKeepSharing,\n onRequestDedicatedNumber,\n}: SharedLineAppNoticeProps) {\n const titleId = useId()\n const sharingApps = distinctApps(apps)\n if (!open || sharingApps.length < 2) return null\n\n return (\n <section className=\"tangle-lines agent-shared-line-notice\" aria-labelledby={titleId}>\n <div className=\"agent-shared-line-notice__copy\">\n <h2 id={titleId}>These apps share one text conversation</h2>\n <p>Each app keeps its own history here. Their replies appear together in the same conversation on your phone.</p>\n <ul className=\"agent-shared-line-notice__apps\" aria-label=\"Apps sharing this conversation\">\n {sharingApps.map(app => <li key={app.id}>{app.name}</li>)}\n </ul>\n </div>\n <div className=\"agent-shared-line-notice__actions\">\n {onRequestDedicatedNumber && (\n <button\n className=\"agent-shared-line-notice__secondary\"\n type=\"button\"\n onClick={onRequestDedicatedNumber}\n >\n Get a dedicated number\n </button>\n )}\n <button className=\"agent-shared-line-notice__primary\" type=\"button\" onClick={onKeepSharing}>\n Keep sharing\n </button>\n </div>\n </section>\n )\n}\n"],"mappings":"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","names":["occupied","line","useEffect","useLayoutEffect","useRef","useState","Fragment","jsx","jsxs","useBrowserLayoutEffect","Fragment","jsx","jsxs","useEffect","useState","Fragment","jsx","jsxs","useState","useEffect","jsx","jsxs"]}
|
|
@@ -12,8 +12,8 @@ import {
|
|
|
12
12
|
} from "../chunk-4LBCTFBP.js";
|
|
13
13
|
import {
|
|
14
14
|
assertRenderUiSchema
|
|
15
|
-
} from "../chunk-
|
|
16
|
-
import "../chunk-
|
|
15
|
+
} from "../chunk-MJ4PW262.js";
|
|
16
|
+
import "../chunk-UK4PVX2T.js";
|
|
17
17
|
|
|
18
18
|
// src/preset-cloudflare/workflow-instance.ts
|
|
19
19
|
async function ensureCloudflareWorkflowInstance(binding, input) {
|
|
@@ -121,9 +121,9 @@ export declare function createPublicConsultation(options: PublicConsultationOpti
|
|
|
121
121
|
executionBudget?: ChatTurnExecutionLimits;
|
|
122
122
|
maxOutputTokens?: number;
|
|
123
123
|
}) => Promise<{
|
|
124
|
-
start?: undefined;
|
|
125
124
|
status: 'unsupported';
|
|
126
125
|
reason: string;
|
|
126
|
+
start?: undefined;
|
|
127
127
|
} | {
|
|
128
128
|
reason?: undefined;
|
|
129
129
|
status: 'prepared';
|
package/dist/sandbox/index.js
CHANGED
|
@@ -138,13 +138,13 @@ import {
|
|
|
138
138
|
} from "../chunk-4LBCTFBP.js";
|
|
139
139
|
import "../chunk-WVESWAJJ.js";
|
|
140
140
|
import "../chunk-LWSJK546.js";
|
|
141
|
-
import "../chunk-
|
|
141
|
+
import "../chunk-74WXGIEK.js";
|
|
142
142
|
import "../chunk-6A7MYOUI.js";
|
|
143
143
|
import "../chunk-S5SRJJQG.js";
|
|
144
|
-
import "../chunk-
|
|
145
|
-
import "../chunk-
|
|
144
|
+
import "../chunk-MJ4PW262.js";
|
|
145
|
+
import "../chunk-N537SNWU.js";
|
|
146
146
|
import "../chunk-UGWQLQDS.js";
|
|
147
|
-
import "../chunk-
|
|
147
|
+
import "../chunk-UK4PVX2T.js";
|
|
148
148
|
import "../chunk-D6UJEOZQ.js";
|
|
149
149
|
export {
|
|
150
150
|
DEFAULT_ESCALATION_TOOLS,
|
package/dist/tools/index.js
CHANGED
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
restrictTaxonomy,
|
|
10
10
|
verifyCapabilityToken,
|
|
11
11
|
verifyExpiringCapabilityToken
|
|
12
|
-
} from "../chunk-
|
|
12
|
+
} from "../chunk-74WXGIEK.js";
|
|
13
13
|
import {
|
|
14
14
|
DEFAULT_APP_TOOL_PATHS,
|
|
15
15
|
DEFAULT_HEADER_NAMES,
|
|
@@ -23,7 +23,7 @@ import {
|
|
|
23
23
|
unresolvableSurfaceCredential
|
|
24
24
|
} from "../chunk-6A7MYOUI.js";
|
|
25
25
|
import "../chunk-S5SRJJQG.js";
|
|
26
|
-
import "../chunk-
|
|
26
|
+
import "../chunk-MJ4PW262.js";
|
|
27
27
|
import {
|
|
28
28
|
APP_TOOL_NAMES,
|
|
29
29
|
buildAppToolOpenAITools,
|
|
@@ -31,11 +31,11 @@ import {
|
|
|
31
31
|
defineAppTool,
|
|
32
32
|
findCustomTool,
|
|
33
33
|
isAppToolName
|
|
34
|
-
} from "../chunk-
|
|
34
|
+
} from "../chunk-N537SNWU.js";
|
|
35
35
|
import "../chunk-UGWQLQDS.js";
|
|
36
36
|
import {
|
|
37
37
|
ToolInputError
|
|
38
|
-
} from "../chunk-
|
|
38
|
+
} from "../chunk-UK4PVX2T.js";
|
|
39
39
|
export {
|
|
40
40
|
APP_TOOL_NAMES,
|
|
41
41
|
DEFAULT_APP_TOOL_PATHS,
|
|
@@ -41,7 +41,7 @@ export interface AgentProfileEditorConfig {
|
|
|
41
41
|
systemPrompt?: boolean;
|
|
42
42
|
instructions?: boolean;
|
|
43
43
|
};
|
|
44
|
-
/** Keep hidden resources opaque when the host preserves and validates their authority on save. Defaults to false. */
|
|
44
|
+
/** Keep hidden resources opaque when the host preserves and validates their authority on save. Advanced JSON remains editable. Defaults to false. */
|
|
45
45
|
preserveHiddenResources?: boolean;
|
|
46
46
|
/** Catalog-backed model selectors. Without it, model fields are plain text inputs. */
|
|
47
47
|
models?: AgentProfileEditorModelCatalog;
|
package/dist/web-react/index.js
CHANGED
|
@@ -16,11 +16,11 @@ import {
|
|
|
16
16
|
} from "../chunk-3NVVBQ2U.js";
|
|
17
17
|
import {
|
|
18
18
|
defineAppTool
|
|
19
|
-
} from "../chunk-
|
|
19
|
+
} from "../chunk-N537SNWU.js";
|
|
20
20
|
import "../chunk-UGWQLQDS.js";
|
|
21
21
|
import {
|
|
22
22
|
ToolInputError
|
|
23
|
-
} from "../chunk-
|
|
23
|
+
} from "../chunk-UK4PVX2T.js";
|
|
24
24
|
import {
|
|
25
25
|
isWorkProductStatus,
|
|
26
26
|
parseAgentCheckInput,
|