Skip to content
Next — unreleased

Defined in: packages/sage/src/internal/c4/character.ts:158

SDK-owned decoded Character data.

declare const character: CharacterAccountData;
const atlas = character.atlas;

readonly atlas: number;

Defined in: packages/sage/src/internal/c4/character.ts:169

readonly atlasRaw: bigint;

Defined in: packages/sage/src/internal/c4/character.ts:168

readonly bump: number;

Defined in: packages/sage/src/internal/c4/character.ts:162

readonly checkIn: {
lastCheckInTime: bigint;
streak: number;
};

Defined in: packages/sage/src/internal/c4/character.ts:163

readonly lastCheckInTime: bigint;
readonly streak: number;

readonly counts: {
claimStakes: number;
craftingHabs: number;
fleets: number;
};

Defined in: packages/sage/src/internal/c4/character.ts:170

readonly claimStakes: number;
readonly craftingHabs: number;
readonly fleets: number;

readonly game: Address;

Defined in: packages/sage/src/internal/c4/character.ts:161

readonly modifiers: CharacterModifiersData;

Defined in: packages/sage/src/internal/c4/character.ts:181

readonly pilotXpBudget: {
available: number;
fractionalCarry: number;
fractionalCarryRaw: bigint;
lastAccrualTime: bigint;
};

Defined in: packages/sage/src/internal/c4/character.ts:175

readonly available: number;
readonly fractionalCarry: number;
readonly fractionalCarryRaw: bigint;
readonly lastAccrualTime: bigint;

readonly playerProfile: Address;

Defined in: packages/sage/src/internal/c4/character.ts:160

readonly version: number;

Defined in: packages/sage/src/internal/c4/character.ts:159

readonly xp: CharacterXpData;

Defined in: packages/sage/src/internal/c4/character.ts:167


Defined in: packages/sage/src/internal/c4/character.ts:98

SDK-owned translation of Character modifier values.

declare const modifiers: CharacterModifierData;
const shipCapacityPerFleet = modifiers.fleetSize;
const maximumFleetCount = modifiers.fleetConcurrency;

readonly cargoCategories: readonly number[];

Defined in: packages/sage/src/internal/c4/character.ts:129

readonly craftingEfficiencyModifier: number;

Defined in: packages/sage/src/internal/c4/character.ts:111

readonly craftingEfficiencyModifierRaw: bigint;

Defined in: packages/sage/src/internal/c4/character.ts:112

readonly craftingJobConcurrencyBonus: number;

Defined in: packages/sage/src/internal/c4/character.ts:115

readonly craftingTimeModifier: number;

Defined in: packages/sage/src/internal/c4/character.ts:113

readonly craftingTimeModifierRaw: bigint;

Defined in: packages/sage/src/internal/c4/character.ts:114

readonly enemyFactionZoneAccess: boolean;

Defined in: packages/sage/src/internal/c4/character.ts:121

readonly fleetConcurrency: number;

Defined in: packages/sage/src/internal/c4/character.ts:100

readonly fleetSize: number;

Defined in: packages/sage/src/internal/c4/character.ts:99

readonly maxDailyStreakLength: number;

Defined in: packages/sage/src/internal/c4/character.ts:122

readonly maxProductivePlots: number;

Defined in: packages/sage/src/internal/c4/character.ts:119

readonly optional maxProductivePlotTier?: 1 | 5 | 2 | 4 | 3;

Defined in: packages/sage/src/internal/c4/character.ts:118

readonly maxResidentialPlots: number;

Defined in: packages/sage/src/internal/c4/character.ts:117

readonly optional maxResidentialPlotTier?: 1 | 5 | 2 | 4 | 3;

Defined in: packages/sage/src/internal/c4/character.ts:116

readonly maxShipSize: ShipSize;

Defined in: packages/sage/src/internal/c4/character.ts:123

readonly rareMineralDiscovery: readonly RareMineralDiscoveryData[];

Defined in: packages/sage/src/internal/c4/character.ts:130

readonly researchTags: readonly number[];

Defined in: packages/sage/src/internal/c4/character.ts:128

readonly respawnTimeModifier: number;

Defined in: packages/sage/src/internal/c4/character.ts:101

readonly respawnTimeModifierRaw: bigint;

Defined in: packages/sage/src/internal/c4/character.ts:102

readonly scanCoolDownModifier: number;

Defined in: packages/sage/src/internal/c4/character.ts:126

readonly scanCoolDownModifierRaw: bigint;

Defined in: packages/sage/src/internal/c4/character.ts:127

readonly scanPowerModifier: number;

Defined in: packages/sage/src/internal/c4/character.ts:124

readonly scanPowerModifierRaw: bigint;

Defined in: packages/sage/src/internal/c4/character.ts:125

readonly securityZoneAccess: RiskZoneAccess;

Defined in: packages/sage/src/internal/c4/character.ts:120

readonly subwarpSpeedModifier: number;

Defined in: packages/sage/src/internal/c4/character.ts:107

readonly subwarpSpeedModifierRaw: bigint;

Defined in: packages/sage/src/internal/c4/character.ts:108

readonly warpCooldownModifier: number;

Defined in: packages/sage/src/internal/c4/character.ts:109

readonly warpCooldownModifierRaw: bigint;

Defined in: packages/sage/src/internal/c4/character.ts:110

readonly warpLaneFeeModifier: number;

Defined in: packages/sage/src/internal/c4/character.ts:103

readonly warpLaneFeeModifierRaw: bigint;

Defined in: packages/sage/src/internal/c4/character.ts:104

readonly warpSpeedModifier: number;

Defined in: packages/sage/src/internal/c4/character.ts:105

readonly warpSpeedModifierRaw: bigint;

Defined in: packages/sage/src/internal/c4/character.ts:106


Defined in: packages/sage/src/internal/c4/character.ts:140

SDK-owned Character modifier state from the Character account.

declare const modifiers: CharacterModifiersData;
const nodes = modifiers.unlockedNodes;

readonly nodeLevels: readonly {
level: number;
nodeId: number;
}[];

Defined in: packages/sage/src/internal/c4/character.ts:144

readonly seqId: number;

Defined in: packages/sage/src/internal/c4/character.ts:141

readonly unlockedNodes: readonly number[];

Defined in: packages/sage/src/internal/c4/character.ts:143

readonly unupdatedCount: number;

Defined in: packages/sage/src/internal/c4/character.ts:142

readonly values: CharacterModifierData;

Defined in: packages/sage/src/internal/c4/character.ts:148


Defined in: packages/sage/src/identity/index.ts:144

Character XP and pilot state joined to sequence-matched Game XP rules.

declare const ctx: SageContext;
declare const profileAddress: Address;
const progression: CharacterProgressionSnapshot =
await getCharacterProgressionForProfile(ctx, profileAddress);
console.log(progression.xp.pilot.level);

readonly character: EntityRef<"character">;

Defined in: packages/sage/src/identity/index.ts:146

readonly kind: "characterProgression";

Defined in: packages/sage/src/identity/index.ts:145

readonly pilotXpBudget: {
available: number;
fractionalCarry: number;
fractionalCarryRaw: bigint;
lastAccrualTime: bigint;
};

Defined in: packages/sage/src/identity/index.ts:148

readonly available: number;
readonly fractionalCarry: number;
readonly fractionalCarryRaw: bigint;
readonly lastAccrualTime: bigint;

readonly xp: CharacterXpData;

Defined in: packages/sage/src/identity/index.ts:147

readonly xpDefinitions: GameXpDefinitionsSectionData;

Defined in: packages/sage/src/identity/index.ts:149

toJSON(): unknown;

Defined in: packages/sage/src/identity/index.ts:150

unknown


Defined in: packages/sage/src/identity/research-state.ts:22

Display balances derived from one Character, not research purchase eligibility. Sequences describe the input; no current Game definitions are consulted.

declare const state: CharacterResearchState;
console.log(state.careers.mining.researchPointsAvailable, state.renown.available);

readonly careers: Readonly<Record<typeof careers[number], {
earnedXp: bigint;
level: number;
researchPointsAvailable: bigint;
researchPointsSpent: bigint;
}>>;

Defined in: packages/sage/src/identity/research-state.ts:27

readonly characterAddress: Address;

Defined in: packages/sage/src/identity/research-state.ts:23

readonly nodes: readonly {
level: number;
nodeId: number;
}[];

Defined in: packages/sage/src/identity/research-state.ts:48

Acquired nodes only. Stored levels are reported as-is, including 0; only a missing entry defaults to 1. This preserves observed state rather than applying the official client’s minimum-1 sync-step estimate.

readonly pendingNodeUpdates: number;

Defined in: packages/sage/src/identity/research-state.ts:26

readonly renown: {
available: bigint;
careerLevelCarry: number;
earned: bigint;
level: number;
spent: bigint;
};

Defined in: packages/sage/src/identity/research-state.ts:38

readonly available: bigint;
readonly careerLevelCarry: number;
readonly earned: bigint;
readonly level: number;
readonly spent: bigint;

readonly researchSequenceId: number;

Defined in: packages/sage/src/identity/research-state.ts:25

readonly xpSequenceId: number;

Defined in: packages/sage/src/identity/research-state.ts:24

toJSON(): unknown;

Defined in: packages/sage/src/identity/research-state.ts:52

unknown


Defined in: packages/sage/src/identity/index.ts:123

Immutable Character snapshot derived from a Player Profile and Game.

declare const ctx: SageContext;
declare const profileAddress: Address;
const character: CharacterSnapshot = await getCharacterForProfile(ctx, profileAddress);
console.log(character.profile.address);

readonly address: Address;

Defined in: packages/sage/src/identity/index.ts:128

readonly atlas: number;

Defined in: packages/sage/src/internal/c4/character.ts:169

CharacterAccountData.atlas

readonly atlasRaw: bigint;

Defined in: packages/sage/src/internal/c4/character.ts:168

CharacterAccountData.atlasRaw

readonly bump: number;

Defined in: packages/sage/src/internal/c4/character.ts:162

CharacterAccountData.bump

readonly checkIn: {
lastCheckInTime: bigint;
streak: number;
};

Defined in: packages/sage/src/internal/c4/character.ts:163

readonly lastCheckInTime: bigint;
readonly streak: number;

CharacterAccountData.checkIn

readonly counts: {
claimStakes: number;
craftingHabs: number;
fleets: number;
};

Defined in: packages/sage/src/internal/c4/character.ts:170

readonly claimStakes: number;
readonly craftingHabs: number;
readonly fleets: number;

CharacterAccountData.counts

readonly game: Address;

Defined in: packages/sage/src/internal/c4/character.ts:161

CharacterAccountData.game

readonly kind: "character";

Defined in: packages/sage/src/identity/index.ts:127

readonly modifiers: CharacterModifiersData;

Defined in: packages/sage/src/internal/c4/character.ts:181

CharacterAccountData.modifiers

readonly pilotXpBudget: {
available: number;
fractionalCarry: number;
fractionalCarryRaw: bigint;
lastAccrualTime: bigint;
};

Defined in: packages/sage/src/internal/c4/character.ts:175

readonly available: number;
readonly fractionalCarry: number;
readonly fractionalCarryRaw: bigint;
readonly lastAccrualTime: bigint;

CharacterAccountData.pilotXpBudget

readonly profile: EntityRef<"profile">;

Defined in: packages/sage/src/identity/index.ts:129

readonly version: number;

Defined in: packages/sage/src/internal/c4/character.ts:159

CharacterAccountData.version

readonly xp: CharacterXpData;

Defined in: packages/sage/src/internal/c4/character.ts:167

CharacterAccountData.xp

toJSON(): unknown;

Defined in: packages/sage/src/identity/index.ts:130

unknown


Defined in: packages/sage/src/internal/c4/character.ts:27

SDK-owned XP values for one Character category.

declare const category: CharacterXpCategoryData;
const level = category.level;

readonly earned: bigint;

Defined in: packages/sage/src/internal/c4/character.ts:29

readonly level: number;

Defined in: packages/sage/src/internal/c4/character.ts:30

readonly spent: bigint;

Defined in: packages/sage/src/internal/c4/character.ts:28


Defined in: packages/sage/src/internal/c4/character.ts:40

SDK-owned Character XP state.

declare const xp: CharacterXpData;
const pilotLevel = xp.pilot.level;

readonly building: CharacterXpCategoryData;

Defined in: packages/sage/src/internal/c4/character.ts:47

readonly combat: CharacterXpCategoryData;

Defined in: packages/sage/src/internal/c4/character.ts:49

readonly councilRank: CharacterXpCategoryData;

Defined in: packages/sage/src/internal/c4/character.ts:42

readonly councilRankLevelCarry: number;

Defined in: packages/sage/src/internal/c4/character.ts:50

readonly crafting: CharacterXpCategoryData;

Defined in: packages/sage/src/internal/c4/character.ts:48

readonly dailyXp: CharacterXpCategoryData;

Defined in: packages/sage/src/internal/c4/character.ts:43

readonly dataRunner: CharacterXpCategoryData;

Defined in: packages/sage/src/internal/c4/character.ts:45

readonly mining: CharacterXpCategoryData;

Defined in: packages/sage/src/internal/c4/character.ts:46

readonly pilot: CharacterXpCategoryData;

Defined in: packages/sage/src/internal/c4/character.ts:44

readonly seqId: number;

Defined in: packages/sage/src/internal/c4/character.ts:41


Defined in: packages/sage/src/internal/c4/identity.ts:54

SDK-owned decoded Player Profile data.

declare const profile: ProfileAccountData;
const keys = profile.keys;

readonly authKeyCount: number;

Defined in: packages/sage/src/internal/c4/identity.ts:56

readonly createdAt: bigint;

Defined in: packages/sage/src/internal/c4/identity.ts:59

readonly keys: readonly ProfileKeyData[];

Defined in: packages/sage/src/internal/c4/identity.ts:60

readonly keyThreshold: number;

Defined in: packages/sage/src/internal/c4/identity.ts:57

readonly nextSeqId: bigint;

Defined in: packages/sage/src/internal/c4/identity.ts:58

readonly version: number;

Defined in: packages/sage/src/internal/c4/identity.ts:55


Defined in: packages/sage/src/internal/c4/identity.ts:38

SDK-owned representation of one Player Profile key.

declare const key: ProfileKeyData;
const expiresAt = key.expiresAt;

readonly address: Address;

Defined in: packages/sage/src/internal/c4/identity.ts:39

readonly optional expiresAt?: bigint;

Defined in: packages/sage/src/internal/c4/identity.ts:42

readonly expiresAtRaw: bigint;

Defined in: packages/sage/src/internal/c4/identity.ts:41

readonly permissions: readonly ProfilePermission[];

Defined in: packages/sage/src/internal/c4/identity.ts:44

readonly permissionsRaw: bigint;

Defined in: packages/sage/src/internal/c4/identity.ts:43

readonly scope: Address;

Defined in: packages/sage/src/internal/c4/identity.ts:40


Defined in: packages/sage/src/identity/permissions.ts:194

Immutable diagnostics for one original Profile key, never a selected authority. A match is advisory, not chain authorization; unknown requirements are indeterminate.

declare const candidate: ProfileKeyInspection;
console.log(candidate.keyIndex, candidate.status, candidate.diagnostics);

readonly address: Address;

Defined in: packages/sage/src/identity/permissions.ts:196

readonly diagnostics: readonly ProfileKeyDiagnostic[];

Defined in: packages/sage/src/identity/permissions.ts:203

readonly expired: boolean;

Defined in: packages/sage/src/identity/permissions.ts:202

readonly optional expiresAt?: bigint;

Defined in: packages/sage/src/identity/permissions.ts:201

readonly expiresAtRaw: bigint;

Defined in: packages/sage/src/identity/permissions.ts:200

readonly isProfileAuthority: boolean;

Defined in: packages/sage/src/identity/permissions.ts:199

readonly keyIndex: number;

Defined in: packages/sage/src/identity/permissions.ts:195

readonly permissionsRaw: bigint;

Defined in: packages/sage/src/identity/permissions.ts:198

readonly scope: Address;

Defined in: packages/sage/src/identity/permissions.ts:197

readonly status: "match" | "mismatch" | "indeterminate";

Defined in: packages/sage/src/identity/permissions.ts:204

toJSON(): unknown;

Defined in: packages/sage/src/identity/permissions.ts:205

unknown


Defined in: packages/sage/src/identity/permissions.ts:168

Explicit direct-key requirement evaluated only at the caller’s supplied time.

declare const signer: Address;
const requirement: ProfileKeyRequirement = {signer, scope: PROFILE_PERMISSION_SCOPE, permissionsRaw: 4n, at: 100n};

readonly at: bigint;

Defined in: packages/sage/src/identity/permissions.ts:172

readonly permissionsRaw: bigint;

Defined in: packages/sage/src/identity/permissions.ts:171

readonly scope: Address;

Defined in: packages/sage/src/identity/permissions.ts:170

readonly signer: Address;

Defined in: packages/sage/src/identity/permissions.ts:169


Defined in: packages/sage/src/identity/permissions.ts:129

Immutable scoped permission meanings with all raw bits retained.

const inspection: ProfilePermissionInspection = inspectProfilePermissions(PROFILE_PERMISSION_SCOPE, 1n);

readonly permissions: readonly ProfilePermission[];

Defined in: packages/sage/src/identity/permissions.ts:132

readonly permissionsRaw: bigint;

Defined in: packages/sage/src/identity/permissions.ts:131

readonly scope: Address;

Defined in: packages/sage/src/identity/permissions.ts:130

readonly unrecognizedBitsRaw: bigint;

Defined in: packages/sage/src/identity/permissions.ts:133

toJSON(): unknown;

Defined in: packages/sage/src/identity/permissions.ts:134

unknown


Defined in: packages/sage/src/identity/index.ts:107

Immutable, translated Player Profile snapshot.

declare const ctx: SageContext;
declare const profileAddress: Address;
const profile: ProfileSnapshot = await getProfile(ctx, profileAddress);
console.log(profile.address, profile.keys.length);

readonly address: Address;

Defined in: packages/sage/src/identity/index.ts:109

readonly authKeyCount: number;

Defined in: packages/sage/src/internal/c4/identity.ts:56

ProfileAccountData.authKeyCount

readonly createdAt: bigint;

Defined in: packages/sage/src/internal/c4/identity.ts:59

ProfileAccountData.createdAt

readonly keys: readonly ProfileKeyData[];

Defined in: packages/sage/src/internal/c4/identity.ts:60

ProfileAccountData.keys

readonly keyThreshold: number;

Defined in: packages/sage/src/internal/c4/identity.ts:57

ProfileAccountData.keyThreshold

readonly kind: "profile";

Defined in: packages/sage/src/identity/index.ts:108

readonly nextSeqId: bigint;

Defined in: packages/sage/src/internal/c4/identity.ts:58

ProfileAccountData.nextSeqId

readonly version: number;

Defined in: packages/sage/src/internal/c4/identity.ts:55

ProfileAccountData.version

toJSON(): unknown;

Defined in: packages/sage/src/identity/index.ts:110

unknown


Defined in: packages/sage/src/internal/c4/character.ts:84

One translated cargo-specific research modifier.

declare const discovery: RareMineralDiscoveryData;
const multiplier = discovery.multiplier;

readonly cargoId: number;

Defined in: packages/sage/src/internal/c4/character.ts:85

readonly multiplier: number;

Defined in: packages/sage/src/internal/c4/character.ts:86

readonly multiplierRaw: bigint;

Defined in: packages/sage/src/internal/c4/character.ts:87


Defined in: packages/sage/src/identity/index.ts:162

Independent Game research catalog without Character perk or unlock claims.

declare const ctx: SageContext;
const catalog: ResearchCatalogSnapshot = await getResearchCatalog(ctx);
console.log(catalog.nodes.length);

readonly game: EntityRef<"game">;

Defined in: packages/sage/src/identity/index.ts:164

readonly kind: "researchCatalog";

Defined in: packages/sage/src/identity/index.ts:163

readonly nodes: readonly GameResearchNodeData[];

Defined in: packages/sage/src/identity/index.ts:165

readonly sequenceId: number;

Defined in: packages/sage/src/identity/index.ts:166

toJSON(): unknown;

Defined in: packages/sage/src/identity/index.ts:167

unknown

type ProfileKeyDiagnostic =
| "address-mismatch"
| "scope-mismatch"
| "expired"
| "missing-permissions"
| "unrecognized-permissions";

Defined in: packages/sage/src/identity/permissions.ts:180

Reasons an inspected entry does not prove a direct scoped snapshot match.

const diagnostic: ProfileKeyDiagnostic = 'scope-mismatch';

type ProfilePermission =
| "authenticate"
| "addKeys"
| "removeKeys"
| "changeName"
| "createRole"
| "removeRole"
| "setAuthorizer"
| "joinRole"
| "leaveRole"
| "toggleAcceptingNewMembers"
| "addMember"
| "removeMember"
| "drainSolVault"
| "manageGame"
| "manageSystem"
| "manageStar"
| "managePlanet"
| "manageShip"
| "manageCharacter"
| "manageStarbase"
| "manageMineItem"
| "manageResource"
| "removeShipEscrow"
| "moveFleet"
| "undock"
| "dock"
| "rentFleet"
| "doCrafting"
| "manageCargoPod"
| "addRemoveCargo"
| "doStarbaseUpgrades"
| "manageFleet"
| "manageFleetCargo"
| "doMining"
| "respawn"
| "manageSurveyDataUnit"
| "scanSurveyDataUnit"
| "doStarbaseUpkeep"
| "manageProgression"
| "manageCrewConfig"
| "manageCrew"
| "withdrawCrew"
| "manageRegion"
| "manageCargo"
| "manageClaimStakeConfig"
| "manageCombat"
| "manageClaimStake"
| "manageCrafting"
| "engageInCombat"
| "repair"
| "manageScanning"
| "scan"
| "manageLocalMarketOrders"
| "doResearch"
| "dailyCheckIn"
| "manageCurrency"
| "manageMissions"
| "doGovernance"
| "manageMissionTreasuries";

Defined in: packages/sage/src/internal/c4/profile-permissions.ts:16

Stable labels for recognized scoped permissions carried by Profile keys. Profile and SAGE meanings require their exact supported program scope.

const permission: ProfilePermission = 'authenticate';

type ResearchNodeDefinition = GameResearchNodeData;

Defined in: packages/sage/src/identity/index.ts:95

One Game research node definition with no claimed player unlock state.

declare const node: ResearchNodeDefinition;
console.log(node.name, node.maxLevel);

type RiskZoneAccess = "low" | "medium" | "high";

Defined in: packages/sage/src/internal/c4/character.ts:75

Stable risk-zone labels translated from generated numeric enums.

const access: RiskZoneAccess = 'low';

type ShipSize =
| "xx-small"
| "x-small"
| "small"
| "medium"
| "large"
| "capital"
| "commander"
| "titan";

Defined in: packages/sage/src/internal/c4/character.ts:59

Stable ship-size labels translated from generated numeric enums.

const size: ShipSize = 'medium';

type WalletProfileDiscoveryOptions =
| Omit<ReadOptions, "maxAgeMs" | "refresh"> & {
addresses: readonly Address[];
strategy: "known-addresses";
}
| Omit<ReadOptions, "maxAgeMs" | "refresh"> & {
addresses?: never;
strategy: "provider";
};

Defined in: packages/sage/src/identity/index.ts:185

Explicit strategy and read controls for wallet-to-Profile discovery.

Known addresses and provider hints follow the same direct on-chain validation path. The strategy is required so callers never mistake a known application mapping for provider discovery.

declare const profileAddress: Address;
const options: WalletProfileDiscoveryOptions = {
strategy: 'known-addresses',
addresses: [profileAddress],
};

type XpCategory = GameXpCategory;

Defined in: packages/sage/src/identity/index.ts:68

Stable gameplay label for one Game XP category.

const category: XpCategory = 'pilot';

type XpDefinitions = GameXpDefinitionsSectionData;

Defined in: packages/sage/src/identity/index.ts:86

Sequence-versioned Game XP rules joined to Character XP.

declare const definitions: XpDefinitions;
console.log(definitions.sequenceId);

type XpLevelThreshold = GameXpLevelThresholdData;

Defined in: packages/sage/src/identity/index.ts:77

Exact XP thresholds for one level across every category.

declare const threshold: XpLevelThreshold;
console.log(threshold.pilot);

const PROFILE_PERMISSION_SCOPE: Address = PROFILE_SCOPE;

Defined in: packages/sage/src/identity/permissions.ts:19

Pinned supported Player Profile program scope, where bit zero means AUTH.

const mask = composeProfilePermissions(PROFILE_PERMISSION_SCOPE, ['authenticate']);

const SAGE_PERMISSION_SCOPE: Address = SAGE_SCOPE;

Defined in: packages/sage/src/identity/permissions.ts:28

Pinned supported SAGE program scope, where bit zero means manageGame. Recognized names describe bits, not complete action authorization policies.

const mask = composeProfilePermissions(SAGE_PERMISSION_SCOPE, ['moveFleet']);

function composeProfilePermissions(scope, names): bigint;

Defined in: packages/sage/src/identity/permissions.ts:67

Compose only verified names under an explicit scope. Empty input returns zero. Profile and SAGE names require their exact supported program scope; drainSolVault is recognized across scopes. Names identify verified bits, not complete action authorization policies. No default authority mask is added.

ParameterType
scopeAddress
namesreadonly ProfilePermission[]

bigint

const raw = composeProfilePermissions(PROFILE_PERMISSION_SCOPE, ['addKeys', 'removeKeys']);

function containsProfilePermissions(availableRaw, requiredRaw): boolean;

Defined in: packages/sage/src/identity/permissions.ts:115

Numeric bit containment only, including unknown bits; this is not authorization. Callers must track the scope each mask belongs to; this pure bit operation neither checks scope compatibility nor interprets permission meanings.

ParameterType
availableRawbigint
requiredRawbigint

boolean

const contains = containsProfilePermissions(6n, 4n);

function deriveCharacterResearchState(character): CharacterResearchState;

Defined in: packages/sage/src/identity/research-state.ts:79

Projects stored XP, career research points, Renown and acquired nodes without I/O, mutation, or a separate cache. Career points use level minus spent; Renown uses earned minus spent. Daily XP is not a career and is excluded. Balances clamp at zero; bigint values serialize as decimal strings.

Input must be an SDK-loaded Character. The result reflects that read’s state, not necessarily current Game rules: compare researchSequenceId with the catalog sequence and require pendingNodeUpdates === 0 before treating perks as synchronized. Use getCharacterProgressionForProfile for the optional sequence-matched XP-definition join. This helper does not authorize research.

ParameterType
characterPick<CharacterSnapshot, "address" | "xp" | "modifiers">

CharacterResearchState

declare const ctx: SageContext;
declare const profileAddress: Address;
const character = await getCharacterForProfile(ctx, profileAddress);
const state = deriveCharacterResearchState(character);
console.log(state.careers.pilot.earnedXp, state.careers.pilot.level);
console.log(state.renown.available, state.nodes);

function getCharacterForProfile(
ctx,
profileAddress,
options?): Promise<CharacterSnapshot>;

Defined in: packages/sage/src/identity/index.ts:452

Derives and reads the Character associated with a known Player Profile.

ParameterType
ctxSageContext
profileAddressAddress
options?ReadOptions

Promise<CharacterSnapshot>

declare const ctx: SageContext;
declare const profileAddress: Address;
const character = await getCharacterForProfile(ctx, profileAddress);

function getCharacterProgressionForProfile(
ctx,
profileAddress,
options?): Promise<CharacterProgressionSnapshot>;

Defined in: packages/sage/src/identity/index.ts:371

Reads a derived Character and joins its XP state to matching Game rules.

The Profile-to-Character PDA remains the canonical discovery path. Game XP rules are loaded lazily and must carry the Character’s exact sequence id.

ParameterType
ctxSageContext
profileAddressAddress
options?ReadOptions

Promise<CharacterProgressionSnapshot>

declare const ctx: SageContext;
declare const profileAddress: Address;
const progression = await getCharacterProgressionForProfile(ctx, profileAddress);

function getCharactersForWallet(
ctx,
wallet,
options): Promise<readonly CharacterSnapshot[]>;

Defined in: packages/sage/src/identity/index.ts:639

Resolves wallet Profiles and derives every Character currently present for them.

The returned list preserves the wallet discovery strategy metadata. Profiles without a Character are omitted because Character creation is optional.

ParameterType
ctxSageContext
walletAddress
optionsWalletProfileDiscoveryOptions

Promise<readonly CharacterSnapshot[]>

declare const ctx: SageContext;
declare const wallet: Address;
const characters = await getCharactersForWallet(ctx, wallet, {
strategy: 'provider',
});

function getProfile(
ctx,
address,
options?): Promise<ProfileSnapshot>;

Defined in: packages/sage/src/identity/index.ts:349

Reads a required Player Profile by account address.

ParameterType
ctxSageContext
addressAddress
options?ReadOptions

Promise<ProfileSnapshot>

declare const ctx: SageContext;
declare const profileAddress: Address;
const profile = await getProfile(ctx, profileAddress);

function getProfilesForWallet(
ctx,
wallet,
options): Promise<readonly ProfileSnapshot[]>;

Defined in: packages/sage/src/identity/index.ts:511

Resolves and directly validates zero, one, or many Player Profiles for a wallet.

Provider and known-address results are address hints only. Every unique candidate is read through the context data plane, validated as a Player Profile, and checked for the requested wallet in its decoded key list. Stored matching keys are accepted regardless of expiry; consumers remain responsible for applying authorization policy to the returned key details. Missing candidates are treated as stale hints and omitted; a contradictory present Profile rejects the discovery.

ParameterType
ctxSageContext
walletAddress
optionsWalletProfileDiscoveryOptions

Promise<readonly ProfileSnapshot[]>

declare const ctx: SageContext;
declare const wallet: Address;
const profiles = await getProfilesForWallet(ctx, wallet, {
strategy: 'provider',
});

function getResearchCatalog(ctx): Promise<ResearchCatalogSnapshot>;

Defined in: packages/sage/src/identity/index.ts:395

Reads the Game research tree as an independent, context-cached catalog.

The result intentionally has no Character relation, unlock flags, perk state, or inferred player ownership. It also has no read metadata because the definitions registry does not expose an authoritative per-read envelope.

ParameterType
ctxSageContext

Promise<ResearchCatalogSnapshot>

declare const ctx: SageContext;
const catalog = await getResearchCatalog(ctx);

function inspectProfileKeys(profile, requirement): readonly ProfileKeyInspection[];

Defined in: packages/sage/src/identity/permissions.ts:221

Inspect every key against an exact scope, mask, direct signer and explicit time. No AUTH override, role/certificate delegation, threshold policy, RPC, wall clock, refresh or signer is used. All original indices remain visible; select an index explicitly for an existing planner and retain its freshness and simulation checks. Canonical expiresAtRaw controls expiry; negative values are permanent. A key remains unexpired at its exact expiry second and expires only when at is later.

ParameterType
profileProfileSnapshot
requirementProfileKeyRequirement

readonly ProfileKeyInspection[]

declare const profile: ProfileSnapshot;
declare const requirement: ProfileKeyRequirement;
const candidates = inspectProfileKeys(profile, requirement);
console.log(candidates.map(key => [key.keyIndex, key.status]));

function inspectProfilePermissions(scope, permissionsRaw): ProfilePermissionInspection;

Defined in: packages/sage/src/identity/permissions.ts:143

Inspect known meanings without discarding unrecognized raw bits.

ParameterType
scopeAddress
permissionsRawbigint

ProfilePermissionInspection

const inspection = inspectProfilePermissions(PROFILE_PERMISSION_SCOPE, 1n);
console.log(inspection.permissions, inspection.unrecognizedBitsRaw);

function maybeGetCharacterForProfile(
ctx,
profileAddress,
options?): Promise<
| CharacterSnapshot
| undefined>;

Defined in: packages/sage/src/identity/index.ts:475

Derives and optionally reads the Character for a known Player Profile.

ParameterType
ctxSageContext
profileAddressAddress
options?ReadOptions

Promise< | CharacterSnapshot | undefined>

declare const ctx: SageContext;
declare const profileAddress: Address;
const character = await maybeGetCharacterForProfile(ctx, profileAddress);

function maybeGetProfile(
ctx,
address,
options?): Promise<ProfileSnapshot | undefined>;

Defined in: packages/sage/src/identity/index.ts:430

Reads an optional Player Profile by account address.

ParameterType
ctxSageContext
addressAddress
options?ReadOptions

Promise<ProfileSnapshot | undefined>

declare const ctx: SageContext;
declare const profileAddress: Address;
const profile = await maybeGetProfile(ctx, profileAddress);

function unionProfilePermissionMasks(masks): bigint;

Defined in: packages/sage/src/identity/permissions.ts:99

Union exact raw masks, preserving unknown bits. Empty input returns zero. This is a pure bit operation. Callers must track the scope each mask belongs to; combining masks does not establish permission meanings or authorization.

ParameterType
masksreadonly bigint[]

bigint

const raw = unionProfilePermissionMasks([4n, 0n]);