@opengeni/contracts 0.31.1 → 0.35.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/dist/chunk-7JZMI22I.js +126 -0
- package/dist/chunk-7JZMI22I.js.map +1 -0
- package/dist/{chunk-TQC34EGL.js → chunk-JRHJTJVH.js} +759 -295
- package/dist/chunk-JRHJTJVH.js.map +1 -0
- package/dist/google-drive.d.ts +103 -0
- package/dist/google-drive.js +96 -3
- package/dist/google-drive.js.map +1 -1
- package/dist/index.d.ts +652 -8
- package/dist/index.js +113 -5
- package/dist/slack-bot-scopes.d.ts +58 -1
- package/dist/slack-bot-scopes.js +15 -3
- package/dist/workspace-instruction-policies.d.ts +178 -0
- package/dist/workspace-state.d.ts +218 -4
- package/package.json +1 -1
- package/src/google-drive.ts +119 -0
- package/src/index.ts +546 -114
- package/src/slack-bot-scopes.ts +93 -1
- package/src/workspace-instruction-policies.ts +91 -3
- package/src/workspace-state.ts +112 -6
- package/dist/chunk-KGL5BVGF.js +0 -45
- package/dist/chunk-KGL5BVGF.js.map +0 -1
- package/dist/chunk-TQC34EGL.js.map +0 -1
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
// src/slack-bot-scopes.ts
|
|
2
|
+
var OPENGENI_SLACK_BOT_REQUIRED_SCOPES = [
|
|
3
|
+
"app_mentions:read",
|
|
4
|
+
"canvases:read",
|
|
5
|
+
"channels:history",
|
|
6
|
+
"channels:read",
|
|
7
|
+
"chat:write",
|
|
8
|
+
"commands",
|
|
9
|
+
"files:read",
|
|
10
|
+
"groups:history",
|
|
11
|
+
"groups:read",
|
|
12
|
+
"im:history",
|
|
13
|
+
"im:read",
|
|
14
|
+
"im:write",
|
|
15
|
+
"mpim:history",
|
|
16
|
+
"mpim:read",
|
|
17
|
+
"users:read"
|
|
18
|
+
];
|
|
19
|
+
var OPENGENI_SLACK_REACTION_REQUIRED_SCOPE = "reactions:read";
|
|
20
|
+
var OPENGENI_SLACK_BOT_REQUESTED_SCOPES = [
|
|
21
|
+
...OPENGENI_SLACK_BOT_REQUIRED_SCOPES,
|
|
22
|
+
OPENGENI_SLACK_REACTION_REQUIRED_SCOPE
|
|
23
|
+
];
|
|
24
|
+
var OPENGENI_SLACK_BOT_EVENTS = [
|
|
25
|
+
"app_mention",
|
|
26
|
+
"message.channels",
|
|
27
|
+
"message.groups",
|
|
28
|
+
"message.im",
|
|
29
|
+
"message.mpim",
|
|
30
|
+
"reaction_added"
|
|
31
|
+
];
|
|
32
|
+
var OPENGENI_MANAGED_PUBLIC_BASE_URL = "https://app.opengeni.ai";
|
|
33
|
+
function normalizedSlackManifestBaseUrl(publicBaseUrl) {
|
|
34
|
+
const parsed = new URL(publicBaseUrl);
|
|
35
|
+
if (parsed.protocol !== "https:" || parsed.username || parsed.password) {
|
|
36
|
+
throw new Error("Slack bot manifest public base URL must be credential-free HTTPS");
|
|
37
|
+
}
|
|
38
|
+
parsed.hash = "";
|
|
39
|
+
parsed.search = "";
|
|
40
|
+
parsed.pathname = parsed.pathname.replace(/\/+$/, "");
|
|
41
|
+
return parsed.toString().replace(/\/$/, "");
|
|
42
|
+
}
|
|
43
|
+
function buildOpenGeniSlackBotManifest(publicBaseUrl) {
|
|
44
|
+
const baseUrl = normalizedSlackManifestBaseUrl(publicBaseUrl);
|
|
45
|
+
return {
|
|
46
|
+
display_information: { name: "OpenGeni" },
|
|
47
|
+
features: {
|
|
48
|
+
bot_user: { display_name: "OpenGeni", always_online: false },
|
|
49
|
+
slash_commands: [
|
|
50
|
+
{
|
|
51
|
+
command: "/opengeni",
|
|
52
|
+
description: "Start an OpenGeni task in this channel",
|
|
53
|
+
should_escape: false,
|
|
54
|
+
url: `${baseUrl}/v1/integrations/slack/commands`
|
|
55
|
+
}
|
|
56
|
+
],
|
|
57
|
+
shortcuts: [
|
|
58
|
+
{
|
|
59
|
+
callback_id: "opengeni_message",
|
|
60
|
+
description: "Start an OpenGeni task from this Slack message",
|
|
61
|
+
name: "Open in OpenGeni",
|
|
62
|
+
type: "message"
|
|
63
|
+
}
|
|
64
|
+
]
|
|
65
|
+
},
|
|
66
|
+
oauth_config: {
|
|
67
|
+
redirect_urls: [
|
|
68
|
+
`${baseUrl}/v1/integrations/oauth/callback`,
|
|
69
|
+
`${baseUrl}/v1/integrations/slack/callback`
|
|
70
|
+
],
|
|
71
|
+
scopes: { bot: [...OPENGENI_SLACK_BOT_REQUESTED_SCOPES] }
|
|
72
|
+
},
|
|
73
|
+
settings: {
|
|
74
|
+
event_subscriptions: {
|
|
75
|
+
bot_events: [...OPENGENI_SLACK_BOT_EVENTS],
|
|
76
|
+
request_url: `${baseUrl}/v1/integrations/slack/events`
|
|
77
|
+
},
|
|
78
|
+
interactivity: {
|
|
79
|
+
is_enabled: true,
|
|
80
|
+
request_url: `${baseUrl}/v1/integrations/slack/interactions`
|
|
81
|
+
},
|
|
82
|
+
org_deploy_enabled: false,
|
|
83
|
+
socket_mode_enabled: false,
|
|
84
|
+
token_rotation_enabled: false
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
var OPENGENI_SLACK_BOT_SAFE_OPTIONAL_SCOPES = [
|
|
89
|
+
"team:read",
|
|
90
|
+
OPENGENI_SLACK_REACTION_REQUIRED_SCOPE
|
|
91
|
+
];
|
|
92
|
+
var OPENGENI_SLACK_BOT_FORBIDDEN_SCOPES = ["channels:join", "chat:write.public"];
|
|
93
|
+
function isOpenGeniSlackBotScopeAllowed(scope) {
|
|
94
|
+
return OPENGENI_SLACK_BOT_REQUIRED_SCOPES.includes(scope) || OPENGENI_SLACK_BOT_SAFE_OPTIONAL_SCOPES.includes(scope);
|
|
95
|
+
}
|
|
96
|
+
function areOpenGeniSlackBotScopesAccepted(grantedScopes) {
|
|
97
|
+
return OPENGENI_SLACK_BOT_REQUIRED_SCOPES.every((scope) => grantedScopes.includes(scope)) && grantedScopes.every(isOpenGeniSlackBotScopeAllowed);
|
|
98
|
+
}
|
|
99
|
+
function hasOpenGeniSlackReactionScope(grantedScopes) {
|
|
100
|
+
return grantedScopes.includes(OPENGENI_SLACK_REACTION_REQUIRED_SCOPE);
|
|
101
|
+
}
|
|
102
|
+
function evaluateOpenGeniSlackBotScopes(grantedScopes) {
|
|
103
|
+
const granted = new Set(grantedScopes);
|
|
104
|
+
const missingRequired = OPENGENI_SLACK_BOT_REQUIRED_SCOPES.filter((scope) => !granted.has(scope));
|
|
105
|
+
const unsupported = [...granted].filter((scope) => !isOpenGeniSlackBotScopeAllowed(scope)).sort();
|
|
106
|
+
return {
|
|
107
|
+
accepted: areOpenGeniSlackBotScopesAccepted(grantedScopes),
|
|
108
|
+
missingRequired,
|
|
109
|
+
unsupported
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export {
|
|
114
|
+
OPENGENI_SLACK_BOT_REQUIRED_SCOPES,
|
|
115
|
+
OPENGENI_SLACK_REACTION_REQUIRED_SCOPE,
|
|
116
|
+
OPENGENI_SLACK_BOT_REQUESTED_SCOPES,
|
|
117
|
+
OPENGENI_SLACK_BOT_EVENTS,
|
|
118
|
+
OPENGENI_MANAGED_PUBLIC_BASE_URL,
|
|
119
|
+
buildOpenGeniSlackBotManifest,
|
|
120
|
+
OPENGENI_SLACK_BOT_SAFE_OPTIONAL_SCOPES,
|
|
121
|
+
OPENGENI_SLACK_BOT_FORBIDDEN_SCOPES,
|
|
122
|
+
areOpenGeniSlackBotScopesAccepted,
|
|
123
|
+
hasOpenGeniSlackReactionScope,
|
|
124
|
+
evaluateOpenGeniSlackBotScopes
|
|
125
|
+
};
|
|
126
|
+
//# sourceMappingURL=chunk-7JZMI22I.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/slack-bot-scopes.ts"],"sourcesContent":["export const OPENGENI_SLACK_BOT_REQUIRED_SCOPES = [\n \"app_mentions:read\",\n \"canvases:read\",\n \"channels:history\",\n \"channels:read\",\n \"chat:write\",\n \"commands\",\n \"files:read\",\n \"groups:history\",\n \"groups:read\",\n \"im:history\",\n \"im:read\",\n \"im:write\",\n \"mpim:history\",\n \"mpim:read\",\n \"users:read\",\n] as const;\n\n/** Read-only scope needed only for the optional emoji-reaction summon surface. */\nexport const OPENGENI_SLACK_REACTION_REQUIRED_SCOPE = \"reactions:read\" as const;\n\n/**\n * Scopes requested by the managed and generated self-hosted manifests.\n *\n * `reactions:read` is deliberately not part of the base eligibility contract:\n * legacy installations may continue using existing Slack interactions and\n * tools while the reaction setting stays disabled and the UI asks an admin to\n * reinstall.\n */\nexport const OPENGENI_SLACK_BOT_REQUESTED_SCOPES = [\n ...OPENGENI_SLACK_BOT_REQUIRED_SCOPES,\n OPENGENI_SLACK_REACTION_REQUIRED_SCOPE,\n] as const;\n\nexport const OPENGENI_SLACK_BOT_EVENTS = [\n \"app_mention\",\n \"message.channels\",\n \"message.groups\",\n \"message.im\",\n \"message.mpim\",\n \"reaction_added\",\n] as const;\n\nexport const OPENGENI_MANAGED_PUBLIC_BASE_URL = \"https://app.opengeni.ai\" as const;\n\nfunction normalizedSlackManifestBaseUrl(publicBaseUrl: string): string {\n const parsed = new URL(publicBaseUrl);\n if (parsed.protocol !== \"https:\" || parsed.username || parsed.password) {\n throw new Error(\"Slack bot manifest public base URL must be credential-free HTTPS\");\n }\n parsed.hash = \"\";\n parsed.search = \"\";\n parsed.pathname = parsed.pathname.replace(/\\/+$/, \"\");\n return parsed.toString().replace(/\\/$/, \"\");\n}\n\n/** Canonical managed/self-hosted Slack app manifest. Slack accepts JSON manifests. */\nexport function buildOpenGeniSlackBotManifest(publicBaseUrl: string) {\n const baseUrl = normalizedSlackManifestBaseUrl(publicBaseUrl);\n return {\n display_information: { name: \"OpenGeni\" },\n features: {\n bot_user: { display_name: \"OpenGeni\", always_online: false },\n slash_commands: [\n {\n command: \"/opengeni\",\n description: \"Start an OpenGeni task in this channel\",\n should_escape: false,\n url: `${baseUrl}/v1/integrations/slack/commands`,\n },\n ],\n shortcuts: [\n {\n callback_id: \"opengeni_message\",\n description: \"Start an OpenGeni task from this Slack message\",\n name: \"Open in OpenGeni\",\n type: \"message\",\n },\n ],\n },\n oauth_config: {\n redirect_urls: [\n `${baseUrl}/v1/integrations/oauth/callback`,\n `${baseUrl}/v1/integrations/slack/callback`,\n ],\n scopes: { bot: [...OPENGENI_SLACK_BOT_REQUESTED_SCOPES] },\n },\n settings: {\n event_subscriptions: {\n bot_events: [...OPENGENI_SLACK_BOT_EVENTS],\n request_url: `${baseUrl}/v1/integrations/slack/events`,\n },\n interactivity: {\n is_enabled: true,\n request_url: `${baseUrl}/v1/integrations/slack/interactions`,\n },\n org_deploy_enabled: false,\n socket_mode_enabled: false,\n token_rotation_enabled: false,\n },\n } as const;\n}\n\n/**\n * Optional bot grants that remain inside the shipped bot's read/identity\n * boundary. Every other unrequired scope fails closed, including unknown future\n * Slack scopes, so verification, core routing, and UI eligibility cannot drift.\n */\nexport const OPENGENI_SLACK_BOT_SAFE_OPTIONAL_SCOPES = [\n \"team:read\",\n OPENGENI_SLACK_REACTION_REQUIRED_SCOPE,\n] as const;\n\n/** @deprecated Use evaluateOpenGeniSlackBotScopes; an allowlist is the policy. */\nexport const OPENGENI_SLACK_BOT_FORBIDDEN_SCOPES = [\"channels:join\", \"chat:write.public\"] as const;\n\nexport type OpenGeniSlackBotScopePolicy = {\n accepted: boolean;\n missingRequired: string[];\n unsupported: string[];\n};\n\nfunction isOpenGeniSlackBotScopeAllowed(scope: string): boolean {\n return (\n (OPENGENI_SLACK_BOT_REQUIRED_SCOPES as readonly string[]).includes(scope) ||\n (OPENGENI_SLACK_BOT_SAFE_OPTIONAL_SCOPES as readonly string[]).includes(scope)\n );\n}\n\nexport function areOpenGeniSlackBotScopesAccepted(grantedScopes: readonly string[]): boolean {\n return (\n OPENGENI_SLACK_BOT_REQUIRED_SCOPES.every((scope) => grantedScopes.includes(scope)) &&\n grantedScopes.every(isOpenGeniSlackBotScopeAllowed)\n );\n}\n\nexport function hasOpenGeniSlackReactionScope(grantedScopes: readonly string[]): boolean {\n return grantedScopes.includes(OPENGENI_SLACK_REACTION_REQUIRED_SCOPE);\n}\n\nexport function evaluateOpenGeniSlackBotScopes(\n grantedScopes: readonly string[],\n): OpenGeniSlackBotScopePolicy {\n const granted = new Set(grantedScopes);\n const missingRequired = OPENGENI_SLACK_BOT_REQUIRED_SCOPES.filter((scope) => !granted.has(scope));\n const unsupported = [...granted].filter((scope) => !isOpenGeniSlackBotScopeAllowed(scope)).sort();\n return {\n accepted: areOpenGeniSlackBotScopesAccepted(grantedScopes),\n missingRequired,\n unsupported,\n };\n}\n"],"mappings":";AAAO,IAAM,qCAAqC;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,yCAAyC;AAU/C,IAAM,sCAAsC;AAAA,EACjD,GAAG;AAAA,EACH;AACF;AAEO,IAAM,4BAA4B;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,mCAAmC;AAEhD,SAAS,+BAA+B,eAA+B;AACrE,QAAM,SAAS,IAAI,IAAI,aAAa;AACpC,MAAI,OAAO,aAAa,YAAY,OAAO,YAAY,OAAO,UAAU;AACtE,UAAM,IAAI,MAAM,kEAAkE;AAAA,EACpF;AACA,SAAO,OAAO;AACd,SAAO,SAAS;AAChB,SAAO,WAAW,OAAO,SAAS,QAAQ,QAAQ,EAAE;AACpD,SAAO,OAAO,SAAS,EAAE,QAAQ,OAAO,EAAE;AAC5C;AAGO,SAAS,8BAA8B,eAAuB;AACnE,QAAM,UAAU,+BAA+B,aAAa;AAC5D,SAAO;AAAA,IACL,qBAAqB,EAAE,MAAM,WAAW;AAAA,IACxC,UAAU;AAAA,MACR,UAAU,EAAE,cAAc,YAAY,eAAe,MAAM;AAAA,MAC3D,gBAAgB;AAAA,QACd;AAAA,UACE,SAAS;AAAA,UACT,aAAa;AAAA,UACb,eAAe;AAAA,UACf,KAAK,GAAG,OAAO;AAAA,QACjB;AAAA,MACF;AAAA,MACA,WAAW;AAAA,QACT;AAAA,UACE,aAAa;AAAA,UACb,aAAa;AAAA,UACb,MAAM;AAAA,UACN,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,IACA,cAAc;AAAA,MACZ,eAAe;AAAA,QACb,GAAG,OAAO;AAAA,QACV,GAAG,OAAO;AAAA,MACZ;AAAA,MACA,QAAQ,EAAE,KAAK,CAAC,GAAG,mCAAmC,EAAE;AAAA,IAC1D;AAAA,IACA,UAAU;AAAA,MACR,qBAAqB;AAAA,QACnB,YAAY,CAAC,GAAG,yBAAyB;AAAA,QACzC,aAAa,GAAG,OAAO;AAAA,MACzB;AAAA,MACA,eAAe;AAAA,QACb,YAAY;AAAA,QACZ,aAAa,GAAG,OAAO;AAAA,MACzB;AAAA,MACA,oBAAoB;AAAA,MACpB,qBAAqB;AAAA,MACrB,wBAAwB;AAAA,IAC1B;AAAA,EACF;AACF;AAOO,IAAM,0CAA0C;AAAA,EACrD;AAAA,EACA;AACF;AAGO,IAAM,sCAAsC,CAAC,iBAAiB,mBAAmB;AAQxF,SAAS,+BAA+B,OAAwB;AAC9D,SACG,mCAAyD,SAAS,KAAK,KACvE,wCAA8D,SAAS,KAAK;AAEjF;AAEO,SAAS,kCAAkC,eAA2C;AAC3F,SACE,mCAAmC,MAAM,CAAC,UAAU,cAAc,SAAS,KAAK,CAAC,KACjF,cAAc,MAAM,8BAA8B;AAEtD;AAEO,SAAS,8BAA8B,eAA2C;AACvF,SAAO,cAAc,SAAS,sCAAsC;AACtE;AAEO,SAAS,+BACd,eAC6B;AAC7B,QAAM,UAAU,IAAI,IAAI,aAAa;AACrC,QAAM,kBAAkB,mCAAmC,OAAO,CAAC,UAAU,CAAC,QAAQ,IAAI,KAAK,CAAC;AAChG,QAAM,cAAc,CAAC,GAAG,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,+BAA+B,KAAK,CAAC,EAAE,KAAK;AAChG,SAAO;AAAA,IACL,UAAU,kCAAkC,aAAa;AAAA,IACzD;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
|