@tomflow/proflow-execution-browser-extension 0.1.27 → 0.1.29
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/DOCS.md +1 -1
- package/dist/deployment/adapter.d.ts +10 -10
- package/dist/deployment/descriptor.d.ts +1 -1
- package/dist/deployment/descriptor.js +1 -1
- package/dist/extension/background.js +15 -1
- package/dist/extension/{side-panel.js → tasks.js} +3 -3
- package/dist/src/index.js +1 -1
- package/extension/background.ts +19 -6
- package/extension/options.html +1 -1
- package/extension/{side-panel.html → tasks.html} +16 -12
- package/extension/{side-panel.ts → tasks.ts} +3 -3
- package/manifest.json +4 -5
- package/package.json +5 -5
- package/proflow.module.json +1 -1
- /package/dist/extension/{side-panel.d.ts → tasks.d.ts} +0 -0
package/DOCS.md
CHANGED
|
@@ -6,7 +6,7 @@ Execution 领域拥有的 Chrome MV3 Extension,负责 Task UI、审批提醒
|
|
|
6
6
|
|
|
7
7
|
## 主要能力
|
|
8
8
|
|
|
9
|
-
-
|
|
9
|
+
- 运行期提供独立 ProFlow Tasks 扩展页面、Task Observer、System Observer 和 Browser Effect;任务 UI 不再以内嵌 Side Panel 形式占用当前网页。
|
|
10
10
|
- 运行期创建、恢复和唤醒 Custom GPT Conversation,稳定观察 workerRef/c-id。
|
|
11
11
|
- 部署期通过独立 `/gpts/editor` / `/gpts/editor/*` Provisioning Surface 物化 Custom GPT;该分支不进入 Task/Worker 状态机。
|
|
12
12
|
- 正常创建路径在单一 GPT Editor 会话中完成字段、Action Schema、API Key/Bearer、Knowledge ZIP、模型与 Capabilities 配置,再创建 Private GPT;不在 Create 后重新打开同一 GPT 做 Auth。
|
|
@@ -47,7 +47,7 @@ export declare const behaviorAdapter: {
|
|
|
47
47
|
ok: true;
|
|
48
48
|
status: "SUCCEEDED";
|
|
49
49
|
moduleRef: "execution-browser-extension";
|
|
50
|
-
moduleVersion: "0.1.
|
|
50
|
+
moduleVersion: "0.1.29";
|
|
51
51
|
data: {
|
|
52
52
|
loadDir: string;
|
|
53
53
|
};
|
|
@@ -60,7 +60,7 @@ export declare const behaviorAdapter: {
|
|
|
60
60
|
readonly ok: true;
|
|
61
61
|
readonly status: "SUCCEEDED";
|
|
62
62
|
readonly moduleRef: "execution-browser-extension";
|
|
63
|
-
readonly moduleVersion: "0.1.
|
|
63
|
+
readonly moduleVersion: "0.1.29";
|
|
64
64
|
};
|
|
65
65
|
observedEffects: never[];
|
|
66
66
|
}>;
|
|
@@ -70,7 +70,7 @@ export declare const behaviorAdapter: {
|
|
|
70
70
|
ok: true;
|
|
71
71
|
status: "SUCCEEDED";
|
|
72
72
|
moduleRef: "execution-browser-extension";
|
|
73
|
-
moduleVersion: "0.1.
|
|
73
|
+
moduleVersion: "0.1.29";
|
|
74
74
|
data: {
|
|
75
75
|
setupStatus: "ACTION_REQUIRED" | "READY";
|
|
76
76
|
runtimeStatus: "NOT_APPLICABLE";
|
|
@@ -95,7 +95,7 @@ export declare const behaviorAdapter: {
|
|
|
95
95
|
result: {
|
|
96
96
|
contract: "deployment.result.v1";
|
|
97
97
|
moduleRef: "execution-browser-extension";
|
|
98
|
-
moduleVersion: "0.1.
|
|
98
|
+
moduleVersion: "0.1.29";
|
|
99
99
|
ok: false;
|
|
100
100
|
status: "ACTION_REQUIRED";
|
|
101
101
|
data: {
|
|
@@ -127,14 +127,14 @@ export declare const behaviorAdapter: {
|
|
|
127
127
|
readonly ok: true;
|
|
128
128
|
readonly status: "SUCCEEDED";
|
|
129
129
|
readonly moduleRef: "execution-browser-extension";
|
|
130
|
-
readonly moduleVersion: "0.1.
|
|
130
|
+
readonly moduleVersion: "0.1.29";
|
|
131
131
|
};
|
|
132
132
|
observedEffects: string[];
|
|
133
133
|
} | {
|
|
134
134
|
result: {
|
|
135
135
|
contract: "deployment.result.v1";
|
|
136
136
|
moduleRef: "execution-browser-extension";
|
|
137
|
-
moduleVersion: "0.1.
|
|
137
|
+
moduleVersion: "0.1.29";
|
|
138
138
|
ok: false;
|
|
139
139
|
status: "FAILED";
|
|
140
140
|
error: {
|
|
@@ -167,7 +167,7 @@ export declare const behaviorAdapter: {
|
|
|
167
167
|
ok: true;
|
|
168
168
|
status: "SUCCEEDED";
|
|
169
169
|
moduleRef: "execution-browser-extension";
|
|
170
|
-
moduleVersion: "0.1.
|
|
170
|
+
moduleVersion: "0.1.29";
|
|
171
171
|
data: {
|
|
172
172
|
docs: string;
|
|
173
173
|
};
|
|
@@ -180,11 +180,11 @@ export declare const behaviorAdapter: {
|
|
|
180
180
|
readonly ok: true;
|
|
181
181
|
readonly status: "SUCCEEDED";
|
|
182
182
|
readonly moduleRef: "execution-browser-extension";
|
|
183
|
-
readonly moduleVersion: "0.1.
|
|
183
|
+
readonly moduleVersion: "0.1.29";
|
|
184
184
|
} | {
|
|
185
185
|
contract: "deployment.result.v1";
|
|
186
186
|
moduleRef: "execution-browser-extension";
|
|
187
|
-
moduleVersion: "0.1.
|
|
187
|
+
moduleVersion: "0.1.29";
|
|
188
188
|
ok: false;
|
|
189
189
|
status: "FAILED";
|
|
190
190
|
error: {
|
|
@@ -201,7 +201,7 @@ export declare const behaviorAdapter: {
|
|
|
201
201
|
readonly ok: true;
|
|
202
202
|
readonly status: "SUCCEEDED";
|
|
203
203
|
readonly moduleRef: "execution-browser-extension";
|
|
204
|
-
readonly moduleVersion: "0.1.
|
|
204
|
+
readonly moduleVersion: "0.1.29";
|
|
205
205
|
};
|
|
206
206
|
observedEffects: never[];
|
|
207
207
|
}>;
|
|
@@ -3,7 +3,7 @@ export declare const descriptor: {
|
|
|
3
3
|
readonly contractVersion: "1.0.0";
|
|
4
4
|
readonly moduleRef: "execution-browser-extension";
|
|
5
5
|
readonly packageName: "@tomflow/proflow-execution-browser-extension";
|
|
6
|
-
readonly moduleVersion: "0.1.
|
|
6
|
+
readonly moduleVersion: "0.1.29";
|
|
7
7
|
readonly kind: "browser-extension";
|
|
8
8
|
readonly templateVersion: "1.0.0";
|
|
9
9
|
readonly platformCompatibility: ">=1.0.0 <2.0.0";
|
|
@@ -3,7 +3,7 @@ export const descriptor = {
|
|
|
3
3
|
contractVersion: "1.0.0",
|
|
4
4
|
moduleRef: "execution-browser-extension",
|
|
5
5
|
packageName: "@tomflow/proflow-execution-browser-extension",
|
|
6
|
-
moduleVersion: "0.1.
|
|
6
|
+
moduleVersion: "0.1.29",
|
|
7
7
|
kind: "browser-extension",
|
|
8
8
|
templateVersion: "1.0.0",
|
|
9
9
|
platformCompatibility: ">=1.0.0 <2.0.0",
|
|
@@ -14779,6 +14779,18 @@ chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
|
|
|
14779
14779
|
return true;
|
|
14780
14780
|
}
|
|
14781
14781
|
});
|
|
14782
|
+
async function openTaskPage() {
|
|
14783
|
+
const taskPageUrl = chrome.runtime.getURL("extension/tasks.html");
|
|
14784
|
+
const [existing] = await chrome.tabs.query({
|
|
14785
|
+
url: taskPageUrl,
|
|
14786
|
+
currentWindow: true
|
|
14787
|
+
});
|
|
14788
|
+
if (existing?.id !== void 0) {
|
|
14789
|
+
await chrome.tabs.update(existing.id, { active: true });
|
|
14790
|
+
return;
|
|
14791
|
+
}
|
|
14792
|
+
await chrome.tabs.create({ url: taskPageUrl, active: true });
|
|
14793
|
+
}
|
|
14782
14794
|
async function startBackgroundRuntime() {
|
|
14783
14795
|
await bootstrapManagedRuntimeConfig();
|
|
14784
14796
|
await persistSnapshot();
|
|
@@ -14786,8 +14798,10 @@ async function startBackgroundRuntime() {
|
|
|
14786
14798
|
void runProvisioningBridgeLoop();
|
|
14787
14799
|
void runObserverRecovery();
|
|
14788
14800
|
}
|
|
14801
|
+
chrome.action.onClicked.addListener(() => {
|
|
14802
|
+
void openTaskPage();
|
|
14803
|
+
});
|
|
14789
14804
|
chrome.runtime.onInstalled.addListener(() => {
|
|
14790
|
-
void chrome.sidePanel.setPanelBehavior({ openPanelOnActionClick: true });
|
|
14791
14805
|
void bootstrapManagedRuntimeConfig().then(async () => {
|
|
14792
14806
|
await persistSnapshot();
|
|
14793
14807
|
void runBridgeLoop();
|
|
@@ -2,7 +2,7 @@ export {};
|
|
|
2
2
|
function element(selector) {
|
|
3
3
|
const value = document.querySelector(selector);
|
|
4
4
|
if (!value)
|
|
5
|
-
throw new Error(`
|
|
5
|
+
throw new Error(`TASK_PAGE_TARGET_MISSING:${selector}`);
|
|
6
6
|
return value;
|
|
7
7
|
}
|
|
8
8
|
const connection = element("#connection");
|
|
@@ -81,7 +81,7 @@ async function refreshApprovals() {
|
|
|
81
81
|
await approvalApplication("approval.deny", {
|
|
82
82
|
approvalRef: approval.approvalRef,
|
|
83
83
|
expectedVersion: approval.version,
|
|
84
|
-
reason: "Denied from Extension
|
|
84
|
+
reason: "Denied from Extension Task Page",
|
|
85
85
|
});
|
|
86
86
|
await refreshApprovals();
|
|
87
87
|
}));
|
|
@@ -116,7 +116,7 @@ async function loadTask(taskId) {
|
|
|
116
116
|
await taskApplication("node.reopen", {
|
|
117
117
|
taskId: selected.taskId,
|
|
118
118
|
nodeId: node.nodeId,
|
|
119
|
-
reason: "Human reopen from Extension
|
|
119
|
+
reason: "Human reopen from Extension Task Page",
|
|
120
120
|
expectedTaskVersion: selected.version,
|
|
121
121
|
idempotencyKey: requestId("extension-reopen"),
|
|
122
122
|
});
|
package/dist/src/index.js
CHANGED
|
@@ -238,8 +238,8 @@ export function createExecutionBrowserExtension(options) {
|
|
|
238
238
|
if (roleIdentity.roleRef !== request.input.roleRef ||
|
|
239
239
|
roleIdentity.workerRef)
|
|
240
240
|
throw new ExecutionBrowserError("PRECONDITION_FAILED", "ROLE_URL_MISMATCH");
|
|
241
|
-
const precondition = await effectStarted(raw);
|
|
242
241
|
const opened = await options.browser.open(request.input.roleUrl);
|
|
242
|
+
const precondition = await effectStarted(raw);
|
|
243
243
|
const submitted = await options.browser.submit(opened.tabId, `WORKER_BIND ${request.input.bootstrapFingerprint}`, request.input.bootstrapFingerprint);
|
|
244
244
|
if (!(await options.browser.hasMessage(submitted.tabId, request.input.bootstrapFingerprint)))
|
|
245
245
|
throw new ExecutionBrowserError("UNKNOWN_SIDE_EFFECT", "CREATE_MESSAGE_REALITY_UNCONFIRMED");
|
package/extension/background.ts
CHANGED
|
@@ -112,13 +112,11 @@ type ChromeRuntime = {
|
|
|
112
112
|
set(value: Record<string, unknown>): Promise<void>;
|
|
113
113
|
};
|
|
114
114
|
};
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
openPanelOnActionClick: boolean;
|
|
118
|
-
}): Promise<void>;
|
|
115
|
+
action: {
|
|
116
|
+
onClicked: { addListener(listener: () => void): void };
|
|
119
117
|
};
|
|
120
118
|
tabs: {
|
|
121
|
-
query(query: { url?: string }): Promise<ChromeTab[]>;
|
|
119
|
+
query(query: { url?: string; currentWindow?: boolean }): Promise<ChromeTab[]>;
|
|
122
120
|
get(tabId: number): Promise<ChromeTab>;
|
|
123
121
|
create(create: { url: string; active: boolean }): Promise<ChromeTab>;
|
|
124
122
|
reload(tabId: number): Promise<void>;
|
|
@@ -1319,6 +1317,19 @@ chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
|
|
|
1319
1317
|
}
|
|
1320
1318
|
});
|
|
1321
1319
|
|
|
1320
|
+
async function openTaskPage(): Promise<void> {
|
|
1321
|
+
const taskPageUrl = chrome.runtime.getURL("extension/tasks.html");
|
|
1322
|
+
const [existing] = await chrome.tabs.query({
|
|
1323
|
+
url: taskPageUrl,
|
|
1324
|
+
currentWindow: true,
|
|
1325
|
+
});
|
|
1326
|
+
if (existing?.id !== undefined) {
|
|
1327
|
+
await chrome.tabs.update(existing.id, { active: true });
|
|
1328
|
+
return;
|
|
1329
|
+
}
|
|
1330
|
+
await chrome.tabs.create({ url: taskPageUrl, active: true });
|
|
1331
|
+
}
|
|
1332
|
+
|
|
1322
1333
|
async function startBackgroundRuntime(): Promise<void> {
|
|
1323
1334
|
await bootstrapManagedRuntimeConfig();
|
|
1324
1335
|
await persistSnapshot();
|
|
@@ -1327,8 +1338,10 @@ async function startBackgroundRuntime(): Promise<void> {
|
|
|
1327
1338
|
void runObserverRecovery();
|
|
1328
1339
|
}
|
|
1329
1340
|
|
|
1341
|
+
chrome.action.onClicked.addListener(() => {
|
|
1342
|
+
void openTaskPage();
|
|
1343
|
+
});
|
|
1330
1344
|
chrome.runtime.onInstalled.addListener(() => {
|
|
1331
|
-
void chrome.sidePanel.setPanelBehavior({ openPanelOnActionClick: true });
|
|
1332
1345
|
void bootstrapManagedRuntimeConfig().then(async () => {
|
|
1333
1346
|
await persistSnapshot();
|
|
1334
1347
|
void runBridgeLoop();
|
package/extension/options.html
CHANGED
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
|
|
30
30
|
<section>
|
|
31
31
|
<h2>Task Application</h2>
|
|
32
|
-
<p>Connects the
|
|
32
|
+
<p>Connects the independent ProFlow Tasks page to the loopback platform-host application surface. This credential is separate from Role and Browser-bridge credentials.</p>
|
|
33
33
|
<form id="task-application-form">
|
|
34
34
|
<label>Platform-host endpoint <input id="task-application-endpoint" required placeholder="http://127.0.0.1:47830" /></label>
|
|
35
35
|
<label>Task application token <input id="task-application-token" type="password" required autocomplete="off" /></label>
|
|
@@ -3,25 +3,28 @@
|
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="utf-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width" />
|
|
6
|
-
<title>ProFlow</title>
|
|
6
|
+
<title>ProFlow Tasks</title>
|
|
7
7
|
<style>
|
|
8
|
-
body { font:
|
|
9
|
-
|
|
8
|
+
body { background: #f7f7f8; color: #18181b; font: 14px system-ui; margin: 0; }
|
|
9
|
+
main { box-sizing: border-box; margin: 0 auto; max-width: 1180px; padding: 28px; }
|
|
10
|
+
header { margin-bottom: 20px; }
|
|
11
|
+
section { background: #fff; border: 1px solid #e4e4e7; border-radius: 10px; margin-top: 14px; padding: 16px; }
|
|
10
12
|
label { display: block; margin: 8px 0; }
|
|
11
|
-
input, textarea { box-sizing: border-box; display: block; margin-top: 4px; width: 100%; }
|
|
12
|
-
textarea { min-height:
|
|
13
|
-
button { margin: 4px 4px 4px 0; padding:
|
|
13
|
+
input, textarea { box-sizing: border-box; display: block; margin-top: 4px; padding: 8px; width: 100%; }
|
|
14
|
+
textarea { min-height: 84px; }
|
|
15
|
+
button { margin: 4px 4px 4px 0; padding: 7px 11px; }
|
|
14
16
|
button[disabled] { opacity: .55; }
|
|
15
|
-
.task { border: 1px solid #
|
|
16
|
-
.meta { color: #
|
|
17
|
+
.task { border: 1px solid #e4e4e7; border-radius: 8px; margin: 8px 0; padding: 10px; }
|
|
18
|
+
.meta { color: #52525b; font-size: 12px; }
|
|
17
19
|
#error { color: #a00; white-space: pre-wrap; }
|
|
18
20
|
#result { white-space: pre-wrap; }
|
|
19
|
-
#browser-status { max-height:
|
|
21
|
+
#browser-status { max-height: 220px; overflow: auto; }
|
|
20
22
|
</style>
|
|
21
23
|
</head>
|
|
22
24
|
<body>
|
|
25
|
+
<main>
|
|
23
26
|
<header>
|
|
24
|
-
<h1>ProFlow</h1>
|
|
27
|
+
<h1>ProFlow Tasks</h1>
|
|
25
28
|
<div id="connection" class="meta">Connecting…</div>
|
|
26
29
|
</header>
|
|
27
30
|
|
|
@@ -54,7 +57,7 @@
|
|
|
54
57
|
|
|
55
58
|
<section>
|
|
56
59
|
<h2>Execution Approval</h2>
|
|
57
|
-
<p class="meta">Approval is an Execution-owned durable fact. This
|
|
60
|
+
<p class="meta">Approval is an Execution-owned durable fact. This page only sends authenticated human decisions to the Execution Owner.</p>
|
|
58
61
|
<button id="refresh-approvals" type="button">Refresh approvals</button>
|
|
59
62
|
<div id="approvals"></div>
|
|
60
63
|
</section>
|
|
@@ -72,6 +75,7 @@
|
|
|
72
75
|
|
|
73
76
|
<p id="error" role="alert"></p>
|
|
74
77
|
<pre id="result" role="status"></pre>
|
|
75
|
-
<script type="module" src="../dist/extension/
|
|
78
|
+
<script type="module" src="../dist/extension/tasks.js"></script>
|
|
79
|
+
</main>
|
|
76
80
|
</body>
|
|
77
81
|
</html>
|
|
@@ -47,7 +47,7 @@ type TaskView = TaskSummary & {
|
|
|
47
47
|
|
|
48
48
|
function element<T extends HTMLElement>(selector: string): T {
|
|
49
49
|
const value = document.querySelector<T>(selector);
|
|
50
|
-
if (!value) throw new Error(`
|
|
50
|
+
if (!value) throw new Error(`TASK_PAGE_TARGET_MISSING:${selector}`);
|
|
51
51
|
return value;
|
|
52
52
|
}
|
|
53
53
|
|
|
@@ -152,7 +152,7 @@ async function refreshApprovals() {
|
|
|
152
152
|
await approvalApplication("approval.deny", {
|
|
153
153
|
approvalRef: approval.approvalRef,
|
|
154
154
|
expectedVersion: approval.version,
|
|
155
|
-
reason: "Denied from Extension
|
|
155
|
+
reason: "Denied from Extension Task Page",
|
|
156
156
|
});
|
|
157
157
|
await refreshApprovals();
|
|
158
158
|
}),
|
|
@@ -189,7 +189,7 @@ async function loadTask(taskId: string) {
|
|
|
189
189
|
await taskApplication("node.reopen", {
|
|
190
190
|
taskId: selected.taskId,
|
|
191
191
|
nodeId: node.nodeId,
|
|
192
|
-
reason: "Human reopen from Extension
|
|
192
|
+
reason: "Human reopen from Extension Task Page",
|
|
193
193
|
expectedTaskVersion: selected.version,
|
|
194
194
|
idempotencyKey: requestId("extension-reopen"),
|
|
195
195
|
});
|
package/manifest.json
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"manifest_version": 3,
|
|
3
3
|
"name": "ProFlow Execution Browser",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.29",
|
|
5
5
|
"permissions": [
|
|
6
6
|
"tabs",
|
|
7
|
-
"storage"
|
|
8
|
-
"sidePanel"
|
|
7
|
+
"storage"
|
|
9
8
|
],
|
|
10
9
|
"host_permissions": [
|
|
11
10
|
"https://chatgpt.com/*",
|
|
@@ -36,8 +35,8 @@
|
|
|
36
35
|
"run_at": "document_idle"
|
|
37
36
|
}
|
|
38
37
|
],
|
|
39
|
-
"
|
|
40
|
-
"
|
|
38
|
+
"action": {
|
|
39
|
+
"default_title": "Open ProFlow Tasks"
|
|
41
40
|
},
|
|
42
41
|
"options_page": "extension/options.html"
|
|
43
42
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tomflow/proflow-execution-browser-extension",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.29",
|
|
4
4
|
"description": "Execution-owned MV3 Browser executor, evidence provider and browser application surface.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"publishConfig": {
|
|
@@ -27,12 +27,12 @@
|
|
|
27
27
|
"SETUP.md"
|
|
28
28
|
],
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@tomflow/proflow-
|
|
31
|
-
"@tomflow/proflow-
|
|
30
|
+
"@tomflow/proflow-execution-contracts": "^0.1.10",
|
|
31
|
+
"@tomflow/proflow-module-contract": "^0.1.13"
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|
|
34
|
-
"@tomflow/proflow-
|
|
35
|
-
"@tomflow/proflow-
|
|
34
|
+
"@tomflow/proflow-deployment-conformance": "^0.1.13",
|
|
35
|
+
"@tomflow/proflow-execution-runtime": "^0.1.15"
|
|
36
36
|
},
|
|
37
37
|
"keywords": [
|
|
38
38
|
"proflow",
|
package/proflow.module.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"contractVersion": "1.0.0",
|
|
4
4
|
"moduleRef": "execution-browser-extension",
|
|
5
5
|
"packageName": "@tomflow/proflow-execution-browser-extension",
|
|
6
|
-
"moduleVersion": "0.1.
|
|
6
|
+
"moduleVersion": "0.1.29",
|
|
7
7
|
"kind": "browser-extension",
|
|
8
8
|
"templateVersion": "1.0.0",
|
|
9
9
|
"platformCompatibility": ">=1.0.0 <2.0.0",
|
|
File without changes
|