@sema-agent/client-core 0.111.0 → 0.112.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.
Files changed (106) hide show
  1. package/CHANGELOG.md +75 -0
  2. package/README.md +15 -6
  3. package/dist/agentSession/engineSessionBackgroundStop.js +2 -2
  4. package/dist/checkpointRowVerdict.d.ts +3 -0
  5. package/dist/checkpointRowVerdict.js +14 -1
  6. package/dist/consoleCaPin.d.ts +136 -0
  7. package/dist/consoleCaPin.js +827 -0
  8. package/dist/decideReceipt.d.ts +2 -1
  9. package/dist/deviceRebind.js +3 -3
  10. package/dist/effectiveFacts.d.ts +9 -0
  11. package/dist/effectiveFacts.js +33 -0
  12. package/dist/engineAddress.d.ts +1 -0
  13. package/dist/engineAddress.js +4 -1
  14. package/dist/engineCredentialRelease.d.ts +54 -0
  15. package/dist/engineCredentialRelease.js +146 -0
  16. package/dist/engineErrorCodes.d.ts +1 -0
  17. package/dist/engineErrorCodes.js +1 -0
  18. package/dist/engineHealthFacts.d.ts +0 -11
  19. package/dist/engineHealthFacts.js +0 -21
  20. package/dist/engineHealthProbeVerdict.d.ts +1 -0
  21. package/dist/engineHealthProbeVerdict.js +21 -13
  22. package/dist/engineUnavailable.d.ts +3 -2
  23. package/dist/engineUnavailable.js +16 -12
  24. package/dist/engineUrl.js +4 -2
  25. package/dist/gateFailureCodes.js +2 -2
  26. package/dist/generated/sdkFactTables.d.ts +1 -0
  27. package/dist/generated/sdkFactTables.js +13 -0
  28. package/dist/generated/settingsSchemaFns.d.ts +1 -0
  29. package/dist/generated/settingsSchemaFns.js +3 -0
  30. package/dist/generated/settingsSchemaHooksClassifier.js +38 -9
  31. package/dist/generated/settingsSchemaTables.d.ts +52 -0
  32. package/dist/generated/settingsSchemaTables.js +18 -0
  33. package/dist/generated/settingsSchemaTypes.d.ts +23 -13
  34. package/dist/generated/settingsSchemaUrlShape.d.ts +1 -0
  35. package/dist/generated/settingsSchemaUrlShape.js +17 -0
  36. package/dist/hitl/decisionRefusal.d.ts +4 -0
  37. package/dist/hitl/decisionRefusal.js +12 -2
  38. package/dist/hitl/localAllowRedemption.d.ts +9 -6
  39. package/dist/hitl/localAllowRedemption.js +20 -0
  40. package/dist/hitl/parkOwnership.js +2 -1
  41. package/dist/hitl/parkResolver.js +7 -0
  42. package/dist/hitl/screenDecisionCards.js +3 -2
  43. package/dist/hitl/sessionPolicyWire.js +2 -2
  44. package/dist/hitl/standingRows.d.ts +4 -2
  45. package/dist/hitl/standingRows.js +10 -3
  46. package/dist/hooksReaderGenerations.js +1 -1
  47. package/dist/i18n/messages.en.d.ts +163 -0
  48. package/dist/i18n/messages.en.js +163 -0
  49. package/dist/i18n/messages.zh.js +174 -0
  50. package/dist/index.d.ts +30 -5
  51. package/dist/index.js +15 -2
  52. package/dist/liveModelCatalog.d.ts +4 -0
  53. package/dist/liveModelCatalog.js +10 -1
  54. package/dist/localConfig/documents.d.ts +61 -0
  55. package/dist/localConfig/documents.js +51 -0
  56. package/dist/localConfig/kernel.d.ts +149 -0
  57. package/dist/localConfig/kernel.js +597 -0
  58. package/dist/localConfig/mcp/edit.d.ts +161 -0
  59. package/dist/localConfig/mcp/edit.js +846 -0
  60. package/dist/localConfig/mcp/servers.d.ts +165 -0
  61. package/dist/localConfig/mcp/servers.js +776 -0
  62. package/dist/localConfig/mcp/views.d.ts +170 -0
  63. package/dist/localConfig/mcp/views.js +429 -0
  64. package/dist/localConfig/modelPool.d.ts +262 -0
  65. package/dist/localConfig/modelPool.js +1489 -0
  66. package/dist/localConfig/modelPoolWords.d.ts +13 -0
  67. package/dist/localConfig/modelPoolWords.js +20 -0
  68. package/dist/localConfig/receiptShape.d.ts +7 -0
  69. package/dist/localConfig/receiptShape.js +135 -0
  70. package/dist/localConfig/settingsWrite.d.ts +127 -0
  71. package/dist/localConfig/settingsWrite.js +237 -0
  72. package/dist/localConfig/skills.d.ts +124 -0
  73. package/dist/localConfig/skills.js +397 -0
  74. package/dist/localConfig/skillsWords.d.ts +10 -0
  75. package/dist/localConfig/skillsWords.js +5 -0
  76. package/dist/mcpProbeWire.js +2 -1
  77. package/dist/mcpWireCaps.js +1 -1
  78. package/dist/memoryVerbsWire.js +3 -2
  79. package/dist/model/onboardJudgement.d.ts +14 -4
  80. package/dist/model/onboardJudgement.js +91 -139
  81. package/dist/modelConfigGapNotice.d.ts +20 -0
  82. package/dist/modelConfigGapNotice.js +102 -0
  83. package/dist/modsKernelIdentity.js +2 -47
  84. package/dist/ownKey.d.ts +1 -0
  85. package/dist/ownKey.js +40 -8
  86. package/dist/permissionsDeclaration.d.ts +2 -1
  87. package/dist/permissionsDeclaration.js +31 -17
  88. package/dist/promptBlockedCopy.js +2 -2
  89. package/dist/resumeRefusalCopy.d.ts +3 -1
  90. package/dist/resumeRefusalCopy.js +12 -4
  91. package/dist/runLedgerSnapshot.js +3 -3
  92. package/dist/runPermissionModeSwitch.js +2 -3
  93. package/dist/seatContract.d.ts +154 -4
  94. package/dist/seatContract.js +228 -2
  95. package/dist/sessionIdSegment.d.ts +1 -0
  96. package/dist/sessionIdSegment.js +4 -1
  97. package/dist/sessionMemoryErase.js +2 -1
  98. package/dist/sha256Bytes.d.ts +1 -0
  99. package/dist/sha256Bytes.js +46 -0
  100. package/dist/skillOverrideChain.d.ts +83 -0
  101. package/dist/skillOverrideChain.js +378 -0
  102. package/dist/skillsWireCaps.d.ts +3 -0
  103. package/dist/skillsWireCaps.js +16 -1
  104. package/dist/turnFailurePresentation.js +4 -10
  105. package/docs/INTEGRATION-CLIENTS.md +614 -14
  106. package/package.json +3 -3
@@ -0,0 +1,397 @@
1
+ import { SETTINGS_IS_RESERVED_MEMBER_NAME } from '../generated/settingsSchemaFns.js';
2
+ import { readOwnDataValue, appendOwnElement } from '../ownKey.js';
3
+ import { SKILL_OVERRIDE_STATES, effectiveOfShaped, lockOfShaped, lowerTierOf, ownValueIn, secondaryNamesOf, bareNameOf, shapeSkillLayers, shapeSkillSubject, stateAt, withLayerDoc, } from '../skillOverrideChain.js';
4
+ import { settingsWritePlan } from './settingsWrite.js';
5
+ import { isDotSegment } from '../sessionIdSegment.js';
6
+ import { slotReadOf } from '../wireFailureShape.js';
7
+ import { SKILL_ROOT_LAYERS, SKILL_ROOT_KINDS, SKILL_OVERRIDE_SCOPES } from './skillsWords.js';
8
+ function own(v, key) {
9
+ if (typeof v !== 'object' || v === null)
10
+ return undefined;
11
+ try {
12
+ return readOwnDataValue(v, key);
13
+ }
14
+ catch {
15
+ return undefined;
16
+ }
17
+ }
18
+ const isRecord = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
19
+ const LIST_BUDGET = 4096;
20
+ function listOf(v) {
21
+ if (!Array.isArray(v))
22
+ return [];
23
+ const n = own(v, 'length');
24
+ if (typeof n !== 'number' || !Number.isSafeInteger(n) || n < 0 || n > LIST_BUDGET)
25
+ return [];
26
+ const out = [];
27
+ for (let i = 0; i < n; i++)
28
+ out.push(own(v, String(i)));
29
+ return out;
30
+ }
31
+ const TRUST_LAYERS = ['project', 'additional'];
32
+ function pathFormOf(raw) {
33
+ if (typeof raw !== 'string' || raw === '' || raw.length > 4096 || raw.includes('\u0000'))
34
+ return undefined;
35
+ const sep = raw.includes('\\') && !raw.includes('/') ? '\\' : '/';
36
+ let floor;
37
+ if (raw.startsWith('/'))
38
+ floor = '/';
39
+ else if (/^[A-Za-z]:[\\/]/.test(raw))
40
+ floor = raw.slice(0, 3);
41
+ else if (/^\\\\[^\\/]+[\\/][^\\/]+/.test(raw))
42
+ floor = raw.match(/^\\\\[^\\/]+[\\/][^\\/]+/)[0];
43
+ else
44
+ return undefined;
45
+ let path = raw;
46
+ while (path.length > floor.length && (path.endsWith('/') || path.endsWith('\\')))
47
+ path = path.slice(0, -1);
48
+ const rest = path.slice(floor.length);
49
+ if (rest !== '' && rest.split(/[\\/]/).some((seg) => seg === '' || isDotSegment(seg)))
50
+ return undefined;
51
+ return { sep, path, floor };
52
+ }
53
+ const joinPath = (f, ...segs) => (f.path === f.floor && /[\\/]$/.test(f.floor) ? f.path + segs.join(f.sep) : [f.path, ...segs].join(f.sep));
54
+ function parentOf(f) {
55
+ if (f.path.length <= f.floor.length)
56
+ return undefined;
57
+ const i = Math.max(f.path.lastIndexOf('/'), f.path.lastIndexOf('\\'));
58
+ if (i < f.floor.length - 1)
59
+ return undefined;
60
+ const up = i < f.floor.length ? f.floor : f.path.slice(0, i);
61
+ return { sep: f.sep, path: up, floor: f.floor };
62
+ }
63
+ export function skillRootsOf(cwd, hostFacts) {
64
+ try {
65
+ const here = pathFormOf(cwd);
66
+ const home = pathFormOf(own(hostFacts, 'configHome'));
67
+ if (here === undefined || home === undefined)
68
+ return undefined;
69
+ const levels = [here];
70
+ const gitRaw = own(hostFacts, 'gitRoot');
71
+ const git = gitRaw === null || gitRaw === undefined ? undefined : pathFormOf(gitRaw);
72
+ if (git !== undefined) {
73
+ const chain = [];
74
+ let at = here;
75
+ while (at !== undefined) {
76
+ chain.push(at);
77
+ if (at.path === git.path)
78
+ break;
79
+ at = parentOf(at);
80
+ }
81
+ if (at !== undefined && at.path === git.path)
82
+ levels.splice(0, levels.length, ...chain);
83
+ }
84
+ const managed = pathFormOf(own(hostFacts, 'managedDir'));
85
+ const extra = listOf(own(hostFacts, 'additionalDirectories')).map(pathFormOf).filter((f) => f !== undefined);
86
+ const plugins = [];
87
+ for (const p of listOf(own(hostFacts, 'plugins'))) {
88
+ const name = own(p, 'name');
89
+ const root = pathFormOf(own(p, 'root'));
90
+ if (typeof name === 'string' && name !== '' && root !== undefined)
91
+ plugins.push({ name, root });
92
+ }
93
+ const column = (kind) => {
94
+ const out = [];
95
+ const add = (layer, base, dir, plugin) => {
96
+ if (out.some((r) => r.dir === dir))
97
+ return;
98
+ appendOwnElement(out, Object.freeze({ layer, kind, dir, base: base.path, ...(plugin === undefined ? {} : { plugin }) }));
99
+ };
100
+ if (managed !== undefined)
101
+ add('managed', managed, joinPath(managed, kind));
102
+ add('user', home, joinPath(home, kind));
103
+ for (const lv of levels)
104
+ add('project', lv, joinPath(lv, '.sema', kind));
105
+ for (const d of extra)
106
+ add('additional', d, joinPath(d, '.sema', kind));
107
+ for (const p of plugins)
108
+ add('plugin', p.root, joinPath(p.root, kind), p.name);
109
+ return Object.freeze(out);
110
+ };
111
+ return Object.freeze({ skills: column('skills'), commands: column('commands'), agents: column('agents') });
112
+ }
113
+ catch {
114
+ return undefined;
115
+ }
116
+ }
117
+ const LAYER_RANK = { managed: 0, user: 1, project: 2, additional: 3, plugin: 4, synced: 5, mcp: 6, builtin: 7 };
118
+ function rootOf(v) {
119
+ if (!isRecord(v))
120
+ return undefined;
121
+ const layer = SKILL_ROOT_LAYERS.find((w) => w === own(v, 'layer'));
122
+ const kind = SKILL_ROOT_KINDS.find((w) => w === own(v, 'kind'));
123
+ const dir = own(v, 'dir');
124
+ const base = own(v, 'base');
125
+ if (layer === undefined || kind === undefined || typeof dir !== 'string' || dir === '' || typeof base !== 'string')
126
+ return undefined;
127
+ return { layer, kind, dir, base };
128
+ }
129
+ function rootTrust(trust, root) {
130
+ if (!TRUST_LAYERS.includes(root.layer))
131
+ return 'ok';
132
+ if (!isRecord(trust) || own(trust, 'state') !== 'judged')
133
+ return 'unconfirmed';
134
+ for (const r of listOf(own(trust, 'roots'))) {
135
+ if (own(r, 'dir') !== root.dir)
136
+ continue;
137
+ const t = own(r, 'trusted');
138
+ if (t === true)
139
+ return 'ok';
140
+ if (t !== false)
141
+ return 'unconfirmed';
142
+ const why = own(own(r, 'why'), 'kind');
143
+ return why === 'not_trusted' || why === 'ineligible' ? 'untrusted' : 'unconfirmed';
144
+ }
145
+ return 'unconfirmed';
146
+ }
147
+ const truthy = (v) => v === true || v === 'true';
148
+ export function skillsViewOf(listings, layers, trust) {
149
+ const untrusted = new Set();
150
+ const unconfirmed = new Set();
151
+ try {
152
+ const L = shapeSkillLayers(layers);
153
+ const rows = [];
154
+ const raw = listOf(listings);
155
+ for (let i = 0; i < raw.length; i++) {
156
+ const e = raw[i];
157
+ const fm = own(e, 'frontmatter');
158
+ const dmi = truthy(own(fm, 'disable-model-invocation'));
159
+ const s = shapeSkillSubject(isRecord(e) ? { ...snapshotSubject(e), disableModelInvocation: dmi } : undefined);
160
+ if (s === undefined)
161
+ continue;
162
+ const rootRaw = own(e, 'root');
163
+ const root = rootRaw === undefined ? undefined : rootOf(rootRaw);
164
+ if (rootRaw !== undefined && root === undefined)
165
+ continue;
166
+ const layer = root !== undefined ? root.layer : s.origin === 'mcp' ? 'mcp' : s.origin === 'synced' ? 'synced' : s.origin === 'plugin' ? 'plugin' : 'builtin';
167
+ const trustWord = root === undefined ? 'ok' : rootTrust(trust, root);
168
+ if (root !== undefined && trustWord === 'untrusted')
169
+ untrusted.add(root.dir);
170
+ if (root !== undefined && trustWord === 'unconfirmed')
171
+ unconfirmed.add(root.dir);
172
+ const d = own(fm, 'description');
173
+ rows.push({ s, layer, order: i, trustWord, description: typeof d === 'string' && d.trim() !== '' ? d.trim() : undefined });
174
+ }
175
+ const winner = new Map();
176
+ for (const r of [...rows].sort((a, b) => { const d = LAYER_RANK[a.layer] - LAYER_RANK[b.layer]; return d !== 0 ? d : a.order - b.order; })) {
177
+ if (r.trustWord !== 'ok')
178
+ continue;
179
+ if (!winner.has(r.s.name))
180
+ winner.set(r.s.name, r);
181
+ }
182
+ const entries = [];
183
+ for (const r of rows) {
184
+ const effective = effectiveOfShaped(L, r.s);
185
+ const lock = lockOfShaped(L, r.s);
186
+ const editable = lock === undefined ? Object.freeze({ ok: true }) : Object.freeze({ ok: false, lockedBy: lock.source });
187
+ const base = { name: r.s.name, layer: r.layer, effective, editable };
188
+ const excluded = (reason) => {
189
+ const e = { ...base, status: 'excluded', reason };
190
+ return Object.freeze(e);
191
+ };
192
+ const applied = (extra) => {
193
+ const e = { ...base, status: 'applied', ...extra };
194
+ return Object.freeze(e);
195
+ };
196
+ if (r.trustWord !== 'ok')
197
+ appendOwnElement(entries, excluded(r.trustWord));
198
+ else if (winner.get(r.s.name) !== r)
199
+ appendOwnElement(entries, excluded('shadowed'));
200
+ else if (r.s.disableModelInvocation)
201
+ appendOwnElement(entries, excluded('model_invocation_off'));
202
+ else if (effective.value === 'off' || effective.value === 'user-invocable-only')
203
+ appendOwnElement(entries, excluded('overridden'));
204
+ else if (effective.value === 'name-only')
205
+ appendOwnElement(entries, applied({ nameOnly: true }));
206
+ else
207
+ appendOwnElement(entries, applied(r.description === undefined ? {} : { description: r.description }));
208
+ }
209
+ return Object.freeze({ entries: Object.freeze(entries), withheldRoots: Object.freeze({ untrusted: untrusted.size, unconfirmed: unconfirmed.size }) });
210
+ }
211
+ catch {
212
+ return Object.freeze({ entries: Object.freeze([]), withheldRoots: Object.freeze({ untrusted: untrusted.size, unconfirmed: unconfirmed.size }) });
213
+ }
214
+ }
215
+ function snapshotSubject(e) {
216
+ const out = {};
217
+ for (const k of ['name', 'origin', 'unqualifiedName', 'bareNameReserved', 'aliases', 'mcpLabels', 'reservedLabels', 'syncedNames', 'followsSyncedSkillState', 'hiddenBehindPlugin']) {
218
+ const v = own(e, k);
219
+ if (v !== undefined)
220
+ out[k] = v;
221
+ }
222
+ return out;
223
+ }
224
+ export function skillsSetEditOf(entry, state, scope) {
225
+ return Object.freeze({ kind: 'set_override', name: entry.name, state, scope });
226
+ }
227
+ export function skillsClearEditOf(entry) {
228
+ const by = own(own(entry, 'effective'), 'decidedBy');
229
+ const name = own(entry, 'name');
230
+ if (typeof name !== 'string' || name === '')
231
+ return undefined;
232
+ const editable = slotReadOf(entry, 'editable');
233
+ if (editable.presence === 'unreadable')
234
+ return undefined;
235
+ if (editable.presence === 'present' && editable.value !== undefined && own(editable.value, 'ok') !== true)
236
+ return undefined;
237
+ if (by === 'localSettings')
238
+ return Object.freeze({ kind: 'clear_override', name, scope: 'local' });
239
+ if (by === 'userSettings')
240
+ return Object.freeze({ kind: 'clear_override', name, scope: 'user' });
241
+ return undefined;
242
+ }
243
+ const LOCK_REFUSAL = {
244
+ policy: 'skill_locked_by_higher_layer',
245
+ flag: 'skill_locked_by_higher_layer',
246
+ plugin: 'skill_managed_by_plugin',
247
+ 'skill-author': 'skill_locked_by_author',
248
+ 'reserved-name': 'skill_name_unstorable',
249
+ };
250
+ const DOC_DECIDERS = ['policySettings', 'localSettings', 'projectSettings', 'userSettings'];
251
+ function docOf(r) {
252
+ if (r === undefined)
253
+ return undefined;
254
+ if (r.status === 'loaded')
255
+ return r.doc;
256
+ if (r.status === 'absent' || r.status === 'outside_fence')
257
+ return null;
258
+ return undefined;
259
+ }
260
+ function overrideDiff(L, target, r, desiredState, subjects) {
261
+ const m = new Map();
262
+ const ov = L.docs[target];
263
+ const lower = (s) => lowerTierOf(L, s, target, false);
264
+ const desired = (s) => s.name === r.name ? desiredState : (lockOfShaped(L, s)?.value ?? ownValueIn(ov, s) ?? lower(s) ?? 'on');
265
+ const u = desiredState;
266
+ const O = lower(r) ?? 'on';
267
+ const v = ownValueIn(ov, r) ?? O;
268
+ if (r.origin === 'mcp') {
269
+ if (u === v)
270
+ return m;
271
+ const k = u === O ? undefined : u;
272
+ if (k !== stateAt(ov, r.name) || m.has(r.name))
273
+ m.set(r.name, k);
274
+ for (const c of secondaryNamesOf(r)) {
275
+ if (stateAt(ov, c) === undefined)
276
+ continue;
277
+ for (const s of subjects) {
278
+ if (s.name === r.name || s.origin !== 'mcp' || !secondaryNamesOf(s).includes(c) || m.has(s.name))
279
+ continue;
280
+ const h = ownValueIn(ov, s);
281
+ if ((lockOfShaped(L, s) !== undefined || desired(s) === (h ?? lower(s) ?? 'on')) && h !== undefined)
282
+ m.set(s.name, h);
283
+ }
284
+ m.set(c, undefined);
285
+ }
286
+ return m;
287
+ }
288
+ const bare = r.origin === 'synced' ? bareNameOf(r) : undefined;
289
+ if (bare !== undefined && stateAt(ov, bare) !== undefined && u !== v) {
290
+ const p = lowerTierOf(L, r, target, true) ?? 'on';
291
+ const k = u === p ? undefined : u;
292
+ if (k !== stateAt(ov, r.name))
293
+ m.set(r.name, k);
294
+ m.set(bare, undefined);
295
+ return m;
296
+ }
297
+ if (r.origin === 'synced' && u === v)
298
+ return m;
299
+ const d = u === O ? undefined : u;
300
+ if (d !== stateAt(ov, r.name))
301
+ m.set(r.name, d);
302
+ return m;
303
+ }
304
+ function clearDiff(L, target, r, subjects) {
305
+ const m = new Map();
306
+ const ov = L.docs[target];
307
+ if (stateAt(ov, r.name) !== undefined)
308
+ m.set(r.name, undefined);
309
+ for (const c of secondaryNamesOf(r)) {
310
+ if (stateAt(ov, c) === undefined)
311
+ continue;
312
+ if (r.origin === 'mcp') {
313
+ for (const s of subjects) {
314
+ if (s.name === r.name || s.origin !== 'mcp' || !secondaryNamesOf(s).includes(c) || m.has(s.name))
315
+ continue;
316
+ const h = ownValueIn(ov, s);
317
+ if (h !== undefined)
318
+ m.set(s.name, h);
319
+ }
320
+ }
321
+ m.set(c, undefined);
322
+ }
323
+ return m;
324
+ }
325
+ export function skillOverrideWritePlan(edit, context) {
326
+ try {
327
+ if (!isRecord(edit))
328
+ return Object.freeze({ ok: false, reason: 'invalid_request' });
329
+ const kind = own(edit, 'kind');
330
+ const name = own(edit, 'name');
331
+ const scope = SKILL_OVERRIDE_SCOPES.find((w) => w === own(edit, 'scope'));
332
+ const stateRaw = own(edit, 'state');
333
+ const state = SKILL_OVERRIDE_STATES.find((w) => w === stateRaw);
334
+ if ((kind !== 'set_override' && kind !== 'clear_override') || typeof name !== 'string' || name === '' || name.length > 512 || scope === undefined)
335
+ return Object.freeze({ ok: false, reason: 'invalid_request' });
336
+ if (kind === 'set_override' ? state === undefined : stateRaw !== undefined)
337
+ return Object.freeze({ ok: false, reason: 'invalid_request' });
338
+ if (SETTINGS_IS_RESERVED_MEMBER_NAME(name))
339
+ return Object.freeze({ ok: false, reason: 'skill_name_unstorable' });
340
+ const target = scope === 'local' ? 'localSettings' : 'userSettings';
341
+ const snapshot = ['policySettings', 'projectSettings', 'localSettings', 'userSettings'].filter((d) => d !== target);
342
+ const subjects = listOf(own(context, 'subjects'))
343
+ .map((v) => shapeSkillSubject(v))
344
+ .filter((s) => s !== undefined);
345
+ const flag = own(context, 'flagSettings');
346
+ const session = own(context, 'session');
347
+ const disabledSources = own(context, 'disabledSources');
348
+ const envOff = own(context, 'bundledSkillsDisabledByEnv') === true;
349
+ const plan = ({ fresh }) => {
350
+ const docs = {};
351
+ for (const d of [target, ...snapshot]) {
352
+ const doc = docOf(fresh[d]);
353
+ if (doc === undefined)
354
+ return { kind: 'refuse', reason: 'scope_unreadable' };
355
+ docs[d] = doc;
356
+ }
357
+ const L = shapeSkillLayers({ ...docs, flagSettings: flag, session, disabledSources, bundledSkillsDisabledByEnv: envOff });
358
+ const r = subjects.find((s) => s.name === name);
359
+ if (r === undefined)
360
+ return { kind: 'refuse', reason: 'not_found' };
361
+ const lock = lockOfShaped(L, r);
362
+ if (lock !== undefined)
363
+ return { kind: 'refuse', reason: LOCK_REFUSAL[lock.source] };
364
+ const diff = kind === 'set_override' ? overrideDiff(L, target, r, state, subjects) : clearDiff(L, target, r, subjects);
365
+ const current = docs[target] ?? null;
366
+ let next = null;
367
+ if (diff.size > 0) {
368
+ const edits = [...diff].map(([member, value]) => value === undefined ? { intent: 'skillOverride', member, op: 'delete' } : { intent: 'skillOverride', member, op: 'set', value });
369
+ const w = settingsWritePlan({ doc: target, current, trust: 'unreadable', edits });
370
+ if (!w.ok)
371
+ return { kind: 'refuse', reason: w.reason, ...(w.detail === undefined ? {} : { detail: w.detail }) };
372
+ if (w.changed)
373
+ next = w.next;
374
+ }
375
+ const after = effectiveOfShaped(next === null ? L : withLayerDoc(L, target, next), r);
376
+ const layer = DOC_DECIDERS.find((d) => d === after.decidedBy);
377
+ const wanted = kind === 'set_override' ? state : undefined;
378
+ const disclose = layer === undefined ? [] : [{ kind: wanted === undefined || after.value === wanted ? 'decided_by' : 'shadowed_by', layer }];
379
+ return next === null ? { kind: 'unchanged', disclose } : { kind: 'write', next, disclose };
380
+ };
381
+ const intent = Object.freeze({
382
+ appliesOn: 'next_turn',
383
+ steps: Object.freeze([Object.freeze({ doc: target, role: 'effect', snapshot: Object.freeze([...snapshot]), plan })]),
384
+ });
385
+ return Object.freeze({ ok: true, intent });
386
+ }
387
+ catch {
388
+ return Object.freeze({ ok: false, reason: 'invalid_request' });
389
+ }
390
+ }
391
+ const PENDING = Object.freeze({ kind: 'pending' });
392
+ export function skillCreatePlan(_intent) {
393
+ return PENDING;
394
+ }
395
+ export function skillRemovePlan(_intent) {
396
+ return PENDING;
397
+ }
@@ -0,0 +1,10 @@
1
+ export declare const SKILL_ROOT_LAYERS: readonly ["managed", "user", "project", "additional", "plugin"];
2
+ export type SkillRootLayer = (typeof SKILL_ROOT_LAYERS)[number];
3
+ export declare const SKILL_ROOT_KINDS: readonly ["skills", "commands", "agents"];
4
+ export type SkillRootKind = (typeof SKILL_ROOT_KINDS)[number];
5
+ export declare const SKILLS_VIEW_EXCLUDED_REASONS: readonly ["overridden", "model_invocation_off", "untrusted", "unconfirmed", "shadowed"];
6
+ export type SkillsViewExcludedReason = (typeof SKILLS_VIEW_EXCLUDED_REASONS)[number];
7
+ export declare const SKILLS_VIEW_LAYERS: readonly ["managed", "user", "project", "additional", "plugin", "mcp", "builtin", "synced"];
8
+ export type SkillsViewLayer = (typeof SKILLS_VIEW_LAYERS)[number];
9
+ export declare const SKILL_OVERRIDE_SCOPES: readonly ["local", "user"];
10
+ export type SkillOverrideScope = (typeof SKILL_OVERRIDE_SCOPES)[number];
@@ -0,0 +1,5 @@
1
+ export const SKILL_ROOT_LAYERS = Object.freeze(['managed', 'user', 'project', 'additional', 'plugin']);
2
+ export const SKILL_ROOT_KINDS = Object.freeze(['skills', 'commands', 'agents']);
3
+ export const SKILLS_VIEW_EXCLUDED_REASONS = Object.freeze(['overridden', 'model_invocation_off', 'untrusted', 'unconfirmed', 'shadowed']);
4
+ export const SKILLS_VIEW_LAYERS = Object.freeze([...SKILL_ROOT_LAYERS, 'mcp', 'builtin', 'synced']);
5
+ export const SKILL_OVERRIDE_SCOPES = Object.freeze(['local', 'user']);
@@ -1,5 +1,6 @@
1
1
  import { projectMcpSection } from './adapter/downstream/eventToSdkMessage.js';
2
2
  import { wireFailureShapeOf } from './wireFailureShape.js';
3
+ import { LIMIT_RATE_EXCEEDED } from './engineErrorCodes.js';
3
4
  import { mcpProbeAvailable } from './mcpProbeCapability.js';
4
5
  import { scenarioRefusalFromError } from './scenarioRefusal.js';
5
6
  export const MCP_PROBE_REFUSAL_CAUSES = Object.freeze([
@@ -50,7 +51,7 @@ export function classifyMcpProbeFailure(e) {
50
51
  return refusedBy('body_unparseable', message);
51
52
  case 'request.payload_too_large':
52
53
  return refusedBy('payload_too_large', message);
53
- case 'limit.rate_exceeded':
54
+ case LIMIT_RATE_EXCEEDED:
54
55
  return refusedBy('rate_limited', message, retryAfterSec);
55
56
  case 'auth.unauthorized':
56
57
  return refusedBy('unauthorized', message);
@@ -448,6 +448,6 @@ export function mcpAssertionHeaderNotSentNotice(specs) {
448
448
  const parts = distinct.slice(0, ASSERTION_NOTICE_NAMES_SHOWN).map((x) => `"${x}"`);
449
449
  if (distinct.length > ASSERTION_NOTICE_NAMES_SHOWN)
450
450
  parts.push(`+${distinct.length - ASSERTION_NOTICE_NAMES_SHOWN} more`);
451
- return (`MCP servers that declare an assertion header (assertionHeader): ${parts.join(', ')} — server versions up to 7.148.0 accept this setting but do not send the header, ` +
451
+ return (`MCP servers that declare an assertion header (assertionHeader): ${parts.join(', ')} — server versions up to 7.149.0 accept this setting but do not send the header, ` +
452
452
  'and this client cannot tell whether the engine it uses sends it; a connector that requires the header will refuse requests from these servers');
453
453
  }
@@ -1,4 +1,5 @@
1
1
  import { wireFailureShapeOf } from './wireFailureShape.js';
2
+ import { CAPABILITY_OPERATOR_PRINCIPALS_REQUIRED, MEMORY_CONTROL_PLANE_CORRUPT } from './engineErrorCodes.js';
2
3
  import { memoryComplianceVerbsAvailable } from './memoryComplianceCapability.js';
3
4
  import { memoryOriginVerbsAvailable } from './memoryOriginCapability.js';
4
5
  import { readMemoryEraseReceipt, readMemoryOriginClearanceReceipt } from './memoryEntriesWire.js';
@@ -53,7 +54,7 @@ export function classifyMemoryFailure(e) {
53
54
  return refusedBy('unauthorized', message);
54
55
  case 'auth.operator_only':
55
56
  return refusedBy('operator_only', message);
56
- case 'capability.operator_principals_required':
57
+ case CAPABILITY_OPERATOR_PRINCIPALS_REQUIRED:
57
58
  return refusedBy('operators_unconfigured', message);
58
59
  case 'auth.service_token_required':
59
60
  return refusedBy('service_token_required', message);
@@ -94,7 +95,7 @@ export function classifyMemoryFailure(e) {
94
95
  case 'memory.target_outside_store':
95
96
  case 'memory.scope_home_not_directory':
96
97
  return unknownBy('store_form_refused', message);
97
- case 'internal.memory_control_plane_corrupt':
98
+ case MEMORY_CONTROL_PLANE_CORRUPT:
98
99
  return unknownBy('control_plane_corrupt', message);
99
100
  default:
100
101
  break;
@@ -1,7 +1,10 @@
1
- import type { ModelApiWord } from './providerPresets.js';
2
- import type { OnboardCatalogIssue, OnboardProbeResult, OnboardProbeVerdict, OnboardRefusal } from '../seatContract.js';
1
+ import { type ModelApiWord } from './providerPresets.js';
2
+ import type { ModelDiscoveryResult, OnboardCatalogIssue, OnboardProbeResult, OnboardProbeVerdict, OnboardRefusal } from '../seatContract.js';
3
+ import type { SettingsDocument } from '../host.js';
3
4
  import { type ModelProbeResult } from '../modelCapabilityProbe.js';
4
5
  import type { UiLanguage } from '../env/uiLanguage.js';
6
+ export declare function onboardKeyCarriedBy(text: string, key: string | undefined): boolean;
7
+ export declare function onboardRedactKey(text: string, key: string | undefined): string;
5
8
  export declare function onboardBaseUrlProblem(url: string, lang?: UiLanguage): string | undefined;
6
9
  export interface OnboardProbeTarget {
7
10
  readonly baseUrl: string;
@@ -42,6 +45,13 @@ export interface OnboardProbeDeps {
42
45
  readonly firstTokenMs?: number | undefined;
43
46
  }
44
47
  export declare function probeModelEndpoint(target: OnboardProbeTarget, deps?: OnboardProbeDeps): Promise<OnboardProbeResult>;
48
+ export interface OnboardDiscoveryTarget {
49
+ readonly baseUrl: string;
50
+ readonly api: ModelApiWord;
51
+ readonly apiKey?: string | undefined;
52
+ readonly auth?: 'bearer' | 'x-api-key' | undefined;
53
+ }
54
+ export declare function discoverEndpointModels(target: OnboardDiscoveryTarget, deps?: OnboardProbeDeps): Promise<ModelDiscoveryResult>;
45
55
  export type OnboardWriteVerdict = {
46
56
  readonly write: true;
47
57
  readonly unverified: boolean;
@@ -49,10 +59,11 @@ export type OnboardWriteVerdict = {
49
59
  readonly write: false;
50
60
  readonly refusal: 'probe_failed' | 'probe_unverified';
51
61
  };
52
- export declare function onboardWriteVerdict(verdict: OnboardProbeVerdict, acceptUnverified?: boolean): OnboardWriteVerdict;
62
+ export declare function onboardWriteVerdict(verdict: OnboardProbeVerdict | undefined, acceptUnverified?: boolean): OnboardWriteVerdict;
53
63
  export declare const KEY_SLOT_PREFIX = "SEMA_MODEL_KEY_";
54
64
  export declare function keyEnvNameForEntry(entryName: string): string;
55
65
  export declare function poolEntryNameOf(modelId: string, channel: string, taken: ReadonlySet<string>): string;
66
+ export declare function onboardEntryCredentialIssue(m: SettingsDocument, env: Readonly<Record<string, string | undefined>>): string | undefined;
56
67
  export interface OnboardPlanEntry {
57
68
  readonly modelId: string;
58
69
  readonly api: ModelApiWord;
@@ -90,5 +101,4 @@ export type OnboardWritePlan = {
90
101
  readonly refusal: Extract<OnboardRefusal, 'input' | 'catalog_unreadable' | 'credential_unpaired' | 'engine_is_remote' | 'env_catalog_present'>;
91
102
  readonly detail: string;
92
103
  };
93
- export declare function onboardWritePlan(input: OnboardWritePlanInput): OnboardWritePlan;
94
104
  export declare function onboardRefusalText(refusal: OnboardRefusal, lang?: UiLanguage): string;