swipium 2.0.0 → 2.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 +76 -0
- package/README.md +32 -20
- package/THREAT_MODEL.md +109 -21
- package/dist/automationGen/run.js.map +1 -1
- package/dist/cli/init.js +101 -11
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/verify.js +2 -2
- package/dist/cli/verify.js.map +1 -1
- package/dist/consent/consent.js +365 -17
- package/dist/consent/consent.js.map +1 -1
- package/dist/context/projectRoot.js +9 -4
- package/dist/context/projectRoot.js.map +1 -1
- package/dist/context/protocolEra.js +15 -0
- package/dist/context/protocolEra.js.map +1 -0
- package/dist/drivers/DirectDriver.js +5 -2
- package/dist/drivers/DirectDriver.js.map +1 -1
- package/dist/featureTesting/executionBootstrap.js +85 -77
- package/dist/featureTesting/executionBootstrap.js.map +1 -1
- package/dist/flows/run.js +9 -5
- package/dist/flows/run.js.map +1 -1
- package/dist/lib/abortScope.js +36 -3
- package/dist/lib/abortScope.js.map +1 -1
- package/dist/lib/android.js +15 -6
- package/dist/lib/android.js.map +1 -1
- package/dist/lib/codexEnv.js +112 -0
- package/dist/lib/codexEnv.js.map +1 -0
- package/dist/lib/logger.js +18 -0
- package/dist/lib/logger.js.map +1 -1
- package/dist/lib/result.js +188 -10
- package/dist/lib/result.js.map +1 -1
- package/dist/lib/schemaHash.js +20 -31
- package/dist/lib/schemaHash.js.map +1 -1
- package/dist/lib/simctl.js +102 -3
- package/dist/lib/simctl.js.map +1 -1
- package/dist/lib/toolSchema.js +143 -0
- package/dist/lib/toolSchema.js.map +1 -0
- package/dist/lib/wda.js +5 -2
- package/dist/lib/wda.js.map +1 -1
- package/dist/mobileAudit/runner.js +12 -4
- package/dist/mobileAudit/runner.js.map +1 -1
- package/dist/oracle/failures.js +2 -2
- package/dist/oracle/failures.js.map +1 -1
- package/dist/orchestration/testThis/execute.js +21 -4
- package/dist/orchestration/testThis/execute.js.map +1 -1
- package/dist/orchestration/testThis/pipeline.js +2 -0
- package/dist/orchestration/testThis/pipeline.js.map +1 -1
- package/dist/orchestration/testThis/plan.js.map +1 -1
- package/dist/report/export.js +1 -1
- package/dist/report/export.js.map +1 -1
- package/dist/server.js +564 -139
- package/dist/server.js.map +1 -1
- package/dist/services/prepareAndroid.js +3 -2
- package/dist/services/prepareAndroid.js.map +1 -1
- package/dist/services/prepareIos.js +31 -4
- package/dist/services/prepareIos.js.map +1 -1
- package/dist/services/smoke.js +38 -4
- package/dist/services/smoke.js.map +1 -1
- package/dist/session/processRegistry.js +12 -1
- package/dist/session/processRegistry.js.map +1 -1
- package/dist/snapshot/parse.js +64 -9
- package/dist/snapshot/parse.js.map +1 -1
- package/dist/snapshot/present.js +14 -4
- package/dist/snapshot/present.js.map +1 -1
- package/dist/snapshot/settle.js +14 -3
- package/dist/snapshot/settle.js.map +1 -1
- package/dist/tools/act.js +694 -670
- package/dist/tools/act.js.map +1 -1
- package/dist/tools/agent.js +15 -16
- package/dist/tools/agent.js.map +1 -1
- package/dist/tools/appControl.js +4 -4
- package/dist/tools/appControl.js.map +1 -1
- package/dist/tools/appMap.js +11 -13
- package/dist/tools/appMap.js.map +1 -1
- package/dist/tools/build.js +4 -6
- package/dist/tools/build.js.map +1 -1
- package/dist/tools/bundletool.js +3 -3
- package/dist/tools/bundletool.js.map +1 -1
- package/dist/tools/clearOverlay.js +2 -3
- package/dist/tools/clearOverlay.js.map +1 -1
- package/dist/tools/device.js +4 -3
- package/dist/tools/device.js.map +1 -1
- package/dist/tools/doctor.js +23 -11
- package/dist/tools/doctor.js.map +1 -1
- package/dist/tools/explore.js +15 -21
- package/dist/tools/explore.js.map +1 -1
- package/dist/tools/featureTesting.js +22 -6
- package/dist/tools/featureTesting.js.map +1 -1
- package/dist/tools/firstRun.js +4 -5
- package/dist/tools/firstRun.js.map +1 -1
- package/dist/tools/flow.js +13 -17
- package/dist/tools/flow.js.map +1 -1
- package/dist/tools/flowRepair.js +3 -5
- package/dist/tools/flowRepair.js.map +1 -1
- package/dist/tools/generate.js +10 -11
- package/dist/tools/generate.js.map +1 -1
- package/dist/tools/getArtifact.js +114 -10
- package/dist/tools/getArtifact.js.map +1 -1
- package/dist/tools/health.js +2 -1
- package/dist/tools/health.js.map +1 -1
- package/dist/tools/ios.js +35 -13
- package/dist/tools/ios.js.map +1 -1
- package/dist/tools/issues.js +8 -8
- package/dist/tools/issues.js.map +1 -1
- package/dist/tools/jobs.js +26 -10
- package/dist/tools/jobs.js.map +1 -1
- package/dist/tools/metro.js +4 -5
- package/dist/tools/metro.js.map +1 -1
- package/dist/tools/mobileAudit.js +11 -10
- package/dist/tools/mobileAudit.js.map +1 -1
- package/dist/tools/note.js +2 -3
- package/dist/tools/note.js.map +1 -1
- package/dist/tools/prepareIosTarget.js +102 -31
- package/dist/tools/prepareIosTarget.js.map +1 -1
- package/dist/tools/prepareTarget.js +3 -5
- package/dist/tools/prepareTarget.js.map +1 -1
- package/dist/tools/report.js +4 -5
- package/dist/tools/report.js.map +1 -1
- package/dist/tools/resolveArtifact.js +2 -3
- package/dist/tools/resolveArtifact.js.map +1 -1
- package/dist/tools/resolveTarget.js +3 -6
- package/dist/tools/resolveTarget.js.map +1 -1
- package/dist/tools/screenRecord.js +2 -3
- package/dist/tools/screenRecord.js.map +1 -1
- package/dist/tools/screenshot.js +2 -2
- package/dist/tools/screenshot.js.map +1 -1
- package/dist/tools/smoke.js +4 -2
- package/dist/tools/smoke.js.map +1 -1
- package/dist/tools/snapshot.js +6 -7
- package/dist/tools/snapshot.js.map +1 -1
- package/dist/tools/startSession.js +12 -16
- package/dist/tools/startSession.js.map +1 -1
- package/dist/tools/suite.js +2 -4
- package/dist/tools/suite.js.map +1 -1
- package/dist/tools/testSuite.js +13 -19
- package/dist/tools/testSuite.js.map +1 -1
- package/dist/tools/testThis.js +28 -13
- package/dist/tools/testThis.js.map +1 -1
- package/dist/tools/visual.js +7 -9
- package/dist/tools/visual.js.map +1 -1
- package/dist/tools/wait.js +130 -21
- package/dist/tools/wait.js.map +1 -1
- package/dist/tools/wda.js +199 -60
- package/dist/tools/wda.js.map +1 -1
- package/dist/version.js +1 -1
- package/docs/README.md +4 -4
- package/docs/ci-reports.md +39 -7
- package/docs/concepts.md +37 -25
- package/docs/flows.md +1 -1
- package/docs/mcp-server.md +281 -76
- package/docs/physical-devices.md +4 -4
- package/docs/tools.md +59 -30
- package/package.json +4 -3
package/dist/consent/consent.js
CHANGED
|
@@ -9,8 +9,31 @@
|
|
|
9
9
|
// declined, dismissed (`cancel`), timed-out or failed prompt is a REFUSAL. It never falls back
|
|
10
10
|
// to the model-mediated re-call. Which path decided an action is tagged as its
|
|
11
11
|
// ApprovalMechanism and lands in the mutation ledger.
|
|
12
|
-
|
|
12
|
+
//
|
|
13
|
+
// Protocol 2026-07-28 has no server-to-client requests: the same prompt rides inside an
|
|
14
|
+
// InputRequiredResult and the answer arrives on the client's retry of the tool call, correlated by
|
|
15
|
+
// a single-use server-side handle (issueConsentPrompt / redeemConsentPrompt below). The decision
|
|
16
|
+
// phases and outcomes are shared with the 2025 path; the ledger tags both 'elicitation'.
|
|
17
|
+
//
|
|
18
|
+
// Operator pre-approval (SWIPIUM_CONSENT_PREAPPROVE): headless clients (codex exec, claude -p)
|
|
19
|
+
// advertise elicitation but answer every prompt automatically (decline / cancel), so no gated
|
|
20
|
+
// action can ever run there. The OPERATOR can pre-approve exact action names in the server
|
|
21
|
+
// process environment (whatever the MCP client passes, e.g. its config `env`). It is read ONLY
|
|
22
|
+
// from process.env, never from the repo (.swipium/config.json etc.), so neither the model nor a
|
|
23
|
+
// checked-out project can grant it. No wildcards: each action must be named. Code-level tiers
|
|
24
|
+
// (CONSENT_ACTION_TIERS) narrow what a name can grant:
|
|
25
|
+
// - runsCode actions execute repo- or model-chosen code/commands; they are pre-approvable only
|
|
26
|
+
// when SWIPIUM_CONSENT_PREAPPROVE_RUN_CODE=1 is ALSO set (under codex exec that lets the model
|
|
27
|
+
// run code outside the client's sandbox);
|
|
28
|
+
// - never-pre-approvable actions (wda_non_loopback, which has its own exact-URL opt-in) are
|
|
29
|
+
// ignored;
|
|
30
|
+
// - test_this_plan covers its bundled sub-steps only when every runsCode sub-step (e.g. a
|
|
31
|
+
// build_from_source step) is itself pre-approvable.
|
|
32
|
+
// A pre-approved challenge is still session-bound and single-use; it is ledgered as
|
|
33
|
+
// 'operator-policy' and logged at warn with the exact command.
|
|
34
|
+
import { createHash, randomBytes, randomUUID } from 'node:crypto';
|
|
13
35
|
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
36
|
+
import { log } from '../lib/logger.js';
|
|
14
37
|
// The calling tool invocation's sessionId, set once per call by the server's tool wrapper
|
|
15
38
|
// (src/server.ts) so every consent-gated tool is session-bound with zero per-tool changes.
|
|
16
39
|
const consentScope = new AsyncLocalStorage();
|
|
@@ -43,8 +66,238 @@ function prunePending(now = Date.now()) {
|
|
|
43
66
|
function forget(consentId) {
|
|
44
67
|
pending.delete(consentId);
|
|
45
68
|
elicitationApproved.delete(consentId);
|
|
69
|
+
operatorApproved.delete(consentId);
|
|
46
70
|
awaitingElicitation.delete(consentId);
|
|
71
|
+
const token = promptTokenByConsent.get(consentId);
|
|
72
|
+
if (token !== undefined)
|
|
73
|
+
promptHandles.delete(token);
|
|
74
|
+
promptTokenByConsent.delete(consentId);
|
|
75
|
+
}
|
|
76
|
+
/** Every ConsentRequest.action a tool can mint (test/consentPreapprove.test.ts keeps this in sync
|
|
77
|
+
* with the requireConsent call sites). SWIPIUM_CONSENT_PREAPPROVE accepts only these names. */
|
|
78
|
+
export const CONSENT_ACTIONS = [
|
|
79
|
+
'app_clear_data',
|
|
80
|
+
'app_fresh_start',
|
|
81
|
+
'automation_project_write',
|
|
82
|
+
'build_from_source',
|
|
83
|
+
'destructive_ui_candidate',
|
|
84
|
+
'erase_device',
|
|
85
|
+
'flow_mutation_run',
|
|
86
|
+
'geo_set',
|
|
87
|
+
'install_app',
|
|
88
|
+
'network_change',
|
|
89
|
+
'ocr_run',
|
|
90
|
+
'permission_grant',
|
|
91
|
+
'permission_revoke',
|
|
92
|
+
'prepare_plan',
|
|
93
|
+
'privacy_reset',
|
|
94
|
+
'screen_record',
|
|
95
|
+
'seed_state',
|
|
96
|
+
'start_metro',
|
|
97
|
+
'suite_fresh_state_replay',
|
|
98
|
+
'test_this_plan',
|
|
99
|
+
'wda_build',
|
|
100
|
+
'wda_non_loopback',
|
|
101
|
+
'wda_start',
|
|
102
|
+
];
|
|
103
|
+
const CONSENT_ACTION_SET = new Set(CONSENT_ACTIONS);
|
|
104
|
+
/** Code-level risk tier per consent action (every action must be classified). */
|
|
105
|
+
export const CONSENT_ACTION_TIERS = {
|
|
106
|
+
app_clear_data: { runsCode: false },
|
|
107
|
+
app_fresh_start: { runsCode: false },
|
|
108
|
+
automation_project_write: { runsCode: false }, // writes generated files, never runs them
|
|
109
|
+
build_from_source: { runsCode: true }, // repo build scripts (gradle / xcodebuild / npm)
|
|
110
|
+
destructive_ui_candidate: { runsCode: false },
|
|
111
|
+
erase_device: { runsCode: false },
|
|
112
|
+
flow_mutation_run: { runsCode: true }, // seed scripts from repo fixtures, external OCR, openUrl with variables
|
|
113
|
+
geo_set: { runsCode: false },
|
|
114
|
+
install_app: { runsCode: false },
|
|
115
|
+
network_change: { runsCode: false },
|
|
116
|
+
ocr_run: { runsCode: true }, // repo-configured OCR / visual mask command
|
|
117
|
+
permission_grant: { runsCode: false },
|
|
118
|
+
permission_revoke: { runsCode: false },
|
|
119
|
+
prepare_plan: { runsCode: false },
|
|
120
|
+
privacy_reset: { runsCode: false },
|
|
121
|
+
screen_record: { runsCode: false },
|
|
122
|
+
seed_state: { runsCode: true }, // fixture seed scripts from the repo
|
|
123
|
+
start_metro: { runsCode: true }, // npx expo/react-native start loads the project's Metro/Babel config
|
|
124
|
+
suite_fresh_state_replay: { runsCode: true }, // state-profile prepare/teardown can run seed scripts
|
|
125
|
+
test_this_plan: { runsCode: false }, // bundled sub-steps are checked separately (planRunsCodeSteps)
|
|
126
|
+
wda_build: { runsCode: true }, // xcodebuild on a model-chosen wdaProjectPath
|
|
127
|
+
wda_non_loopback: {
|
|
128
|
+
runsCode: false,
|
|
129
|
+
notPreapprovable: 'use SWIPIUM_ALLOW_REMOTE_WDA=<exact URL> (the exact-URL pre-approval for remote WDA)',
|
|
130
|
+
},
|
|
131
|
+
wda_start: { runsCode: true }, // xcodebuild on a model-chosen wdaProjectPath
|
|
132
|
+
};
|
|
133
|
+
export const PREAPPROVE_ENV = 'SWIPIUM_CONSENT_PREAPPROVE';
|
|
134
|
+
export const PREAPPROVE_RUN_CODE_ENV = 'SWIPIUM_CONSENT_PREAPPROVE_RUN_CODE';
|
|
135
|
+
function tierOf(action) {
|
|
136
|
+
return CONSENT_ACTION_SET.has(action) ? CONSENT_ACTION_TIERS[action] : undefined;
|
|
137
|
+
}
|
|
138
|
+
/** True when the action executes repo- or model-chosen code (see ConsentActionTier.runsCode). */
|
|
139
|
+
export function actionRunsCode(action) {
|
|
140
|
+
return tierOf(action)?.runsCode === true;
|
|
141
|
+
}
|
|
142
|
+
/** Parse SWIPIUM_CONSENT_PREAPPROVE: comma-separated exact action names. Anything else (unknown
|
|
143
|
+
* names, `*`, `risk<=x`) is NOT honoured and is returned in `ignored`. Known names whose tier
|
|
144
|
+
* forbids pre-approval are returned in `blocked`. `runCode` is SWIPIUM_CONSENT_PREAPPROVE_RUN_CODE. */
|
|
145
|
+
export function parseConsentPreapproval(raw, runCode) {
|
|
146
|
+
const actions = new Set();
|
|
147
|
+
const ignored = [];
|
|
148
|
+
const blocked = [];
|
|
149
|
+
const runCodeOptIn = runCode?.trim() === '1';
|
|
150
|
+
for (const part of (raw ?? '').split(',')) {
|
|
151
|
+
const name = part.trim();
|
|
152
|
+
if (!name)
|
|
153
|
+
continue;
|
|
154
|
+
const tier = tierOf(name);
|
|
155
|
+
if (!tier)
|
|
156
|
+
ignored.push(name);
|
|
157
|
+
else if (tier.notPreapprovable)
|
|
158
|
+
blocked.push({ name, reason: `never pre-approvable: ${tier.notPreapprovable}` });
|
|
159
|
+
else if (tier.runsCode && !runCodeOptIn)
|
|
160
|
+
blocked.push({
|
|
161
|
+
name,
|
|
162
|
+
reason: `runs repo- or model-chosen code: also set ${PREAPPROVE_RUN_CODE_ENV}=1 to pre-approve it`,
|
|
163
|
+
});
|
|
164
|
+
else
|
|
165
|
+
actions.add(name);
|
|
166
|
+
}
|
|
167
|
+
return { actions, ignored, blocked };
|
|
168
|
+
}
|
|
169
|
+
function currentPreapproval() {
|
|
170
|
+
return parseConsentPreapproval(process.env[PREAPPROVE_ENV], process.env[PREAPPROVE_RUN_CODE_ENV]);
|
|
171
|
+
}
|
|
172
|
+
/** True when the operator pre-approved `action` in the server's own environment (and its tier
|
|
173
|
+
* allows it). Read per call from process.env only (never repo config). */
|
|
174
|
+
export function isOperatorPreapproved(action) {
|
|
175
|
+
return currentPreapproval().actions.has(action);
|
|
176
|
+
}
|
|
177
|
+
/** test_this_plan bundles sub-steps; return the kinds of the ones that run code. Read from the
|
|
178
|
+
* structured `affects.steps[].kind` (src/services/preflight.ts) AND the `exactCommand` bullet
|
|
179
|
+
* lines ("• <kind>: <cmd>"), so a malformed payload fails closed rather than open. */
|
|
180
|
+
export function planRunsCodeSteps(req) {
|
|
181
|
+
const kinds = new Set();
|
|
182
|
+
const steps = req.affects?.steps;
|
|
183
|
+
if (Array.isArray(steps)) {
|
|
184
|
+
for (const st of steps) {
|
|
185
|
+
const kind = st?.kind;
|
|
186
|
+
if (typeof kind === 'string')
|
|
187
|
+
kinds.add(kind);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
for (const line of (req.exactCommand ?? '').split('\n')) {
|
|
191
|
+
const m = /^\s*(?:•\s*)?([a-z_]+)\s*(?::|$)/.exec(line);
|
|
192
|
+
if (m)
|
|
193
|
+
kinds.add(m[1]);
|
|
194
|
+
}
|
|
195
|
+
return [...kinds].filter((k) => actionRunsCode(k)).sort();
|
|
196
|
+
}
|
|
197
|
+
/** Does the operator policy approve this exact request? Unlike isOperatorPreapproved, this also
|
|
198
|
+
* applies the test_this_plan sub-step rule. `reason` is set when the action is listed but the
|
|
199
|
+
* policy still does not cover it. */
|
|
200
|
+
export function operatorPolicyCovers(req) {
|
|
201
|
+
const { actions } = currentPreapproval();
|
|
202
|
+
if (!actions.has(req.action))
|
|
203
|
+
return { approved: false };
|
|
204
|
+
if (req.action === 'test_this_plan') {
|
|
205
|
+
const uncovered = planRunsCodeSteps(req).filter((k) => !actions.has(k));
|
|
206
|
+
if (uncovered.length)
|
|
207
|
+
return {
|
|
208
|
+
approved: false,
|
|
209
|
+
reason: `test_this_plan includes ${uncovered.join(', ')}, which runs code and is not itself pre-approved ` +
|
|
210
|
+
`(list it in ${PREAPPROVE_ENV} and set ${PREAPPROVE_RUN_CODE_ENV}=1)`,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
return { approved: true };
|
|
214
|
+
}
|
|
215
|
+
function levenshtein(a, b) {
|
|
216
|
+
const dp = Array.from({ length: b.length + 1 }, (_, j) => j);
|
|
217
|
+
for (let i = 1; i <= a.length; i++) {
|
|
218
|
+
let prev = dp[0];
|
|
219
|
+
dp[0] = i;
|
|
220
|
+
for (let j = 1; j <= b.length; j++) {
|
|
221
|
+
const tmp = dp[j];
|
|
222
|
+
dp[j] = Math.min(dp[j] + 1, dp[j - 1] + 1, prev + (a[i - 1] === b[j - 1] ? 0 : 1));
|
|
223
|
+
prev = tmp;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return dp[b.length];
|
|
227
|
+
}
|
|
228
|
+
/** Case-insensitive near-miss for an unknown name ("INSTALL-APP" > install_app), or undefined. */
|
|
229
|
+
export function suggestConsentAction(name) {
|
|
230
|
+
const norm = name
|
|
231
|
+
.trim()
|
|
232
|
+
.toLowerCase()
|
|
233
|
+
.replace(/[-\s.]+/g, '_');
|
|
234
|
+
if (!norm || /[*<>=]/.test(norm))
|
|
235
|
+
return undefined;
|
|
236
|
+
let best;
|
|
237
|
+
for (const a of CONSENT_ACTIONS) {
|
|
238
|
+
const d = levenshtein(norm, a);
|
|
239
|
+
if (!best || d < best.d)
|
|
240
|
+
best = { name: a, d };
|
|
241
|
+
}
|
|
242
|
+
return best && best.d <= Math.max(1, Math.floor(best.name.length / 4)) ? best.name : undefined;
|
|
243
|
+
}
|
|
244
|
+
let preapprovalWarned = false;
|
|
245
|
+
/** One stderr line at startup for each class of names in SWIPIUM_CONSENT_PREAPPROVE that is ignored. */
|
|
246
|
+
export function warnIgnoredPreapprovals() {
|
|
247
|
+
if (preapprovalWarned)
|
|
248
|
+
return;
|
|
249
|
+
const raw = process.env[PREAPPROVE_ENV];
|
|
250
|
+
if (!raw)
|
|
251
|
+
return;
|
|
252
|
+
preapprovalWarned = true;
|
|
253
|
+
const { actions, ignored, blocked } = currentPreapproval();
|
|
254
|
+
if (ignored.length) {
|
|
255
|
+
const suggestions = ignored
|
|
256
|
+
.map((n) => ({ n, s: suggestConsentAction(n) }))
|
|
257
|
+
.filter((x) => !!x.s)
|
|
258
|
+
.map((x) => `"${x.n}": did you mean ${x.s}?`);
|
|
259
|
+
log('warn', `${PREAPPROVE_ENV}: ignoring unknown action names (exact names only, no wildcards)`, {
|
|
260
|
+
ignored,
|
|
261
|
+
...(suggestions.length ? { suggestions } : {}),
|
|
262
|
+
known: CONSENT_ACTIONS,
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
if (blocked.length)
|
|
266
|
+
log('warn', `${PREAPPROVE_ENV}: ignoring actions that cannot be pre-approved this way`, { blocked });
|
|
267
|
+
if (actions.size)
|
|
268
|
+
log('info', `${PREAPPROVE_ENV}: operator pre-approved consent actions`, { actions: [...actions] });
|
|
269
|
+
}
|
|
270
|
+
/** Headless-client hint for a decline / cancel nobody may have seen (only add it when the answer
|
|
271
|
+
* was likely automatic: a real human decline must not be nudged toward disabling consent). */
|
|
272
|
+
export function preapproveHint(action, req) {
|
|
273
|
+
const tier = tierOf(action);
|
|
274
|
+
const lead = 'If this client runs headless (codex exec, claude -p), it answers consent prompts automatically. ';
|
|
275
|
+
if (tier?.notPreapprovable)
|
|
276
|
+
return `${lead}"${action}" cannot be pre-approved by name: ${tier.notPreapprovable}.`;
|
|
277
|
+
const names = [action, ...(req && action === 'test_this_plan' ? planRunsCodeSteps(req) : [])];
|
|
278
|
+
const needsRunCode = names.some((n) => actionRunsCode(n));
|
|
279
|
+
return (lead +
|
|
280
|
+
`An operator can pre-approve this action with ${PREAPPROVE_ENV}=${names.join(',')} in the MCP server env` +
|
|
281
|
+
(needsRunCode
|
|
282
|
+
? ` plus ${PREAPPROVE_RUN_CODE_ENV}=1, because it runs repository or model-chosen code (under codex exec, outside the client sandbox).`
|
|
283
|
+
: '.'));
|
|
284
|
+
}
|
|
285
|
+
/** Audit line for an approval nobody was asked about: the action plus the exact command(s), or a
|
|
286
|
+
* short hash and the first 200 chars when the command is long. */
|
|
287
|
+
function commandAudit(req) {
|
|
288
|
+
const cmd = req.exactCommand ?? '';
|
|
289
|
+
if (!cmd)
|
|
290
|
+
return { exactCommand: null, affects: JSON.stringify(req.affects ?? {}).slice(0, 200) };
|
|
291
|
+
if (cmd.length <= 200)
|
|
292
|
+
return { exactCommand: cmd };
|
|
293
|
+
return {
|
|
294
|
+
exactCommandSha256: createHash('sha256').update(cmd).digest('hex').slice(0, 16),
|
|
295
|
+
exactCommandHead: cmd.slice(0, 200),
|
|
296
|
+
exactCommandLength: cmd.length,
|
|
297
|
+
};
|
|
47
298
|
}
|
|
299
|
+
/** A decline / cancel faster than this was most likely answered by the client, not a human. */
|
|
300
|
+
export const AUTO_ANSWER_MS = 1500;
|
|
48
301
|
let elicitationProvider;
|
|
49
302
|
/** Installed once at server construction (src/server.ts); undefined disables elicitation. */
|
|
50
303
|
export function setElicitationProvider(provider) {
|
|
@@ -55,9 +308,13 @@ export function setElicitationProvider(provider) {
|
|
|
55
308
|
// (SessionStore.recordMutation reads this). Bounded like the ledger itself.
|
|
56
309
|
const consumedMechanisms = new Map();
|
|
57
310
|
const elicitationApproved = new Set();
|
|
311
|
+
// Challenges approved by SWIPIUM_CONSENT_PREAPPROVE (consumed like an elicitation approval).
|
|
312
|
+
const operatorApproved = new Set();
|
|
58
313
|
// Challenges currently routed to (or decided by) an out-of-band prompt: a client re-call can
|
|
59
314
|
// never approve these. Only the elicitation answer can (no approve:true bypass).
|
|
60
315
|
const awaitingElicitation = new Set();
|
|
316
|
+
const promptHandles = new Map(); // token > handle
|
|
317
|
+
const promptTokenByConsent = new Map(); // consentId > its one live token
|
|
61
318
|
/** Mechanism that approved an already-consumed consentId (audit trail for the ledger). */
|
|
62
319
|
export function approvalMechanismFor(consentId) {
|
|
63
320
|
return consumedMechanisms.get(consentId);
|
|
@@ -79,7 +336,14 @@ export function requireConsent(req) {
|
|
|
79
336
|
const consentId = randomUUID().slice(0, 8);
|
|
80
337
|
const sessionId = currentConsentSession();
|
|
81
338
|
pending.set(consentId, { req, createdAt: Date.now(), ...(sessionId ? { sessionId } : {}) });
|
|
82
|
-
|
|
339
|
+
// `next` repeats the approval instruction in structuredContent: Claude Code / Codex show the
|
|
340
|
+
// model that JSON, not the text block, for non-error results.
|
|
341
|
+
const payload = {
|
|
342
|
+
requiresConsent: true,
|
|
343
|
+
consentId,
|
|
344
|
+
...req,
|
|
345
|
+
next: [`To approve, re-call this tool with consentId="${consentId}" and approve=true`],
|
|
346
|
+
};
|
|
83
347
|
const text = `🔐 Consent required (${req.risk}): ${req.explain}\n` +
|
|
84
348
|
(req.exactCommand ? `Will run: ${req.exactCommand}\n` : '') +
|
|
85
349
|
`To approve, re-call this tool with consentId="${consentId}" and approve=true.\n\n` +
|
|
@@ -90,6 +354,9 @@ export function requireConsent(req) {
|
|
|
90
354
|
}
|
|
91
355
|
/**
|
|
92
356
|
* Ask the connected client's HUMAN to decide a freshly-minted consent via MCP elicitation.
|
|
357
|
+
* - operator-policy: the action is listed in SWIPIUM_CONSENT_PREAPPROVE, so it is approved
|
|
358
|
+
* without asking (any client, and even with SWIPIUM_REQUIRE_ELICITATION=1: the operator made
|
|
359
|
+
* that decision explicitly). consumeConsent tags it 'operator-policy'.
|
|
93
360
|
* - approved: the caller re-invokes the tool; consumeConsent tags mechanism 'elicitation'.
|
|
94
361
|
* - declined / cancelled (dismissed, timed out, transport error, aborted call): REFUSAL. The
|
|
95
362
|
* challenge is burned so the client cannot self-approve it afterwards (a re-call of the tool
|
|
@@ -97,17 +364,25 @@ export function requireConsent(req) {
|
|
|
97
364
|
* - unavailable (client does not advertise elicitation): portable re-call convention
|
|
98
365
|
* ('client-assertion'), unless SWIPIUM_REQUIRE_ELICITATION=1, in which case EVERY
|
|
99
366
|
* consent-gated action (builds, Metro, installs, data wipes, seeds…) is refused outright.
|
|
367
|
+
* Protocol 2026-07-28 connections cannot await an answer inside one request: src/server.ts runs
|
|
368
|
+
* the same phases itself (operatorPolicyDecision, issueConsentPrompt / redeemConsentPrompt,
|
|
369
|
+
* settleConsentAnswer, noPromptDecision), so both eras share every outcome below.
|
|
100
370
|
*/
|
|
101
371
|
export async function requestConsentDecision(consentId, ctx) {
|
|
102
372
|
const req = peekConsent(consentId);
|
|
103
373
|
if (!req)
|
|
104
374
|
return { mechanism: 'client-assertion' };
|
|
375
|
+
const byPolicy = operatorPolicyDecision(consentId);
|
|
376
|
+
if (byPolicy)
|
|
377
|
+
return byPolicy;
|
|
378
|
+
const startedAt = Date.now();
|
|
105
379
|
let answer = 'unavailable';
|
|
106
380
|
let failure;
|
|
107
|
-
|
|
381
|
+
const provider = ctx?.provider ?? elicitationProvider;
|
|
382
|
+
if (provider) {
|
|
108
383
|
awaitingElicitation.add(consentId);
|
|
109
384
|
try {
|
|
110
|
-
answer = await
|
|
385
|
+
answer = await provider(req, ctx);
|
|
111
386
|
}
|
|
112
387
|
catch (e) {
|
|
113
388
|
// The client advertised elicitation, so a throw here is a timeout / transport failure /
|
|
@@ -118,22 +393,59 @@ export async function requestConsentDecision(consentId, ctx) {
|
|
|
118
393
|
if (answer === 'unavailable')
|
|
119
394
|
awaitingElicitation.delete(consentId);
|
|
120
395
|
}
|
|
396
|
+
if (answer === 'unavailable')
|
|
397
|
+
return noPromptDecision(consentId);
|
|
398
|
+
return settleConsentAnswer(consentId, answer, Date.now() - startedAt, failure);
|
|
399
|
+
}
|
|
400
|
+
/** Phase 1 (both eras): the operator pre-approval (SWIPIUM_CONSENT_PREAPPROVE + its tiers), checked
|
|
401
|
+
* BEFORE anyone is asked. Returns the approval, or undefined when the user must decide. */
|
|
402
|
+
export function operatorPolicyDecision(consentId) {
|
|
403
|
+
const req = peekConsent(consentId);
|
|
404
|
+
if (!req)
|
|
405
|
+
return undefined;
|
|
406
|
+
const policy = operatorPolicyCovers(req);
|
|
407
|
+
if (policy.approved) {
|
|
408
|
+
operatorApproved.add(consentId);
|
|
409
|
+
// warn, not info: SWIPIUM_LOG_LEVEL=warn must still show what ran without a prompt.
|
|
410
|
+
log('warn', `consent approved by operator policy (${PREAPPROVE_ENV}), no prompt shown`, {
|
|
411
|
+
action: req.action,
|
|
412
|
+
consentId,
|
|
413
|
+
risk: req.risk,
|
|
414
|
+
...commandAudit(req),
|
|
415
|
+
});
|
|
416
|
+
return { mechanism: 'operator-policy', approved: true };
|
|
417
|
+
}
|
|
418
|
+
if (policy.reason)
|
|
419
|
+
log('warn', `${PREAPPROVE_ENV} does not cover this request; asking instead`, { action: req.action, consentId, reason: policy.reason });
|
|
420
|
+
return undefined;
|
|
421
|
+
}
|
|
422
|
+
/** Phase 2 (both eras): record what the out-of-band prompt answered. 'approved' lets the caller
|
|
423
|
+
* re-invoke the tool (consumeConsent tags it 'elicitation'); anything else burns the challenge. */
|
|
424
|
+
export function settleConsentAnswer(consentId, answer, elapsedMs, failure) {
|
|
425
|
+
const action = peekConsent(consentId)?.action ?? 'unknown';
|
|
121
426
|
if (answer === 'approved') {
|
|
122
427
|
elicitationApproved.add(consentId);
|
|
123
428
|
return { mechanism: 'elicitation', approved: true };
|
|
124
429
|
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
430
|
+
forget(consentId);
|
|
431
|
+
return {
|
|
432
|
+
mechanism: 'elicitation',
|
|
433
|
+
approved: false,
|
|
434
|
+
outcome: answer,
|
|
435
|
+
elapsedMs,
|
|
436
|
+
...(failure !== undefined ? { failure } : {}),
|
|
437
|
+
reason: answer === 'declined'
|
|
438
|
+
? `User declined "${action}" in the consent prompt`
|
|
439
|
+
: failure !== undefined
|
|
440
|
+
? `Consent prompt for "${action}" failed before anyone answered (${failure}), treated as a refusal`
|
|
441
|
+
: `Consent prompt for "${action}" was dismissed or not answered, treated as a refusal`,
|
|
442
|
+
};
|
|
443
|
+
}
|
|
444
|
+
/** Phase 2 when the client cannot show a prompt (no form elicitation): the portable re-call
|
|
445
|
+
* ('client-assertion'), or a refusal under SWIPIUM_REQUIRE_ELICITATION=1. */
|
|
446
|
+
export function noPromptDecision(consentId) {
|
|
447
|
+
const req = peekConsent(consentId);
|
|
448
|
+
if (req && process.env.SWIPIUM_REQUIRE_ELICITATION === '1') {
|
|
137
449
|
forget(consentId);
|
|
138
450
|
return {
|
|
139
451
|
mechanism: 'refused',
|
|
@@ -143,6 +455,41 @@ export async function requestConsentDecision(consentId, ctx) {
|
|
|
143
455
|
}
|
|
144
456
|
return { mechanism: 'client-assertion' };
|
|
145
457
|
}
|
|
458
|
+
/** Protocol 2026-07-28: open (or re-open) the out-of-band prompt for a pending consent and return
|
|
459
|
+
* the single-use requestState handle for its InputRequiredResult. From here on only the prompt's
|
|
460
|
+
* answer can approve the consent (an approve:true re-call is refused, as on 2025 elicitation).
|
|
461
|
+
* Re-opening replaces the previous handle. Undefined when the consent is no longer pending. */
|
|
462
|
+
export function issueConsentPrompt(consentId, binding) {
|
|
463
|
+
if (!peekConsent(consentId))
|
|
464
|
+
return undefined;
|
|
465
|
+
const previous = promptTokenByConsent.get(consentId);
|
|
466
|
+
if (previous !== undefined)
|
|
467
|
+
promptHandles.delete(previous);
|
|
468
|
+
const token = `swp1.${randomBytes(32).toString('base64url')}`;
|
|
469
|
+
promptHandles.set(token, {
|
|
470
|
+
consentId,
|
|
471
|
+
tool: binding.tool,
|
|
472
|
+
argsDigest: binding.argsDigest,
|
|
473
|
+
...(binding.sessionId !== undefined ? { sessionId: binding.sessionId } : {}),
|
|
474
|
+
issuedAt: Date.now(),
|
|
475
|
+
});
|
|
476
|
+
promptTokenByConsent.set(consentId, token);
|
|
477
|
+
awaitingElicitation.add(consentId);
|
|
478
|
+
return token;
|
|
479
|
+
}
|
|
480
|
+
/** Protocol 2026-07-28: redeem a requestState handle. SINGLE-USE: the handle is deleted on the
|
|
481
|
+
* first presentation, whatever happens next. Undefined for an unknown, forged, replayed or
|
|
482
|
+
* expired handle (the consent behind it is pruned with the challenge, CONSENT_TTL_MS). */
|
|
483
|
+
export function redeemConsentPrompt(token) {
|
|
484
|
+
prunePending();
|
|
485
|
+
const handle = promptHandles.get(token);
|
|
486
|
+
if (!handle)
|
|
487
|
+
return undefined;
|
|
488
|
+
promptHandles.delete(token);
|
|
489
|
+
if (promptTokenByConsent.get(handle.consentId) === token)
|
|
490
|
+
promptTokenByConsent.delete(handle.consentId);
|
|
491
|
+
return handle;
|
|
492
|
+
}
|
|
146
493
|
/**
|
|
147
494
|
* Validate a resume call. Consent is single-use AND bound to the exact action:
|
|
148
495
|
* `expected.action`/`expected.affects` must match what was originally requested, so an
|
|
@@ -173,6 +520,7 @@ export function consumeConsent(consentId, approve, expected) {
|
|
|
173
520
|
return { approved: false, req, reason: 'consent does not match the affected target' };
|
|
174
521
|
}
|
|
175
522
|
const wasElicited = elicitationApproved.has(consentId);
|
|
523
|
+
const byOperator = operatorApproved.has(consentId);
|
|
176
524
|
const routed = awaitingElicitation.has(consentId);
|
|
177
525
|
forget(consentId);
|
|
178
526
|
if (!approve)
|
|
@@ -181,7 +529,7 @@ export function consumeConsent(consentId, approve, expected) {
|
|
|
181
529
|
// re-call with approve:true (e.g. racing the dialog) must not bypass the human.
|
|
182
530
|
if (routed && !wasElicited)
|
|
183
531
|
return { approved: false, req, reason: 'consent is awaiting the out-of-band user prompt' };
|
|
184
|
-
const mechanism = wasElicited ? 'elicitation' : 'client-assertion';
|
|
532
|
+
const mechanism = byOperator ? 'operator-policy' : wasElicited ? 'elicitation' : 'client-assertion';
|
|
185
533
|
recordMechanism(consentId, mechanism);
|
|
186
534
|
return { approved: true, req, mechanism };
|
|
187
535
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consent.js","sourceRoot":"","sources":["../../src/consent/consent.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"consent.js","sourceRoot":"","sources":["../../src/consent/consent.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
// Order (first hit wins):
|
|
3
3
|
// 1. explicit `projectRoot` arg (must be absolute + an existing directory; an invalid explicit
|
|
4
4
|
// value is an error, never silently replaced by a fallback)
|
|
5
|
-
// 2. MCP roots (the client's declared workspace,
|
|
5
|
+
// 2. MCP roots (the client's declared workspace), on 2025-era connections only: protocol
|
|
6
|
+
// 2026-07-28 deprecates roots and has no server-to-client roots/list, so 2026 clients go
|
|
7
|
+
// straight to the fallbacks below (pass projectRoot, or set SWIPIUM_PROJECT_ROOT)
|
|
6
8
|
// 3. env SWIPIUM_PROJECT_ROOT (user-set in the client's server config)
|
|
7
9
|
// 4. env CLAUDE_PROJECT_DIR (Claude Code sets it for every stdio server it launches)
|
|
8
10
|
// 5. process.cwd(), only when it is a real directory that is NOT the filesystem root and NOT
|
|
@@ -17,6 +19,7 @@ import { fileURLToPath } from 'node:url';
|
|
|
17
19
|
import { isAbsolute, join, parse, resolve } from 'node:path';
|
|
18
20
|
import { homedir } from 'node:os';
|
|
19
21
|
import { qaError } from '../lib/result.js';
|
|
22
|
+
import { servesModernEra } from './protocolEra.js';
|
|
20
23
|
export const PROJECT_ROOT_UNRESOLVED = 'PROJECT_ROOT_UNRESOLVED';
|
|
21
24
|
function isDir(p) {
|
|
22
25
|
try {
|
|
@@ -157,11 +160,13 @@ async function resolveProjectRootUnrecorded(server, explicit, opts = {}) {
|
|
|
157
160
|
}
|
|
158
161
|
return { source: 'none', hint: `Path not found or not a directory: ${p}` };
|
|
159
162
|
}
|
|
160
|
-
// 2) MCP roots (workspace the client exposed)
|
|
163
|
+
// 2) MCP roots (workspace the client exposed). Never on a 2026-07-28 instance: listRoots()
|
|
164
|
+
// throws there (no server-to-client requests), and roots are deprecated in that revision.
|
|
161
165
|
try {
|
|
162
|
-
const caps = server.server.getClientCapabilities?.();
|
|
166
|
+
const caps = servesModernEra(server) ? undefined : server.server.getClientCapabilities?.();
|
|
163
167
|
if (caps?.roots) {
|
|
164
|
-
|
|
168
|
+
// Same 5 s cap as currentProjectRoots (src/server.ts); the SDK default is 60 s.
|
|
169
|
+
const res = await server.server.listRoots(undefined, { timeout: 5_000 });
|
|
165
170
|
const picked = pickMcpRoot((res.roots ?? []).map((r) => r.uri), opts.home ?? homedir());
|
|
166
171
|
if (picked)
|
|
167
172
|
return { root: picked, source: 'mcp-roots' };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projectRoot.js","sourceRoot":"","sources":["../../src/context/projectRoot.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,0BAA0B;AAC1B,iGAAiG;AACjG,iEAAiE;AACjE,
|
|
1
|
+
{"version":3,"file":"projectRoot.js","sourceRoot":"","sources":["../../src/context/projectRoot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// Which MCP protocol era an McpServer instance serves. Under serveStdio (src/server.ts) the era is
|
|
2
|
+
// fixed per instance when it is built: 'legacy' (2025-06-18 / 2025-11-25, `initialize` handshake)
|
|
3
|
+
// or 'modern' (2026-07-28, `server/discover` + per-request `_meta`). Modern instances have no
|
|
4
|
+
// server-to-client requests (roots/list, elicitation/create, sampling throw there), so the code
|
|
5
|
+
// that would send one asks here first. Keyed by object identity so tests can hand in fakes.
|
|
6
|
+
const modernServers = new WeakSet();
|
|
7
|
+
/** Mark `server` (an McpServer, or anything standing in for one) as serving protocol 2026-07-28. */
|
|
8
|
+
export function markModernServer(server) {
|
|
9
|
+
modernServers.add(server);
|
|
10
|
+
}
|
|
11
|
+
/** True when `server` serves protocol 2026-07-28 (no server-to-client requests available). */
|
|
12
|
+
export function servesModernEra(server) {
|
|
13
|
+
return server !== undefined && server !== null && modernServers.has(server);
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=protocolEra.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocolEra.js","sourceRoot":"","sources":["../../src/context/protocolEra.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,kGAAkG;AAClG,8FAA8F;AAC9F,gGAAgG;AAChG,4FAA4F;AAE5F,MAAM,aAAa,GAAG,IAAI,OAAO,EAAU,CAAC;AAE5C,oGAAoG;AACpG,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,eAAe,CAAC,MAA0B;IACxD,OAAO,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,IAAI,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAC9E,CAAC"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
// The shell-tap / `input text` approach is the same one proven in the Inn suite for
|
|
6
6
|
// React Native custom inputs that don't respond to programmatic clicks.
|
|
7
7
|
import { run, runBinary } from '../lib/spawn.js';
|
|
8
|
-
import { currentSignal } from '../lib/abortScope.js';
|
|
8
|
+
import { currentSignal, isAbortError, sleepOrCancel } from '../lib/abortScope.js';
|
|
9
9
|
import { adbDevices } from '../lib/android.js';
|
|
10
10
|
/** Characters the device-side /system/bin/sh (mksh) treats specially; each gets a backslash.
|
|
11
11
|
* Includes brace/glob expansion (`{a,b}` > `a b`, `[s]dcard` > `sdcard`). Backslash itself is
|
|
@@ -334,13 +334,16 @@ export class DirectDriver {
|
|
|
334
334
|
lastErr = r.stdout.trim() || r.stderr.trim();
|
|
335
335
|
}
|
|
336
336
|
catch (e) {
|
|
337
|
+
// Cancelled: rethrow at once (still an AbortError for isAbortError) instead of retrying.
|
|
338
|
+
if (isAbortError(e))
|
|
339
|
+
throw e;
|
|
337
340
|
lastErr = String(e);
|
|
338
341
|
}
|
|
339
342
|
if (attempt + 1 >= ATTEMPTS || (deadline !== undefined && deadline - Date.now() <= 400)) {
|
|
340
343
|
attempt++;
|
|
341
344
|
break;
|
|
342
345
|
}
|
|
343
|
-
await
|
|
346
|
+
await sleepOrCancel(400);
|
|
344
347
|
}
|
|
345
348
|
throw new Error(`uiautomator dump failed after ${attempt} attempt(s): ${lastErr}`);
|
|
346
349
|
}
|