@msg91comm/m91 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +35 -0
- package/README.md +241 -19
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/integrations/claude-agent-sdk.d.ts +63 -0
- package/dist/src/integrations/claude-agent-sdk.d.ts.map +1 -0
- package/dist/src/integrations/claude-agent-sdk.js +109 -0
- package/dist/src/integrations/claude-agent-sdk.js.map +1 -0
- package/dist/src/integrations/google-adk.d.ts +47 -0
- package/dist/src/integrations/google-adk.d.ts.map +1 -0
- package/dist/src/integrations/google-adk.js +84 -0
- package/dist/src/integrations/google-adk.js.map +1 -0
- package/dist/src/integrations/index.d.ts +7 -3
- package/dist/src/integrations/index.d.ts.map +1 -1
- package/dist/src/integrations/index.js +6 -2
- package/dist/src/integrations/index.js.map +1 -1
- package/dist/src/integrations/langchain.d.ts +56 -5
- package/dist/src/integrations/langchain.d.ts.map +1 -1
- package/dist/src/integrations/langchain.js +56 -2
- package/dist/src/integrations/langchain.js.map +1 -1
- package/dist/src/integrations/mastra.d.ts +75 -0
- package/dist/src/integrations/mastra.d.ts.map +1 -0
- package/dist/src/integrations/mastra.js +109 -0
- package/dist/src/integrations/mastra.js.map +1 -0
- package/dist/src/integrations/openai-agents.d.ts +61 -0
- package/dist/src/integrations/openai-agents.d.ts.map +1 -0
- package/dist/src/integrations/openai-agents.js +127 -0
- package/dist/src/integrations/openai-agents.js.map +1 -0
- package/dist/src/integrations/specs.d.ts +42 -0
- package/dist/src/integrations/specs.d.ts.map +1 -1
- package/dist/src/integrations/specs.js +61 -0
- package/dist/src/integrations/specs.js.map +1 -1
- package/dist/src/integrations/vercel-ai.d.ts +44 -6
- package/dist/src/integrations/vercel-ai.d.ts.map +1 -1
- package/dist/src/integrations/vercel-ai.js +38 -3
- package/dist/src/integrations/vercel-ai.js.map +1 -1
- package/dist/src/integrations/zod-shapes.d.ts +19 -0
- package/dist/src/integrations/zod-shapes.d.ts.map +1 -0
- package/dist/src/integrations/zod-shapes.js +44 -0
- package/dist/src/integrations/zod-shapes.js.map +1 -0
- package/dist/src/platform.d.ts +1 -1
- package/dist/src/platform.d.ts.map +1 -1
- package/dist/src/platform.js +1 -1
- package/dist/src/platform.js.map +1 -1
- package/dist/src/url-builder.js +1 -1
- package/dist/src/url-builder.js.map +1 -1
- package/examples/basic-alert.ts +1 -1
- package/examples/claude-agent-sdk.ts +23 -0
- package/examples/deep-agents.ts +31 -0
- package/examples/google-adk.ts +39 -0
- package/examples/mastra.ts +41 -0
- package/examples/openai-agents.ts +33 -0
- package/examples/webhook-urls.ts +1 -1
- package/package.json +63 -11
- package/src/index.ts +1 -1
- package/src/integrations/claude-agent-sdk.ts +158 -0
- package/src/integrations/google-adk.ts +122 -0
- package/src/integrations/index.ts +7 -3
- package/src/integrations/langchain.ts +109 -6
- package/src/integrations/mastra.ts +178 -0
- package/src/integrations/openai-agents.ts +173 -0
- package/src/integrations/specs.ts +104 -0
- package/src/integrations/vercel-ai.ts +59 -7
- package/src/integrations/zod-shapes.ts +55 -0
- package/src/platform.ts +1 -1
- package/src/url-builder.ts +1 -1
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI Agents SDK (`@openai/agents`): two tools, and M91 as the approver.
|
|
3
|
+
*
|
|
4
|
+
* **Approver.** Mark your risky tools `needsApproval: true`. The SDK pauses the
|
|
5
|
+
* run and returns `result.interruptions`; `runWithM91Approvals` rings a phone
|
|
6
|
+
* for each one, approves or rejects it on the run state with the person's
|
|
7
|
+
* answer, and resumes the same run until it finishes.
|
|
8
|
+
*
|
|
9
|
+
* ```ts
|
|
10
|
+
* import { Agent, tool } from '@openai/agents';
|
|
11
|
+
* import { M91Client } from '@msg91comm/m91';
|
|
12
|
+
* import { runWithM91Approvals } from '@msg91comm/m91/integrations/openai-agents';
|
|
13
|
+
*
|
|
14
|
+
* const issueRefund = tool({
|
|
15
|
+
* name: 'issue_refund',
|
|
16
|
+
* description: 'Refund an order.',
|
|
17
|
+
* parameters: z.object({ orderId: z.string(), amount: z.number() }),
|
|
18
|
+
* needsApproval: true,
|
|
19
|
+
* execute: async ({ orderId, amount }) => refunds.create(orderId, amount),
|
|
20
|
+
* });
|
|
21
|
+
*
|
|
22
|
+
* const agent = new Agent({ name: 'Support', instructions: '…', tools: [issueRefund] });
|
|
23
|
+
* const client = new M91Client(process.env.M91_SEND_LINK!);
|
|
24
|
+
*
|
|
25
|
+
* const result = await runWithM91Approvals(agent, 'Refund ORD-40122, it never arrived.', client);
|
|
26
|
+
* console.log(result.finalOutput);
|
|
27
|
+
* ```
|
|
28
|
+
*
|
|
29
|
+
* **Tools** (`createM91Tools`) are for when the model itself should decide to
|
|
30
|
+
* ask, or to wake somebody about something that happened.
|
|
31
|
+
*
|
|
32
|
+
* `@openai/agents` is an optional peer dependency, imported only when one of
|
|
33
|
+
* these is called.
|
|
34
|
+
*/
|
|
35
|
+
import { ALERT_DESCRIPTION, ALERT_SCHEMA, ALERT_TOOL_NAME, APPROVAL_DESCRIPTION, APPROVAL_SCHEMA, APPROVAL_TOOL_NAME, decideToolCall, needsHuman, runAlert, runApproval, } from './specs.js';
|
|
36
|
+
async function agentsModule() {
|
|
37
|
+
try {
|
|
38
|
+
const specifier = '@openai/agents';
|
|
39
|
+
return (await import(specifier));
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
throw new Error('The OpenAI Agents integration needs @openai/agents. Install it with: npm install @openai/agents', { cause: error });
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/** The blocking approval tool, `m91_request_approval`. Returns `"approved"`, `"rejected"` or `"error: …"`. */
|
|
46
|
+
export async function createM91ApprovalTool(client, defaults = {}) {
|
|
47
|
+
const { tool } = await agentsModule();
|
|
48
|
+
return tool({
|
|
49
|
+
name: APPROVAL_TOOL_NAME,
|
|
50
|
+
description: APPROVAL_DESCRIPTION,
|
|
51
|
+
// JSON Schema with optional fields: the non-strict mode accepts it as is.
|
|
52
|
+
parameters: APPROVAL_SCHEMA,
|
|
53
|
+
strict: false,
|
|
54
|
+
execute: (args) => runApproval(client, args, defaults),
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
/** The fire-and-forget alert tool, `m91_send_alert`. Returns `"sent:delivered=N"` or `"error: …"`. */
|
|
58
|
+
export async function createM91AlertTool(client, defaults = {}) {
|
|
59
|
+
const { tool } = await agentsModule();
|
|
60
|
+
return tool({
|
|
61
|
+
name: ALERT_TOOL_NAME,
|
|
62
|
+
description: ALERT_DESCRIPTION,
|
|
63
|
+
parameters: ALERT_SCHEMA,
|
|
64
|
+
strict: false,
|
|
65
|
+
execute: (args) => runAlert(client, args, defaults),
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
/** Both tools, for an agent's `tools` array. */
|
|
69
|
+
export async function createM91Tools(client, defaults = {}) {
|
|
70
|
+
return [await createM91ApprovalTool(client, defaults), await createM91AlertTool(client, defaults)];
|
|
71
|
+
}
|
|
72
|
+
function parseArguments(item) {
|
|
73
|
+
const raw = item.arguments;
|
|
74
|
+
if (raw === undefined)
|
|
75
|
+
return undefined;
|
|
76
|
+
try {
|
|
77
|
+
return JSON.parse(raw);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return raw;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function callIdOf(item) {
|
|
84
|
+
const raw = item.rawItem;
|
|
85
|
+
return raw.callId ?? raw.id ?? `${item.name ?? 'tool'}-${item.arguments ?? ''}`.slice(0, 60);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Ask a person about every pending approval on a paused run, and record the
|
|
89
|
+
* answers on its state. Returns how many were decided; resume with
|
|
90
|
+
* `run(agent, result.state)`.
|
|
91
|
+
*
|
|
92
|
+
* Interruptions for tools outside `options.tools` are left pending for your
|
|
93
|
+
* own code to decide.
|
|
94
|
+
*/
|
|
95
|
+
export async function approveInterruptionsWithM91(result, client, options = {}) {
|
|
96
|
+
const state = result.state;
|
|
97
|
+
let decided = 0;
|
|
98
|
+
for (const item of result.interruptions ?? []) {
|
|
99
|
+
const toolName = item.name ?? 'tool';
|
|
100
|
+
const input = parseArguments(item);
|
|
101
|
+
if (!(await needsHuman(options, toolName, input)))
|
|
102
|
+
continue;
|
|
103
|
+
const decision = await decideToolCall(client, { toolName, input, callId: callIdOf(item) }, options);
|
|
104
|
+
if (decision.approved)
|
|
105
|
+
state.approve(item);
|
|
106
|
+
else
|
|
107
|
+
state.reject(item, { message: decision.reason });
|
|
108
|
+
decided += 1;
|
|
109
|
+
}
|
|
110
|
+
return decided;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* `run()`, with every approval the run pauses for answered on a phone through
|
|
114
|
+
* M91, until the run finishes or nothing left to decide is M91's.
|
|
115
|
+
*/
|
|
116
|
+
export async function runWithM91Approvals(agent, input, client, options = {}) {
|
|
117
|
+
const { run } = await agentsModule();
|
|
118
|
+
const { runOptions, maxRounds = 20, ...gate } = options;
|
|
119
|
+
let result = (await run(agent, input, runOptions));
|
|
120
|
+
for (let round = 0; round < maxRounds && (result.interruptions?.length ?? 0) > 0; round += 1) {
|
|
121
|
+
if ((await approveInterruptionsWithM91(result, client, gate)) === 0)
|
|
122
|
+
break;
|
|
123
|
+
result = (await run(agent, result.state, runOptions));
|
|
124
|
+
}
|
|
125
|
+
return result;
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=openai-agents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-agents.js","sourceRoot":"","sources":["../../../src/integrations/openai-agents.ts"],"names":[],"mappings":"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"}
|
|
@@ -128,4 +128,46 @@ export interface AlertDefaults {
|
|
|
128
128
|
/** Ask, wait, and answer in a word a model cannot misread. */
|
|
129
129
|
export declare function runApproval(client: M91Client, args: ApprovalArgs, defaults?: ApprovalDefaults): Promise<string>;
|
|
130
130
|
export declare function runAlert(client: M91Client, args: AlertArgs, defaults?: AlertDefaults): Promise<string>;
|
|
131
|
+
/**
|
|
132
|
+
* One tool call a framework is about to make, in the only three fields every
|
|
133
|
+
* framework agrees on.
|
|
134
|
+
*/
|
|
135
|
+
export interface GatedCall {
|
|
136
|
+
toolName: string;
|
|
137
|
+
input: unknown;
|
|
138
|
+
/** The framework's id for this call. Becomes the alert's customId. */
|
|
139
|
+
callId: string;
|
|
140
|
+
}
|
|
141
|
+
/** How a gate decides who gets asked, and how the question reads. */
|
|
142
|
+
export interface GateOptions extends ApprovalDefaults {
|
|
143
|
+
/**
|
|
144
|
+
* Which tool calls need a human: a list of tool names, or a predicate.
|
|
145
|
+
*
|
|
146
|
+
* Required where a framework routes every call through the gate (Claude
|
|
147
|
+
* Agent SDK, Google ADK, Vercel `toolApproval`): ringing somebody's phone
|
|
148
|
+
* for every file read is how a channel gets muted.
|
|
149
|
+
*/
|
|
150
|
+
tools?: readonly string[] | ((toolName: string, input: unknown) => boolean | Promise<boolean>);
|
|
151
|
+
/** Write the lock-screen question yourself. Default: "Allow <tool>?" plus the arguments. */
|
|
152
|
+
describe?: (call: GatedCall) => {
|
|
153
|
+
title: string;
|
|
154
|
+
description?: string;
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
export interface GateDecision {
|
|
158
|
+
approved: boolean;
|
|
159
|
+
/** Why, in words a model can repeat to the user. */
|
|
160
|
+
reason: string;
|
|
161
|
+
}
|
|
162
|
+
/** Does this call need a human? With no `tools`, every call that reaches the gate does. */
|
|
163
|
+
export declare function needsHuman(options: GateOptions, toolName: string, input: unknown): Promise<boolean>;
|
|
164
|
+
/** A customId M91 accepts, stable across a framework's retries of the same call. */
|
|
165
|
+
export declare function gateCustomId(call: GatedCall): string;
|
|
166
|
+
/**
|
|
167
|
+
* Ring a phone about a tool call and wait for the answer.
|
|
168
|
+
*
|
|
169
|
+
* Fails closed: an M91 error, an unreachable channel or a timeout is a no,
|
|
170
|
+
* with the reason spelled out, never a silent yes.
|
|
171
|
+
*/
|
|
172
|
+
export declare function decideToolCall(client: M91Client, call: GatedCall, options?: GateOptions): Promise<GateDecision>;
|
|
131
173
|
//# sourceMappingURL=specs.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"specs.d.ts","sourceRoot":"","sources":["../../../src/integrations/specs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAG9C,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE5D,eAAO,MAAM,QAAQ,aAAa,CAAC;AACnC,eAAO,MAAM,QAAQ,aAAa,CAAC;AAEnC;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAIlD;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAexD;AAWD,gFAAgF;AAChF,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+BlB,CAAC;AAEX,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;CAkBf,CAAC;AAEX,eAAO,MAAM,kBAAkB,yBAAyB,CAAC;AACzD,eAAO,MAAM,eAAe,mBAAmB,CAAC;AAEhD,eAAO,MAAM,oBAAoB,QASW,CAAC;AAE7C,eAAO,MAAM,iBAAiB,QAQmD,CAAC;AAElF,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED,8DAA8D;AAC9D,wBAAsB,WAAW,CAC/B,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,YAAY,EAClB,QAAQ,GAAE,gBAAqB,GAC9B,OAAO,CAAC,MAAM,CAAC,CAkBjB;AAED,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,SAAS,EACf,QAAQ,GAAE,aAAkB,GAC3B,OAAO,CAAC,MAAM,CAAC,CAejB"}
|
|
1
|
+
{"version":3,"file":"specs.d.ts","sourceRoot":"","sources":["../../../src/integrations/specs.ts"],"names":[],"mappings":"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"}
|
|
@@ -153,4 +153,65 @@ export async function runAlert(client, args, defaults = {}) {
|
|
|
153
153
|
return errorResult(error);
|
|
154
154
|
}
|
|
155
155
|
}
|
|
156
|
+
/** Does this call need a human? With no `tools`, every call that reaches the gate does. */
|
|
157
|
+
export async function needsHuman(options, toolName, input) {
|
|
158
|
+
const { tools } = options;
|
|
159
|
+
if (tools === undefined)
|
|
160
|
+
return true;
|
|
161
|
+
if (typeof tools === 'function')
|
|
162
|
+
return Boolean(await tools(toolName, input));
|
|
163
|
+
return tools.includes(toolName);
|
|
164
|
+
}
|
|
165
|
+
/** A customId M91 accepts, stable across a framework's retries of the same call. */
|
|
166
|
+
export function gateCustomId(call) {
|
|
167
|
+
const raw = `tool-${call.toolName}-${call.callId}`;
|
|
168
|
+
return raw.replace(/[^A-Za-z0-9_-]/g, '-').slice(0, 100);
|
|
169
|
+
}
|
|
170
|
+
function defaultQuestion(call) {
|
|
171
|
+
let args;
|
|
172
|
+
try {
|
|
173
|
+
args = JSON.stringify(call.input, null, 2) ?? '';
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
args = String(call.input);
|
|
177
|
+
}
|
|
178
|
+
if (args.length > 1500)
|
|
179
|
+
args = `${args.slice(0, 1500)}\n… (truncated)`;
|
|
180
|
+
return {
|
|
181
|
+
title: `Allow the agent to run ${call.toolName}?`,
|
|
182
|
+
description: `The agent wants to call ${call.toolName} with:\n${args}`,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Ring a phone about a tool call and wait for the answer.
|
|
187
|
+
*
|
|
188
|
+
* Fails closed: an M91 error, an unreachable channel or a timeout is a no,
|
|
189
|
+
* with the reason spelled out, never a silent yes.
|
|
190
|
+
*/
|
|
191
|
+
export async function decideToolCall(client, call, options = {}) {
|
|
192
|
+
const question = options.describe ? options.describe(call) : defaultQuestion(call);
|
|
193
|
+
try {
|
|
194
|
+
const approved = await client.requestApproval(question.title, {
|
|
195
|
+
customId: gateCustomId(call),
|
|
196
|
+
description: question.description,
|
|
197
|
+
severity: options.severity ?? 'HIGH',
|
|
198
|
+
approveLabel: options.approveLabel ?? 'Approve',
|
|
199
|
+
rejectLabel: options.rejectLabel ?? 'Reject',
|
|
200
|
+
timeoutMs: (options.timeoutSeconds ?? 300) * 1000,
|
|
201
|
+
});
|
|
202
|
+
return approved
|
|
203
|
+
? { approved: true, reason: 'Approved by a human via M91.' }
|
|
204
|
+
: {
|
|
205
|
+
approved: false,
|
|
206
|
+
reason: 'A human rejected this action via M91 (or did not answer in time). ' +
|
|
207
|
+
'Do not retry it; tell the user it was not approved.',
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
catch (error) {
|
|
211
|
+
return {
|
|
212
|
+
approved: false,
|
|
213
|
+
reason: `Could not get human approval via M91, so the action was not run. ${errorResult(error)}`,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
}
|
|
156
217
|
//# sourceMappingURL=specs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"specs.js","sourceRoot":"","sources":["../../../src/integrations/specs.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"specs.js","sourceRoot":"","sources":["../../../src/integrations/specs.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Vercel AI SDK tools.
|
|
2
|
+
* Vercel AI SDK: two tools, and a gate for your own tools.
|
|
3
|
+
*
|
|
4
|
+
* **Tools** the model calls when it decides to ask (`createM91Tools`).
|
|
5
|
+
*
|
|
6
|
+
* **Gate** (`createM91ToolApproval`) plugs into AI SDK 6+'s `toolApproval`
|
|
7
|
+
* option: every call to the tools you name rings a phone first, and runs only
|
|
8
|
+
* if a person approves. The model cannot skip it, because it never decides to
|
|
9
|
+
* ask: the SDK asks for it.
|
|
10
|
+
*
|
|
11
|
+
* ```ts
|
|
12
|
+
* const { text } = await generateText({
|
|
13
|
+
* model: 'openai/gpt-5-mini',
|
|
14
|
+
* tools: { issueRefund, deleteUser },
|
|
15
|
+
* toolApproval: createM91ToolApproval(client, { tools: ['issueRefund', 'deleteUser'] }),
|
|
16
|
+
* stopWhen: isStepCount(5),
|
|
17
|
+
* prompt: 'Refund order ORD-40122.',
|
|
18
|
+
* });
|
|
19
|
+
* ```
|
|
3
20
|
*
|
|
4
21
|
* ```ts
|
|
5
22
|
* import { M91Client } from '@msg91comm/m91';
|
|
@@ -13,7 +30,7 @@
|
|
|
13
30
|
* m91_request_approval: await createM91ApprovalTool(client),
|
|
14
31
|
* m91_send_alert: await createM91AlertTool(client),
|
|
15
32
|
* },
|
|
16
|
-
*
|
|
33
|
+
* stopWhen: isStepCount(10),
|
|
17
34
|
* prompt: 'Look into order ORD-40122 and refund it if it checks out.',
|
|
18
35
|
* });
|
|
19
36
|
* ```
|
|
@@ -22,15 +39,36 @@
|
|
|
22
39
|
* imported only when one of these is called — `npm install @msg91comm/m91` stays at zero
|
|
23
40
|
* dependencies.
|
|
24
41
|
*/
|
|
42
|
+
import type { Tool, ToolApprovalStatus, ToolSet } from 'ai';
|
|
25
43
|
import type { M91Client } from '../client.js';
|
|
26
|
-
import { type AlertDefaults, type ApprovalDefaults } from './specs.js';
|
|
44
|
+
import { type AlertArgs, type AlertDefaults, type ApprovalArgs, type ApprovalDefaults, type GateOptions } from './specs.js';
|
|
27
45
|
/**
|
|
28
46
|
* The blocking approval gate. Returns `"approved"`, `"rejected"` or
|
|
29
47
|
* `"error: …"`, and nothing but a real human approval returns `"approved"`.
|
|
30
48
|
*/
|
|
31
|
-
export declare function createM91ApprovalTool(client: M91Client, defaults?: ApprovalDefaults): Promise<
|
|
49
|
+
export declare function createM91ApprovalTool(client: M91Client, defaults?: ApprovalDefaults): Promise<Tool<ApprovalArgs, string>>;
|
|
32
50
|
/** The fire-and-forget alert. Returns `"sent:delivered=N"` or `"error: …"`. */
|
|
33
|
-
export declare function createM91AlertTool(client: M91Client, defaults?: AlertDefaults): Promise<
|
|
51
|
+
export declare function createM91AlertTool(client: M91Client, defaults?: AlertDefaults): Promise<Tool<AlertArgs, string>>;
|
|
34
52
|
/** Both, keyed by tool name, ready to spread into `tools: {…}`. */
|
|
35
|
-
export declare function createM91Tools(client: M91Client, defaults?: ApprovalDefaults & AlertDefaults): Promise<
|
|
53
|
+
export declare function createM91Tools(client: M91Client, defaults?: ApprovalDefaults & AlertDefaults): Promise<ToolSet>;
|
|
54
|
+
/** The fields of an AI SDK tool call the gate reads. */
|
|
55
|
+
interface ApprovalRequestLike {
|
|
56
|
+
toolCall: {
|
|
57
|
+
toolName: string;
|
|
58
|
+
input: unknown;
|
|
59
|
+
toolCallId: string;
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* A `toolApproval` function for `generateText` / `streamText` / `ToolLoopAgent`.
|
|
64
|
+
*
|
|
65
|
+
* Calls to the tools in `options.tools` block while M91 rings a phone, then run
|
|
66
|
+
* if a person approves and come back to the model as denied otherwise. Every
|
|
67
|
+
* other call is `not-applicable` and runs as normal. Not synchronous: it waits
|
|
68
|
+
* up to `timeoutSeconds` (default 300) for an answer.
|
|
69
|
+
*/
|
|
70
|
+
export declare function createM91ToolApproval(client: M91Client, options: GateOptions & {
|
|
71
|
+
tools: NonNullable<GateOptions['tools']>;
|
|
72
|
+
}): (request: ApprovalRequestLike) => Promise<ToolApprovalStatus>;
|
|
73
|
+
export {};
|
|
36
74
|
//# sourceMappingURL=vercel-ai.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vercel-ai.d.ts","sourceRoot":"","sources":["../../../src/integrations/vercel-ai.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"vercel-ai.d.ts","sourceRoot":"","sources":["../../../src/integrations/vercel-ai.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAE5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAKL,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAKjB,MAAM,YAAY,CAAC;AAqBpB;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,SAAS,EACjB,QAAQ,GAAE,gBAAqB,GAC9B,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CASrC;AAED,+EAA+E;AAC/E,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,SAAS,EACjB,QAAQ,GAAE,aAAkB,GAC3B,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAOlC;AAED,mEAAmE;AACnE,wBAAsB,cAAc,CAClC,MAAM,EAAE,SAAS,EACjB,QAAQ,GAAE,gBAAgB,GAAG,aAAkB,GAC9C,OAAO,CAAC,OAAO,CAAC,CAKlB;AAED,wDAAwD;AACxD,UAAU,mBAAmB;IAC3B,QAAQ,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;CACpE;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,WAAW,GAAG;IAAE,KAAK,EAAE,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAA;CAAE,GAClE,CAAC,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAY/D"}
|
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Vercel AI SDK tools.
|
|
2
|
+
* Vercel AI SDK: two tools, and a gate for your own tools.
|
|
3
|
+
*
|
|
4
|
+
* **Tools** the model calls when it decides to ask (`createM91Tools`).
|
|
5
|
+
*
|
|
6
|
+
* **Gate** (`createM91ToolApproval`) plugs into AI SDK 6+'s `toolApproval`
|
|
7
|
+
* option: every call to the tools you name rings a phone first, and runs only
|
|
8
|
+
* if a person approves. The model cannot skip it, because it never decides to
|
|
9
|
+
* ask: the SDK asks for it.
|
|
10
|
+
*
|
|
11
|
+
* ```ts
|
|
12
|
+
* const { text } = await generateText({
|
|
13
|
+
* model: 'openai/gpt-5-mini',
|
|
14
|
+
* tools: { issueRefund, deleteUser },
|
|
15
|
+
* toolApproval: createM91ToolApproval(client, { tools: ['issueRefund', 'deleteUser'] }),
|
|
16
|
+
* stopWhen: isStepCount(5),
|
|
17
|
+
* prompt: 'Refund order ORD-40122.',
|
|
18
|
+
* });
|
|
19
|
+
* ```
|
|
3
20
|
*
|
|
4
21
|
* ```ts
|
|
5
22
|
* import { M91Client } from '@msg91comm/m91';
|
|
@@ -13,7 +30,7 @@
|
|
|
13
30
|
* m91_request_approval: await createM91ApprovalTool(client),
|
|
14
31
|
* m91_send_alert: await createM91AlertTool(client),
|
|
15
32
|
* },
|
|
16
|
-
*
|
|
33
|
+
* stopWhen: isStepCount(10),
|
|
17
34
|
* prompt: 'Look into order ORD-40122 and refund it if it checks out.',
|
|
18
35
|
* });
|
|
19
36
|
* ```
|
|
@@ -22,7 +39,7 @@
|
|
|
22
39
|
* imported only when one of these is called — `npm install @msg91comm/m91` stays at zero
|
|
23
40
|
* dependencies.
|
|
24
41
|
*/
|
|
25
|
-
import { ALERT_DESCRIPTION, ALERT_SCHEMA, APPROVAL_DESCRIPTION, APPROVAL_SCHEMA, runAlert, runApproval, } from './specs.js';
|
|
42
|
+
import { ALERT_DESCRIPTION, ALERT_SCHEMA, APPROVAL_DESCRIPTION, APPROVAL_SCHEMA, decideToolCall, needsHuman, runAlert, runApproval, } from './specs.js';
|
|
26
43
|
async function aiModule() {
|
|
27
44
|
try {
|
|
28
45
|
// A variable specifier: an optional peer dependency must not be a build
|
|
@@ -64,4 +81,22 @@ export async function createM91Tools(client, defaults = {}) {
|
|
|
64
81
|
m91_send_alert: await createM91AlertTool(client, defaults),
|
|
65
82
|
};
|
|
66
83
|
}
|
|
84
|
+
/**
|
|
85
|
+
* A `toolApproval` function for `generateText` / `streamText` / `ToolLoopAgent`.
|
|
86
|
+
*
|
|
87
|
+
* Calls to the tools in `options.tools` block while M91 rings a phone, then run
|
|
88
|
+
* if a person approves and come back to the model as denied otherwise. Every
|
|
89
|
+
* other call is `not-applicable` and runs as normal. Not synchronous: it waits
|
|
90
|
+
* up to `timeoutSeconds` (default 300) for an answer.
|
|
91
|
+
*/
|
|
92
|
+
export function createM91ToolApproval(client, options) {
|
|
93
|
+
return async ({ toolCall }) => {
|
|
94
|
+
if (!(await needsHuman(options, toolCall.toolName, toolCall.input)))
|
|
95
|
+
return 'not-applicable';
|
|
96
|
+
const decision = await decideToolCall(client, { toolName: toolCall.toolName, input: toolCall.input, callId: toolCall.toolCallId }, options);
|
|
97
|
+
return decision.approved
|
|
98
|
+
? { type: 'approved', reason: decision.reason }
|
|
99
|
+
: { type: 'denied', reason: decision.reason };
|
|
100
|
+
};
|
|
101
|
+
}
|
|
67
102
|
//# sourceMappingURL=vercel-ai.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vercel-ai.js","sourceRoot":"","sources":["../../../src/integrations/vercel-ai.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"vercel-ai.js","sourceRoot":"","sources":["../../../src/integrations/vercel-ai.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAKH,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,oBAAoB,EACpB,eAAe,EAMf,cAAc,EACd,UAAU,EACV,QAAQ,EACR,WAAW,GACZ,MAAM,YAAY,CAAC;AAOpB,KAAK,UAAU,QAAQ;IACrB,IAAI,CAAC;QACH,wEAAwE;QACxE,gCAAgC;QAChC,MAAM,SAAS,GAAG,IAAI,CAAC;QACvB,OAAO,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,CAAwB,CAAC;IAC1D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,uFAAuF,EACvF,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAAiB,EACjB,WAA6B,EAAE;IAE/B,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;IAC9C,OAAO,IAAI,CAAC;QACV,WAAW,EAAE,oBAAoB;QACjC,6EAA6E;QAC7E,4EAA4E;QAC5E,WAAW,EAAE,UAAU,CAAC,eAAe,CAAC;QACxC,OAAO,EAAE,CAAC,IAAkB,EAAE,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC;KACrE,CAA+B,CAAC;AACnC,CAAC;AAED,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAiB,EACjB,WAA0B,EAAE;IAE5B,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;IAC9C,OAAO,IAAI,CAAC;QACV,WAAW,EAAE,iBAAiB;QAC9B,WAAW,EAAE,UAAU,CAAC,YAAY,CAAC;QACrC,OAAO,EAAE,CAAC,IAAe,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC;KAC/D,CAA4B,CAAC;AAChC,CAAC;AAED,mEAAmE;AACnE,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAiB,EACjB,WAA6C,EAAE;IAE/C,OAAO;QACL,oBAAoB,EAAE,MAAM,qBAAqB,CAAC,MAAM,EAAE,QAAQ,CAAC;QACnE,cAAc,EAAE,MAAM,kBAAkB,CAAC,MAAM,EAAE,QAAQ,CAAC;KAC3D,CAAC;AACJ,CAAC;AAOD;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAAiB,EACjB,OAAmE;IAEnE,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC5B,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;YAAE,OAAO,gBAAgB,CAAC;QAC7F,MAAM,QAAQ,GAAG,MAAM,cAAc,CACnC,MAAM,EACN,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,UAAU,EAAE,EACnF,OAAO,CACR,CAAC;QACF,OAAO,QAAQ,CAAC,QAAQ;YACtB,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE;YAC/C,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;IAClD,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The approval and alert arguments as zod shapes, for frameworks that only
|
|
3
|
+
* take zod (Claude Agent SDK, Mastra, Google ADK).
|
|
4
|
+
*
|
|
5
|
+
* Built from the zod the caller already has, passed in, so this package never
|
|
6
|
+
* imports zod itself and the descriptions stay the ones in `specs.ts`.
|
|
7
|
+
*/
|
|
8
|
+
/** The slice of zod this file uses; v3 and v4 both satisfy it. */
|
|
9
|
+
export interface ZodLike {
|
|
10
|
+
string(): any;
|
|
11
|
+
number(): any;
|
|
12
|
+
enum(values: readonly [string, ...string[]]): any;
|
|
13
|
+
object(shape: Record<string, any>): any;
|
|
14
|
+
}
|
|
15
|
+
export declare function approvalShape(z: ZodLike): Record<string, any>;
|
|
16
|
+
export declare function alertShape(z: ZodLike): Record<string, any>;
|
|
17
|
+
/** zod is an optional peer dependency: import it only when asked, and say so if it is missing. */
|
|
18
|
+
export declare function loadZod(framework: string): Promise<ZodLike>;
|
|
19
|
+
//# sourceMappingURL=zod-shapes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zod-shapes.d.ts","sourceRoot":"","sources":["../../../src/integrations/zod-shapes.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,kEAAkE;AAClE,MAAM,WAAW,OAAO;IACtB,MAAM,IAAI,GAAG,CAAC;IACd,MAAM,IAAI,GAAG,CAAC;IACd,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,GAAG,GAAG,CAAC;IAClD,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC;CACzC;AAID,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAW7D;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAQ1D;AAED,kGAAkG;AAClG,wBAAsB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAUjE"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The approval and alert arguments as zod shapes, for frameworks that only
|
|
3
|
+
* take zod (Claude Agent SDK, Mastra, Google ADK).
|
|
4
|
+
*
|
|
5
|
+
* Built from the zod the caller already has, passed in, so this package never
|
|
6
|
+
* imports zod itself and the descriptions stay the ones in `specs.ts`.
|
|
7
|
+
*/
|
|
8
|
+
import { ALERT_SCHEMA, APPROVAL_SCHEMA } from './specs.js';
|
|
9
|
+
const SEVERITIES = ['LOW', 'MEDIUM', 'HIGH', 'CRITICAL'];
|
|
10
|
+
export function approvalShape(z) {
|
|
11
|
+
const p = APPROVAL_SCHEMA.properties;
|
|
12
|
+
return {
|
|
13
|
+
title: z.string().describe(p.title.description),
|
|
14
|
+
customId: z.string().describe(p.customId.description),
|
|
15
|
+
description: z.string().optional().describe(p.description.description),
|
|
16
|
+
severity: z.enum(SEVERITIES).optional().describe(p.severity.description),
|
|
17
|
+
approveLabel: z.string().optional().describe(p.approveLabel.description),
|
|
18
|
+
rejectLabel: z.string().optional().describe(p.rejectLabel.description),
|
|
19
|
+
timeoutSeconds: z.number().optional().describe(p.timeoutSeconds.description),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export function alertShape(z) {
|
|
23
|
+
const p = ALERT_SCHEMA.properties;
|
|
24
|
+
return {
|
|
25
|
+
title: z.string().describe(p.title.description),
|
|
26
|
+
customId: z.string().optional().describe(p.customId.description),
|
|
27
|
+
description: z.string().optional().describe(p.description.description),
|
|
28
|
+
severity: z.enum(SEVERITIES).optional().describe(p.severity.description),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/** zod is an optional peer dependency: import it only when asked, and say so if it is missing. */
|
|
32
|
+
export async function loadZod(framework) {
|
|
33
|
+
try {
|
|
34
|
+
const specifier = 'zod';
|
|
35
|
+
const mod = (await import(specifier));
|
|
36
|
+
return mod.z ?? mod;
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
throw new Error(`The ${framework} integration needs zod. Install it with: npm install zod`, {
|
|
40
|
+
cause: error,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=zod-shapes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zod-shapes.js","sourceRoot":"","sources":["../../../src/integrations/zod-shapes.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAU3D,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAU,CAAC;AAElE,MAAM,UAAU,aAAa,CAAC,CAAU;IACtC,MAAM,CAAC,GAAG,eAAe,CAAC,UAAU,CAAC;IACrC,OAAO;QACL,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC;QAC/C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;QACrD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC;QACtE,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;QACxE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,CAAC;QACxE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC;QACtE,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,WAAW,CAAC;KAC7E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,CAAU;IACnC,MAAM,CAAC,GAAG,YAAY,CAAC,UAAU,CAAC;IAClC,OAAO;QACL,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC;QAC/C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;QAChE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC;QACtE,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;KACzE,CAAC;AACJ,CAAC;AAED,kGAAkG;AAClG,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,SAAiB;IAC7C,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,KAAK,CAAC;QACxB,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,CAA8B,CAAC;QACnE,OAAO,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC;IACtB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,OAAO,SAAS,0DAA0D,EAAE;YAC1F,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
|
package/dist/src/platform.d.ts
CHANGED
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
import { type TransportOptions } from './http.js';
|
|
21
21
|
import { type AlertDetail, type AlertResponse, type ApiKeyInfo, type InviteResult, type ProvisionedChannel, type Recipient } from './models.js';
|
|
22
22
|
import { type SendOptions } from './client.js';
|
|
23
|
-
export declare const DEFAULT_BASE_URL = "https://m91.msg91.com";
|
|
23
|
+
export declare const DEFAULT_BASE_URL = "https://m91-api.msg91.com";
|
|
24
24
|
export declare const API_KEY_PREFIX = "m91sk_";
|
|
25
25
|
export interface PlatformOptions extends TransportOptions {
|
|
26
26
|
baseUrl?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/platform.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,EAAa,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,UAAU,EAEf,KAAK,YAAY,EAEjB,KAAK,kBAAkB,EACvB,KAAK,SAAS,EAUf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,KAAK,WAAW,EAAiB,MAAM,aAAa,CAAC;AAE9D,eAAO,MAAM,gBAAgB,
|
|
1
|
+
{"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/platform.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,EAAa,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,UAAU,EAEf,KAAK,YAAY,EAEjB,KAAK,kBAAkB,EACvB,KAAK,SAAS,EAUf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,KAAK,WAAW,EAAiB,MAAM,aAAa,CAAC;AAE9D,eAAO,MAAM,gBAAgB,8BAA8B,CAAC;AAC5D,eAAO,MAAM,cAAc,WAAW,CAAC;AAEvC,MAAM,WAAW,eAAgB,SAAQ,gBAAgB;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;;OAMG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,4EAA4E;AAC5E,qBAAa,WAAW;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAY;gBAErB,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB;IAUzD,0EAA0E;IAC1E,QAAQ,IAAI,MAAM;IAIlB,OAAO,CAAC,GAAG;IAIX;;;;;;;;;;;;;;OAcG;IACG,MAAM,IAAI,OAAO,CAAC,UAAU,CAAC;IAInC;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACG,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAMxE;;;;;;OAMG;IACG,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAOtD;;;;;;;;;OASG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,aAAa,CAAC;IAclG;;;OAGG;IACG,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAc3E;;;;;OAKG;IACG,UAAU,CACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAC/C,OAAO,CAAC,OAAO,CAAC;IAwBnB;;;;;;;;;;;OAWG;IACH;;;;;;;;;;;;;;;;OAgBG;IACG,YAAY,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAK7C,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,UAAO,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAiBjF;;;;;OAKG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC;IAU5E,iDAAiD;IAC3C,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAStE,2DAA2D;YAC7C,eAAe;CAS9B;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAUlD;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAStD"}
|
package/dist/src/platform.js
CHANGED
|
@@ -21,7 +21,7 @@ import { M91ForbiddenError, M91NotFoundError, M91ValidationError } from './excep
|
|
|
21
21
|
import { Transport } from './http.js';
|
|
22
22
|
import { CHANNEL_NAME_MAX, MAX_MEMBERS_PER_CALL, buildAlertPayload, collapse, parseAlertDetail, parseAlertResponse, parseApiKeyInfo, parseInviteResult, parseProvisionedChannel, parseRecipient, validatePhone, } from './models.js';
|
|
23
23
|
import { checkDelivery } from './client.js';
|
|
24
|
-
export const DEFAULT_BASE_URL = 'https://m91.msg91.com';
|
|
24
|
+
export const DEFAULT_BASE_URL = 'https://m91-api.msg91.com';
|
|
25
25
|
export const API_KEY_PREFIX = 'm91sk_';
|
|
26
26
|
/** Invite people, alert them one at a time, and provision team channels. */
|
|
27
27
|
export class M91Platform {
|
package/dist/src/platform.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/platform.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1F,OAAO,EAAE,SAAS,EAAyB,MAAM,WAAW,CAAC;AAC7D,OAAO,EAIL,gBAAgB,EAEhB,oBAAoB,EAGpB,iBAAiB,EACjB,QAAQ,EACR,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,uBAAuB,EACvB,cAAc,EACd,aAAa,GACd,MAAM,aAAa,CAAC;AACrB,OAAO,EAAoB,aAAa,EAAE,MAAM,aAAa,CAAC;AAE9D,MAAM,CAAC,MAAM,gBAAgB,GAAG,
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/platform.ts"],"names":[],"mappings":"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"}
|
package/dist/src/url-builder.js
CHANGED
|
@@ -44,7 +44,7 @@ export function normalizeSendLink(sendLink) {
|
|
|
44
44
|
// authenticates as nothing and every call 401s, which reads like a revoked
|
|
45
45
|
// link rather than a mistyped one.
|
|
46
46
|
if (segments.length < 2 || segments[segments.length - 2] !== 's') {
|
|
47
|
-
throw new M91ValidationError(`sendLink must look like https://m91.msg91.com/s/<token> — ` +
|
|
47
|
+
throw new M91ValidationError(`sendLink must look like https://m91-api.msg91.com/s/<token> — ` +
|
|
48
48
|
`no /s/<token> found in '${parsed.pathname}'`);
|
|
49
49
|
}
|
|
50
50
|
return `${parsed.origin}/${segments.join('/')}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"url-builder.js","sourceRoot":"","sources":["../../src/url-builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EACL,aAAa,EACb,eAAe,EACf,SAAS,EACT,yBAAyB,EAGzB,SAAS,EACT,SAAS,EACT,aAAa,EACb,QAAQ,GACT,MAAM,aAAa,CAAC;AAErB;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC9C,MAAM,IAAI,kBAAkB,CAAC,yDAAyD,CAAC,CAAC;IAC1F,CAAC;IAED,IAAI,MAAW,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,kBAAkB,CAC1B,mEAAmE,QAAQ,GAAG,CAC/E,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAChE,MAAM,IAAI,kBAAkB,CAC1B,mEAAmE,QAAQ,GAAG,CAC/E,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC5D,2EAA2E;IAC3E,2EAA2E;IAC3E,mCAAmC;IACnC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;QACjE,MAAM,IAAI,kBAAkB,CAC1B,
|
|
1
|
+
{"version":3,"file":"url-builder.js","sourceRoot":"","sources":["../../src/url-builder.ts"],"names":[],"mappings":"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"}
|
package/examples/basic-alert.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Raise an alert, then close it when the condition heals.
|
|
3
3
|
*
|
|
4
|
-
* export M91_SEND_LINK="https://m91.msg91.com/s/your_token"
|
|
4
|
+
* export M91_SEND_LINK="https://m91-api.msg91.com/s/your_token"
|
|
5
5
|
* npx tsx examples/basic-alert.ts
|
|
6
6
|
*
|
|
7
7
|
* The send link is the whole credential. It goes in the environment, never in
|