@octonodes/ui-extensions 0.2.13 → 0.2.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +105 -8
- package/dist/app/OctonodeAppProvider/AppAccessScreen/AppAccessScreen.d.ts +3 -0
- package/dist/app/OctonodeAppProvider/AppAccessScreen/AppAccessScreen.d.ts.map +1 -0
- package/dist/app/OctonodeAppProvider/AppAccessScreen/AppAccessScreen.js +17 -0
- package/dist/app/OctonodeAppProvider/AppAccessScreen/AppAccessScreen.js.map +1 -0
- package/dist/app/OctonodeAppProvider/AppAccessScreen/AppAccessScreen.types.d.ts +4 -0
- package/dist/app/OctonodeAppProvider/AppAccessScreen/AppAccessScreen.types.d.ts.map +1 -0
- package/dist/app/OctonodeAppProvider/AppAccessScreen/AppAccessScreen.types.js +2 -0
- package/dist/app/OctonodeAppProvider/AppAccessScreen/AppAccessScreen.types.js.map +1 -0
- package/dist/app/OctonodeAppProvider/AppAccessScreen/constants.d.ts +3 -0
- package/dist/app/OctonodeAppProvider/AppAccessScreen/constants.d.ts.map +1 -0
- package/dist/app/OctonodeAppProvider/AppAccessScreen/constants.js +14 -0
- package/dist/app/OctonodeAppProvider/AppAccessScreen/constants.js.map +1 -0
- package/dist/app/OctonodeAppProvider/AppAccessScreen/index.d.ts +3 -0
- package/dist/app/OctonodeAppProvider/AppAccessScreen/index.d.ts.map +1 -0
- package/dist/app/OctonodeAppProvider/AppAccessScreen/index.js +3 -0
- package/dist/app/OctonodeAppProvider/AppAccessScreen/index.js.map +1 -0
- package/dist/app/OctonodeAppProvider/OctonodeAppProvider.d.ts +5 -0
- package/dist/app/OctonodeAppProvider/OctonodeAppProvider.d.ts.map +1 -0
- package/dist/app/OctonodeAppProvider/OctonodeAppProvider.js +72 -0
- package/dist/app/OctonodeAppProvider/OctonodeAppProvider.js.map +1 -0
- package/dist/app/OctonodeAppProvider/OctonodeAppProvider.types.d.ts +12 -0
- package/dist/app/OctonodeAppProvider/OctonodeAppProvider.types.d.ts.map +1 -0
- package/dist/app/OctonodeAppProvider/OctonodeAppProvider.types.js +2 -0
- package/dist/app/OctonodeAppProvider/OctonodeAppProvider.types.js.map +1 -0
- package/dist/app/OctonodeAppProvider/index.d.ts +3 -0
- package/dist/app/OctonodeAppProvider/index.d.ts.map +1 -0
- package/dist/app/OctonodeAppProvider/index.js +3 -0
- package/dist/app/OctonodeAppProvider/index.js.map +1 -0
- package/dist/app/constants.d.ts +2 -0
- package/dist/app/constants.d.ts.map +1 -0
- package/dist/app/constants.js +3 -0
- package/dist/app/constants.js.map +1 -0
- package/dist/app/hosted.d.ts +6 -0
- package/dist/app/hosted.d.ts.map +1 -0
- package/dist/app/hosted.js +174 -0
- package/dist/app/hosted.js.map +1 -0
- package/dist/app/index.d.ts +5 -1
- package/dist/app/index.d.ts.map +1 -1
- package/dist/app/index.js +6 -4
- package/dist/app/index.js.map +1 -1
- package/dist/app/project.d.ts +1 -1
- package/dist/app/project.d.ts.map +1 -1
- package/dist/app/server.d.ts +4 -0
- package/dist/app/server.d.ts.map +1 -1
- package/dist/app/server.js +15 -3
- package/dist/app/server.js.map +1 -1
- package/dist/app/types.d.ts +24 -3
- package/dist/app/types.d.ts.map +1 -1
- package/dist/contributions.d.ts +5 -0
- package/dist/contributions.d.ts.map +1 -0
- package/dist/contributions.js +71 -0
- package/dist/contributions.js.map +1 -0
- package/dist/contributions.types.d.ts +93 -0
- package/dist/contributions.types.d.ts.map +1 -0
- package/dist/contributions.types.js +2 -0
- package/dist/contributions.types.js.map +1 -0
- package/dist/index.d.ts +9 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -4
- package/dist/index.js.map +1 -1
- package/dist/locales/de.json +22 -0
- package/dist/locales/en.json +22 -0
- package/dist/locales/es.json +22 -0
- package/dist/locales/fr.json +22 -0
- package/dist/locales/index.d.ts +113 -0
- package/dist/locales/index.d.ts.map +1 -0
- package/dist/locales/index.js +8 -0
- package/dist/locales/index.js.map +1 -0
- package/dist/locales/ja.json +22 -0
- package/dist/react.d.ts +2 -0
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +16 -4
- package/dist/react.js.map +1 -1
- package/dist/targets.d.ts +2 -0
- package/dist/targets.d.ts.map +1 -0
- package/dist/targets.js +46 -0
- package/dist/targets.js.map +1 -0
- package/package.json +5 -1
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { HOSTED_APP_PROTOCOL } from "./constants.js";
|
|
2
|
+
/** Only app-relative routes may cross the Studio boundary. */
|
|
3
|
+
export function appRoute(value) {
|
|
4
|
+
if (typeof value !== "string" || value.length > 4096 || !value.startsWith("/") || /[\\\s\p{Cc}]/u.test(value))
|
|
5
|
+
return null;
|
|
6
|
+
try {
|
|
7
|
+
const url = new URL(value, "https://app.invalid");
|
|
8
|
+
if (url.origin !== "https://app.invalid" || url.username || url.password || url.hash.includes("octonode_session"))
|
|
9
|
+
return null;
|
|
10
|
+
return url.pathname + url.search + url.hash;
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/** Browser history remains the router. The bridge mirrors it into the Studio URL. */
|
|
17
|
+
export function connectHostedApp() {
|
|
18
|
+
const fragment = new URLSearchParams(location.hash.slice(1));
|
|
19
|
+
const embedded = parent !== window;
|
|
20
|
+
// Only non-secret embedding coordinates survive a child reload.
|
|
21
|
+
let saved = null;
|
|
22
|
+
try {
|
|
23
|
+
if (embedded)
|
|
24
|
+
saved = sessionStorage.getItem("octonode.host");
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
/* Storage can be disabled in embedded browsers. */
|
|
28
|
+
}
|
|
29
|
+
const coordinates = saved ? new URLSearchParams(saved) : new URLSearchParams();
|
|
30
|
+
const origin = fragment.get("octonode_parent") ?? coordinates.get("origin");
|
|
31
|
+
const nonce = fragment.get("octonode_channel") ?? coordinates.get("channel");
|
|
32
|
+
if (embedded &&
|
|
33
|
+
(!origin ||
|
|
34
|
+
!nonce ||
|
|
35
|
+
new URL(origin).origin !== origin ||
|
|
36
|
+
!(origin.startsWith("https://") || /^http:\/\/(localhost|127\.0\.0\.1)(:\d+)?$/.test(origin))))
|
|
37
|
+
throw new Error("Open this app from Studio to establish a trusted session");
|
|
38
|
+
try {
|
|
39
|
+
if (embedded)
|
|
40
|
+
sessionStorage.setItem("octonode.host", new URLSearchParams({ origin: origin, channel: nonce }).toString());
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
/* The launch coordinates still establish this session. */
|
|
44
|
+
}
|
|
45
|
+
const token = embedded ? undefined : (fragment.get("octonode_session") ?? undefined);
|
|
46
|
+
if (fragment.has("octonode_parent") || token)
|
|
47
|
+
history.replaceState(history.state, "", appRoute(fragment.get("octonode_path")) ?? location.pathname + location.search);
|
|
48
|
+
const listeners = new Set();
|
|
49
|
+
let state = {
|
|
50
|
+
embedded,
|
|
51
|
+
status: token ? "ready" : embedded ? "connecting" : "standalone",
|
|
52
|
+
token,
|
|
53
|
+
path: location.pathname + location.search + location.hash,
|
|
54
|
+
};
|
|
55
|
+
let disposed = false;
|
|
56
|
+
let navigation = [];
|
|
57
|
+
const publish = (patch) => {
|
|
58
|
+
state = { ...state, ...patch };
|
|
59
|
+
listeners.forEach((listener) => listener());
|
|
60
|
+
};
|
|
61
|
+
const send = (message) => {
|
|
62
|
+
if (embedded && !disposed)
|
|
63
|
+
parent.postMessage({ ...message, octonode: HOSTED_APP_PROTOCOL, channel: nonce }, origin);
|
|
64
|
+
};
|
|
65
|
+
const push = history.pushState;
|
|
66
|
+
const replace = history.replaceState;
|
|
67
|
+
const routeChanged = (replaceRoute = false) => {
|
|
68
|
+
const path = location.pathname + location.search + location.hash;
|
|
69
|
+
publish({ path });
|
|
70
|
+
send({ type: "navigate", path, replace: replaceRoute });
|
|
71
|
+
};
|
|
72
|
+
const pushRoute = function (...args) {
|
|
73
|
+
push.apply(history, args);
|
|
74
|
+
routeChanged();
|
|
75
|
+
};
|
|
76
|
+
const replaceRoute = function (...args) {
|
|
77
|
+
replace.apply(history, args);
|
|
78
|
+
routeChanged(true);
|
|
79
|
+
};
|
|
80
|
+
history.pushState = pushRoute;
|
|
81
|
+
history.replaceState = replaceRoute;
|
|
82
|
+
const popped = () => routeChanged(true);
|
|
83
|
+
const receive = (event) => {
|
|
84
|
+
const message = event.data;
|
|
85
|
+
if (!embedded ||
|
|
86
|
+
event.source !== parent ||
|
|
87
|
+
event.origin !== origin ||
|
|
88
|
+
message?.octonode !== HOSTED_APP_PROTOCOL ||
|
|
89
|
+
message.channel !== nonce)
|
|
90
|
+
return;
|
|
91
|
+
if (message.type === "session" &&
|
|
92
|
+
typeof message.token === "string" &&
|
|
93
|
+
/^octo_app_[A-Za-z0-9_-]{43}$/.test(message.token) &&
|
|
94
|
+
Number.isFinite(message.expiresAt) &&
|
|
95
|
+
message.expiresAt > Date.now()) {
|
|
96
|
+
publish({ status: "ready", token: message.token, expiresAt: message.expiresAt });
|
|
97
|
+
send({ type: "ack" });
|
|
98
|
+
if (navigation.length)
|
|
99
|
+
send({ type: "navigation", items: navigation });
|
|
100
|
+
}
|
|
101
|
+
if (message.type === "expired")
|
|
102
|
+
publish({ status: "expired", token: undefined });
|
|
103
|
+
if (message.type === "route") {
|
|
104
|
+
const path = appRoute(message.path);
|
|
105
|
+
if (path && path !== state.path) {
|
|
106
|
+
replace.call(history, history.state, "", path);
|
|
107
|
+
publish({ path });
|
|
108
|
+
dispatchEvent(new PopStateEvent("popstate", { state: history.state }));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
addEventListener("message", receive);
|
|
113
|
+
addEventListener("popstate", popped);
|
|
114
|
+
addEventListener("hashchange", popped);
|
|
115
|
+
const heartbeat = setInterval(() => {
|
|
116
|
+
if (state.expiresAt && state.expiresAt <= Date.now())
|
|
117
|
+
publish({ status: "expired", token: undefined });
|
|
118
|
+
send({ type: "ready" });
|
|
119
|
+
}, 1000);
|
|
120
|
+
send({ type: "ready" });
|
|
121
|
+
return {
|
|
122
|
+
getSnapshot: () => state,
|
|
123
|
+
subscribe(listener) {
|
|
124
|
+
listeners.add(listener);
|
|
125
|
+
return () => {
|
|
126
|
+
listeners.delete(listener);
|
|
127
|
+
};
|
|
128
|
+
},
|
|
129
|
+
navigate(path, options = {}) {
|
|
130
|
+
const route = appRoute(path);
|
|
131
|
+
if (!route)
|
|
132
|
+
throw new Error("Expected an app-relative route");
|
|
133
|
+
history[options.replace ? "replaceState" : "pushState"](null, "", route);
|
|
134
|
+
dispatchEvent(new PopStateEvent("popstate"));
|
|
135
|
+
},
|
|
136
|
+
setNavigation(items) {
|
|
137
|
+
if (items.length > 12 ||
|
|
138
|
+
items.some((item) => !item.label.trim() || item.label.length > 40 || !appRoute(item.path)))
|
|
139
|
+
throw new Error("Expected up to 12 app-relative navigation items");
|
|
140
|
+
navigation = items;
|
|
141
|
+
if (state.status === "ready")
|
|
142
|
+
send({ type: "navigation", items });
|
|
143
|
+
},
|
|
144
|
+
async fetch(input, init) {
|
|
145
|
+
const url = new URL(input, location.href);
|
|
146
|
+
if (url.origin !== location.origin)
|
|
147
|
+
throw new Error("App bearer may only be sent to the app's own backend");
|
|
148
|
+
if (!state.token || (state.expiresAt && state.expiresAt <= Date.now()))
|
|
149
|
+
throw new Error("App session expired. Reopen the app from Studio.");
|
|
150
|
+
const headers = new Headers(init?.headers);
|
|
151
|
+
headers.set("authorization", `Bearer ${state.token}`);
|
|
152
|
+
const response = await fetch(url, { ...init, headers, redirect: "error" });
|
|
153
|
+
if (response.status === 401) {
|
|
154
|
+
publish({ status: "expired", token: undefined });
|
|
155
|
+
send({ type: "ready" });
|
|
156
|
+
}
|
|
157
|
+
return response;
|
|
158
|
+
},
|
|
159
|
+
dispose() {
|
|
160
|
+
disposed = true;
|
|
161
|
+
clearInterval(heartbeat);
|
|
162
|
+
removeEventListener("message", receive);
|
|
163
|
+
removeEventListener("popstate", popped);
|
|
164
|
+
removeEventListener("hashchange", popped);
|
|
165
|
+
if (history.pushState === pushRoute)
|
|
166
|
+
history.pushState = push;
|
|
167
|
+
if (history.replaceState === replaceRoute)
|
|
168
|
+
history.replaceState = replace;
|
|
169
|
+
listeners.clear();
|
|
170
|
+
state = { ...state, token: undefined };
|
|
171
|
+
},
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=hosted.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hosted.js","sourceRoot":"","sources":["../../src/app/hosted.ts"],"names":[],"mappings":"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"}
|
package/dist/app/index.d.ts
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
import type { AppContext } from "./types.js";
|
|
1
|
+
import type { AppBridgeRequest, AppContext } from "./types.js";
|
|
2
2
|
export type { AppBridgeRequest, AppBridgeResponse, AppContext, AppExecution, AppGrant, AppProject } from "./types.js";
|
|
3
|
+
export type { HostedApp, HostedAppNavigationItem, HostedAppState } from "./types.js";
|
|
4
|
+
export { connectHostedApp, appRoute } from "./hosted.js";
|
|
5
|
+
export { HOSTED_APP_PROTOCOL } from "./constants.js";
|
|
6
|
+
export declare function request<T>(operation: AppBridgeRequest["operation"], body?: unknown): Promise<T>;
|
|
3
7
|
/** Connects an installed extension to its live workspace and project grants. */
|
|
4
8
|
export declare function connectApp(): Promise<AppContext>;
|
|
5
9
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/app/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/app/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/app/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAqB,UAAU,EAAY,MAAM,YAAY,CAAC;AAE5F,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACtH,YAAY,EAAE,SAAS,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACrF,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAErD,wBAAgB,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,gBAAgB,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CA0C/F;AAED,gFAAgF;AAChF,wBAAsB,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,CAUtD"}
|
package/dist/app/index.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
// Generated from packages/ui-extensions/src/app/index.ts. Do not edit; run the Octonode SDK sync.
|
|
2
2
|
import { getAppSession, UI_EXTENSION_API_VERSION } from "../index.js";
|
|
3
3
|
import { appContext } from "./project.js";
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
export { connectHostedApp, appRoute } from "./hosted.js";
|
|
5
|
+
export { HOSTED_APP_PROTOCOL } from "./constants.js";
|
|
6
|
+
export function request(operation, body) {
|
|
7
|
+
const apiVersion = getAppSession().protocolVersion ?? UI_EXTENSION_API_VERSION;
|
|
6
8
|
if (parent === window)
|
|
7
9
|
throw new Error("App actions require an installed extension");
|
|
8
10
|
const requestId = crypto.randomUUID();
|
|
@@ -14,7 +16,7 @@ function request(operation, body) {
|
|
|
14
16
|
if (event.source !== parent ||
|
|
15
17
|
message?.octonode !== "ui-extension" ||
|
|
16
18
|
message.type !== "app-response" ||
|
|
17
|
-
message.apiVersion !==
|
|
19
|
+
message.apiVersion !== apiVersion ||
|
|
18
20
|
message.requestId !== requestId)
|
|
19
21
|
return;
|
|
20
22
|
finish(message.ok ? undefined : new Error(message.error || "App action failed"), message.value);
|
|
@@ -32,7 +34,7 @@ function request(operation, body) {
|
|
|
32
34
|
function send() {
|
|
33
35
|
parent.postMessage({
|
|
34
36
|
octonode: "ui-extension",
|
|
35
|
-
apiVersion
|
|
37
|
+
apiVersion,
|
|
36
38
|
type: "app-request",
|
|
37
39
|
requestId,
|
|
38
40
|
operation,
|
package/dist/app/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/app/index.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,OAAO,EAAE,aAAa,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAK1C,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/app/index.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,OAAO,EAAE,aAAa,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAK1C,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAErD,MAAM,UAAU,OAAO,CAAI,SAAwC,EAAE,IAAc;IACjF,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC,eAAe,IAAI,wBAAwB,CAAC;IAC/E,IAAI,MAAM,KAAK,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IACrF,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IACtC,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACxC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACpF,MAAM,KAAK,GAAG,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7E,MAAM,OAAO,GAAG,CAAC,KAAmB,EAAE,EAAE;YACtC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAyC,CAAC;YAChE,IACE,KAAK,CAAC,MAAM,KAAK,MAAM;gBACvB,OAAO,EAAE,QAAQ,KAAK,cAAc;gBACpC,OAAO,CAAC,IAAI,KAAK,cAAc;gBAC/B,OAAO,CAAC,UAAU,KAAK,UAAU;gBACjC,OAAO,CAAC,SAAS,KAAK,SAAS;gBAE/B,OAAO;YACT,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,IAAI,mBAAmB,CAAC,EAAE,OAAO,CAAC,KAAU,CAAC,CAAC;QACvG,CAAC,CAAC;QACF,SAAS,MAAM,CAAC,KAAa,EAAE,KAAS;YACtC,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,aAAa,CAAC,KAAK,CAAC,CAAC;YACrB,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACxC,IAAI,KAAK;gBAAE,MAAM,CAAC,KAAK,CAAC,CAAC;;gBACpB,OAAO,CAAC,KAAU,CAAC,CAAC;QAC3B,CAAC;QACD,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACrC,SAAS,IAAI;YACX,MAAM,CAAC,WAAW,CAChB;gBACE,QAAQ,EAAE,cAAc;gBACxB,UAAU;gBACV,IAAI,EAAE,aAAa;gBACnB,SAAS;gBACT,SAAS;gBACT,IAAI;aACsB,EAC5B,GAAG,CACJ,CAAC;QACJ,CAAC;QACD,IAAI,EAAE,CAAC;IACT,CAAC,CAAC,CAAC;AACL,CAAC;AAED,gFAAgF;AAChF,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;IAChC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAM3B,SAAS,CAAC,CAAC;IACd,OAAO,UAAU,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AAChD,CAAC"}
|
package/dist/app/project.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { AppSession } from "../index.js";
|
|
2
2
|
import type { AppBridgeRequest, AppContext, AppGrant } from "./types.js";
|
|
3
|
-
export type AppRequest = <T>(operation: AppBridgeRequest["operation"], body?: unknown) => Promise<T>;
|
|
3
|
+
export type AppRequest = <T>(operation: Exclude<AppBridgeRequest["operation"], "host">, body?: unknown) => Promise<T>;
|
|
4
4
|
export declare function appContext(session: Pick<AppSession, "appId" | "installationId" | "workspace" | "projectId">, verified: {
|
|
5
5
|
appId: string;
|
|
6
6
|
installationId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/app/project.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAgB,QAAQ,EAAc,MAAM,YAAY,CAAC;AAEnG,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,gBAAgB,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/app/project.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAgB,QAAQ,EAAc,MAAM,YAAY,CAAC;AAEnG,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,gBAAgB,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;AAoCtH,wBAAgB,UAAU,CACxB,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,GAAG,gBAAgB,GAAG,WAAW,GAAG,WAAW,CAAC,EACjF,QAAQ,EAAE;IACR,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;IACnC,MAAM,EAAE,QAAQ,EAAE,CAAC;CACpB,EACD,OAAO,EAAE,UAAU,GAClB,UAAU,CAyBZ"}
|
package/dist/app/server.d.ts
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import type { AppContext } from "./types.js";
|
|
2
2
|
export type { AppContext, AppExecution, AppGrant, AppProject } from "./types.js";
|
|
3
|
+
export declare class AppRequestError extends Error {
|
|
4
|
+
readonly status: number;
|
|
5
|
+
constructor(message: string, status: number);
|
|
6
|
+
}
|
|
3
7
|
/** Verify the browser's app bearer before using it from a developer-hosted backend. */
|
|
4
8
|
export declare function connectAppServer(token: string, options: {
|
|
5
9
|
appId: string;
|
package/dist/app/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/app/server.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAY,MAAM,YAAY,CAAC;AAEvD,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEjF,uFAAuF;AACvF,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9D,OAAO,CAAC,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/app/server.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAY,MAAM,YAAY,CAAC;AAEvD,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEjF,qBAAa,eAAgB,SAAQ,KAAK;aAGtB,MAAM,EAAE,MAAM;gBAD9B,OAAO,EAAE,MAAM,EACC,MAAM,EAAE,MAAM;CAKjC;AAED,uFAAuF;AACvF,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9D,OAAO,CAAC,UAAU,CAAC,CAoCrB"}
|
package/dist/app/server.js
CHANGED
|
@@ -1,9 +1,17 @@
|
|
|
1
1
|
// Generated from packages/ui-extensions/src/app/server.ts. Do not edit; run the Octonode SDK sync.
|
|
2
2
|
import { appContext } from "./project.js";
|
|
3
|
+
export class AppRequestError extends Error {
|
|
4
|
+
status;
|
|
5
|
+
constructor(message, status) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.status = status;
|
|
8
|
+
this.name = "AppRequestError";
|
|
9
|
+
}
|
|
10
|
+
}
|
|
3
11
|
/** Verify the browser's app bearer before using it from a developer-hosted backend. */
|
|
4
12
|
export async function connectAppServer(token, options) {
|
|
5
13
|
if (!/^octo_app_[A-Za-z0-9_-]{43}$/.test(token))
|
|
6
|
-
throw new
|
|
14
|
+
throw new AppRequestError("Invalid app session", 401);
|
|
7
15
|
const base = new URL(options.baseUrl);
|
|
8
16
|
if (base.protocol !== "https:" && !(base.protocol === "http:" && ["localhost", "127.0.0.1"].includes(base.hostname)))
|
|
9
17
|
throw new Error("Octonode API URL must use HTTPS");
|
|
@@ -14,6 +22,8 @@ export async function connectAppServer(token, options) {
|
|
|
14
22
|
? "/api/apps/runtime/data"
|
|
15
23
|
: "/api/apps/runtime/executions";
|
|
16
24
|
const response = await fetch(new URL(path, base), {
|
|
25
|
+
redirect: "manual",
|
|
26
|
+
signal: AbortSignal.timeout(15_000),
|
|
17
27
|
method: operation === "context" ? "GET" : "POST",
|
|
18
28
|
headers: {
|
|
19
29
|
authorization: `Bearer ${token}`,
|
|
@@ -21,13 +31,15 @@ export async function connectAppServer(token, options) {
|
|
|
21
31
|
},
|
|
22
32
|
...(operation === "context" ? {} : { body: JSON.stringify(body) }),
|
|
23
33
|
});
|
|
34
|
+
if (response.status >= 300 && response.status < 400)
|
|
35
|
+
throw new AppRequestError("Octonode app API redirects are not allowed", 502);
|
|
24
36
|
if (!response.ok)
|
|
25
|
-
throw new
|
|
37
|
+
throw new AppRequestError(`Octonode app request failed (${response.status})`, response.status);
|
|
26
38
|
return response.json();
|
|
27
39
|
};
|
|
28
40
|
const verified = await request("context");
|
|
29
41
|
if (verified.appId !== options.appId)
|
|
30
|
-
throw new
|
|
42
|
+
throw new AppRequestError("App session belongs to another app", 403);
|
|
31
43
|
return appContext({ ...verified, projectId: options.projectId }, verified, request);
|
|
32
44
|
}
|
|
33
45
|
//# sourceMappingURL=server.js.map
|
package/dist/app/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/app/server.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,OAAO,EAAE,UAAU,EAAmB,MAAM,cAAc,CAAC;AAK3D,uFAAuF;AACvF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAa,EACb,OAA+D;IAE/D,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/app/server.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,OAAO,EAAE,UAAU,EAAmB,MAAM,cAAc,CAAC;AAK3D,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAGtB;IAFlB,YACE,OAAe,EACC,MAAc;QAE9B,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,WAAM,GAAN,MAAM,CAAQ;QAG9B,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,uFAAuF;AACvF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAa,EACb,OAA+D;IAE/D,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,eAAe,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAC;IACvG,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClH,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,MAAM,OAAO,GAAe,KAAK,EAAK,SAA8C,EAAE,IAAc,EAAc,EAAE;QAClH,MAAM,IAAI,GACR,SAAS,KAAK,SAAS;YACrB,CAAC,CAAC,2BAA2B;YAC7B,CAAC,CAAC,SAAS,KAAK,MAAM;gBACpB,CAAC,CAAC,wBAAwB;gBAC1B,CAAC,CAAC,8BAA8B,CAAC;QACvC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE;YAChD,QAAQ,EAAE,QAAQ;YAClB,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;YACnC,MAAM,EAAE,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM;YAChD,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,KAAK,EAAE;gBAChC,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;aAC3E;YACD,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;SACnE,CAAC,CAAC;QACH,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG;YACjD,MAAM,IAAI,eAAe,CAAC,4CAA4C,EAAE,GAAG,CAAC,CAAC;QAC/E,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,eAAe,CAAC,gCAAgC,QAAQ,CAAC,MAAM,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QACjH,OAAO,QAAQ,CAAC,IAAI,EAAgB,CAAC;IACvC,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAM3B,SAAS,CAAC,CAAC;IACd,IAAI,QAAQ,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK;QAAE,MAAM,IAAI,eAAe,CAAC,oCAAoC,EAAE,GAAG,CAAC,CAAC;IAC3G,OAAO,UAAU,CAAC,EAAE,GAAG,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AACtF,CAAC"}
|
package/dist/app/types.d.ts
CHANGED
|
@@ -1,4 +1,25 @@
|
|
|
1
1
|
import type { AppSession } from "../index.js";
|
|
2
|
+
export type HostedAppState = {
|
|
3
|
+
embedded: boolean;
|
|
4
|
+
status: "connecting" | "ready" | "standalone" | "expired";
|
|
5
|
+
token?: string;
|
|
6
|
+
expiresAt?: number;
|
|
7
|
+
path: string;
|
|
8
|
+
};
|
|
9
|
+
export type HostedAppNavigationItem = {
|
|
10
|
+
label: string;
|
|
11
|
+
path: string;
|
|
12
|
+
};
|
|
13
|
+
export type HostedApp = {
|
|
14
|
+
getSnapshot(): HostedAppState;
|
|
15
|
+
subscribe(listener: () => void): () => void;
|
|
16
|
+
navigate(path: string, options?: {
|
|
17
|
+
replace?: boolean;
|
|
18
|
+
}): void;
|
|
19
|
+
setNavigation(items: HostedAppNavigationItem[]): void;
|
|
20
|
+
fetch(input: string, init?: RequestInit): Promise<Response>;
|
|
21
|
+
dispose(): void;
|
|
22
|
+
};
|
|
2
23
|
export type AppGrant = {
|
|
3
24
|
action: "projects:read" | "data:read" | "data:write" | "workflows:run";
|
|
4
25
|
projectId: string;
|
|
@@ -52,15 +73,15 @@ export type AppContext = {
|
|
|
52
73
|
};
|
|
53
74
|
export type AppBridgeRequest = {
|
|
54
75
|
octonode: "ui-extension";
|
|
55
|
-
apiVersion: "1";
|
|
76
|
+
apiVersion: "1" | "2";
|
|
56
77
|
type: "app-request";
|
|
57
78
|
requestId: string;
|
|
58
|
-
operation: "context" | "data" | "workflow.run";
|
|
79
|
+
operation: "context" | "data" | "workflow.run" | "host";
|
|
59
80
|
body?: unknown;
|
|
60
81
|
};
|
|
61
82
|
export type AppBridgeResponse = {
|
|
62
83
|
octonode: "ui-extension";
|
|
63
|
-
apiVersion: "1";
|
|
84
|
+
apiVersion: "1" | "2";
|
|
64
85
|
type: "app-response";
|
|
65
86
|
requestId: string;
|
|
66
87
|
ok: boolean;
|
package/dist/app/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/app/types.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,MAAM,QAAQ,GAAG;IACrB,MAAM,EAAE,eAAe,GAAG,WAAW,GAAG,YAAY,GAAG,eAAe,CAAC;IACvE,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,GAAG,aAAa,CAAC;IACpF,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,IAAI,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7C,MAAM,EAAE;QACN,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;QACzB,IAAI,EAAE;YACJ,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE;gBAAE,MAAM,CAAC,EAAE,MAAM,CAAC;gBAAC,KAAK,CAAC,EAAE,MAAM,CAAA;aAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;YACrF,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;YACzE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;YACjH,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;SAC1D,CAAC;KACH,CAAC;IACF,EAAE,EAAE;QACF,GAAG,CACD,UAAU,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,CAAC,EAAE;YAAE,cAAc,CAAC,EAAE,MAAM,CAAC;YAAC,GAAG,CAAC,EAAE,MAAM,CAAA;SAAE,GAClD,OAAO,CAAC,YAAY,CAAC,CAAC;KAC1B,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IAC3B,cAAc,EAAE,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;IACnC,MAAM,EAAE,SAAS,QAAQ,EAAE,CAAC;IAC5B,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,OAAO,EAAE,UAAU,GAAG,SAAS,CAAC;IAChC,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,CAAC;CAC3C,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,cAAc,CAAC;IACzB,UAAU,EAAE,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/app/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ActionDefinition, AppExtensionTarget, ExtensionApi } from "./contributions.types.js";
|
|
2
|
+
export declare function extensionApi(target: AppExtensionTarget): ExtensionApi;
|
|
3
|
+
export declare function defineAction(target: AppExtensionTarget, handler: ActionDefinition["handler"]): ActionDefinition;
|
|
4
|
+
export declare function startAction(definition: ActionDefinition): void;
|
|
5
|
+
//# sourceMappingURL=contributions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contributions.d.ts","sourceRoot":"","sources":["../src/contributions.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,gBAAgB,EAEhB,kBAAkB,EAClB,YAAY,EAEb,MAAM,0BAA0B,CAAC;AAQlC,wBAAgB,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,YAAY,CAkBrE;AACD,wBAAgB,YAAY,CAAC,MAAM,EAAE,kBAAkB,EAAE,OAAO,EAAE,gBAAgB,CAAC,SAAS,CAAC,GAAG,gBAAgB,CAE/G;AACD,wBAAgB,WAAW,CAAC,UAAU,EAAE,gBAAgB,GAAG,IAAI,CA8C9D"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// Generated from packages/ui-extensions/src/contributions.ts. Do not edit; run the Octonode SDK sync.
|
|
2
|
+
import { getAppSession } from "./index.js";
|
|
3
|
+
import { request } from "./app/index.js";
|
|
4
|
+
function environment(target) {
|
|
5
|
+
getAppSession();
|
|
6
|
+
const value = globalThis.__octonodeExtension;
|
|
7
|
+
if (!value || value.target !== target)
|
|
8
|
+
throw new Error("Extension target context unavailable");
|
|
9
|
+
return value;
|
|
10
|
+
}
|
|
11
|
+
export function extensionApi(target) {
|
|
12
|
+
const value = environment(target);
|
|
13
|
+
return {
|
|
14
|
+
target,
|
|
15
|
+
context: value.context,
|
|
16
|
+
i18n: { t: (key) => value.translations[key] ?? key },
|
|
17
|
+
ui: {
|
|
18
|
+
openPanel: (id) => request("host", { command: "panel.open", id }),
|
|
19
|
+
openAssistant: (suggestion) => request("host", { command: "assistant.open", suggestion }),
|
|
20
|
+
},
|
|
21
|
+
tabs: {
|
|
22
|
+
undo: (scope, revision) => request("host", { command: "layout.undo", scope, revision }),
|
|
23
|
+
list: () => request("host", { command: "layout.list" }),
|
|
24
|
+
update: (scope, revision, items) => request("host", { command: "layout.update", scope, revision, items }),
|
|
25
|
+
},
|
|
26
|
+
edits: { propose: (input) => request("host", { command: "edit.propose", ...input }) },
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export function defineAction(target, handler) {
|
|
30
|
+
return { kind: "action", target, handler };
|
|
31
|
+
}
|
|
32
|
+
export function startAction(definition) {
|
|
33
|
+
const value = environment(definition.target);
|
|
34
|
+
if (!value.invocationId)
|
|
35
|
+
throw new Error("Actions require host invocation");
|
|
36
|
+
const controller = new AbortController();
|
|
37
|
+
addEventListener("pagehide", () => controller.abort(), { once: true });
|
|
38
|
+
const api = {
|
|
39
|
+
...extensionApi(definition.target),
|
|
40
|
+
signal: controller.signal,
|
|
41
|
+
invocationId: value.invocationId,
|
|
42
|
+
};
|
|
43
|
+
parent.postMessage({
|
|
44
|
+
octonode: "ui-extension",
|
|
45
|
+
apiVersion: "2",
|
|
46
|
+
type: "render",
|
|
47
|
+
target: definition.target,
|
|
48
|
+
tree: { type: "node-form", children: [] },
|
|
49
|
+
}, "*");
|
|
50
|
+
Promise.resolve()
|
|
51
|
+
.then(() => definition.handler(api))
|
|
52
|
+
.then(() => {
|
|
53
|
+
parent.postMessage({
|
|
54
|
+
octonode: "ui-extension",
|
|
55
|
+
apiVersion: "2",
|
|
56
|
+
type: "action-complete",
|
|
57
|
+
target: definition.target,
|
|
58
|
+
invocationId: value.invocationId,
|
|
59
|
+
}, "*");
|
|
60
|
+
})
|
|
61
|
+
.catch(() => {
|
|
62
|
+
parent.postMessage({
|
|
63
|
+
octonode: "ui-extension",
|
|
64
|
+
apiVersion: "2",
|
|
65
|
+
type: "error",
|
|
66
|
+
target: definition.target,
|
|
67
|
+
message: "Extension action failed",
|
|
68
|
+
}, "*");
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=contributions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contributions.js","sourceRoot":"","sources":["../src/contributions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import type { APP_EXTENSION_TARGETS } from "./targets.js";
|
|
2
|
+
export type AppExtensionTarget = (typeof APP_EXTENSION_TARGETS)[number];
|
|
3
|
+
export type ExtensionContext = Readonly<{
|
|
4
|
+
projectId?: string;
|
|
5
|
+
worktreeId?: string;
|
|
6
|
+
workflowId?: string;
|
|
7
|
+
nodeId?: string;
|
|
8
|
+
nodeKind?: string;
|
|
9
|
+
edgeId?: string;
|
|
10
|
+
executionId?: string;
|
|
11
|
+
taskSpaceId?: string;
|
|
12
|
+
itemId?: string;
|
|
13
|
+
documentId?: string;
|
|
14
|
+
documentFormat?: "markdown" | "html" | "latex";
|
|
15
|
+
tableId?: string;
|
|
16
|
+
rowId?: string;
|
|
17
|
+
filePath?: string;
|
|
18
|
+
revision?: string | number;
|
|
19
|
+
draftRevision?: number;
|
|
20
|
+
selectedIds?: readonly string[];
|
|
21
|
+
canvas?: {
|
|
22
|
+
x: number;
|
|
23
|
+
y: number;
|
|
24
|
+
};
|
|
25
|
+
readOnly: boolean;
|
|
26
|
+
tasks?: readonly {
|
|
27
|
+
itemId: string;
|
|
28
|
+
taskSpaceId: string;
|
|
29
|
+
revision: number;
|
|
30
|
+
}[];
|
|
31
|
+
nodes?: readonly {
|
|
32
|
+
id: string;
|
|
33
|
+
kind?: string;
|
|
34
|
+
label?: string;
|
|
35
|
+
}[];
|
|
36
|
+
selection?: {
|
|
37
|
+
start: number;
|
|
38
|
+
end: number;
|
|
39
|
+
};
|
|
40
|
+
}>;
|
|
41
|
+
export type ExtensionApi = {
|
|
42
|
+
readonly target: AppExtensionTarget;
|
|
43
|
+
readonly context: ExtensionContext;
|
|
44
|
+
i18n: {
|
|
45
|
+
t(key: string): string;
|
|
46
|
+
};
|
|
47
|
+
ui: {
|
|
48
|
+
openPanel(id: string): Promise<void>;
|
|
49
|
+
openAssistant(suggestion?: string): Promise<void>;
|
|
50
|
+
};
|
|
51
|
+
edits: {
|
|
52
|
+
propose(input: {
|
|
53
|
+
resource: "file" | "document";
|
|
54
|
+
baseRevision: string;
|
|
55
|
+
draftRevision: number;
|
|
56
|
+
content: string;
|
|
57
|
+
mode: "append" | "replace" | "replace-selection";
|
|
58
|
+
}): Promise<void>;
|
|
59
|
+
};
|
|
60
|
+
tabs: {
|
|
61
|
+
undo(scope: string, revision: string): Promise<void>;
|
|
62
|
+
list(): Promise<{
|
|
63
|
+
scope: string;
|
|
64
|
+
revision: string;
|
|
65
|
+
items: {
|
|
66
|
+
id: string;
|
|
67
|
+
label?: string;
|
|
68
|
+
pinned?: boolean;
|
|
69
|
+
}[];
|
|
70
|
+
}[]>;
|
|
71
|
+
update(scope: string, revision: string, items: {
|
|
72
|
+
id: string;
|
|
73
|
+
label?: string;
|
|
74
|
+
pinned?: boolean;
|
|
75
|
+
}[]): Promise<void>;
|
|
76
|
+
};
|
|
77
|
+
};
|
|
78
|
+
export type ActionApi = ExtensionApi & {
|
|
79
|
+
signal: AbortSignal;
|
|
80
|
+
invocationId: string;
|
|
81
|
+
};
|
|
82
|
+
export type ActionDefinition = {
|
|
83
|
+
kind: "action";
|
|
84
|
+
target: AppExtensionTarget;
|
|
85
|
+
handler(api: ActionApi): Promise<void> | void;
|
|
86
|
+
};
|
|
87
|
+
export type ExtensionEnvironment = {
|
|
88
|
+
target: AppExtensionTarget;
|
|
89
|
+
context: ExtensionContext;
|
|
90
|
+
translations: Readonly<Record<string, string>>;
|
|
91
|
+
invocationId?: string;
|
|
92
|
+
};
|
|
93
|
+
//# sourceMappingURL=contributions.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contributions.types.d.ts","sourceRoot":"","sources":["../src/contributions.types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contributions.types.js","sourceRoot":"","sources":["../src/contributions.types.ts"],"names":[],"mappings":""}
|