@sema-agent/client-core 0.100.0 → 0.101.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 +395 -0
- package/README.md +164 -117
- package/dist/adapt/arms.js +51 -16
- package/dist/adapt/textStream.js +7 -4
- package/dist/adapt/toolCards.js +9 -8
- package/dist/adapt.js +7 -1
- package/dist/adapter/activeRunSelfHeal.d.ts +24 -2
- package/dist/adapter/activeRunSelfHeal.js +108 -6
- package/dist/adapter/downstream/eventToSdkMessage.js +33 -12
- package/dist/adapter/downstream/terminalToSdkResult.d.ts +60 -1
- package/dist/adapter/downstream/terminalToSdkResult.js +209 -39
- package/dist/adapter/runStream.d.ts +4 -4
- package/dist/adapter/runStream.js +158 -43
- package/dist/agentsWireCaps.d.ts +2 -7
- package/dist/agentsWireCaps.js +1 -2
- package/dist/approvalDecidedByCapability.js +2 -2
- package/dist/approvalFrameFamilies.d.ts +33 -0
- package/dist/approvalFrameFamilies.js +120 -0
- package/dist/approvalsStreamLiveCapability.js +2 -2
- package/dist/attachmentsWireCaps.js +41 -13
- package/dist/callerCwdCapability.js +2 -2
- package/dist/centerWiringCapability.js +2 -2
- package/dist/clockReading.d.ts +2 -0
- package/dist/clockReading.js +4 -0
- package/dist/cloudConfigWireCaps.d.ts +19 -5
- package/dist/cloudConfigWireCaps.js +193 -56
- package/dist/coreValuePorts.d.ts +12 -2
- package/dist/coreValuePorts.js +9 -0
- package/dist/decideFailureNote.js +5 -3
- package/dist/decideReceipt.js +2 -2
- package/dist/deviceExecutorManagementCapability.js +2 -2
- package/dist/deviceFlowPolling.js +1 -1
- package/dist/disableSkillsWire.d.ts +1 -1
- package/dist/disableSkillsWire.js +4 -3
- package/dist/displayUntrusted.d.ts +1 -0
- package/dist/displayUntrusted.js +65 -8
- package/dist/engineCapReader.js +1 -1
- package/dist/engineConfigDrift.js +1 -1
- package/dist/engineErrorCodes.d.ts +14 -5
- package/dist/engineErrorCodes.js +27 -6
- package/dist/engineGenerationConvergence.d.ts +39 -0
- package/dist/engineGenerationConvergence.js +95 -0
- package/dist/engineGenerationPort.d.ts +61 -0
- package/dist/engineGenerationPort.js +144 -0
- package/dist/engineHealthFacts.d.ts +23 -0
- package/dist/engineHealthFacts.js +92 -0
- package/dist/engineIdentity.d.ts +4 -0
- package/dist/engineIdentity.js +11 -0
- package/dist/engineNoticeCodes.d.ts +2 -5
- package/dist/engineRowRef.js +3 -0
- package/dist/engineSessionMessages.js +2 -2
- package/dist/engineToolDirectory.js +2 -2
- package/dist/engineWireFor.d.ts +99 -0
- package/dist/engineWireFor.js +248 -6
- package/dist/engineWireTarget.d.ts +1 -0
- package/dist/engineWireTarget.js +8 -0
- package/dist/env/uiLanguage.js +1 -1
- package/dist/errorSupplementRoles.d.ts +3 -0
- package/dist/errorSupplementRoles.js +37 -0
- package/dist/executionLaneCapability.js +2 -2
- package/dist/fileHistoryCaptureCapability.js +3 -3
- package/dist/finalVerifyWire.d.ts +6 -3
- package/dist/finalVerifyWire.js +6 -23
- package/dist/flagInput.d.ts +4 -0
- package/dist/flagInput.js +24 -0
- package/dist/fleet/fleetLedger.js +5 -2
- package/dist/fleet/fleetProjection.d.ts +1 -0
- package/dist/fleet/fleetProjection.js +15 -2
- package/dist/gateVocabulary.js +3 -0
- package/dist/generated/engineFactTables.d.ts +7 -3
- package/dist/generated/engineFactTables.js +52 -0
- package/dist/generated/engineNoticeTables.js +12 -0
- package/dist/generated/settingsSchemaActiveTiers.d.ts +1 -0
- package/dist/generated/settingsSchemaActiveTiers.js +14 -0
- package/dist/generated/settingsSchemaCallerTextEcho.d.ts +1 -0
- package/dist/generated/settingsSchemaCallerTextEcho.js +8 -0
- package/dist/generated/settingsSchemaControlAndBidi.d.ts +1 -0
- package/dist/generated/settingsSchemaControlAndBidi.js +8 -0
- package/dist/generated/settingsSchemaDefaultModel.d.ts +11 -0
- package/dist/generated/settingsSchemaDefaultModel.js +25 -0
- package/dist/generated/settingsSchemaFns.d.ts +54 -0
- package/dist/generated/settingsSchemaFns.js +26 -1
- package/dist/generated/settingsSchemaMcpRequestEntry.d.ts +1 -1
- package/dist/generated/settingsSchemaMcpRequestEntry.js +1 -7
- package/dist/generated/settingsSchemaSafetyMergeSpec.d.ts +1 -0
- package/dist/generated/settingsSchemaSafetyMergeSpec.js +95 -0
- package/dist/generated/settingsSchemaSettingsSources.d.ts +1 -0
- package/dist/generated/settingsSchemaSettingsSources.js +58 -0
- package/dist/generated/settingsSchemaTables.d.ts +2 -0
- package/dist/generated/settingsSchemaTables.js +13 -0
- package/dist/generated/settingsSchemaUrlPattern.d.ts +1 -0
- package/dist/generated/settingsSchemaUrlPattern.js +183 -0
- package/dist/headlessPermissionModeWire.d.ts +18 -2
- package/dist/headlessPermissionModeWire.js +30 -19
- package/dist/hitl/allowRuleShadow.js +7 -5
- package/dist/hitl/approvalCardReading.d.ts +3 -0
- package/dist/hitl/approvalCardReading.js +17 -0
- package/dist/hitl/approvalCompleteParked.js +1 -1
- package/dist/hitl/approvalDelivery.d.ts +87 -0
- package/dist/hitl/approvalDelivery.js +193 -0
- package/dist/hitl/approvalResolution.d.ts +11 -0
- package/dist/hitl/approvalResolution.js +50 -11
- package/dist/hitl/askClassPair.d.ts +6 -0
- package/dist/hitl/askClassPair.js +30 -3
- package/dist/hitl/askParkAutoReopenBlock.d.ts +30 -0
- package/dist/hitl/askParkAutoReopenBlock.js +117 -0
- package/dist/hitl/askParkRowRouting.js +4 -1
- package/dist/hitl/attributionLadder.d.ts +42 -3
- package/dist/hitl/attributionLadder.js +79 -8
- package/dist/hitl/automaticAnswerVerdict.d.ts +6 -1
- package/dist/hitl/automaticAnswerVerdict.js +46 -11
- package/dist/hitl/crashConverged.js +2 -2
- package/dist/hitl/decisionConflict.d.ts +6 -2
- package/dist/hitl/decisionConflict.js +24 -9
- package/dist/hitl/decisionRefusal.d.ts +20 -10
- package/dist/hitl/decisionRefusal.js +99 -54
- package/dist/hitl/decisionSend.d.ts +3 -0
- package/dist/hitl/decisionSend.js +87 -103
- package/dist/hitl/frameRouter.d.ts +1 -0
- package/dist/hitl/frameRouter.js +9 -2
- package/dist/hitl/hitlBridge.d.ts +18 -6
- package/dist/hitl/hitlBridge.js +41 -37
- package/dist/hitl/livePendingAsk.js +4 -3
- package/dist/hitl/noAllowCause.js +1 -1
- package/dist/hitl/parkResolver.js +3 -2
- package/dist/hitl/persistedRulesWire.js +1 -0
- package/dist/hitl/planReviewWire.d.ts +4 -0
- package/dist/hitl/planReviewWire.js +59 -30
- package/dist/hitl/resumeRunningCard.d.ts +3 -2
- package/dist/hitl/resumeRunningCard.js +17 -11
- package/dist/hitl/sessionPolicyDeliverable.d.ts +5 -2
- package/dist/hitl/sessionPolicyDeliverable.js +62 -29
- package/dist/hitl/sessionPolicyWire.d.ts +13 -3
- package/dist/hitl/sessionPolicyWire.js +81 -16
- package/dist/hitl/standingRows.js +1 -1
- package/dist/hitl/toolApprovalWire.d.ts +9 -10
- package/dist/hitl/toolApprovalWire.js +72 -54
- package/dist/hookMatcherVerdict.d.ts +2 -0
- package/dist/hookMatcherVerdict.js +12 -0
- package/dist/hooksCompactTransition.d.ts +19 -0
- package/dist/hooksCompactTransition.js +41 -0
- package/dist/hooksWireCaps.d.ts +1 -1
- package/dist/hooksWireCaps.js +202 -203
- package/dist/host.d.ts +1 -14
- package/dist/host.js +0 -8
- package/dist/hostCallbackGuard.d.ts +1 -0
- package/dist/hostCallbackGuard.js +1 -1
- package/dist/hostSettingsSource.d.ts +172 -0
- package/dist/hostSettingsSource.js +675 -0
- package/dist/hostTurnSettings.d.ts +73 -17
- package/dist/hostTurnSettings.js +594 -97
- package/dist/httpHookPolicy.d.ts +37 -0
- package/dist/httpHookPolicy.js +176 -0
- package/dist/humanTurn.d.ts +2 -1
- package/dist/humanTurn.js +37 -7
- package/dist/humanTurnRead.js +4 -3
- package/dist/humanTurnSentences.d.ts +10 -0
- package/dist/humanTurnSentences.js +74 -0
- package/dist/i18n/messages.en.d.ts +184 -2
- package/dist/i18n/messages.en.js +187 -5
- package/dist/i18n/messages.zh.js +197 -5
- package/dist/i18n/translate.js +3 -3
- package/dist/index.d.ts +69 -15
- package/dist/index.js +45 -13
- package/dist/inheritEnvCapability.d.ts +3 -1
- package/dist/inheritEnvCapability.js +31 -17
- package/dist/inheritEnvWire.d.ts +2 -1
- package/dist/inheritEnvWire.js +11 -5
- package/dist/interactiveToolsWire.d.ts +4 -2
- package/dist/interactiveToolsWire.js +5 -5
- package/dist/jsonFaithful.d.ts +20 -0
- package/dist/jsonFaithful.js +152 -0
- package/dist/limitsWire.d.ts +7 -2
- package/dist/limitsWire.js +19 -13
- package/dist/liveInitToolFace.d.ts +6 -1
- package/dist/liveInitToolFace.js +5 -3
- package/dist/liveModelCatalog.d.ts +22 -0
- package/dist/liveModelCatalog.js +132 -18
- package/dist/mcpPanel.js +1 -1
- package/dist/mcpProbeCapability.js +2 -2
- package/dist/mcpStatusSupersetKeys.d.ts +24 -0
- package/dist/mcpStatusSupersetKeys.js +45 -0
- package/dist/mcpToolToggles.js +2 -1
- package/dist/mcpWireCaps.d.ts +39 -1
- package/dist/mcpWireCaps.js +254 -50
- package/dist/memoryComplianceCapability.js +2 -2
- package/dist/memoryOriginCapability.js +2 -2
- package/dist/model/catalogDefault.d.ts +24 -0
- package/dist/model/catalogDefault.js +4 -0
- package/dist/model/liveCatalogShape.js +5 -4
- package/dist/model/modelsPolicy.js +4 -3
- package/dist/model/onboardJudgement.d.ts +1 -0
- package/dist/model/onboardJudgement.js +1 -1
- package/dist/model/subagentModelWord.js +2 -2
- package/dist/modelCapabilityProbe.js +6 -6
- package/dist/modelIdentityResolvability.d.ts +10 -1
- package/dist/modelIdentityResolvability.js +62 -39
- package/dist/modsKernelIdentity.d.ts +10 -0
- package/dist/modsKernelIdentity.js +103 -0
- package/dist/modsKernelTransit.d.ts +8 -0
- package/dist/modsKernelTransit.js +6 -0
- package/dist/notifications.d.ts +30 -12
- package/dist/notifications.js +241 -53
- package/dist/outputStyleSeatCapability.js +2 -2
- package/dist/ownKey.d.ts +11 -0
- package/dist/ownKey.js +164 -3
- package/dist/panelReduce.js +1 -1
- package/dist/peerFrames.d.ts +1 -1
- package/dist/peerFrames.js +6 -2
- package/dist/peerLaneCapability.js +2 -2
- package/dist/permissionModesCapability.js +4 -4
- package/dist/permissionRuleIssue.js +2 -0
- package/dist/permissionRulesWriteCapability.js +2 -2
- package/dist/permissionsAllowGrantCapability.js +2 -2
- package/dist/permissionsDeclaration.d.ts +43 -4
- package/dist/permissionsDeclaration.js +102 -35
- package/dist/pluginHooksWire.d.ts +20 -4
- package/dist/pluginHooksWire.js +92 -53
- package/dist/prepareRefusal.d.ts +3 -2
- package/dist/prepareRefusal.js +27 -9
- package/dist/printInitToolFace.js +2 -2
- package/dist/printModelStatus.js +1 -1
- package/dist/projectMemory.d.ts +32 -0
- package/dist/projectMemory.js +70 -0
- package/dist/promptBlockedCopy.d.ts +2 -1
- package/dist/promptBlockedCopy.js +2 -1
- package/dist/promptDelivery.d.ts +23 -3
- package/dist/promptDelivery.js +169 -30
- package/dist/providerRejection.d.ts +19 -1
- package/dist/providerRejection.js +75 -4
- package/dist/queuedDelivery.d.ts +48 -0
- package/dist/queuedDelivery.js +233 -0
- package/dist/reattachWindow.d.ts +94 -0
- package/dist/reattachWindow.js +127 -0
- package/dist/request/printNotification.d.ts +1 -1
- package/dist/request/printNotification.js +5 -1
- package/dist/request/submissionIdentity.d.ts +37 -0
- package/dist/request/submissionIdentity.js +65 -0
- package/dist/request/taskRequest.d.ts +12 -4
- package/dist/request/taskRequest.js +221 -152
- package/dist/resultFrameKeys.d.ts +1 -0
- package/dist/resultFrameKeys.js +4 -1
- package/dist/retryStatus.d.ts +8 -0
- package/dist/retryStatus.js +57 -9
- package/dist/rewindArchiveCapability.js +2 -2
- package/dist/rewindEngineAction.d.ts +2 -0
- package/dist/rewindEngineAction.js +23 -1
- package/dist/rowKind.d.ts +36 -0
- package/dist/rowKind.js +97 -0
- package/dist/ruleCompileVerdict.d.ts +18 -0
- package/dist/ruleCompileVerdict.js +67 -2
- package/dist/ruleReadings.d.ts +58 -0
- package/dist/ruleReadings.js +132 -0
- package/dist/ruleRefusalSentence.d.ts +4 -0
- package/dist/ruleRefusalSentence.js +9 -3
- package/dist/runCancelContext.d.ts +0 -1
- package/dist/runCancelContext.js +1 -2
- package/dist/runTerminal.d.ts +5 -0
- package/dist/runTerminal.js +52 -17
- package/dist/sandboxWire.d.ts +1 -1
- package/dist/sandboxWire.js +4 -6
- package/dist/scenarioRefusal.js +1 -1
- package/dist/scenarioSkills.d.ts +20 -0
- package/dist/scenarioSkills.js +72 -0
- package/dist/scenarioWire.d.ts +5 -2
- package/dist/scenarioWire.js +9 -9
- package/dist/sealedKeyCapability.js +2 -2
- package/dist/seam.d.ts +2 -0
- package/dist/seam.js +2 -2
- package/dist/seatContract.d.ts +46 -1
- package/dist/seatContract.js +49 -19
- package/dist/selfOrchestrationDenial.js +1 -1
- package/dist/sessionPolicyCapability.js +2 -2
- package/dist/sessionRulesChildrenReadLive.d.ts +6 -0
- package/dist/sessionRulesChildrenReadLive.js +5 -0
- package/dist/sessionRulesNamespaceFormsCapability.d.ts +12 -0
- package/dist/sessionRulesNamespaceFormsCapability.js +29 -0
- package/dist/sessionSyncFileHistoryCapability.js +2 -2
- package/dist/settingsCredentialKeyPaths.js +60 -5
- package/dist/settingsHooksSalvage.d.ts +1 -0
- package/dist/settingsHooksSalvage.js +7 -1
- package/dist/settingsLayerAdmission.d.ts +4 -0
- package/dist/settingsLayerAdmission.js +16 -0
- package/dist/skillToolListsCapability.js +6 -5
- package/dist/skillsWireCaps.d.ts +14 -0
- package/dist/skillsWireCaps.js +47 -16
- package/dist/slashCommandGate.d.ts +24 -0
- package/dist/slashCommandGate.js +74 -0
- package/dist/slashCommandTable.d.ts +14 -0
- package/dist/slashCommandTable.js +99 -0
- package/dist/sqlEngineCapability.js +2 -2
- package/dist/steerPriorityCapability.js +2 -2
- package/dist/storePostureCapability.js +2 -2
- package/dist/subagent/agentStateDetail.js +1 -1
- package/dist/subagent/engineDelegatedPrompt.d.ts +9 -0
- package/dist/subagent/engineDelegatedPrompt.js +38 -7
- package/dist/subagent/engineRowStopGate.js +2 -2
- package/dist/subagent/engineSubagentResume.js +3 -3
- package/dist/subagent/engineTaskHandleWire.d.ts +1 -0
- package/dist/subagent/engineTaskHandleWire.js +10 -0
- package/dist/submitFailure.d.ts +8 -0
- package/dist/submitFailure.js +17 -0
- package/dist/supportFloor.d.ts +1 -0
- package/dist/supportFloor.js +7 -0
- package/dist/terminationIntent.d.ts +55 -0
- package/dist/terminationIntent.js +352 -0
- package/dist/toolHistoryMismatch.d.ts +8 -0
- package/dist/toolHistoryMismatch.js +37 -6
- package/dist/toolResult.d.ts +13 -3
- package/dist/toolResult.js +158 -9
- package/dist/toolResultContent.d.ts +13 -0
- package/dist/toolResultContent.js +82 -7
- package/dist/toolRoster.d.ts +18 -0
- package/dist/toolRoster.js +64 -0
- package/dist/turnFailurePresentation.js +27 -90
- package/dist/usageLimitAutoResume.d.ts +74 -0
- package/dist/usageLimitAutoResume.js +227 -0
- package/dist/userAttachmentEnvelope.js +1 -1
- package/dist/userAttachmentSeat.js +5 -5
- package/dist/userInvokedSkillsCapability.js +2 -2
- package/dist/webSearchBackendCapability.js +2 -2
- package/dist/wireErrorTriage.js +99 -50
- package/dist/wireFailureShape.d.ts +25 -1
- package/dist/wireFailureShape.js +92 -5
- package/dist/wireRefusalCopy.d.ts +24 -1
- package/dist/wireRefusalCopy.js +253 -32
- package/dist/wiringFleetDoctor.d.ts +3 -0
- package/dist/wiringFleetDoctor.js +21 -0
- package/dist/workflow.d.ts +2 -1
- package/dist/workflow.js +38 -1
- package/dist/workflowClient.d.ts +2 -7
- package/dist/workflowsJournalCapability.js +2 -2
- package/dist/writeProtectionCapability.js +2 -2
- package/docs/INTEGRATION-CLIENTS.md +607 -181
- package/package.json +14 -3
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { engineCapValue } from './engineCapsCache.js';
|
|
2
|
+
import { engineWireTargetBaseUrl } from './engineWireTarget.js';
|
|
3
|
+
const SESSION_RULES_NAMESPACE_FORMS_KEY = 'sessionRulesNamespaceForms';
|
|
4
|
+
const CONFIRMED = Object.freeze({ kind: 'confirmed' });
|
|
5
|
+
const ABSENT = Object.freeze({ kind: 'absent' });
|
|
6
|
+
const DECLINED = Object.freeze({ kind: 'declined' });
|
|
7
|
+
const UNREADABLE = Object.freeze({ kind: 'unreadable' });
|
|
8
|
+
const UNOBSERVED = Object.freeze({ kind: 'unobserved' });
|
|
9
|
+
export function observedSessionRulesNamespaceForms(baseUrl) {
|
|
10
|
+
try {
|
|
11
|
+
const base = baseUrl === undefined ? engineWireTargetBaseUrl() : baseUrl;
|
|
12
|
+
const slot = engineCapValue(typeof base === 'string' ? base : undefined, SESSION_RULES_NAMESPACE_FORMS_KEY);
|
|
13
|
+
switch (slot.kind) {
|
|
14
|
+
case 'unobserved':
|
|
15
|
+
return UNOBSERVED;
|
|
16
|
+
case 'not_reported':
|
|
17
|
+
return ABSENT;
|
|
18
|
+
case 'unreadable':
|
|
19
|
+
return UNREADABLE;
|
|
20
|
+
case 'null':
|
|
21
|
+
return DECLINED;
|
|
22
|
+
case 'value':
|
|
23
|
+
return slot.value === true ? CONFIRMED : DECLINED;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return UNOBSERVED;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { engineWireTargetBaseUrl } from './engineWireTarget.js';
|
|
2
2
|
import { createEngineCapReader, unreadableReadingDetail } from './engineCapReader.js';
|
|
3
3
|
import { ownDataField } from './ownKey.js';
|
|
4
4
|
export function projectSessionSyncFileHistoryCapability(caps) {
|
|
@@ -20,7 +20,7 @@ const reader = createEngineCapReader({
|
|
|
20
20
|
name: 'sessionSyncFileHistory',
|
|
21
21
|
project: projectSessionSyncFileHistoryCapability,
|
|
22
22
|
});
|
|
23
|
-
export function observedSessionSyncFileHistory(baseUrl =
|
|
23
|
+
export function observedSessionSyncFileHistory(baseUrl = engineWireTargetBaseUrl()) {
|
|
24
24
|
return reader.observed(baseUrl);
|
|
25
25
|
}
|
|
26
26
|
export function sessionSyncFileHistoryAvailable(reading) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { looksLikeKnownSecret, queryCarriesCredential } from './displayUntrusted.js';
|
|
1
|
+
import { looksLikeKnownSecret, percentBoundaryReadingOf, queryCarriesCredential } from './displayUntrusted.js';
|
|
2
2
|
const CREDENTIAL_WORDS = new Set([
|
|
3
3
|
'key', 'keys', 'apikey', 'token', 'tokens', 'secret', 'secrets', 'password', 'passwd', 'pass', 'pwd', 'pin', 'otp',
|
|
4
4
|
'auth', 'authorization', 'credential', 'credentials', 'cookie', 'cookies', 'session', 'private', 'cert', 'signature', 'salt',
|
|
@@ -6,6 +6,9 @@ const CREDENTIAL_WORDS = new Set([
|
|
|
6
6
|
const CREDENTIAL_STEMS = ['PASSWORD', 'PASSWD', 'SECRET', 'TOKEN', 'APIKEY', 'CREDENTIAL', 'COOKIE', 'PRIVATE'];
|
|
7
7
|
const CREDENTIAL_SUFFIXES = ['PASS', 'PWD', 'KEY', 'AUTH'];
|
|
8
8
|
const SECRET_CONFIG_NAME = /(?:^|[-_.])(?:token|key|secret|password|authorization|credential|cookie)s?$/i;
|
|
9
|
+
const FLATTENED_CREDENTIAL_TAILS = [
|
|
10
|
+
'apikey', 'token', 'tokens', 'secret', 'secrets', 'password', 'passwd', 'credential', 'credentials', 'cookie', 'cookies', 'authorization',
|
|
11
|
+
];
|
|
9
12
|
export function credentialNameWords(name) {
|
|
10
13
|
if (typeof name !== 'string')
|
|
11
14
|
return [];
|
|
@@ -24,17 +27,54 @@ export function isCredentialEnvName(name) {
|
|
|
24
27
|
const upper = name.toUpperCase();
|
|
25
28
|
return CREDENTIAL_STEMS.some((stem) => upper.includes(stem)) || CREDENTIAL_SUFFIXES.some((suffix) => upper.endsWith(suffix));
|
|
26
29
|
}
|
|
30
|
+
function legacyNameWords(name) {
|
|
31
|
+
return name
|
|
32
|
+
.replace(/([a-z0-9])([A-Z])/g, '$1_$2')
|
|
33
|
+
.split(/[_\-.\s]+/)
|
|
34
|
+
.filter((w) => w.length > 0)
|
|
35
|
+
.map((w) => w.toLowerCase());
|
|
36
|
+
}
|
|
27
37
|
export function isCredentialConfigKey(name) {
|
|
28
38
|
if (typeof name !== 'string')
|
|
29
39
|
return false;
|
|
30
40
|
const words = credentialNameWords(name);
|
|
31
41
|
const last = words[words.length - 1];
|
|
32
|
-
|
|
42
|
+
if (SECRET_CONFIG_NAME.test(name) || (last !== undefined && CREDENTIAL_WORDS.has(last)))
|
|
43
|
+
return true;
|
|
44
|
+
const legacy = legacyNameWords(name);
|
|
45
|
+
const legacyLast = legacy[legacy.length - 1];
|
|
46
|
+
if (legacyLast !== undefined && CREDENTIAL_WORDS.has(legacyLast))
|
|
47
|
+
return true;
|
|
48
|
+
const flattened = name.replace(/[_\-.\s]+/g, '').toLowerCase();
|
|
49
|
+
return FLATTENED_CREDENTIAL_TAILS.some((tail) => flattened.endsWith(tail));
|
|
33
50
|
}
|
|
34
51
|
const DECIMAL_INTEGER_RE = /^\s*\d+\s*$/;
|
|
35
|
-
function
|
|
36
|
-
|
|
37
|
-
|
|
52
|
+
function percentDecodeOnce(s) {
|
|
53
|
+
return s.indexOf('%') === -1 ? s : s.replace(/%([0-7][0-9A-Fa-f])/g, (_m, hex) => String.fromCharCode(Number.parseInt(hex, 16)));
|
|
54
|
+
}
|
|
55
|
+
const SCHEME_THEN_ENCODED_SPACE = /(?:^|[^A-Za-z0-9])(?:bearer|basic)(?:\+|%20)[^\s+%]{1,4096}/i;
|
|
56
|
+
const FORM_READING_MAX_LAYERS = 3;
|
|
57
|
+
function formEncodedCarriesCredential(value) {
|
|
58
|
+
if (value.indexOf('+') === -1 && value.indexOf('%') === -1)
|
|
59
|
+
return false;
|
|
60
|
+
let layer = value;
|
|
61
|
+
for (let depth = 0;; depth++) {
|
|
62
|
+
const boundary = percentBoundaryReadingOf(layer);
|
|
63
|
+
for (const reading of boundary === layer ? [layer] : [layer, boundary]) {
|
|
64
|
+
if (SCHEME_THEN_ENCODED_SPACE.test(reading))
|
|
65
|
+
return true;
|
|
66
|
+
if (reading.indexOf('+') !== -1 && looksLikeKnownSecret(reading.replace(/\+/g, ' ')))
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
const next = percentDecodeOnce(layer);
|
|
70
|
+
if (next === layer)
|
|
71
|
+
return false;
|
|
72
|
+
if (depth === FORM_READING_MAX_LAYERS)
|
|
73
|
+
return true;
|
|
74
|
+
layer = next;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function urlCarriesCredential(value) {
|
|
38
78
|
const text = value.trim();
|
|
39
79
|
if (!text.includes('://'))
|
|
40
80
|
return false;
|
|
@@ -49,6 +89,21 @@ function stringCarriesCredential(value) {
|
|
|
49
89
|
return true;
|
|
50
90
|
return url.search.length > 1 && queryCarriesCredential(url.search.slice(1));
|
|
51
91
|
}
|
|
92
|
+
function stringCarriesCredential(value) {
|
|
93
|
+
if (looksLikeKnownSecret(value) || formEncodedCarriesCredential(value))
|
|
94
|
+
return true;
|
|
95
|
+
let layer = value;
|
|
96
|
+
for (let depth = 0;; depth++) {
|
|
97
|
+
if (urlCarriesCredential(layer))
|
|
98
|
+
return true;
|
|
99
|
+
if (depth === FORM_READING_MAX_LAYERS)
|
|
100
|
+
return false;
|
|
101
|
+
const next = percentDecodeOnce(layer);
|
|
102
|
+
if (next === layer)
|
|
103
|
+
return false;
|
|
104
|
+
layer = next;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
52
107
|
const ENV_ASSIGNMENT_RE = /^([A-Za-z_][A-Za-z0-9_]*)=(.*)$/s;
|
|
53
108
|
const LONG_OPTION_RE = /^--?([A-Za-z][A-Za-z0-9_-]*)(?:=(.*))?$/s;
|
|
54
109
|
const HEADER_FORM_RE = /^\s*([A-Za-z][A-Za-z0-9_-]*)\s*:\s*\S/;
|
|
@@ -41,4 +41,5 @@ export declare function hooksSalvageMaskOf(dropped: readonly {
|
|
|
41
41
|
}[]): HooksSalvageMask;
|
|
42
42
|
export declare function salvageSettingsHooksEntries(doc: SettingsDocument | null | undefined): HooksSalvage;
|
|
43
43
|
export declare const HOOK_SETTINGS_SOURCE_TEXT: Readonly<Record<HookSettingsSource, string>>;
|
|
44
|
+
export declare function layerNotAppliedRefusesTurn(source: HookSettingsSource): boolean;
|
|
44
45
|
export declare function settingsHooksSalvageNotice(salvage: HooksSalvage, source: HookSettingsSource, doc?: SettingsDocument | null): string | undefined;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { displayUntrusted } from './displayUntrusted.js';
|
|
2
|
+
import { msg, renderMessage } from './i18n/translate.js';
|
|
2
3
|
import { SETTINGS_CLASSIFY_HOOKS_CONFIG, } from './generated/settingsSchemaFns.js';
|
|
3
4
|
const _tuplePins = [true, true, true, true, true, true];
|
|
4
5
|
void _tuplePins;
|
|
@@ -116,6 +117,9 @@ export const HOOK_SETTINGS_SOURCE_TEXT = Object.freeze({
|
|
|
116
117
|
localSettings: 'Local settings',
|
|
117
118
|
flagSettings: 'Flag settings',
|
|
118
119
|
});
|
|
120
|
+
export function layerNotAppliedRefusesTurn(source) {
|
|
121
|
+
return source === 'policySettings';
|
|
122
|
+
}
|
|
119
123
|
const SALVAGE_LABEL_MAX = 80;
|
|
120
124
|
const SALVAGE_PIECES_SHOWN = 3;
|
|
121
125
|
const labelOf = (s) => (typeof s === 'number' ? String(s) : displayUntrusted(s, { max: SALVAGE_LABEL_MAX }));
|
|
@@ -194,11 +198,13 @@ export function settingsHooksSalvageNotice(salvage, source, doc) {
|
|
|
194
198
|
try {
|
|
195
199
|
if (salvage.outcome === 'loaded-partial') {
|
|
196
200
|
const what = joinPhrases(salvage.dropped.map((d) => ({ key: d.path.join('\u0000'), text: dropPhrase(d, doc) })));
|
|
201
|
+
if (layerNotAppliedRefusesTurn(source))
|
|
202
|
+
return renderMessage(msg('config.hooks.salvage.managedPartial', { layer, what }));
|
|
197
203
|
return `${layer}: ${what}. The rest of this file's hooks are applied.`;
|
|
198
204
|
}
|
|
199
205
|
if (salvage.outcome === 'rejected') {
|
|
200
206
|
const why = joinPhrases(salvage.rejections.map((r) => ({ key: r.path.join('\u0000'), text: rejectionPhrase(r) })));
|
|
201
|
-
if (source
|
|
207
|
+
if (layerNotAppliedRefusesTurn(source)) {
|
|
202
208
|
return `${layer}: hooks could not be loaded — ${why}. Requests are not sent while the managed hooks cannot be applied; ask your administrator to fix the managed settings.`;
|
|
203
209
|
}
|
|
204
210
|
return `${layer}: hooks were not loaded — ${why}; ${GUARD_RISK_TAIL}.`;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { HostSettingsLayer, WorkspaceTrustState } from './hostSettingsSource.js';
|
|
2
|
+
export declare function layerAdmissionWord(layer: HostSettingsLayer, trust: WorkspaceTrustState | 'unreadable', category: string, member?: string): string;
|
|
3
|
+
export declare function layerAdmitted(layer: HostSettingsLayer, trust: WorkspaceTrustState | 'unreadable', category: string, member?: string): boolean;
|
|
4
|
+
export declare function admittedLayers<L extends HostSettingsLayer>(layers: readonly L[], trust: WorkspaceTrustState | 'unreadable', category: string, member?: string): readonly L[];
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { SETTINGS_LAYER_ADMISSION } from './generated/settingsSchemaFns.js';
|
|
2
|
+
const TRUST_UNREADABLE_READING = 'declined';
|
|
3
|
+
const ADMITTED = 'admitted';
|
|
4
|
+
function layerAdmissionOf(layer, trust, category, member) {
|
|
5
|
+
const reading = trust === 'unreadable' ? TRUST_UNREADABLE_READING : trust;
|
|
6
|
+
return member === undefined ? SETTINGS_LAYER_ADMISSION(layer, reading, category) : SETTINGS_LAYER_ADMISSION(layer, reading, category, member);
|
|
7
|
+
}
|
|
8
|
+
export function layerAdmissionWord(layer, trust, category, member) {
|
|
9
|
+
return layerAdmissionOf(layer, trust, category, member);
|
|
10
|
+
}
|
|
11
|
+
export function layerAdmitted(layer, trust, category, member) {
|
|
12
|
+
return layerAdmissionOf(layer, trust, category, member) === ADMITTED;
|
|
13
|
+
}
|
|
14
|
+
export function admittedLayers(layers, trust, category, member) {
|
|
15
|
+
return layers.filter((layer) => layerAdmitted(layer, trust, category, member));
|
|
16
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { engineWireTargetBaseUrl } from './engineWireTarget.js';
|
|
2
2
|
import { createEngineCapReader, unreadableReadingDetail } from './engineCapReader.js';
|
|
3
3
|
import { msg, renderMessage } from './i18n/translate.js';
|
|
4
|
-
import { ownDataField } from './ownKey.js';
|
|
4
|
+
import { guardedRead, ownDataField, readOwnDataValue } from './ownKey.js';
|
|
5
5
|
export function projectSkillToolListsCapability(caps) {
|
|
6
6
|
try {
|
|
7
7
|
if (caps === null || typeof caps !== 'object' || Array.isArray(caps))
|
|
@@ -21,13 +21,14 @@ const reader = createEngineCapReader({
|
|
|
21
21
|
name: 'skillToolLists',
|
|
22
22
|
project: projectSkillToolListsCapability,
|
|
23
23
|
});
|
|
24
|
-
export function observedSkillToolLists(baseUrl =
|
|
24
|
+
export function observedSkillToolLists(baseUrl = engineWireTargetBaseUrl()) {
|
|
25
25
|
return reader.observed(baseUrl);
|
|
26
26
|
}
|
|
27
27
|
export function skillToolListsAvailable(reading) {
|
|
28
|
-
|
|
28
|
+
const kind = guardedRead(() => readOwnDataValue(reading, 'kind'));
|
|
29
|
+
if (kind === 'present')
|
|
29
30
|
return 'yes';
|
|
30
|
-
if (
|
|
31
|
+
if (kind === 'absent' || kind === 'not_reported')
|
|
31
32
|
return 'no';
|
|
32
33
|
return 'unknown';
|
|
33
34
|
}
|
package/dist/skillsWireCaps.d.ts
CHANGED
|
@@ -21,4 +21,18 @@ export interface SkillSpecsOptions {
|
|
|
21
21
|
skillToolLists?: SkillToolListsReading;
|
|
22
22
|
}
|
|
23
23
|
export declare function skillBaseDirOf(skillRoot: string | undefined, platform?: 'posix' | 'win32'): string | undefined;
|
|
24
|
+
export type SkillToolListKey = 'allowedTools' | 'disallowedTools';
|
|
25
|
+
export type SkillToolListsVerdict = {
|
|
26
|
+
readonly kind: 'ok';
|
|
27
|
+
readonly lists: {
|
|
28
|
+
allowedTools?: string[];
|
|
29
|
+
disallowedTools?: string[];
|
|
30
|
+
};
|
|
31
|
+
} | {
|
|
32
|
+
readonly kind: 'bad';
|
|
33
|
+
readonly key: SkillToolListKey;
|
|
34
|
+
readonly index?: number;
|
|
35
|
+
readonly detail: string;
|
|
36
|
+
};
|
|
37
|
+
export declare function skillToolListsVerdict(source: object, reading: SkillToolListsReading | undefined): SkillToolListsVerdict;
|
|
24
38
|
export declare function skillCommandsToSpecs(cmds: SkillCmdLike[], resolveBody: (cmd: SkillCmdLike) => string | null, opts?: SkillSpecsOptions): SkillSpecOnWire[];
|
package/dist/skillsWireCaps.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { skillToolListsAvailable } from './skillToolListsCapability.js';
|
|
2
|
+
import { msg, renderMessage } from './i18n/translate.js';
|
|
3
|
+
import { appendOwnElement } from './ownKey.js';
|
|
2
4
|
export function toCappedSpec(name, description, whenToUse, body) {
|
|
3
5
|
const n = name.trim();
|
|
4
6
|
const c = body.trim();
|
|
@@ -27,14 +29,14 @@ export function skillBaseDirOf(skillRoot, platform = 'posix') {
|
|
|
27
29
|
return undefined;
|
|
28
30
|
return skillRoot;
|
|
29
31
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
+
const SKILL_TOOL_LIST_READ_BUDGET = 100_000;
|
|
33
|
+
function readSkillToolList(key, source) {
|
|
32
34
|
const hint = 'The list is the skill’s own tool rule list and is sent exactly as given (entries are never dropped, repaired, reordered or truncated here), ' +
|
|
33
35
|
'so a value that is not a list of strings is refused instead of being silently reduced.';
|
|
34
|
-
const unreadable = () => new TypeError(
|
|
36
|
+
const unreadable = () => new TypeError(`could not be read — reading it (the property, the array length or an entry) threw. ${hint}`);
|
|
35
37
|
let v;
|
|
36
38
|
try {
|
|
37
|
-
v =
|
|
39
|
+
v = source[key];
|
|
38
40
|
}
|
|
39
41
|
catch {
|
|
40
42
|
throw unreadable();
|
|
@@ -49,7 +51,7 @@ function readSkillToolList(skillName, key, cmd) {
|
|
|
49
51
|
throw unreadable();
|
|
50
52
|
}
|
|
51
53
|
if (!isArray) {
|
|
52
|
-
throw new TypeError(
|
|
54
|
+
throw new TypeError(`must be an array of strings or absent — got ${v === null ? 'null' : typeof v === 'object' ? 'a non-array object' : `typeof ${typeof v}`}. ${hint}`);
|
|
53
55
|
}
|
|
54
56
|
const list = v;
|
|
55
57
|
let lengthRead;
|
|
@@ -60,7 +62,10 @@ function readSkillToolList(skillName, key, cmd) {
|
|
|
60
62
|
throw unreadable();
|
|
61
63
|
}
|
|
62
64
|
if (typeof lengthRead !== 'number' || !Number.isSafeInteger(lengthRead) || lengthRead < 0 || lengthRead > 4_294_967_295) {
|
|
63
|
-
throw new TypeError(
|
|
65
|
+
throw new TypeError(`must be an array of strings or absent — its length is not a valid array length. ${hint}`);
|
|
66
|
+
}
|
|
67
|
+
if (lengthRead > SKILL_TOOL_LIST_READ_BUDGET) {
|
|
68
|
+
throw new TypeError(renderMessage(msg('config.skills.toolListTooMany', { got: String(SKILL_TOOL_LIST_READ_BUDGET) })));
|
|
64
69
|
}
|
|
65
70
|
const n = lengthRead;
|
|
66
71
|
const out = [];
|
|
@@ -73,18 +78,45 @@ function readSkillToolList(skillName, key, cmd) {
|
|
|
73
78
|
throw unreadable();
|
|
74
79
|
}
|
|
75
80
|
if (typeof e !== 'string') {
|
|
76
|
-
throw new TypeError(
|
|
81
|
+
throw Object.assign(new TypeError(`must be an array of strings or absent — the entry at index ${i} is ${e === null ? 'null' : `typeof ${typeof e}`}. ${hint}`), { index: i });
|
|
77
82
|
}
|
|
78
|
-
out
|
|
83
|
+
appendOwnElement(out, e);
|
|
79
84
|
}
|
|
80
85
|
return out;
|
|
81
86
|
}
|
|
87
|
+
function refusalOf(e, key) {
|
|
88
|
+
const index = e.index;
|
|
89
|
+
return { kind: 'bad', key, ...(typeof index === 'number' ? { index } : {}), detail: e.message };
|
|
90
|
+
}
|
|
91
|
+
export function skillToolListsVerdict(source, reading) {
|
|
92
|
+
if (reading === undefined)
|
|
93
|
+
return { kind: 'ok', lists: {} };
|
|
94
|
+
let allowedTools;
|
|
95
|
+
let disallowedTools;
|
|
96
|
+
try {
|
|
97
|
+
allowedTools = readSkillToolList('allowedTools', source);
|
|
98
|
+
}
|
|
99
|
+
catch (e) {
|
|
100
|
+
return refusalOf(e, 'allowedTools');
|
|
101
|
+
}
|
|
102
|
+
try {
|
|
103
|
+
disallowedTools = readSkillToolList('disallowedTools', source);
|
|
104
|
+
}
|
|
105
|
+
catch (e) {
|
|
106
|
+
return refusalOf(e, 'disallowedTools');
|
|
107
|
+
}
|
|
108
|
+
const toolListsOn = skillToolListsAvailable(reading ?? { kind: 'unobserved' }) === 'yes';
|
|
109
|
+
const lists = {};
|
|
110
|
+
if (toolListsOn && allowedTools !== undefined)
|
|
111
|
+
lists.allowedTools = allowedTools;
|
|
112
|
+
if (toolListsOn && disallowedTools !== undefined)
|
|
113
|
+
lists.disallowedTools = disallowedTools;
|
|
114
|
+
return { kind: 'ok', lists };
|
|
115
|
+
}
|
|
82
116
|
export function skillCommandsToSpecs(cmds, resolveBody, opts) {
|
|
83
117
|
const specs = [];
|
|
84
118
|
const seen = new Set();
|
|
85
119
|
const reading = opts?.skillToolLists;
|
|
86
|
-
const wired = reading !== undefined;
|
|
87
|
-
const toolListsOn = wired && skillToolListsAvailable(reading ?? { kind: 'unobserved' }) === 'yes';
|
|
88
120
|
for (const cmd of cmds) {
|
|
89
121
|
if (cmd.type !== 'prompt' || cmd.disableModelInvocation)
|
|
90
122
|
continue;
|
|
@@ -96,15 +128,14 @@ export function skillCommandsToSpecs(cmds, resolveBody, opts) {
|
|
|
96
128
|
continue;
|
|
97
129
|
seen.add(spec.name);
|
|
98
130
|
const baseDir = opts?.toolsRunHere === true ? skillBaseDirOf(cmd.skillRoot, opts.platform ?? 'posix') : undefined;
|
|
99
|
-
const
|
|
100
|
-
|
|
131
|
+
const verdict = skillToolListsVerdict(cmd, reading);
|
|
132
|
+
if (verdict.kind === 'bad') {
|
|
133
|
+
throw new TypeError(`skillCommandsToSpecs: skill ${JSON.stringify(spec.name.slice(0, 80))} ${verdict.key} ${verdict.detail}`);
|
|
134
|
+
}
|
|
101
135
|
let wire = spec;
|
|
102
136
|
if (baseDir !== undefined)
|
|
103
137
|
wire = { ...wire, baseDir };
|
|
104
|
-
|
|
105
|
-
wire = { ...wire, allowedTools };
|
|
106
|
-
if (toolListsOn && disallowedTools !== undefined)
|
|
107
|
-
wire = { ...wire, disallowedTools };
|
|
138
|
+
wire = { ...wire, ...verdict.lists };
|
|
108
139
|
specs.push(wire);
|
|
109
140
|
}
|
|
110
141
|
return specs;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Capabilities } from '@sema-agent/sdk';
|
|
2
|
+
import { SLASH_COMMAND_ROSTER_PIN, type SlashCommandBucket, type SlashCommandOverride, type SlashCommandPosture } from './slashCommandTable.js';
|
|
3
|
+
export { SLASH_COMMAND_ROSTER_PIN };
|
|
4
|
+
export type { SlashCommandBucket, SlashCommandOverride, SlashCommandPosture };
|
|
5
|
+
export declare const SLASH_COMMAND_BUCKETS: Readonly<Record<SlashCommandBucket, readonly string[]>>;
|
|
6
|
+
export type SlashCommandGateReason = 'cc-availability' | 'cc-isEnabled' | 'config-deny' | 'capability-absent' | 'capability-degraded' | 'hidden-from-help' | 'allowed';
|
|
7
|
+
export type SlashCommandGateState = 'allowed' | 'degraded' | 'denied';
|
|
8
|
+
export interface SlashCommandGateInput {
|
|
9
|
+
readonly name: string;
|
|
10
|
+
readonly source?: string;
|
|
11
|
+
readonly ccAvailable?: boolean;
|
|
12
|
+
readonly ccEnabled?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface SlashCommandVerdict {
|
|
15
|
+
readonly state: SlashCommandGateState;
|
|
16
|
+
readonly visible: boolean;
|
|
17
|
+
readonly degraded: boolean;
|
|
18
|
+
readonly hidden: boolean;
|
|
19
|
+
readonly reason: SlashCommandGateReason;
|
|
20
|
+
readonly requiredCapability?: string;
|
|
21
|
+
}
|
|
22
|
+
export declare function slashCommandBucketOf(name: string): SlashCommandBucket | undefined;
|
|
23
|
+
export declare function slashCommandOverrideOf(name: string): SlashCommandOverride | undefined;
|
|
24
|
+
export declare function judgeSlashCommand(command: SlashCommandGateInput, capabilities: Capabilities | undefined): SlashCommandVerdict;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { guardedRead, readOwnDataValue } from './ownKey.js';
|
|
2
|
+
import { SLASH_COMMAND_BUCKET_FLEET_NA, SLASH_COMMAND_BUCKET_MAPPABLE_TO_SDK, SLASH_COMMAND_BUCKET_POSTURE_TABLE, SLASH_COMMAND_BUCKET_PURE_UI, SLASH_COMMAND_OVERRIDE_ROWS, SLASH_COMMAND_ROSTER_PIN, } from './slashCommandTable.js';
|
|
3
|
+
export { SLASH_COMMAND_ROSTER_PIN };
|
|
4
|
+
export const SLASH_COMMAND_BUCKETS = Object.freeze({
|
|
5
|
+
pureUI: SLASH_COMMAND_BUCKET_PURE_UI,
|
|
6
|
+
mappableToSdk: SLASH_COMMAND_BUCKET_MAPPABLE_TO_SDK,
|
|
7
|
+
fleetNA: SLASH_COMMAND_BUCKET_FLEET_NA,
|
|
8
|
+
});
|
|
9
|
+
const BUCKET_INDEX = new Map([
|
|
10
|
+
...SLASH_COMMAND_BUCKET_PURE_UI.map((n) => [n, 'pureUI']),
|
|
11
|
+
...SLASH_COMMAND_BUCKET_MAPPABLE_TO_SDK.map((n) => [n, 'mappableToSdk']),
|
|
12
|
+
...SLASH_COMMAND_BUCKET_FLEET_NA.map((n) => [n, 'fleetNA']),
|
|
13
|
+
]);
|
|
14
|
+
const OVERRIDE_INDEX = new Map(SLASH_COMMAND_OVERRIDE_ROWS);
|
|
15
|
+
export function slashCommandBucketOf(name) {
|
|
16
|
+
return typeof name === 'string' ? BUCKET_INDEX.get(name) : undefined;
|
|
17
|
+
}
|
|
18
|
+
export function slashCommandOverrideOf(name) {
|
|
19
|
+
return typeof name === 'string' ? OVERRIDE_INDEX.get(name) : undefined;
|
|
20
|
+
}
|
|
21
|
+
function capabilityPresent(capabilities, key) {
|
|
22
|
+
try {
|
|
23
|
+
const v = guardedRead(() => readOwnDataValue(capabilities, key));
|
|
24
|
+
if (typeof v === 'boolean')
|
|
25
|
+
return v;
|
|
26
|
+
if (typeof v === 'string')
|
|
27
|
+
return v.length > 0;
|
|
28
|
+
if (Array.isArray(v))
|
|
29
|
+
return v.length > 0;
|
|
30
|
+
return Boolean(v);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function slot(input, key) {
|
|
37
|
+
return guardedRead(() => readOwnDataValue(input, key));
|
|
38
|
+
}
|
|
39
|
+
function verdict(state, hidden, reason, requiredCapability) {
|
|
40
|
+
return Object.freeze({
|
|
41
|
+
state,
|
|
42
|
+
visible: state !== 'denied',
|
|
43
|
+
degraded: state === 'degraded',
|
|
44
|
+
hidden,
|
|
45
|
+
reason,
|
|
46
|
+
...(requiredCapability !== undefined ? { requiredCapability } : {}),
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
export function judgeSlashCommand(command, capabilities) {
|
|
50
|
+
const rawName = slot(command, 'name');
|
|
51
|
+
const name = typeof rawName === 'string' ? rawName : '';
|
|
52
|
+
if (slot(command, 'ccAvailable') === false)
|
|
53
|
+
return verdict('denied', false, 'cc-availability');
|
|
54
|
+
if (slot(command, 'ccEnabled') === false)
|
|
55
|
+
return verdict('denied', false, 'cc-isEnabled');
|
|
56
|
+
const override = OVERRIDE_INDEX.get(name);
|
|
57
|
+
const bucket = BUCKET_INDEX.get(name);
|
|
58
|
+
const bucketPosture = (bucket !== undefined ? SLASH_COMMAND_BUCKET_POSTURE_TABLE[bucket] : undefined) ?? 'allow';
|
|
59
|
+
const explicit = override?.mode;
|
|
60
|
+
const mode = explicit === 'allow' || explicit === 'deny' ? explicit : bucketPosture;
|
|
61
|
+
if (mode === 'deny')
|
|
62
|
+
return verdict('denied', false, 'config-deny');
|
|
63
|
+
const source = slot(command, 'source');
|
|
64
|
+
const builtin = source === undefined || source === 'builtin';
|
|
65
|
+
const unbucketedFallthrough = builtin && bucket === undefined && explicit !== 'allow' && explicit !== 'deny';
|
|
66
|
+
const hidden = override?.hidden === true || unbucketedFallthrough;
|
|
67
|
+
const required = override?.requiredCapability;
|
|
68
|
+
if (required !== undefined && required !== '' && !capabilityPresent(capabilities, required)) {
|
|
69
|
+
if (override?.degradeWhenAbsent === true)
|
|
70
|
+
return verdict('degraded', hidden, 'capability-degraded', required);
|
|
71
|
+
return verdict('denied', false, 'capability-absent', required);
|
|
72
|
+
}
|
|
73
|
+
return verdict('allowed', hidden, hidden ? 'hidden-from-help' : 'allowed', required !== undefined && required !== '' ? required : undefined);
|
|
74
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare const SLASH_COMMAND_ROSTER_PIN = "CC 2.1.187";
|
|
2
|
+
export type SlashCommandBucket = 'pureUI' | 'mappableToSdk' | 'fleetNA';
|
|
3
|
+
export type SlashCommandPosture = 'allow' | 'deny';
|
|
4
|
+
export interface SlashCommandOverride {
|
|
5
|
+
readonly mode: 'allow' | 'deny' | 'auto';
|
|
6
|
+
readonly requiredCapability?: string;
|
|
7
|
+
readonly degradeWhenAbsent?: boolean;
|
|
8
|
+
readonly hidden?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare const SLASH_COMMAND_BUCKET_POSTURE_TABLE: Readonly<Record<SlashCommandBucket, SlashCommandPosture>>;
|
|
11
|
+
export declare const SLASH_COMMAND_BUCKET_PURE_UI: readonly string[];
|
|
12
|
+
export declare const SLASH_COMMAND_BUCKET_MAPPABLE_TO_SDK: readonly string[];
|
|
13
|
+
export declare const SLASH_COMMAND_BUCKET_FLEET_NA: readonly string[];
|
|
14
|
+
export declare const SLASH_COMMAND_OVERRIDE_ROWS: readonly (readonly [string, SlashCommandOverride])[];
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
export const SLASH_COMMAND_ROSTER_PIN = 'CC 2.1.187';
|
|
2
|
+
export const SLASH_COMMAND_BUCKET_POSTURE_TABLE = Object.freeze({
|
|
3
|
+
pureUI: 'allow',
|
|
4
|
+
mappableToSdk: 'allow',
|
|
5
|
+
fleetNA: 'deny',
|
|
6
|
+
});
|
|
7
|
+
export const SLASH_COMMAND_BUCKET_PURE_UI = Object.freeze([
|
|
8
|
+
'color', 'theme', 'tui', 'brief', 'scroll-speed', 'terminal-setup',
|
|
9
|
+
'help', 'exit', 'copy', 'export', 'diff', 'config',
|
|
10
|
+
'ide', 'add-dir', 'cd', 'powerup', 'feedback', 'btw',
|
|
11
|
+
'advisor', 'fast', 'effort', 'heapdump', 'version', 'stickers',
|
|
12
|
+
'keybindings', 'statusline', 'vim', 'install', 'passes', 'clear',
|
|
13
|
+
'recap',
|
|
14
|
+
]);
|
|
15
|
+
export const SLASH_COMMAND_BUCKET_MAPPABLE_TO_SDK = Object.freeze([
|
|
16
|
+
'init', 'init-verifiers', 'review', 'insights', 'team-onboarding', 'compact',
|
|
17
|
+
'context', 'resume', 'model', 'usage', 'cost', 'permissions',
|
|
18
|
+
'hooks', 'plan', 'memory', 'tasks', 'stop', 'workflows',
|
|
19
|
+
'skills', 'mcp', 'agents', 'plugin', 'reload-plugins', 'rename',
|
|
20
|
+
'branch', 'goal', 'commit-push-pr', 'import', 'explain-usage',
|
|
21
|
+
]);
|
|
22
|
+
export const SLASH_COMMAND_BUCKET_FLEET_NA = Object.freeze([
|
|
23
|
+
'files', 'think-back', 'thinkback-play', 'commit', 'login', 'logout',
|
|
24
|
+
'setup-bedrock', 'setup-vertex', 'upgrade', 'usage-credits', 'extra-usage', 'rate-limit-options',
|
|
25
|
+
'pro-trial-expired', 'desktop', 'session', 'teleport', 'remote-control', 'remote-env',
|
|
26
|
+
'web-setup', 'ultraplan', 'ultrareview', 'install-github-app', 'install-slack-app', 'design-login',
|
|
27
|
+
'autofix-pr', 'mobile', 'tag', 'privacy-settings',
|
|
28
|
+
]);
|
|
29
|
+
export const SLASH_COMMAND_OVERRIDE_ROWS = Object.freeze([
|
|
30
|
+
['status', { mode: 'allow' }],
|
|
31
|
+
['doctor', { mode: 'allow' }],
|
|
32
|
+
['rewind', { mode: 'allow' }],
|
|
33
|
+
['skill-doctor', { mode: 'allow' }],
|
|
34
|
+
['memory-capture', { mode: 'allow' }],
|
|
35
|
+
['init', { mode: 'auto' }],
|
|
36
|
+
['init-verifiers', { mode: 'auto' }],
|
|
37
|
+
['review', { mode: 'auto' }],
|
|
38
|
+
['insights', { mode: 'auto' }],
|
|
39
|
+
['team-onboarding', { mode: 'auto' }],
|
|
40
|
+
['compact', { mode: 'auto', degradeWhenAbsent: true }],
|
|
41
|
+
['context', { mode: 'auto', degradeWhenAbsent: true }],
|
|
42
|
+
['resume', { mode: 'auto', requiredCapability: 'asyncRuns', degradeWhenAbsent: true }],
|
|
43
|
+
['tasks', { mode: 'auto', requiredCapability: 'asyncRuns' }],
|
|
44
|
+
['stop', { mode: 'auto', requiredCapability: 'asyncRuns' }],
|
|
45
|
+
['workflows', { mode: 'auto', requiredCapability: 'asyncRuns' }],
|
|
46
|
+
['usage', { mode: 'auto', requiredCapability: 'pricingConfigured', degradeWhenAbsent: true }],
|
|
47
|
+
['cost', { mode: 'auto', requiredCapability: 'pricingConfigured', degradeWhenAbsent: true }],
|
|
48
|
+
['stats', { mode: 'allow' }],
|
|
49
|
+
['vim', { mode: 'auto', hidden: true }],
|
|
50
|
+
['statusline', { mode: 'auto', hidden: true }],
|
|
51
|
+
['permissions', { mode: 'auto', requiredCapability: 'approvals', degradeWhenAbsent: true }],
|
|
52
|
+
['plan', { mode: 'auto', requiredCapability: 'approvals', degradeWhenAbsent: true }],
|
|
53
|
+
['goal', { mode: 'auto', requiredCapability: 'approvals', degradeWhenAbsent: true }],
|
|
54
|
+
['hooks', { mode: 'auto', degradeWhenAbsent: true }],
|
|
55
|
+
['memory', { mode: 'auto', requiredCapability: 'memory' }],
|
|
56
|
+
['model', { mode: 'auto' }],
|
|
57
|
+
['skills', { mode: 'auto', degradeWhenAbsent: true }],
|
|
58
|
+
['mcp', { mode: 'auto', degradeWhenAbsent: true }],
|
|
59
|
+
['agents', { mode: 'auto', degradeWhenAbsent: true }],
|
|
60
|
+
['plugin', { mode: 'auto', degradeWhenAbsent: true }],
|
|
61
|
+
['reload-plugins', { mode: 'auto', degradeWhenAbsent: true }],
|
|
62
|
+
['rename', { mode: 'auto', degradeWhenAbsent: true }],
|
|
63
|
+
['branch', { mode: 'auto', degradeWhenAbsent: true }],
|
|
64
|
+
['loops', { mode: 'deny' }],
|
|
65
|
+
['update', { mode: 'deny' }],
|
|
66
|
+
['collab', { mode: 'allow' }],
|
|
67
|
+
['websearch', { mode: 'allow' }],
|
|
68
|
+
['import', { mode: 'auto' }],
|
|
69
|
+
['explain-usage', { mode: 'auto' }],
|
|
70
|
+
['mobile', { mode: 'deny' }],
|
|
71
|
+
['tag', { mode: 'deny' }],
|
|
72
|
+
['files', { mode: 'deny' }],
|
|
73
|
+
['privacy-settings', { mode: 'deny' }],
|
|
74
|
+
['think-back', { mode: 'deny' }],
|
|
75
|
+
['thinkback-play', { mode: 'deny' }],
|
|
76
|
+
['commit', { mode: 'deny' }],
|
|
77
|
+
['login', { mode: 'deny' }],
|
|
78
|
+
['logout', { mode: 'deny' }],
|
|
79
|
+
['setup-bedrock', { mode: 'deny' }],
|
|
80
|
+
['setup-vertex', { mode: 'deny' }],
|
|
81
|
+
['upgrade', { mode: 'deny' }],
|
|
82
|
+
['usage-credits', { mode: 'deny' }],
|
|
83
|
+
['extra-usage', { mode: 'deny' }],
|
|
84
|
+
['rate-limit-options', { mode: 'allow' }],
|
|
85
|
+
['pro-trial-expired', { mode: 'deny' }],
|
|
86
|
+
['desktop', { mode: 'deny' }],
|
|
87
|
+
['session', { mode: 'deny' }],
|
|
88
|
+
['teleport', { mode: 'deny' }],
|
|
89
|
+
['remote-control', { mode: 'deny' }],
|
|
90
|
+
['remote-env', { mode: 'deny' }],
|
|
91
|
+
['web-setup', { mode: 'deny' }],
|
|
92
|
+
['ultraplan', { mode: 'deny' }],
|
|
93
|
+
['ultrareview', { mode: 'deny' }],
|
|
94
|
+
['install-github-app', { mode: 'deny' }],
|
|
95
|
+
['install-slack-app', { mode: 'deny' }],
|
|
96
|
+
['design-login', { mode: 'deny' }],
|
|
97
|
+
['autofix-pr', { mode: 'deny' }],
|
|
98
|
+
['daemon', { mode: 'allow', requiredCapability: 'asyncRuns', degradeWhenAbsent: true }],
|
|
99
|
+
]);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { capForDisplay } from './fleetTaskDesc.js';
|
|
2
|
-
import {
|
|
2
|
+
import { engineWireTargetBaseUrl } from './engineWireTarget.js';
|
|
3
3
|
import { storeSeatOf, createEngineCapReader, unreadableReadingDetail } from './engineCapReader.js';
|
|
4
4
|
import { ownDataField } from './ownKey.js';
|
|
5
5
|
export function projectSqlEngineCapability(caps) {
|
|
@@ -40,7 +40,7 @@ const reader = createEngineCapReader({
|
|
|
40
40
|
name: 'sql',
|
|
41
41
|
project: projectSqlEngineCapability,
|
|
42
42
|
});
|
|
43
|
-
export function observedSqlEngine(baseUrl =
|
|
43
|
+
export function observedSqlEngine(baseUrl = engineWireTargetBaseUrl()) {
|
|
44
44
|
return reader.observed(baseUrl);
|
|
45
45
|
}
|
|
46
46
|
const SQL_DETAIL_MAX = 40;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { capForDisplay } from './fleetTaskDesc.js';
|
|
2
|
-
import {
|
|
2
|
+
import { engineWireTargetBaseUrl } from './engineWireTarget.js';
|
|
3
3
|
import { createEngineCapReader, unreadableReadingDetail } from './engineCapReader.js';
|
|
4
4
|
import { ownDataField } from './ownKey.js';
|
|
5
5
|
export function projectSteerPriorityCapability(caps) {
|
|
@@ -26,7 +26,7 @@ const reader = createEngineCapReader({
|
|
|
26
26
|
name: 'fleet.steerPriority',
|
|
27
27
|
project: projectSteerPriorityCapability,
|
|
28
28
|
});
|
|
29
|
-
export function observedSteerPriority(baseUrl =
|
|
29
|
+
export function observedSteerPriority(baseUrl = engineWireTargetBaseUrl()) {
|
|
30
30
|
return reader.observed(baseUrl);
|
|
31
31
|
}
|
|
32
32
|
export function steerPriorityMode(reading) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { capForDisplay } from './fleetTaskDesc.js';
|
|
2
|
-
import {
|
|
2
|
+
import { engineWireTargetBaseUrl } from './engineWireTarget.js';
|
|
3
3
|
import { storeSeatOf, createEngineCapReader, unreadableReadingDetail } from './engineCapReader.js';
|
|
4
4
|
import { projectSqlEngineCapability } from './sqlEngineCapability.js';
|
|
5
5
|
import { ownDataField } from './ownKey.js';
|
|
@@ -45,7 +45,7 @@ const reader = createEngineCapReader({
|
|
|
45
45
|
name: 'store',
|
|
46
46
|
project: projectStorePostureCapability,
|
|
47
47
|
});
|
|
48
|
-
export function observedStorePosture(baseUrl =
|
|
48
|
+
export function observedStorePosture(baseUrl = engineWireTargetBaseUrl()) {
|
|
49
49
|
return reader.observed(baseUrl);
|
|
50
50
|
}
|
|
51
51
|
function presentView(reading) {
|
|
@@ -4,7 +4,7 @@ function own(v, key) {
|
|
|
4
4
|
return undefined;
|
|
5
5
|
try {
|
|
6
6
|
const d = Object.getOwnPropertyDescriptor(v, key);
|
|
7
|
-
return d !== undefined && 'value'
|
|
7
|
+
return d !== undefined && Object.hasOwn(d, 'value') ? d.value : undefined;
|
|
8
8
|
}
|
|
9
9
|
catch {
|
|
10
10
|
return undefined;
|