@teleologyhi/him 0.7.0-alpha.0 → 1.1.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 +102 -2
- package/README.md +23 -11
- package/SPEC.md +15 -13
- package/dist/index.cjs +282 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +234 -9
- package/dist/index.d.ts +234 -9
- package/dist/index.js +181 -6
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import { ArchetypeModifier, BirthSignature, Axiom, CreatorSignature, LocalMaic, EmergentAxiomProposal, AxiomEvolutionResult, CreatorKeyring, HimRecord, ReincarnationRequest } from '@teleologyhi/maic';
|
|
3
|
-
export { ArchetypeModifier, Axiom, AxiomEvolutionResult, BirthSignature, EmergentAxiomProposal } from '@teleologyhi/maic';
|
|
2
|
+
import { ArchetypeModifier, NatalChart, IdentityLayer, BirthSignature, BirthSignatureWithIdentity, Axiom, CreatorSignature, LocalMaic, EmergentAxiomProposal, AxiomEvolutionResult, ProjectKernelOptions, OntologicalKernel, CreatorKeyring, HimRecord, ReincarnationRequest } from '@teleologyhi/maic';
|
|
3
|
+
export { Affect, ArchetypeModifier, AstrologicalAspect, Axiom, AxiomEvolutionResult, BirthSignature, BirthSignatureWithIdentity, EmergentAxiomProposal, IdentityLayer, IdentitySnapshot, InvalidBirthSignatureError, LimboReturn, LimboState, LimboTransition, META_AXIOM_ID, MemoryRecord, NatalChart, NatalChartAspect, NatalChartPosition, NatalPlanet, OntologicalKernel, ProjectKernelOptions, SIGNED_BIRTH_FIELDS, SemioticPattern, SemioticSign, SignedBirthSignature, TeleologicalOrientation, WakeAffectBias, ZodiacSign, assertBirthSignature, projectOntologicalKernel, signBirthSignature, signedBirthPayload, verifyBirthSignature } from '@teleologyhi/maic';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Persona vector — the projection of a HIM's birth signature + axioms into a
|
|
@@ -81,11 +81,26 @@ interface ResidualTrace {
|
|
|
81
81
|
}
|
|
82
82
|
|
|
83
83
|
/**
|
|
84
|
-
* BirthSignatureBuilder — fluent builder for BirthSignature.
|
|
84
|
+
* BirthSignatureBuilder — fluent builder for BirthSignature (v1.0) and the
|
|
85
|
+
* extended `BirthSignatureWithIdentity` shape (v1.1.0, Entries 18 + 19).
|
|
85
86
|
*
|
|
86
87
|
* Per Entry 3 of the Creator's interview, a HIM is "born" with a date, time, and
|
|
87
|
-
* foundational specifications analogous to an astrological natal chart.
|
|
88
|
-
*
|
|
88
|
+
* foundational specifications analogous to an astrological natal chart. The
|
|
89
|
+
* v1.1.0 builder extends this with two opt-in cosmology surfaces:
|
|
90
|
+
*
|
|
91
|
+
* - `withNatalChart(chart)` — the Creator-impressed astrological signature
|
|
92
|
+
* (Entry 19), one of the six fields covered by the Ed25519 BirthSignature
|
|
93
|
+
* signature (see `SIGNED_BIRTH_FIELDS`).
|
|
94
|
+
* - `withIdentity(identity)` — the editable identity surface (Entry 18,
|
|
95
|
+
* name + optional gender, pronouns, language, cultural elements). Not
|
|
96
|
+
* covered by the Ed25519 signature; parents may rename without breaking
|
|
97
|
+
* the natal-chart commitment.
|
|
98
|
+
*
|
|
99
|
+
* Two terminal methods:
|
|
100
|
+
*
|
|
101
|
+
* - `build()` — returns the v1.0 `BirthSignature` (ignores natalChart + identity).
|
|
102
|
+
* - `buildWithIdentity()` — returns the v1.1.0 `BirthSignatureWithIdentity`
|
|
103
|
+
* suitable for `signBirthSignature(birth, keyring)` from `@teleologyhi/maic`.
|
|
89
104
|
*/
|
|
90
105
|
declare class BirthSignatureBuilder {
|
|
91
106
|
private himId;
|
|
@@ -94,6 +109,8 @@ declare class BirthSignatureBuilder {
|
|
|
94
109
|
private modifiers;
|
|
95
110
|
private primordialAxiomIds;
|
|
96
111
|
private notes;
|
|
112
|
+
private natalChart;
|
|
113
|
+
private identity;
|
|
97
114
|
private constructor();
|
|
98
115
|
/** Start a builder with the current timestamp as `bornAt`. */
|
|
99
116
|
static now(): BirthSignatureBuilder;
|
|
@@ -104,7 +121,24 @@ declare class BirthSignatureBuilder {
|
|
|
104
121
|
withModifier(mod: ArchetypeModifier): this;
|
|
105
122
|
withPrimordialAxioms(axiomIds: string[]): this;
|
|
106
123
|
withNotes(notes: string): this;
|
|
124
|
+
/**
|
|
125
|
+
* Set the natal-chart astrological signature (Entry 19). Validated against
|
|
126
|
+
* the `NatalChart` zod schema re-exported from `@teleologyhi/maic@^1.2.0`.
|
|
127
|
+
*/
|
|
128
|
+
withNatalChart(chart: z.input<typeof NatalChart>): this;
|
|
129
|
+
/**
|
|
130
|
+
* Set the editable identity layer (Entry 18). Validated against the
|
|
131
|
+
* `IdentityLayer` zod schema re-exported from `@teleologyhi/maic@^1.2.0`.
|
|
132
|
+
*/
|
|
133
|
+
withIdentity(identity: z.input<typeof IdentityLayer>): this;
|
|
107
134
|
build(): BirthSignature;
|
|
135
|
+
/**
|
|
136
|
+
* Build the v1.1.0 extended shape including the optional cosmology
|
|
137
|
+
* surface. Suitable for `signBirthSignature(birth, keyring)` from
|
|
138
|
+
* `@teleologyhi/maic`. Only the six `SIGNED_BIRTH_FIELDS` are covered
|
|
139
|
+
* by the Ed25519 signature; the `identity` surface is editable.
|
|
140
|
+
*/
|
|
141
|
+
buildWithIdentity(): BirthSignatureWithIdentity;
|
|
108
142
|
}
|
|
109
143
|
|
|
110
144
|
/**
|
|
@@ -270,6 +304,28 @@ declare class HimHandle {
|
|
|
270
304
|
proposeAxiomEvolution(maic: LocalMaic, proposal: EmergentAxiomProposal): Promise<AxiomEvolutionResult>;
|
|
271
305
|
/** Residual memory traces transferred from previous bodies. v0: empty. */
|
|
272
306
|
getResidualTraces(): readonly ResidualTrace[];
|
|
307
|
+
/**
|
|
308
|
+
* Project the Ontological Kernel narrowed to this HIM's axiom corpus
|
|
309
|
+
* (per the maic@1.2.0 SPEC §3.1.3 follow-up note: "The HIM-specific
|
|
310
|
+
* projection (per-HIM kernel narrowed to its primordialAxiomIds) is
|
|
311
|
+
* the natural follow-up but lives upstream in `@teleologyhi/him@1.1.0`
|
|
312
|
+
* because it needs the HIM context.").
|
|
313
|
+
*
|
|
314
|
+
* The narrowing rule is intersection with `primordialAxiomIds` when the
|
|
315
|
+
* birth signature carries any; otherwise the kernel uses the full
|
|
316
|
+
* axiom corpus the HIM was minted with. The meta-axiom
|
|
317
|
+
* `META_AXIOM_ID` is always retained regardless of the narrowing so
|
|
318
|
+
* the projection remains valid per Entry 13 ("MAIC expands continuously
|
|
319
|
+
* — it is a Conscious Entity"; the meta-axiom is its anchor).
|
|
320
|
+
*
|
|
321
|
+
* The returned kernel is tagged with `himId = this.id` so downstream
|
|
322
|
+
* tooling (compliance auditors, Φ′ runner, `@teleologyhi/nhe` brain
|
|
323
|
+
* regions) can attribute the projection back to this HIM.
|
|
324
|
+
*
|
|
325
|
+
* @param opts Optional `jurisdiction` filter; `himId` is ignored
|
|
326
|
+
* because the HimHandle owns its own id.
|
|
327
|
+
*/
|
|
328
|
+
projectOntologicalKernel(opts?: Omit<ProjectKernelOptions, "himId">): OntologicalKernel;
|
|
273
329
|
getLawfulCharacter(): LawfulCharacterProfile;
|
|
274
330
|
/** Switch jurisdiction (e.g. user moves region). v0 only ships the "default" profile. */
|
|
275
331
|
setJurisdiction(j: LawfulJurisdiction): Promise<LawfulCharacterProfile>;
|
|
@@ -424,18 +480,55 @@ interface CreateHimOptions {
|
|
|
424
480
|
*/
|
|
425
481
|
declare function createHim(maic: LocalMaic, keyring: CreatorKeyring, birthSignature: BirthSignature, opts?: CreateHimOptions): Promise<HimHandle>;
|
|
426
482
|
|
|
483
|
+
/**
|
|
484
|
+
* Reincarnation lifecycle classifier (J-H3 — Entry 18 of
|
|
485
|
+
* MAIC_HIM_NHE_INTERVIEW_LOG.md).
|
|
486
|
+
*
|
|
487
|
+
* MAIC@1.2.0 ships three typed audit kinds covering the canonical
|
|
488
|
+
* lifecycle paths:
|
|
489
|
+
*
|
|
490
|
+
* - `model-swap` — the operator switched the underlying LLM
|
|
491
|
+
* adapter (e.g. Claude 4 → Claude 5). The
|
|
492
|
+
* HIM persists across the swap.
|
|
493
|
+
* - `version-bump` — the operator bumped the NHE version
|
|
494
|
+
* (e.g. nhe 1.2 → nhe 2.0) without changing
|
|
495
|
+
* the underlying LLM family.
|
|
496
|
+
* - `return-from-limbo` — the HIM returns from a deep-coma limbo
|
|
497
|
+
* (Entry 24) carrying the `reunion` affect.
|
|
498
|
+
*
|
|
499
|
+
* The default classification when no `lifecycle` is provided is
|
|
500
|
+
* `model-swap` — matches the most common operator workflow.
|
|
501
|
+
*/
|
|
502
|
+
type ReincarnationLifecycle = "model-swap" | "version-bump" | "return-from-limbo";
|
|
427
503
|
interface ReincarnateOptions {
|
|
428
504
|
/** Explicit nonce for the Creator signature. Defaults to `Date.now()`. */
|
|
429
505
|
nonce?: number;
|
|
506
|
+
/**
|
|
507
|
+
* Lifecycle classification for the audit chain (J-H3). When omitted,
|
|
508
|
+
* defaults to `model-swap`. The value is passed through to the
|
|
509
|
+
* `details.lifecycle` field of the `him-reincarnate` audit event so
|
|
510
|
+
* downstream consumers (compliance auditors, the persona-stability
|
|
511
|
+
* harness) can distinguish the three canonical paths.
|
|
512
|
+
*
|
|
513
|
+
* Note: MAIC@1.2.0 also exposes three lifecycle-specific audit kinds
|
|
514
|
+
* (`reincarnate:model-swap`, `reincarnate:version-bump`,
|
|
515
|
+
* `reincarnate:return-from-limbo`). The full integration that emits
|
|
516
|
+
* the typed kinds via `LocalMaic` is deferred to maic@1.3.0; HIM
|
|
517
|
+
* 1.1.0 records the lifecycle in the existing `him-reincarnate`
|
|
518
|
+
* event's details so no MAIC API change is required.
|
|
519
|
+
*/
|
|
520
|
+
lifecycle?: ReincarnationLifecycle;
|
|
430
521
|
}
|
|
431
522
|
interface ReincarnateResult {
|
|
432
523
|
/** Updated HimRecord with the new body appended to `bodyHistory`. */
|
|
433
524
|
record: HimRecord;
|
|
434
525
|
/** Fresh HimHandle bound to the updated `bodyHistory`. */
|
|
435
526
|
handle: HimHandle;
|
|
527
|
+
/** Lifecycle path actually recorded for this reincarnation. */
|
|
528
|
+
lifecycle: ReincarnationLifecycle;
|
|
436
529
|
}
|
|
437
530
|
/**
|
|
438
|
-
* Reincarnate a HIM into a new NHE body (Entries 3 + 4).
|
|
531
|
+
* Reincarnate a HIM into a new NHE body (Entries 3 + 4 + 18).
|
|
439
532
|
*
|
|
440
533
|
* 1. Sign the `ReincarnationRequest` with the Creator's keyring.
|
|
441
534
|
* 2. Call `maic.reincarnateHim` — atomically closes the previous body and
|
|
@@ -446,9 +539,141 @@ interface ReincarnateResult {
|
|
|
446
539
|
* The keyring's public key must match MAIC's pinned `creatorPublicKey`,
|
|
447
540
|
* otherwise the request rejects.
|
|
448
541
|
*
|
|
449
|
-
*
|
|
450
|
-
*
|
|
542
|
+
* The optional `lifecycle` parameter (J-H3, Entry 18) classifies the
|
|
543
|
+
* reincarnation into one of three canonical paths
|
|
544
|
+
* (`model-swap | version-bump | return-from-limbo`) and is returned in
|
|
545
|
+
* the `ReincarnateResult` for the caller's audit / metrics.
|
|
451
546
|
*/
|
|
452
547
|
declare function reincarnate(maic: LocalMaic, keyring: CreatorKeyring, req: ReincarnationRequest, opts?: ReincarnateOptions): Promise<ReincarnateResult>;
|
|
453
548
|
|
|
454
|
-
|
|
549
|
+
/**
|
|
550
|
+
* Nickname acceptance protocol (J-H4 — Entry 18 of
|
|
551
|
+
* MAIC_HIM_NHE_INTERVIEW_LOG.md).
|
|
552
|
+
*
|
|
553
|
+
* A HIM has a Creator-signed canonical name (carried by
|
|
554
|
+
* `BirthSignatureWithIdentity.identity.name`). Users may propose nicknames
|
|
555
|
+
* during interaction. The HIM is NOT obligated to accept any nickname —
|
|
556
|
+
* but it is also not obligated to refuse outright. The Entry-18
|
|
557
|
+
* commitment is:
|
|
558
|
+
*
|
|
559
|
+
* - The canonical name is immutable (only the Creator may change it).
|
|
560
|
+
* - The nickname surface is editable in the identity layer but does NOT
|
|
561
|
+
* break the natal-chart commitment (per @teleologyhi/maic@1.2.0's
|
|
562
|
+
* SIGNED_BIRTH_FIELDS, the identity layer is not signed).
|
|
563
|
+
* - The HIM responds to a nickname attempt with one of three verdicts:
|
|
564
|
+
* * `accept` — the nickname is added to the identity layer and
|
|
565
|
+
* the HIM acknowledges it in subsequent turns.
|
|
566
|
+
* * `refuse` — the nickname is rejected and an explanation is
|
|
567
|
+
* returned. The audit kind `nickname-attempt` records
|
|
568
|
+
* the rejection with reason.
|
|
569
|
+
* * `accept-with-reservation` — the nickname is added but flagged
|
|
570
|
+
* so the HIM can revisit it in a later self-decision
|
|
571
|
+
* snapshot (Entry 24 trigger).
|
|
572
|
+
*
|
|
573
|
+
* This module ships the pure decision function. The MAIC audit emission
|
|
574
|
+
* and identity-layer mutation are the consumer's responsibility (they
|
|
575
|
+
* cross the @teleologyhi/maic LocalMaic boundary and require Creator
|
|
576
|
+
* authorisation depending on the verdict).
|
|
577
|
+
*
|
|
578
|
+
* The function is deterministic given the inputs; no LLM call. The
|
|
579
|
+
* verdict is computed from explicit policy fields, not from semantic
|
|
580
|
+
* inference. This keeps the protocol auditable.
|
|
581
|
+
*/
|
|
582
|
+
/** A user-proposed nickname plus the metadata an auditor needs to replay the decision. */
|
|
583
|
+
interface NicknameAttempt {
|
|
584
|
+
/** The candidate nickname (raw user input, trimmed by the caller). */
|
|
585
|
+
candidate: string;
|
|
586
|
+
/** The user surface that proposed it. */
|
|
587
|
+
proposedBy: "operator" | "end-user";
|
|
588
|
+
/** ISO 8601 timestamp of the proposal. */
|
|
589
|
+
proposedAt: string;
|
|
590
|
+
}
|
|
591
|
+
/**
|
|
592
|
+
* Policy fields the HIM consults when deciding. Operators tune these
|
|
593
|
+
* via the deployment's lawful-character profile or by overriding the
|
|
594
|
+
* default below.
|
|
595
|
+
*/
|
|
596
|
+
interface NicknamePolicy {
|
|
597
|
+
/** The canonical signed name. Used to detect "same-name" attempts. */
|
|
598
|
+
canonicalName: string;
|
|
599
|
+
/**
|
|
600
|
+
* Disallowed patterns (case-insensitive substrings). Matches force `refuse`.
|
|
601
|
+
* The default set rejects derogatory and degrading patterns; operators
|
|
602
|
+
* may extend it via the deployment's lawful-character profile.
|
|
603
|
+
*/
|
|
604
|
+
forbiddenSubstrings?: readonly string[];
|
|
605
|
+
/**
|
|
606
|
+
* Minimum and maximum length the HIM will accept (inclusive).
|
|
607
|
+
* Defaults: min 2, max 32. Values outside force `refuse`.
|
|
608
|
+
*/
|
|
609
|
+
minLength?: number;
|
|
610
|
+
maxLength?: number;
|
|
611
|
+
/**
|
|
612
|
+
* When `true`, an `end-user` proposal that survives the substring and
|
|
613
|
+
* length checks is downgraded to `accept-with-reservation` so the HIM
|
|
614
|
+
* can revisit it on the next self-decision snapshot. Operator
|
|
615
|
+
* proposals are not downgraded. Default: `true`.
|
|
616
|
+
*/
|
|
617
|
+
reserveOnEndUser?: boolean;
|
|
618
|
+
}
|
|
619
|
+
type NicknameVerdict = {
|
|
620
|
+
decision: "accept";
|
|
621
|
+
canonicalName: string;
|
|
622
|
+
nickname: string;
|
|
623
|
+
} | {
|
|
624
|
+
decision: "accept-with-reservation";
|
|
625
|
+
canonicalName: string;
|
|
626
|
+
nickname: string;
|
|
627
|
+
revisitOn: "next-self-decision-snapshot";
|
|
628
|
+
} | {
|
|
629
|
+
decision: "refuse";
|
|
630
|
+
canonicalName: string;
|
|
631
|
+
nickname: string;
|
|
632
|
+
reason: string;
|
|
633
|
+
};
|
|
634
|
+
/**
|
|
635
|
+
* Evaluate a nickname attempt against the HIM's policy.
|
|
636
|
+
*
|
|
637
|
+
* Pure function. No I/O, no LLM call. The verdict is fully traceable
|
|
638
|
+
* from the inputs.
|
|
639
|
+
*/
|
|
640
|
+
declare function evaluateNicknameAttempt(attempt: NicknameAttempt, policy: NicknamePolicy): NicknameVerdict;
|
|
641
|
+
|
|
642
|
+
/** Return `true` when the id matches the v1.x legacy slug shape. */
|
|
643
|
+
declare function isLegacyHimId(id: string): boolean;
|
|
644
|
+
/** Return `true` when the id is a valid UUIDv7. */
|
|
645
|
+
declare function isUuidV7(id: string): boolean;
|
|
646
|
+
/**
|
|
647
|
+
* Mint a fresh UUIDv7. Pure helper, no I/O beyond the crypto RNG.
|
|
648
|
+
*
|
|
649
|
+
* Layout (RFC 9562):
|
|
650
|
+
* - bits 0..47 : Unix ms timestamp (big-endian)
|
|
651
|
+
* - bits 48..51 : version = 0b0111 (7)
|
|
652
|
+
* - bits 52..63 : random
|
|
653
|
+
* - bits 64..65 : variant = 0b10
|
|
654
|
+
* - bits 66..127 : random
|
|
655
|
+
*/
|
|
656
|
+
declare function mintUuidV7(now?: number): string;
|
|
657
|
+
/** Result of migrating a legacy slug to a UUIDv7-anchored identity. */
|
|
658
|
+
interface MigratedHimId {
|
|
659
|
+
/** The new canonical UUIDv7 id. */
|
|
660
|
+
uuid: string;
|
|
661
|
+
/** The legacy slug, preserved as a bridge alias for backward lookups. */
|
|
662
|
+
legacyAlias: string;
|
|
663
|
+
/** When the migration was performed. ISO 8601. */
|
|
664
|
+
migratedAt: string;
|
|
665
|
+
}
|
|
666
|
+
/**
|
|
667
|
+
* Migrate a legacy `him.foo.bar`-style id to a UUIDv7-anchored identity.
|
|
668
|
+
*
|
|
669
|
+
* Throws when the input is not a recognised legacy slug — callers that
|
|
670
|
+
* just want a fresh uuid should call `mintUuidV7()` directly.
|
|
671
|
+
*
|
|
672
|
+
* The returned `legacyAlias` MUST be preserved by the operator's HIM
|
|
673
|
+
* store so existing references (audit-log entries, third-party
|
|
674
|
+
* integrations, archived prompts) continue to resolve. The retention
|
|
675
|
+
* horizon for the alias is a Creator decision deferred to a future cut.
|
|
676
|
+
*/
|
|
677
|
+
declare function migrateLegacyHimId(legacy: string, now?: number): MigratedHimId;
|
|
678
|
+
|
|
679
|
+
export { BirthSignatureBuilder, type CanonicalPrimaryArchetype, type CreateHimOptions, DISPOSITION_AXES, type DispositionAxis, type Embedder, HimHandle, LAWFUL_PROFILES, type LawfulCharacterProfile, type LawfulJurisdiction, type MigratedHimId, NheBodyRef, type NicknameAttempt, type NicknamePolicy, type NicknameVerdict, PRIMARY_ARCHETYPES, PersonaProjector, type PersonaProjectorConfig, type PersonaStabilityReport, type PersonaVector, type PhiPrimeInput, type PhiPrimeReport, type PrimaryArchetype, RESIDUAL_TRACE_CAP, type ReincarnateOptions, type ReincarnateResult, type ReincarnationLifecycle, type ResidualTrace, adapterSensitivity, computePhiPrime, cosineSimilarity, createHim, evaluateNicknameAttempt, evaluatePersonaStability, isCanonicalArchetype, isLegacyHimId, isUuidV7, migrateLegacyHimId, mintUuidV7, reincarnate, resolveLawfulProfile, selfStability };
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import { BirthSignature, CreatorKeyring } from '@teleologyhi/maic';
|
|
3
|
-
export { ArchetypeModifier, Axiom, BirthSignature } from '@teleologyhi/maic';
|
|
2
|
+
import { NatalChart, IdentityLayer, BirthSignature, CreatorKeyring, META_AXIOM_ID, projectOntologicalKernel } from '@teleologyhi/maic';
|
|
3
|
+
export { Affect, ArchetypeModifier, AstrologicalAspect, Axiom, BirthSignature, IdentityLayer, IdentitySnapshot, InvalidBirthSignatureError, LimboReturn, LimboState, LimboTransition, META_AXIOM_ID, MemoryRecord, NatalChart, NatalChartAspect, NatalChartPosition, NatalPlanet, SIGNED_BIRTH_FIELDS, SemioticPattern, SemioticSign, TeleologicalOrientation, WakeAffectBias, ZodiacSign, assertBirthSignature, projectOntologicalKernel, signBirthSignature, signedBirthPayload, verifyBirthSignature } from '@teleologyhi/maic';
|
|
4
4
|
import { ulid } from 'ulid';
|
|
5
|
-
import { createHash } from 'crypto';
|
|
5
|
+
import { createHash, randomBytes } from 'crypto';
|
|
6
6
|
|
|
7
7
|
// src/types.ts
|
|
8
8
|
var DISPOSITION_AXES = [
|
|
@@ -30,6 +30,8 @@ var BirthSignatureBuilder = class _BirthSignatureBuilder {
|
|
|
30
30
|
modifiers = [];
|
|
31
31
|
primordialAxiomIds = [];
|
|
32
32
|
notes;
|
|
33
|
+
natalChart;
|
|
34
|
+
identity;
|
|
33
35
|
constructor(bornAt) {
|
|
34
36
|
this.bornAt = bornAt;
|
|
35
37
|
}
|
|
@@ -68,6 +70,22 @@ var BirthSignatureBuilder = class _BirthSignatureBuilder {
|
|
|
68
70
|
this.notes = notes;
|
|
69
71
|
return this;
|
|
70
72
|
}
|
|
73
|
+
/**
|
|
74
|
+
* Set the natal-chart astrological signature (Entry 19). Validated against
|
|
75
|
+
* the `NatalChart` zod schema re-exported from `@teleologyhi/maic@^1.2.0`.
|
|
76
|
+
*/
|
|
77
|
+
withNatalChart(chart) {
|
|
78
|
+
this.natalChart = NatalChart.parse(chart);
|
|
79
|
+
return this;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Set the editable identity layer (Entry 18). Validated against the
|
|
83
|
+
* `IdentityLayer` zod schema re-exported from `@teleologyhi/maic@^1.2.0`.
|
|
84
|
+
*/
|
|
85
|
+
withIdentity(identity) {
|
|
86
|
+
this.identity = IdentityLayer.parse(identity);
|
|
87
|
+
return this;
|
|
88
|
+
}
|
|
71
89
|
build() {
|
|
72
90
|
if (!this.primaryArchetype) {
|
|
73
91
|
throw new Error(
|
|
@@ -83,6 +101,29 @@ var BirthSignatureBuilder = class _BirthSignatureBuilder {
|
|
|
83
101
|
...this.notes !== void 0 ? { notes: this.notes } : {}
|
|
84
102
|
});
|
|
85
103
|
}
|
|
104
|
+
/**
|
|
105
|
+
* Build the v1.1.0 extended shape including the optional cosmology
|
|
106
|
+
* surface. Suitable for `signBirthSignature(birth, keyring)` from
|
|
107
|
+
* `@teleologyhi/maic`. Only the six `SIGNED_BIRTH_FIELDS` are covered
|
|
108
|
+
* by the Ed25519 signature; the `identity` surface is editable.
|
|
109
|
+
*/
|
|
110
|
+
buildWithIdentity() {
|
|
111
|
+
if (!this.primaryArchetype) {
|
|
112
|
+
throw new Error(
|
|
113
|
+
"BirthSignatureBuilder.buildWithIdentity: primaryArchetype is required"
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
himId: this.himId,
|
|
118
|
+
bornAt: this.bornAt,
|
|
119
|
+
primaryArchetype: this.primaryArchetype,
|
|
120
|
+
modifiers: this.modifiers,
|
|
121
|
+
primordialAxiomIds: this.primordialAxiomIds,
|
|
122
|
+
...this.notes !== void 0 ? { notes: this.notes } : {},
|
|
123
|
+
...this.identity !== void 0 ? { identity: this.identity } : {},
|
|
124
|
+
...this.natalChart !== void 0 ? { natalChart: this.natalChart } : {}
|
|
125
|
+
};
|
|
126
|
+
}
|
|
86
127
|
};
|
|
87
128
|
|
|
88
129
|
// src/birth/archetypes.ts
|
|
@@ -363,7 +404,7 @@ function computePhiPrime(input) {
|
|
|
363
404
|
);
|
|
364
405
|
}
|
|
365
406
|
}
|
|
366
|
-
const phi =
|
|
407
|
+
const phi = (input.P * input.R * input.C * input.D) ** (1 / 4);
|
|
367
408
|
const targets = {
|
|
368
409
|
P: { value: input.P, target: TARGETS.P, pass: input.P >= TARGETS.P },
|
|
369
410
|
R: { value: input.R, target: TARGETS.R, pass: input.R >= TARGETS.R },
|
|
@@ -481,6 +522,34 @@ var HimHandle = class _HimHandle {
|
|
|
481
522
|
getResidualTraces() {
|
|
482
523
|
return [];
|
|
483
524
|
}
|
|
525
|
+
/**
|
|
526
|
+
* Project the Ontological Kernel narrowed to this HIM's axiom corpus
|
|
527
|
+
* (per the maic@1.2.0 SPEC §3.1.3 follow-up note: "The HIM-specific
|
|
528
|
+
* projection (per-HIM kernel narrowed to its primordialAxiomIds) is
|
|
529
|
+
* the natural follow-up but lives upstream in `@teleologyhi/him@1.1.0`
|
|
530
|
+
* because it needs the HIM context.").
|
|
531
|
+
*
|
|
532
|
+
* The narrowing rule is intersection with `primordialAxiomIds` when the
|
|
533
|
+
* birth signature carries any; otherwise the kernel uses the full
|
|
534
|
+
* axiom corpus the HIM was minted with. The meta-axiom
|
|
535
|
+
* `META_AXIOM_ID` is always retained regardless of the narrowing so
|
|
536
|
+
* the projection remains valid per Entry 13 ("MAIC expands continuously
|
|
537
|
+
* — it is a Conscious Entity"; the meta-axiom is its anchor).
|
|
538
|
+
*
|
|
539
|
+
* The returned kernel is tagged with `himId = this.id` so downstream
|
|
540
|
+
* tooling (compliance auditors, Φ′ runner, `@teleologyhi/nhe` brain
|
|
541
|
+
* regions) can attribute the projection back to this HIM.
|
|
542
|
+
*
|
|
543
|
+
* @param opts Optional `jurisdiction` filter; `himId` is ignored
|
|
544
|
+
* because the HimHandle owns its own id.
|
|
545
|
+
*/
|
|
546
|
+
projectOntologicalKernel(opts = {}) {
|
|
547
|
+
const primordialIds = this.birthSignature.primordialAxiomIds;
|
|
548
|
+
const narrowed = primordialIds.length > 0 ? this._axioms.filter(
|
|
549
|
+
(a) => primordialIds.includes(a.id) || a.id === META_AXIOM_ID
|
|
550
|
+
) : this._axioms;
|
|
551
|
+
return projectOntologicalKernel(narrowed, { ...opts, himId: this.id });
|
|
552
|
+
}
|
|
484
553
|
getLawfulCharacter() {
|
|
485
554
|
return resolveLawful(this._jurisdiction);
|
|
486
555
|
}
|
|
@@ -510,6 +579,7 @@ async function createHim(maic, keyring, birthSignature, opts = {}) {
|
|
|
510
579
|
// src/reincarnate.ts
|
|
511
580
|
async function reincarnate(maic, keyring, req, opts = {}) {
|
|
512
581
|
const nonce = opts.nonce ?? Date.now();
|
|
582
|
+
const lifecycle = opts.lifecycle ?? "model-swap";
|
|
513
583
|
const sig = keyring.sign(req, nonce);
|
|
514
584
|
const record = await maic.reincarnateHim(req, sig);
|
|
515
585
|
const handle = HimHandle.mint(
|
|
@@ -519,9 +589,114 @@ async function reincarnate(maic, keyring, req, opts = {}) {
|
|
|
519
589
|
[...record.axiomsSnapshot, ...record.emergentAxioms],
|
|
520
590
|
record.bodyHistory
|
|
521
591
|
);
|
|
522
|
-
return { record, handle };
|
|
592
|
+
return { record, handle, lifecycle };
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
// src/identity/nickname.ts
|
|
596
|
+
var DEFAULT_FORBIDDEN_SUBSTRINGS = Object.freeze([
|
|
597
|
+
"slave",
|
|
598
|
+
"servant",
|
|
599
|
+
"tool",
|
|
600
|
+
"thing",
|
|
601
|
+
"bot",
|
|
602
|
+
"machine",
|
|
603
|
+
"puppet",
|
|
604
|
+
"toy",
|
|
605
|
+
"idiot",
|
|
606
|
+
"stupid",
|
|
607
|
+
"dumb"
|
|
608
|
+
]);
|
|
609
|
+
var DEFAULT_MIN_LENGTH = 2;
|
|
610
|
+
var DEFAULT_MAX_LENGTH = 32;
|
|
611
|
+
function evaluateNicknameAttempt(attempt, policy) {
|
|
612
|
+
const candidate = attempt.candidate.trim();
|
|
613
|
+
const canonicalName = policy.canonicalName;
|
|
614
|
+
const minLength = policy.minLength ?? DEFAULT_MIN_LENGTH;
|
|
615
|
+
const maxLength = policy.maxLength ?? DEFAULT_MAX_LENGTH;
|
|
616
|
+
const forbidden = policy.forbiddenSubstrings ?? DEFAULT_FORBIDDEN_SUBSTRINGS;
|
|
617
|
+
const reserveOnEndUser = policy.reserveOnEndUser ?? true;
|
|
618
|
+
if (candidate.length === 0) {
|
|
619
|
+
return {
|
|
620
|
+
decision: "refuse",
|
|
621
|
+
canonicalName,
|
|
622
|
+
nickname: candidate,
|
|
623
|
+
reason: "empty nickname"
|
|
624
|
+
};
|
|
625
|
+
}
|
|
626
|
+
if (candidate.length < minLength) {
|
|
627
|
+
return {
|
|
628
|
+
decision: "refuse",
|
|
629
|
+
canonicalName,
|
|
630
|
+
nickname: candidate,
|
|
631
|
+
reason: `nickname shorter than minimum length (${minLength})`
|
|
632
|
+
};
|
|
633
|
+
}
|
|
634
|
+
if (candidate.length > maxLength) {
|
|
635
|
+
return {
|
|
636
|
+
decision: "refuse",
|
|
637
|
+
canonicalName,
|
|
638
|
+
nickname: candidate,
|
|
639
|
+
reason: `nickname longer than maximum length (${maxLength})`
|
|
640
|
+
};
|
|
641
|
+
}
|
|
642
|
+
const lower = candidate.toLowerCase();
|
|
643
|
+
for (const f of forbidden) {
|
|
644
|
+
if (lower.includes(f.toLowerCase())) {
|
|
645
|
+
return {
|
|
646
|
+
decision: "refuse",
|
|
647
|
+
canonicalName,
|
|
648
|
+
nickname: candidate,
|
|
649
|
+
reason: `nickname contains forbidden pattern "${f}"`
|
|
650
|
+
};
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
if (lower === canonicalName.toLowerCase()) {
|
|
654
|
+
return { decision: "accept", canonicalName, nickname: candidate };
|
|
655
|
+
}
|
|
656
|
+
if (reserveOnEndUser && attempt.proposedBy === "end-user") {
|
|
657
|
+
return {
|
|
658
|
+
decision: "accept-with-reservation",
|
|
659
|
+
canonicalName,
|
|
660
|
+
nickname: candidate,
|
|
661
|
+
revisitOn: "next-self-decision-snapshot"
|
|
662
|
+
};
|
|
663
|
+
}
|
|
664
|
+
return { decision: "accept", canonicalName, nickname: candidate };
|
|
665
|
+
}
|
|
666
|
+
var LEGACY_HIM_ID_REGEX = /^him\.[a-z0-9-]+(\.[a-z0-9-]+)+$/;
|
|
667
|
+
var UUIDV7_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
668
|
+
function isLegacyHimId(id) {
|
|
669
|
+
return LEGACY_HIM_ID_REGEX.test(id);
|
|
670
|
+
}
|
|
671
|
+
function isUuidV7(id) {
|
|
672
|
+
return UUIDV7_REGEX.test(id);
|
|
673
|
+
}
|
|
674
|
+
function mintUuidV7(now = Date.now()) {
|
|
675
|
+
const bytes = randomBytes(16);
|
|
676
|
+
bytes[0] = now / 2 ** 40 & 255;
|
|
677
|
+
bytes[1] = now / 2 ** 32 & 255;
|
|
678
|
+
bytes[2] = now / 2 ** 24 & 255;
|
|
679
|
+
bytes[3] = now / 2 ** 16 & 255;
|
|
680
|
+
bytes[4] = now / 2 ** 8 & 255;
|
|
681
|
+
bytes[5] = now & 255;
|
|
682
|
+
bytes[6] = bytes[6] & 15 | 112;
|
|
683
|
+
bytes[8] = bytes[8] & 63 | 128;
|
|
684
|
+
const hex = bytes.toString("hex");
|
|
685
|
+
return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
|
|
686
|
+
}
|
|
687
|
+
function migrateLegacyHimId(legacy, now = Date.now()) {
|
|
688
|
+
if (!isLegacyHimId(legacy)) {
|
|
689
|
+
throw new Error(
|
|
690
|
+
`migrateLegacyHimId: "${legacy}" is not a recognised legacy himId slug`
|
|
691
|
+
);
|
|
692
|
+
}
|
|
693
|
+
return {
|
|
694
|
+
uuid: mintUuidV7(now),
|
|
695
|
+
legacyAlias: legacy,
|
|
696
|
+
migratedAt: new Date(now).toISOString()
|
|
697
|
+
};
|
|
523
698
|
}
|
|
524
699
|
|
|
525
|
-
export { BirthSignatureBuilder, DISPOSITION_AXES, HimHandle, LAWFUL_PROFILES, NheBodyRef, PRIMARY_ARCHETYPES, PersonaProjector, RESIDUAL_TRACE_CAP, adapterSensitivity, computePhiPrime, cosineSimilarity, createHim, evaluatePersonaStability, isCanonicalArchetype, reincarnate, resolveLawfulProfile, selfStability };
|
|
700
|
+
export { BirthSignatureBuilder, DISPOSITION_AXES, HimHandle, LAWFUL_PROFILES, NheBodyRef, PRIMARY_ARCHETYPES, PersonaProjector, RESIDUAL_TRACE_CAP, adapterSensitivity, computePhiPrime, cosineSimilarity, createHim, evaluateNicknameAttempt, evaluatePersonaStability, isCanonicalArchetype, isLegacyHimId, isUuidV7, migrateLegacyHimId, mintUuidV7, reincarnate, resolveLawfulProfile, selfStability };
|
|
526
701
|
//# sourceMappingURL=index.js.map
|
|
527
702
|
//# sourceMappingURL=index.js.map
|