@tiinex/app 0.1.1
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/LICENSE +201 -0
- package/NOTICE +31 -0
- package/README.md +26 -0
- package/docs/CONSUMER-CONTRACT.md +65 -0
- package/package.json +94 -0
- package/src/acceptance/knownScenarios.case.mjs +48 -0
- package/src/acceptance/knownScenarios.js +89 -0
- package/src/acceptance/postV423CanonicalTransitionProductVerticalSlice.case.mjs +774 -0
- package/src/acceptance/postV437M0ETimePortalProductParityClosure.case.mjs +51 -0
- package/src/acceptance/postV447M0FGithubSocialPublicationProductIntegration.case.mjs +33 -0
- package/src/acceptance/postV450M0ProductAcceptanceHardening.case.mjs +82 -0
- package/src/acceptance/postV470SchemaReadingContractMaterializationIdentitySourceCoalescingAuthorityCorrection.case.mjs +236 -0
- package/src/acceptance/recoveryAcceptance.case.mjs +196 -0
- package/src/adapters/adapter.definition.schema.json +33 -0
- package/src/adapters/archive/archive.adapter.case.mjs +212 -0
- package/src/adapters/export/export.adapter.js +79 -0
- package/src/adapters/git-native/git-native.adapter.js +43 -0
- package/src/adapters/github/github.adapter.case.mjs +843 -0
- package/src/adapters/github/github.adapter.js +395 -0
- package/src/adapters/github/github.issueEmbedded.js +262 -0
- package/src/adapters/github/github.issueMirror.js +309 -0
- package/src/adapters/github/github.issueSnapshot.js +475 -0
- package/src/adapters/github/github.issueSurface.js +188 -0
- package/src/adapters/github/github.issueTransport.js +237 -0
- package/src/adapters/github/github.publicationRead.js +24 -0
- package/src/adapters/github/github.readTransport.js +18 -0
- package/src/adapters/github/github.repoDiscovery.js +222 -0
- package/src/adapters/github/github.repoMirror.js +255 -0
- package/src/adapters/github/github.repoProxy.js +276 -0
- package/src/adapters/github/github.repoSurface.js +60 -0
- package/src/adapters/github/github.transportDiagnostics.js +68 -0
- package/src/adapters/local/local.adapter.case.mjs +72 -0
- package/src/adapters/local/local.adapter.js +188 -0
- package/src/adapters/registry.js +35 -0
- package/src/adapters/static/static.adapter.js +84 -0
- package/src/app/App.js +1 -0
- package/src/app/TiinexApp.jsx +822 -0
- package/src/app/appShell.views.jsx +58 -0
- package/src/app/artifactAuthoringCapability.js +49 -0
- package/src/app/boot/bootApp.js +19 -0
- package/src/app/boot/environment.js +1 -0
- package/src/app/canonicalAuthoringValues.js +4 -0
- package/src/app/canonicalCreationProductController.js +57 -0
- package/src/app/canonicalCreationProductSettlement.case.mjs +10 -0
- package/src/app/canonicalCreationProductSettlement.js +11 -0
- package/src/app/canonicalReferenceLocalCreateCommand.js +210 -0
- package/src/app/canonicalReferenceTargets.js +73 -0
- package/src/app/canonicalTransitionLocalCreateCommand.js +217 -0
- package/src/app/defaultWorkspaceStart.case.mjs +39 -0
- package/src/app/defaultWorkspaceStart.js +65 -0
- package/src/app/defaultWorkspaceStartCommand.js +55 -0
- package/src/app/durableLocalMutationPolicy.js +21 -0
- package/src/app/githubMaterializationSummary.js +69 -0
- package/src/app/githubProgress.js +25 -0
- package/src/app/githubSourceInput.js +47 -0
- package/src/app/githubSourceMaterializationCommand.js +97 -0
- package/src/app/githubSourceOperation.js +226 -0
- package/src/app/governanceDialogData.js +27 -0
- package/src/app/handoffPackageImportCommand.js +182 -0
- package/src/app/historyAuthority.js +53 -0
- package/src/app/initialWorkspaceBootstrapOperation.js +105 -0
- package/src/app/lineageCommand.js +118 -0
- package/src/app/lineageSourceRecovery.js +339 -0
- package/src/app/localDraftMutationCommand.js +174 -0
- package/src/app/localMaterialCommand.js +124 -0
- package/src/app/nodeGraphVerse.case.mjs +111 -0
- package/src/app/persistenceOwnership.js +92 -0
- package/src/app/productStateBoundary.js +7 -0
- package/src/app/providers/AppProviders.js +1 -0
- package/src/app/providers/LocaleProvider.js +1 -0
- package/src/app/providers/SchemaRegistryProvider.js +1 -0
- package/src/app/providers/WorkspaceProvider.js +1 -0
- package/src/app/publicTarget.js +251 -0
- package/src/app/publicTargetRestoreCommand.js +149 -0
- package/src/app/recordUi.cache.js +35 -0
- package/src/app/recordUi.js +11 -0
- package/src/app/routes/RouteSurface.js +1 -0
- package/src/app/routes/routes.js +1 -0
- package/src/app/runtimeState.js +54 -0
- package/src/app/schemaCurrentDeclaration.js +69 -0
- package/src/app/schemaFactoryLocalCreateCommand.js +101 -0
- package/src/app/schemaFactoryViewerProof.case.mjs +134 -0
- package/src/app/schemaFactoryViewerProof.js +20 -0
- package/src/app/schemaNavigationCommand.js +285 -0
- package/src/app/schemaNavigationMaterialization.js +171 -0
- package/src/app/schemaNavigationRuntimeCatalog.js +25 -0
- package/src/app/schemaNavigationState.js +66 -0
- package/src/app/schemaReadingContractQualification.js +91 -0
- package/src/app/schemaSourceRecovery.js +373 -0
- package/src/app/scrollPersistence.js +30 -0
- package/src/app/semanticOperationHistory.js +18 -0
- package/src/app/shareActionCommand.js +55 -0
- package/src/app/shareProjection.js +190 -0
- package/src/app/shell/AppShell.js +1 -0
- package/src/app/shell/Header.js +1 -0
- package/src/app/shell/Navigation.js +1 -0
- package/src/app/shell/SurfaceSwitcher.js +1 -0
- package/src/app/sourceTransportRefresh.js +176 -0
- package/src/app/startupOwnership.js +40 -0
- package/src/app/startupPresentation.case.mjs +34 -0
- package/src/app/startupPresentation.js +33 -0
- package/src/app/startupPresentation.views.jsx +21 -0
- package/src/app/startupRenderPhase.js +9 -0
- package/src/app/startupWorkspaceCommand.js +62 -0
- package/src/app/startupWorkspaceConfigApplication.js +49 -0
- package/src/app/statePersistenceScheduler.js +106 -0
- package/src/app/tiinexAppConfigPlan.js +108 -0
- package/src/app/tiinexAppConfigSource.js +349 -0
- package/src/app/tiinexAppStartupSource.js +79 -0
- package/src/app/tiinexHostedWorkspaceConventions.js +572 -0
- package/src/app/timePortalHistoricalRead.js +114 -0
- package/src/app/timePortalSnapshotResolution.js +53 -0
- package/src/app/urlMaterialCommand.js +24 -0
- package/src/app/useCanonicalPlacementSelectionOptions.js +9 -0
- package/src/app/useCanonicalReferenceSelectionOptions.js +8 -0
- package/src/app/useLocalMaterialIntake.js +68 -0
- package/src/app/useTimePortalProductController.jsx +111 -0
- package/src/app/useWorkspaceEntrypointIntake.js +77 -0
- package/src/app/useWorkspaceSelectionProductController.jsx +21 -0
- package/src/app/viewState.js +35 -0
- package/src/app/viewport.js +21 -0
- package/src/app/visualDormancy.js +286 -0
- package/src/app/workspaceContinuityNotices.js +32 -0
- package/src/app/workspaceDisplayCounts.js +9 -0
- package/src/app/workspaceEntrypointIntakeCommand.js +87 -0
- package/src/app/workspaceEntrypointProductRouting.case.mjs +20 -0
- package/src/app/workspaceExportCommand.js +21 -0
- package/src/app/workspaceExportDownload.js +23 -0
- package/src/app/workspaceExportExecutionCommand.js +10 -0
- package/src/app/workspaceGithubPublication.js +237 -0
- package/src/app/workspaceHandoffExport.js +56 -0
- package/src/app/workspaceHomeTarget.js +9 -0
- package/src/app/workspaceMulticolumn.js +113 -0
- package/src/app/workspaceNavigationParity.case.mjs +110 -0
- package/src/app/workspaceOpenProgress.js +26 -0
- package/src/app/workspacePlacementOptions.js +46 -0
- package/src/app/workspaceRecordActions.js +158 -0
- package/src/app/workspaceScopedInteraction.js +68 -0
- package/src/app/workspaceSelectionOriginContext.js +29 -0
- package/src/app/workspaceSelectionSession.js +54 -0
- package/src/app/workspaceSourceCloseCommand.js +25 -0
- package/src/app/workspaceSpineProductRouting.case.mjs +22 -0
- package/src/app/workspaceStartupTransition.js +32 -0
- package/src/app/workspaceWindow.js +85 -0
- package/src/artifacts/artifact.fixture.js +1 -0
- package/src/artifacts/artifact.identity.js +6 -0
- package/src/artifacts/artifact.identityAggregation.js +218 -0
- package/src/artifacts/artifact.model.js +2 -0
- package/src/artifacts/artifact.parse.case.mjs +196 -0
- package/src/artifacts/artifact.participantIndex.js +189 -0
- package/src/artifacts/fixtures/evidence.trace.md +50 -0
- package/src/artifacts/fixtures/topic.trace.md +33 -0
- package/src/artifacts/fixtures/unknown-schema.trace.md +25 -0
- package/src/audit/audit.findings.js +1 -0
- package/src/audit/audit.model.js +2 -0
- package/src/audit/audit.plan.js +13 -0
- package/src/audit/audit.report.js +12 -0
- package/src/audit/audit.severity.js +1 -0
- package/src/audit/audit.traverse.js +119 -0
- package/src/audit/integrity/auditIntegrity.checks.js +1 -0
- package/src/audit/integrity/auditIntegrity.compare.js +1 -0
- package/src/audit/lineage/auditLineage.load.js +1 -0
- package/src/audit/lineage/auditLineage.plan.js +1 -0
- package/src/audit/lineage/auditLineage.resolve.js +12 -0
- package/src/audit/sources/auditSources.boundaries.js +1 -0
- package/src/audit/sources/auditSources.checks.js +1 -0
- package/src/audit/validation/auditValidation.recheck.js +1 -0
- package/src/audit/validation/auditValidation.run.js +1 -0
- package/src/build.identity.js +15 -0
- package/src/commands/command.vocabulary.js +14 -0
- package/src/conformance/conformance.fixtures.js +151 -0
- package/src/conformance/conformance.run.js +238 -0
- package/src/data/applicationDataStore.js +23 -0
- package/src/data/companionAccess.js +35 -0
- package/src/diagnostics/events.js +1 -0
- package/src/diagnostics/invariant.js +1 -0
- package/src/diagnostics/schemaBindingChecks.js +1 -0
- package/src/diagnostics/schemaModuleChecks.js +1 -0
- package/src/diagnostics/sourceBoundaryChecks.js +5 -0
- package/src/diagnostics/sourceTransport.report.js +190 -0
- package/src/discovery/discovery.controls.js +7 -0
- package/src/export/export.plan.js +182 -0
- package/src/export/handoff.plan.js +50 -0
- package/src/export/package.builder.case.mjs +97 -0
- package/src/export/package.controlTopology.case.mjs +130 -0
- package/src/export/package.zip.case.mjs +33 -0
- package/src/graph/artifactGraph.model.js +344 -0
- package/src/graph/artifactGraph.project.js +139 -0
- package/src/graph/artifactGraph.worker.js +10 -0
- package/src/i18n/i18n.keys.js +1 -0
- package/src/i18n/i18n.provider.js +1 -0
- package/src/i18n/i18n.resolve.js +5 -0
- package/src/i18n/locales/en/common.json +4 -0
- package/src/i18n/locales/en/schemas/evidence.json +3 -0
- package/src/i18n/locales/en/schemas/presentation-surface.json +3 -0
- package/src/i18n/locales/en/schemas/preservation.json +3 -0
- package/src/i18n/locales/en/schemas/root.json +3 -0
- package/src/i18n/locales/en/schemas/schema-module.json +3 -0
- package/src/i18n/locales/en/schemas/topic.json +3 -0
- package/src/i18n/locales/en/surfaces/audit.json +3 -0
- package/src/i18n/locales/en/surfaces/create.json +3 -0
- package/src/i18n/locales/en/surfaces/detail.json +3 -0
- package/src/i18n/locales/en/surfaces/display-options.json +3 -0
- package/src/i18n/locales/en/surfaces/edit.json +3 -0
- package/src/i18n/locales/en/surfaces/feed.json +3 -0
- package/src/i18n/locales/en/surfaces/lineage.json +3 -0
- package/src/i18n/locales/en/surfaces/preview.json +3 -0
- package/src/i18n/locales/en/surfaces/share.json +3 -0
- package/src/i18n/locales/en/surfaces/source-settings.json +3 -0
- package/src/i18n/locales/en/surfaces/tree.json +3 -0
- package/src/i18n/locales/sv/common.json +4 -0
- package/src/i18n/locales/sv/schemas/evidence.json +3 -0
- package/src/i18n/locales/sv/schemas/presentation-surface.json +3 -0
- package/src/i18n/locales/sv/schemas/preservation.json +3 -0
- package/src/i18n/locales/sv/schemas/root.json +3 -0
- package/src/i18n/locales/sv/schemas/schema-module.json +3 -0
- package/src/i18n/locales/sv/schemas/topic.json +3 -0
- package/src/i18n/locales/sv/surfaces/audit.json +3 -0
- package/src/i18n/locales/sv/surfaces/create.json +3 -0
- package/src/i18n/locales/sv/surfaces/detail.json +3 -0
- package/src/i18n/locales/sv/surfaces/display-options.json +3 -0
- package/src/i18n/locales/sv/surfaces/edit.json +3 -0
- package/src/i18n/locales/sv/surfaces/feed.json +3 -0
- package/src/i18n/locales/sv/surfaces/lineage.json +3 -0
- package/src/i18n/locales/sv/surfaces/preview.json +3 -0
- package/src/i18n/locales/sv/surfaces/share.json +3 -0
- package/src/i18n/locales/sv/surfaces/source-settings.json +3 -0
- package/src/i18n/locales/sv/surfaces/tree.json +3 -0
- package/src/index.js +10 -0
- package/src/integrity/integrity.testFixture.js +9 -0
- package/src/interaction/interaction.spine.js +12 -0
- package/src/lineage/lineage.audit.js +1 -0
- package/src/lineage/lineage.edges.js +1 -0
- package/src/main.js +319 -0
- package/src/main.jsx +34 -0
- package/src/multiverse/multiverse.model.js +10 -0
- package/src/parity/poc.m1ParityScenarios.js +42 -0
- package/src/parity/poc.parityLedger.js +261 -0
- package/src/publication/publication.githubSocialContract.case.mjs +247 -0
- package/src/publication/publication.preflight.case.mjs +64 -0
- package/src/react/TiinexApplication.jsx +39 -0
- package/src/react/VerseHost.jsx +29 -0
- package/src/react/applicationDataContext.jsx +30 -0
- package/src/react.js +2 -0
- package/src/readers/modes/audit.reader.js +1 -0
- package/src/readers/modes/detail.reader.js +1 -0
- package/src/readers/modes/handover.reader.js +1 -0
- package/src/readers/modes/mobile.reader.js +1 -0
- package/src/readers/modes/print.reader.js +1 -0
- package/src/readers/modes/scan.reader.js +1 -0
- package/src/readers/reader.model.js +1 -0
- package/src/readers/reader.resolve.js +2 -0
- package/src/reingest/reingest.plan.case.mjs +65 -0
- package/src/runtime.js +54 -0
- package/src/schemas/README.md +99 -0
- package/src/schemas/coordination/handoff/tiinex.handoff.v1.schema.md +614 -0
- package/src/schemas/coordination/project/tiinex.project.v1.schema.md +311 -0
- package/src/schemas/core/decision/tiinex.decision.v1.schema.md +227 -0
- package/src/schemas/core/evidence/tiinex.evidence.v1.schema.md +318 -0
- package/src/schemas/core/feedback/tiinex.feedback.v1.schema.md +243 -0
- package/src/schemas/core/interpretation/.transitions/evidence-to-interpretation-transition-definition.trace.md +102 -0
- package/src/schemas/core/interpretation/tiinex.interpretation.v1.schema.md +308 -0
- package/src/schemas/core/preservation/tiinex.preservation.v1.schema.md +312 -0
- package/src/schemas/core/relation/.generation/reference-relation-generation-authority.trace.md +185 -0
- package/src/schemas/core/relation/.transitions/topic-references-task-transition-definition.trace.md +119 -0
- package/src/schemas/core/relation/tiinex.relation.v1.schema.md +240 -0
- package/src/schemas/core/relation/workspace/representation/tiinex.workspace.representation.v1.schema.md +550 -0
- package/src/schemas/core/signal/tiinex.signal.v1.schema.md +239 -0
- package/src/schemas/core/task/.transitions/create-task-transition-definition.trace.md +93 -0
- package/src/schemas/core/task/.transitions/topic-to-task-transition-definition.trace.md +102 -0
- package/src/schemas/core/task/task-semantic-package.trace.md +53 -0
- package/src/schemas/core/task/tiinex.task.v1-transitions.trace.md +33 -0
- package/src/schemas/core/task/tiinex.task.v1.authoring.js +65 -0
- package/src/schemas/core/task/tiinex.task.v1.schema.md +229 -0
- package/src/schemas/core/topic/.transitions/create-topic-transition-definition.trace.md +93 -0
- package/src/schemas/core/topic/tiinex.topic.v1-transitions.trace.md +33 -0
- package/src/schemas/core/topic/tiinex.topic.v1.schema.md +197 -0
- package/src/schemas/core/topic/topic-semantic-package.trace.md +53 -0
- package/src/schemas/discovery/finding/tiinex.discovery.finding.v1.schema.md +240 -0
- package/src/schemas/discovery/tiinex.discovery.v1.schema.md +294 -0
- package/src/schemas/manifest.json +367 -0
- package/src/schemas/origins.js +46 -0
- package/src/schemas/party/organization/tiinex.party.organization.v1.schema.md +290 -0
- package/src/schemas/party/role/tiinex.party.role.v1.schema.md +298 -0
- package/src/schemas/party/tiinex.party.v1.schema.js +14 -0
- package/src/schemas/party/tiinex.party.v1.schema.json +23 -0
- package/src/schemas/party/tiinex.party.v1.schema.md +311 -0
- package/src/schemas/party/tiinex.party.v1.schema.runtime.json +2033 -0
- package/src/schemas/party/tiinex.party.v1.schema.source.js +9 -0
- package/src/schemas/presentation/surface/tiinex.presentation.surface.v1.schema.md +476 -0
- package/src/schemas/reduction/tiinex.reduction.v1.schema.md +248 -0
- package/src/schemas/schema/module/tiinex.schema.module.v1.schema.md +465 -0
- package/src/schemas/schema.companionContract.case.mjs +259 -0
- package/src/schemas/schema.factory.case.mjs +256 -0
- package/src/schemas/schema.factory.viewerProjection.js +183 -0
- package/src/schemas/schemaMarkdownCatalog.js +19 -0
- package/src/schemas/tiinex.root.v1.schema.md +865 -0
- package/src/schemas/validation/finding/tiinex.validation.finding.v1.schema.md +309 -0
- package/src/schemas/validation/method/tiinex.validation.method.v1.schema.md +280 -0
- package/src/schemas/validation/report/tiinex.validation.report.v1.schema.md +300 -0
- package/src/schemas/workspace/tiinex.workspace.v1.schema.md +486 -0
- package/src/schemas/workspace/workspace.add.views.jsx +327 -0
- package/src/schemas/workspace/workspace.audit.views.jsx +160 -0
- package/src/schemas/workspace/workspace.auditBadge.views.jsx +98 -0
- package/src/schemas/workspace/workspace.canonicalReferenceDialog.views.jsx +63 -0
- package/src/schemas/workspace/workspace.canonicalTaskDialog.views.jsx +169 -0
- package/src/schemas/workspace/workspace.cardActions.js +9 -0
- package/src/schemas/workspace/workspace.cards.views.jsx +146 -0
- package/src/schemas/workspace/workspace.chrome.views.jsx +299 -0
- package/src/schemas/workspace/workspace.continuationDialog.views.jsx +80 -0
- package/src/schemas/workspace/workspace.discovery.views.jsx +63 -0
- package/src/schemas/workspace/workspace.discoveryRenderWindow.js +56 -0
- package/src/schemas/workspace/workspace.displayOptions.views.jsx +114 -0
- package/src/schemas/workspace/workspace.entrypointChoice.views.jsx +30 -0
- package/src/schemas/workspace/workspace.exportDialog.controller.jsx +40 -0
- package/src/schemas/workspace/workspace.exportDialog.views.jsx +142 -0
- package/src/schemas/workspace/workspace.governance.views.jsx +45 -0
- package/src/schemas/workspace/workspace.graph.views.jsx +134 -0
- package/src/schemas/workspace/workspace.lineage.views.jsx +307 -0
- package/src/schemas/workspace/workspace.read.views.jsx +105 -0
- package/src/schemas/workspace/workspace.recordActionButton.views.jsx +35 -0
- package/src/schemas/workspace/workspace.recordDialogs.views.jsx +257 -0
- package/src/schemas/workspace/workspace.selection.views.jsx +14 -0
- package/src/schemas/workspace/workspace.sourceReceipt.views.jsx +40 -0
- package/src/schemas/workspace/workspace.timePortal.views.jsx +56 -0
- package/src/schemas/workspace/workspace.tree.views.jsx +107 -0
- package/src/schemas/workspace/workspace.viewFormatting.js +172 -0
- package/src/schemas/workspace/workspace.views.jsx +210 -0
- package/src/source-settings/sourceSettings.model.js +7 -0
- package/src/sources/draft/draft.source.js +1 -0
- package/src/sources/github/github.loader.js +204 -0
- package/src/sources/github/github.permalink.js +1 -0
- package/src/sources/github/github.source.js +1 -0
- package/src/sources/github/github.transport.case.mjs +237 -0
- package/src/sources/github/github.transport.js +472 -0
- package/src/sources/local/local.source.js +1 -0
- package/src/sources/source.assetReferences.js +109 -0
- package/src/sources/source.boundaries.js +24 -0
- package/src/sources/source.identity.js +56 -0
- package/src/sources/source.model.case.mjs +26 -0
- package/src/sources/source.model.js +56 -0
- package/src/sources/source.presenter.js +66 -0
- package/src/sources/source.resolve.js +11 -0
- package/src/sources/static/static.source.js +1 -0
- package/src/sources/transport.policy.case.mjs +39 -0
- package/src/sources/transport.policy.js +81 -0
- package/src/storage/storage.policy.js +79 -0
- package/src/styles/app.css +8699 -0
- package/src/styles/responsive.css +10 -0
- package/src/styles/theme.css +4 -0
- package/src/styles/tokens.css +30 -0
- package/src/surfaces/audit/AuditSurface.js +1 -0
- package/src/surfaces/audit/audit.model.js +1 -0
- package/src/surfaces/audit/audit.render.js +1 -0
- package/src/surfaces/contracts.js +45 -0
- package/src/surfaces/create/CreateSurface.js +1 -0
- package/src/surfaces/create/create.model.js +1 -0
- package/src/surfaces/create/create.render.js +1 -0
- package/src/surfaces/detail/DetailSurface.js +1 -0
- package/src/surfaces/detail/detail.model.js +1 -0
- package/src/surfaces/detail/detail.render.js +1 -0
- package/src/surfaces/display-options/DisplayOptionsSurface.js +1 -0
- package/src/surfaces/display-options/displayOptions.model.js +1 -0
- package/src/surfaces/display-options/displayOptions.render.js +1 -0
- package/src/surfaces/edit/EditSurface.js +1 -0
- package/src/surfaces/edit/edit.model.js +1 -0
- package/src/surfaces/edit/edit.render.js +1 -0
- package/src/surfaces/feed/FeedSurface.js +1 -0
- package/src/surfaces/feed/feed.model.js +1 -0
- package/src/surfaces/feed/feed.render.js +1 -0
- package/src/surfaces/lineage/LineageSurface.js +1 -0
- package/src/surfaces/lineage/lineage.model.js +1 -0
- package/src/surfaces/lineage/lineage.render.js +1 -0
- package/src/surfaces/preview/PreviewSurface.js +1 -0
- package/src/surfaces/preview/preview.model.js +1 -0
- package/src/surfaces/preview/preview.render.js +1 -0
- package/src/surfaces/registry.js +58 -0
- package/src/surfaces/share/ShareSurface.js +1 -0
- package/src/surfaces/share/share.model.js +1 -0
- package/src/surfaces/share/share.render.js +1 -0
- package/src/surfaces/source-settings/SourceSettingsSurface.js +1 -0
- package/src/surfaces/source-settings/sourceSettings.model.js +1 -0
- package/src/surfaces/source-settings/sourceSettings.render.js +1 -0
- package/src/surfaces/surfaceContext.js +1 -0
- package/src/surfaces/tree/TreeSurface.js +1 -0
- package/src/surfaces/tree/tree.model.js +1 -0
- package/src/surfaces/tree/tree.render.js +1 -0
- package/src/tooling/portable/adapters/cli/cli.common-output.case.mjs +153 -0
- package/src/tooling/portable/adapters/cli/cli.handoff-sibling-allocation.case.mjs +52 -0
- package/src/tooling/portable/adapters/cli/cli.run.case.mjs +372 -0
- package/src/tooling/portable/adapters/cli/cli.summaryProjection.case.mjs +46 -0
- package/src/tooling/portable/audit/audit.capability.case.mjs +45 -0
- package/src/tooling/portable/fixtures/legacy-artifacts/collaboration/dogfood/001-tiinex-development-dogfood-collaboration-model.trace.fixture.txt +37 -0
- package/src/tooling/portable/fixtures/legacy-artifacts/handoff/tooling/001-v480-tooling-workflow-schema-enablement-handoff.trace.fixture.txt +108 -0
- package/src/tooling/portable/fixtures/legacy-artifacts/handoff/tooling/002-v481-tooling-recipient-relative-handoff-material-closure-planner-foundation-handoff.trace.fixture.txt +130 -0
- package/src/tooling/portable/fixtures/legacy-artifacts/loom/role/001-loom-role.trace.fixture.txt +61 -0
- package/src/tooling/portable/fixtures/legacy-artifacts/sigma/role/001-1-sigma-role.trace.fixture.txt +61 -0
- package/src/tooling/portable/fixtures/legacy-artifacts/tooling/dogfood/001-1-1-1-1-1-1-1-site-tooling-v474-loaded-parent-identity-evidence-closure-result.trace.fixture.txt +48 -0
- package/src/tooling/portable/fixtures/legacy-artifacts/tooling/dogfood/001-1-1-1-1-1-1-site-tooling-v474-loaded-parent-identity-evidence-closure.trace.fixture.txt +48 -0
- package/src/tooling/portable/fixtures/legacy-artifacts/tooling/dogfood/001-1-1-1-1-1-site-tooling-v473-portable-parent-authority-coherence-metadata-fidelity-closure-result.trace.fixture.txt +48 -0
- package/src/tooling/portable/fixtures/legacy-artifacts/tooling/dogfood/001-1-1-1-1-site-tooling-v473-portable-parent-authority-coherence-metadata-fidelity-closure.trace.fixture.txt +48 -0
- package/src/tooling/portable/fixtures/legacy-artifacts/tooling/dogfood/001-1-1-1-site-tooling-v472-portable-exact-authoring-fidelity-closure-result.trace.fixture.txt +48 -0
- package/src/tooling/portable/fixtures/legacy-artifacts/tooling/dogfood/001-1-1-site-tooling-v472-portable-exact-authoring-fidelity-closure.trace.fixture.txt +48 -0
- package/src/tooling/portable/fixtures/legacy-artifacts/tooling/dogfood/001-1-site-tooling-v471-portable-lineage-authoring-closure-result.trace.fixture.txt +48 -0
- package/src/tooling/portable/fixtures/legacy-artifacts/tooling/dogfood/001-site-tooling-v471-portable-lineage-authoring-closure.trace.fixture.txt +39 -0
- package/src/tooling/portable/fixtures/legacy-artifacts/tooling/dogfood/002-1-v475-canonical-artifact-envelope-reference-integrity-validation.trace.fixture.txt +43 -0
- package/src/tooling/portable/fixtures/legacy-artifacts/tooling/dogfood/003-1-v476-canonical-authority-binding-integrity-method-lineage-alloca.trace.fixture.txt +42 -0
- package/src/tooling/portable/fixtures/legacy-artifacts/tooling/dogfood/027-handoff-package-workspace-archive-and-control-plane-minimality-audit.trace.fixture.txt +56 -0
- package/src/tooling/portable/fixtures/legacyArtifactFixtures.mjs +34 -0
- package/src/tooling/portable/grounding/grounding.capsule.case.mjs +65 -0
- package/src/tooling/portable/grounding/grounding.readiness.case.mjs +543 -0
- package/src/tooling/portable/grounding/grounding.semanticIntegration.case.mjs +131 -0
- package/src/tooling/portable/handoff/boundedWorkspaceRepresentation.case.mjs +103 -0
- package/src/tooling/portable/handoff/carrierLineage.fixedWidth.case.mjs +97 -0
- package/src/tooling/portable/handoff/coldStartQualification.case.mjs +293 -0
- package/src/tooling/portable/handoff/fixtures/027-invalid-audit-result.fixture.txt +192 -0
- package/src/tooling/portable/handoff/fixtures/027-invalid-return-handoff.fixture.txt +92 -0
- package/src/tooling/portable/handoff/fixtures/cold-start-qualification.v1.examples.json +60 -0
- package/src/tooling/portable/handoff/handoff.manufacture.case.mjs +293 -0
- package/src/tooling/portable/handoff/materialClosure.case.mjs +727 -0
- package/src/tooling/portable/handoff/multiRootManufacture.case.mjs +615 -0
- package/src/tooling/portable/handoff/operatorBridgeCore.case.mjs +205 -0
- package/src/tooling/portable/handoff/workspaceLandingPlan.case.mjs +143 -0
- package/src/tooling/portable/input/node.input.case.mjs +293 -0
- package/src/tooling/portable/lifecycle/lifecycle.readiness.case.mjs +179 -0
- package/src/tooling/portable/lineage/fixtures/lineage.integrity.repair-projection.v1.examples.json +605 -0
- package/src/tooling/portable/lineage/lineage.integrity.shared-capability.case.mjs +37 -0
- package/src/tooling/portable/lineage/publicationProviderReceipt.fixture.mjs +50 -0
- package/src/tooling/portable/package/fixtures/reference-relation-generation-authority.trace.md +84 -0
- package/src/tooling/portable/package/fixtures/tiinex.root.v1.package-authority.contract-fixture.md +64 -0
- package/src/tooling/portable/package/fixtures/tiinex.schema.generation.v1.generation-binding.contract-fixture.md +140 -0
- package/src/tooling/portable/package/fixtures/tiinex.schema.transition.companion.v1.contract-fixture.md +73 -0
- package/src/tooling/portable/package/fixtures/tiinex.semantic.package.v1.contract-fixture.md +147 -0
- package/src/tooling/portable/package/fixtures/tiinex.transition.definition.v1.package-contract-fixture.md +77 -0
- package/src/tooling/portable/providers/schema.providers.genericity.case.mjs +31 -0
- package/src/tooling/portable/reduction/reduction.preflight.case.mjs +298 -0
- package/src/tooling/portable/schema/fixtures/evidence-preservation-body.inheritance-record-fixture.md +65 -0
- package/src/tooling/portable/schema/fixtures/tiinex.portal.time.v1.contract-fixture.md +294 -0
- package/src/tooling/portable/schema/fixtures/tiinex.root.v1.contract-fixture.md +584 -0
- package/src/tooling/portable/schema/fixtures/tiinex.root.v1.machine-shape.contract-fixture.md +44 -0
- package/src/tooling/portable/schema/fixtures/tiinex.root.v1.ordinary-target.contract-fixture.md +630 -0
- package/src/tooling/portable/schema/fixtures/tiinex.schema.contract.v1.repeated-record.contract-fixture.md +69 -0
- package/src/tooling/portable/schema/fixtures/tiinex.schema.generation.v1.repeated-record.contract-fixture.md +98 -0
- package/src/tooling/portable/schema/fixtures/tiinex.schema.inheritance.v1.repeated-record.contract-fixture.md +58 -0
- package/src/tooling/portable/schema/fixtures/tiinex.task.v1.contract-fixture.md +165 -0
- package/src/tooling/portable/schema/fixtures/tiinex.transition.definition.v1.contract-fixture.md +744 -0
- package/src/tooling/portable/schema/fixtures/tiinex.transition.definition.v1.field-domain.contract-fixture.md +319 -0
- package/src/transitions/canonical-schema-cache/053d46ce082d4ec261b82abc44ecca403d61e240/tiinex.relation.v1.schema.md +240 -0
- package/src/transitions/canonical-schema-cache/053d46ce082d4ec261b82abc44ecca403d61e240/tiinex.schema.contract.v1.schema.md +391 -0
- package/src/transitions/canonical-schema-cache/053d46ce082d4ec261b82abc44ecca403d61e240/tiinex.schema.generation.v1.schema.md +379 -0
- package/src/transitions/canonical-schema-cache/053d46ce082d4ec261b82abc44ecca403d61e240/tiinex.schema.transition.companion.v1.schema.md +265 -0
- package/src/transitions/canonical-schema-cache/053d46ce082d4ec261b82abc44ecca403d61e240/tiinex.semantic.package.v1.schema.md +402 -0
- package/src/transitions/canonical-schema-cache/52ecdea0a75893882ce282214d155f70e1309c2a/tiinex.topic.v1.schema.md +197 -0
- package/src/transitions/canonical-schema-cache/d69b8ff55a56b8cb9282b8684db6a938a4435b94/tiinex.root.v1.schema.md +797 -0
- package/src/transitions/canonical-schema-cache/d69b8ff55a56b8cb9282b8684db6a938a4435b94/tiinex.transition.definition.v1.schema.md +1062 -0
- package/src/transitions/canonicalTransition.packageContracts.js +22 -0
- package/src/transitions/canonicalTransition.productDefaults.js +105 -0
- package/src/transitions/canonicalTransition.schemaCache.case.mjs +45 -0
- package/src/transitions/canonicalTransition.schemaCache.js +81 -0
- package/src/transitions/canonicalTransition.semanticPackage.js +146 -0
- package/src/transitions/record.transitions.case.mjs +88 -0
- package/src/transitions/transition.authorityRepresentation.js +55 -0
- package/src/transitions/transition.availabilityPlanner.js +376 -0
- package/src/transitions/transition.availabilitySemantics.js +150 -0
- package/src/transitions/transition.definitionReadProjection.js +107 -0
- package/src/transitions/transition.definitionRegistry.js +355 -0
- package/src/transitions/transition.definitionRegistryAggregation.js +21 -0
- package/src/transitions/transition.definitions.js +46 -0
- package/src/transitions/transition.explicitGenerationPlanner.js +58 -0
- package/src/transitions/transition.generationInputPlanner.js +19 -0
- package/src/transitions/transition.interpretationMaterializer.js +2 -0
- package/src/transitions/transition.invocationBindingPacket.js +52 -0
- package/src/transitions/transition.invocationBindingPlanner.js +467 -0
- package/src/transitions/transition.legacyShorthand.js +133 -0
- package/src/transitions/transition.localArtifactMaterializers.js +16 -0
- package/src/transitions/transition.localCreateCapability.js +111 -0
- package/src/transitions/transition.outputMaterializationPlanner.js +336 -0
- package/src/transitions/transition.parentReference.js +90 -0
- package/src/transitions/transition.presentation.js +43 -0
- package/src/transitions/transition.productPreparation.js +377 -0
- package/src/transitions/transition.productPresentation.browser.js +28 -0
- package/src/transitions/transition.productPresentation.js +55 -0
- package/src/transitions/transition.referenceCreateCapability.js +119 -0
- package/src/transitions/transition.referenceTarget.js +50 -0
- package/src/transitions/transition.relationMaterializer.js +2 -0
- package/src/transitions/transition.resultSemantics.js +453 -0
- package/src/transitions/transition.taskMaterializer.js +2 -0
- package/src/transitions/transition.topicMaterializer.js +2 -0
- package/src/transitions/transition.validate.case.mjs +58 -0
- package/src/ui/cards/ArtifactCard.js +1 -0
- package/src/ui/cards/SchemaCard.js +1 -0
- package/src/ui/cards/SourceCard.js +1 -0
- package/src/ui/dialog.presenter.js +24 -0
- package/src/ui/feedback/DegradedNotice.js +1 -0
- package/src/ui/feedback/EmptyState.js +1 -0
- package/src/ui/feedback/ValidationNotice.js +1 -0
- package/src/ui/forms/FormRenderer.js +1 -0
- package/src/ui/forms/fields/MarkdownField.js +1 -0
- package/src/ui/forms/fields/SelectField.js +1 -0
- package/src/ui/forms/fields/SourcePickerField.js +1 -0
- package/src/ui/forms/fields/TextField.js +1 -0
- package/src/ui/icon.paths.js +37 -0
- package/src/ui/layout/Panel.js +1 -0
- package/src/ui/layout/ResponsiveFrame.js +1 -0
- package/src/ui/layout/SplitView.js +1 -0
- package/src/ui/layout/Stack.js +1 -0
- package/src/ui/panels/DetailPanel.js +1 -0
- package/src/ui/panels/LineagePanel.js +1 -0
- package/src/ui/panels/SourcePanel.js +1 -0
- package/src/ui/primitives/Badge.js +1 -0
- package/src/ui/primitives/Badge.jsx +5 -0
- package/src/ui/primitives/Button.js +1 -0
- package/src/ui/primitives/Button.jsx +12 -0
- package/src/ui/primitives/Card.js +1 -0
- package/src/ui/primitives/Field.js +1 -0
- package/src/ui/primitives/Field.jsx +21 -0
- package/src/ui/primitives/Icon.jsx +90 -0
- package/src/ui/primitives/Modal.jsx +27 -0
- package/src/validation/i18n.js +37 -0
- package/src/validation/validateArtifact.case.mjs +41 -0
- package/src/verses/column/ColumnVerse.js +1 -0
- package/src/verses/column/column.model.js +6 -0
- package/src/verses/column/column.project.js +7 -0
- package/src/verses/context.js +26 -0
- package/src/verses/contracts.js +1 -0
- package/src/verses/hostRegistry.js +47 -0
- package/src/verses/registry.js +22 -0
- package/src/verses/universe.model.js +8 -0
- package/src/verses/universe.presenter.js +8 -0
- package/src/verses/universe.project.js +12 -0
- package/src/viewer.js +34 -0
- package/src/workspace.model.js +5 -0
- package/src/workspaces/workspace.actions.js +1 -0
- package/src/workspaces/workspace.artifactActions.js +56 -0
- package/src/workspaces/workspace.auditView.js +153 -0
- package/src/workspaces/workspace.candidates.js +149 -0
- package/src/workspaces/workspace.config.js +153 -0
- package/src/workspaces/workspace.configuredSource.js +68 -0
- package/src/workspaces/workspace.discoveryProgress.js +34 -0
- package/src/workspaces/workspace.discoveryView.js +386 -0
- package/src/workspaces/workspace.displayFilters.js +63 -0
- package/src/workspaces/workspace.displayOptions.js +58 -0
- package/src/workspaces/workspace.emptyStateCopy.js +24 -0
- package/src/workspaces/workspace.entrypointLifecycle.js +131 -0
- package/src/workspaces/workspace.entrypointViewIntent.js +83 -0
- package/src/workspaces/workspace.entrypoints.js +157 -0
- package/src/workspaces/workspace.feedSort.js +152 -0
- package/src/workspaces/workspace.import.js +212 -0
- package/src/workspaces/workspace.importConflicts.js +200 -0
- package/src/workspaces/workspace.importLifecycle.case.mjs +103 -0
- package/src/workspaces/workspace.lifecycle.case.mjs +353 -0
- package/src/workspaces/workspace.lifecycle.js +357 -0
- package/src/workspaces/workspace.lineageView.js +244 -0
- package/src/workspaces/workspace.localSourceLifecycle.js +91 -0
- package/src/workspaces/workspace.materialLedger.js +110 -0
- package/src/workspaces/workspace.materialReconciliation.case.mjs +164 -0
- package/src/workspaces/workspace.materialReconciliation.js +390 -0
- package/src/workspaces/workspace.memberIdentity.js +140 -0
- package/src/workspaces/workspace.model.js +2 -0
- package/src/workspaces/workspace.navigation.js +20 -0
- package/src/workspaces/workspace.openSemantics.js +33 -0
- package/src/workspaces/workspace.pathTree.js +132 -0
- package/src/workspaces/workspace.persistence.case.mjs +271 -0
- package/src/workspaces/workspace.persistence.js +469 -0
- package/src/workspaces/workspace.persistenceCache.js +41 -0
- package/src/workspaces/workspace.persistenceClear.js +45 -0
- package/src/workspaces/workspace.persistencePresentation.js +93 -0
- package/src/workspaces/workspace.persistenceRecovery.js +147 -0
- package/src/workspaces/workspace.persistenceRouteCache.js +82 -0
- package/src/workspaces/workspace.publicationReceipts.case.mjs +36 -0
- package/src/workspaces/workspace.publicationReceipts.js +56 -0
- package/src/workspaces/workspace.recoverabilityView.js +264 -0
- package/src/workspaces/workspace.route.js +432 -0
- package/src/workspaces/workspace.runtimeCanonical.js +18 -0
- package/src/workspaces/workspace.sourceMaterial.js +71 -0
- package/src/workspaces/workspace.sourceRecordPath.js +5 -0
- package/src/workspaces/workspace.sourceRecords.js +75 -0
- package/src/workspaces/workspace.store.js +3 -0
- package/src/workspaces/workspace.summary.js +116 -0
- package/src/workspaces/workspace.timePortal.js +137 -0
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import '../sources/source.identity.js';
|
|
2
|
+
|
|
3
|
+
export function collectLoadedArtifactAggregates(input = {}, declaredSchemaIdForRecord = () => '', metadataSchemaIdForRecord = () => '', canonicalSchemaId = '', identityPrefix = 'tiinex.artifact.registry') {
|
|
4
|
+
const aggregates = new Map();
|
|
5
|
+
const append = (record, containingWorkspaceId = '') => {
|
|
6
|
+
if (!record || typeof record !== 'object') return;
|
|
7
|
+
const memberships = recordWorkspaceMemberships(record, containingWorkspaceId);
|
|
8
|
+
const identity = artifactRegistryIdentityForRecord(record, memberships, declaredSchemaIdForRecord, metadataSchemaIdForRecord, identityPrefix);
|
|
9
|
+
const observation = {
|
|
10
|
+
record,
|
|
11
|
+
memberships,
|
|
12
|
+
representation: normalizedRepresentation(record.markdown || ''),
|
|
13
|
+
declaredSchemaId: String(declaredSchemaIdForRecord(record) || '').trim(),
|
|
14
|
+
metadataSchemaId: String(metadataSchemaIdForRecord(record) || '').trim()
|
|
15
|
+
};
|
|
16
|
+
const existing = aggregates.get(identity.key);
|
|
17
|
+
if (existing) {
|
|
18
|
+
for (const membership of memberships) existing.workspaceIds.add(membership);
|
|
19
|
+
existing.observations.push(observation);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
aggregates.set(identity.key, { identity, observations: [observation], workspaceIds: new Set(memberships) });
|
|
23
|
+
};
|
|
24
|
+
for (const record of Array.isArray(input.records) ? input.records : []) append(record);
|
|
25
|
+
for (const workspace of Array.isArray(input.state?.workspaces) ? input.state.workspaces : []) {
|
|
26
|
+
for (const record of Array.isArray(workspace?.records) ? workspace.records : []) append(record, workspace?.id || '');
|
|
27
|
+
}
|
|
28
|
+
return [...aggregates.values()].map((aggregate) => finalizeRecordAggregate(aggregate, canonicalSchemaId));
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function artifactRegistryIdentityForRecord(record = {}, workspaceIds = [], declaredSchemaIdForRecord = () => '', metadataSchemaIdForRecord = () => '', identityPrefix = 'tiinex.artifact.registry') {
|
|
32
|
+
const boundary = artifactSourceBoundaryIdentity(record);
|
|
33
|
+
const sourceArtifactPath = canonicalSourceArtifactPath(record);
|
|
34
|
+
const inputTarget = String(record.sourceTarget?.inputTarget || '').trim();
|
|
35
|
+
if (boundary?.key && sourceArtifactPath) {
|
|
36
|
+
return Object.freeze({
|
|
37
|
+
global: true,
|
|
38
|
+
kind: 'configured-source',
|
|
39
|
+
key: ['source-boundary', boundary.key, sourceArtifactPath].join('\u0000'),
|
|
40
|
+
id: registryIdentityId(identityPrefix, 'source-boundary', [boundary.key, sourceArtifactPath]),
|
|
41
|
+
sourceBoundary: boundary,
|
|
42
|
+
boundaryKey: boundary.key,
|
|
43
|
+
boundarySignature: boundary.signature,
|
|
44
|
+
sourceArtifactPath
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
if (inputTarget) {
|
|
48
|
+
const artifactScoped = Boolean(sourceArtifactPath && embeddedIssueArtifact(record));
|
|
49
|
+
const kind = artifactScoped ? 'input-target-artifact' : 'input-target';
|
|
50
|
+
const identityParts = artifactScoped ? [inputTarget, sourceArtifactPath] : [inputTarget];
|
|
51
|
+
return Object.freeze({
|
|
52
|
+
global: true,
|
|
53
|
+
kind,
|
|
54
|
+
key: ['target', ...identityParts].join('\u0000'),
|
|
55
|
+
id: registryIdentityId(identityPrefix, kind, identityParts),
|
|
56
|
+
inputTarget,
|
|
57
|
+
sourceArtifactPath: artifactScoped ? sourceArtifactPath : ''
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
const membershipScope = (Array.isArray(workspaceIds) ? workspaceIds : []).join(',');
|
|
61
|
+
const key = ['workspace-record', membershipScope, record.id || '', record.path || ''].join('\u0000');
|
|
62
|
+
return Object.freeze({
|
|
63
|
+
global: false,
|
|
64
|
+
kind: 'workspace-record',
|
|
65
|
+
key,
|
|
66
|
+
id: String(record.id || registryIdentityId(identityPrefix, 'workspace-record', [membershipScope, record.path || '']))
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export function readArtifactRepresentationQualification(record = {}) {
|
|
71
|
+
const aggregation = record.registryAggregation || {};
|
|
72
|
+
const variants = Array.isArray(aggregation.representationVariants) ? aggregation.representationVariants : [];
|
|
73
|
+
return Object.freeze({
|
|
74
|
+
state: String(aggregation.representationState || (variants.length ? 'equivalent' : 'unresolved')),
|
|
75
|
+
observationCount: Number(aggregation.observationCount || (variants.length ? 1 : 0)),
|
|
76
|
+
variantCount: variants.length,
|
|
77
|
+
variants: Object.freeze(variants.map((variant) => Object.freeze({
|
|
78
|
+
markdown: String(variant.markdown || ''),
|
|
79
|
+
recordIds: Object.freeze([...(variant.recordIds || [])]),
|
|
80
|
+
workspaceIds: Object.freeze([...(variant.workspaceIds || [])])
|
|
81
|
+
}))),
|
|
82
|
+
reconciliationStatuses: Object.freeze([...(aggregation.reconciliationStatuses || [])])
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export function readArtifactSchemaQualification(record = {}, canonicalSchemaId = '') {
|
|
87
|
+
const aggregation = record.registryAggregation || {};
|
|
88
|
+
const declaredSchemaIds = [...(aggregation.declaredSchemaIds || [])];
|
|
89
|
+
return Object.freeze({
|
|
90
|
+
state: String(aggregation.schemaState || (declaredSchemaIds.length === 1 ? 'equivalent' : 'unresolved')),
|
|
91
|
+
declaredSchemaIds: Object.freeze(declaredSchemaIds),
|
|
92
|
+
canonicalSchemaId: String(canonicalSchemaId || aggregation.canonicalSchemaId || ''),
|
|
93
|
+
canonicalObserved: aggregation.canonicalSchemaObserved === true,
|
|
94
|
+
unresolvedObservationCount: Number(aggregation.unresolvedSchemaObservationCount || 0),
|
|
95
|
+
observationCount: Number(aggregation.observationCount || 0)
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export function artifactSourceBoundaryIdentity(record = {}) {
|
|
100
|
+
const source = record.source || {};
|
|
101
|
+
return globalThis.TiinexSourceIdentity?.configuredSourceBoundaryIdentity?.({
|
|
102
|
+
repository: source.repository || source.repo || source.config?.repo || '',
|
|
103
|
+
ref: source.ref || source.requestedRef || source.config?.ref || '',
|
|
104
|
+
rootPath: source.rootPath || source.config?.rootPath || '.topics'
|
|
105
|
+
}) || null;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export function artifactSourceBoundarySignature(record = {}) {
|
|
109
|
+
return String(artifactSourceBoundaryIdentity(record)?.signature || '');
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function finalizeRecordAggregate(aggregate = {}, canonicalSchemaId = '') {
|
|
113
|
+
const memberships = [...(aggregate.workspaceIds || [])].sort();
|
|
114
|
+
const observations = [...(aggregate.observations || [])].sort(compareObservations);
|
|
115
|
+
const schemaQualification = schemaAggregateQualification(observations, canonicalSchemaId);
|
|
116
|
+
const representative = representativeObservation(observations, canonicalSchemaId)?.record || {};
|
|
117
|
+
const loadedRecordIds = [...new Set(observations.map((item) => String(item.record?.id || '').trim()).filter(Boolean))].sort();
|
|
118
|
+
const loadedSourceIds = [...new Set(observations.map((item) => String(item.record?.source?.id || '').trim()).filter(Boolean))].sort();
|
|
119
|
+
const variants = representationVariants(observations);
|
|
120
|
+
const reconciliationStatuses = [...new Set(observations.map((item) => String(item.record?.materialReconciliation?.status || '').trim()).filter(Boolean))].sort();
|
|
121
|
+
const representationState = representationAggregateState(variants, reconciliationStatuses);
|
|
122
|
+
const identity = aggregate.identity || {};
|
|
123
|
+
return Object.assign({}, representative, {
|
|
124
|
+
id: identity.global ? String(loadedRecordIds[0] || identity.id || '') : String(representative.id || identity.id || ''),
|
|
125
|
+
workspaceId: memberships[0] || '',
|
|
126
|
+
workspaceIds: memberships,
|
|
127
|
+
registryIdentity: identity,
|
|
128
|
+
loadedRecordIds,
|
|
129
|
+
loadedSourceIds,
|
|
130
|
+
registryAggregation: Object.freeze({
|
|
131
|
+
observationCount: observations.length,
|
|
132
|
+
representationState,
|
|
133
|
+
representationVariants: Object.freeze(variants),
|
|
134
|
+
reconciliationStatuses: Object.freeze(reconciliationStatuses),
|
|
135
|
+
schemaState: schemaQualification.state,
|
|
136
|
+
declaredSchemaIds: Object.freeze(schemaQualification.declaredSchemaIds),
|
|
137
|
+
canonicalSchemaId: String(canonicalSchemaId || ''),
|
|
138
|
+
canonicalSchemaObserved: schemaQualification.canonicalObserved,
|
|
139
|
+
unresolvedSchemaObservationCount: schemaQualification.unresolvedObservationCount
|
|
140
|
+
})
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function schemaAggregateQualification(observations = [], canonicalSchemaId = '') {
|
|
145
|
+
const declaredSchemaIds = [...new Set(observations.map((item) => String(item.declaredSchemaId || '').trim()).filter(Boolean))].sort();
|
|
146
|
+
const unresolvedObservationCount = observations.filter((item) => !String(item.declaredSchemaId || '').trim()).length;
|
|
147
|
+
const canonicalObserved = Boolean(canonicalSchemaId && declaredSchemaIds.includes(canonicalSchemaId));
|
|
148
|
+
let state = 'unresolved';
|
|
149
|
+
if (!unresolvedObservationCount && declaredSchemaIds.length === 1) state = 'equivalent';
|
|
150
|
+
else if (declaredSchemaIds.length > 1) state = 'conflicting';
|
|
151
|
+
return { state, declaredSchemaIds, canonicalObserved, unresolvedObservationCount };
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function representativeObservation(observations = [], canonicalSchemaId = '') {
|
|
155
|
+
if (canonicalSchemaId) {
|
|
156
|
+
const canonical = observations.filter((item) => item.declaredSchemaId === canonicalSchemaId);
|
|
157
|
+
if (canonical.length) return canonical[0];
|
|
158
|
+
}
|
|
159
|
+
return observations[0];
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function recordWorkspaceMemberships(record = {}, containingWorkspaceId = '') {
|
|
163
|
+
const memberships = new Set();
|
|
164
|
+
const add = (value) => {
|
|
165
|
+
const id = String(value || '').trim();
|
|
166
|
+
if (id) memberships.add(id);
|
|
167
|
+
};
|
|
168
|
+
add(containingWorkspaceId);
|
|
169
|
+
add(record.workspaceId);
|
|
170
|
+
for (const value of Array.isArray(record.workspaceIds) ? record.workspaceIds : []) add(value);
|
|
171
|
+
return [...memberships].sort();
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
function compareObservations(left = {}, right = {}) {
|
|
175
|
+
return String(left.representation || '').localeCompare(String(right.representation || ''))
|
|
176
|
+
|| String(left.declaredSchemaId || '').localeCompare(String(right.declaredSchemaId || ''))
|
|
177
|
+
|| String(left.record?.path || '').localeCompare(String(right.record?.path || ''))
|
|
178
|
+
|| String(left.record?.id || '').localeCompare(String(right.record?.id || ''))
|
|
179
|
+
|| String((left.memberships || []).join(',')).localeCompare(String((right.memberships || []).join(',')));
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
function representationVariants(observations = []) {
|
|
183
|
+
const variants = new Map();
|
|
184
|
+
for (const observation of observations) {
|
|
185
|
+
const markdown = String(observation.representation || '');
|
|
186
|
+
const existing = variants.get(markdown) || { markdown, recordIds: new Set(), workspaceIds: new Set() };
|
|
187
|
+
const recordId = String(observation.record?.id || '').trim();
|
|
188
|
+
if (recordId) existing.recordIds.add(recordId);
|
|
189
|
+
for (const workspaceId of observation.memberships || []) if (workspaceId) existing.workspaceIds.add(workspaceId);
|
|
190
|
+
variants.set(markdown, existing);
|
|
191
|
+
}
|
|
192
|
+
return [...variants.values()]
|
|
193
|
+
.sort((a, b) => a.markdown.localeCompare(b.markdown))
|
|
194
|
+
.map((variant) => Object.freeze({
|
|
195
|
+
markdown: variant.markdown,
|
|
196
|
+
recordIds: Object.freeze([...variant.recordIds].sort()),
|
|
197
|
+
workspaceIds: Object.freeze([...variant.workspaceIds].sort())
|
|
198
|
+
}));
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
function representationAggregateState(variants = [], reconciliationStatuses = []) {
|
|
202
|
+
if (variants.length > 1 || reconciliationStatuses.includes('checksum-mismatch')) return 'conflicting';
|
|
203
|
+
if (reconciliationStatuses.includes('same-origin-unverified')) return 'unresolved';
|
|
204
|
+
return variants.length === 1 ? 'equivalent' : 'unresolved';
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
function normalizedRepresentation(markdown = '') { return String(markdown || '').replace(/\r\n?/g, '\n'); }
|
|
208
|
+
|
|
209
|
+
function embeddedIssueArtifact(record = {}) {
|
|
210
|
+
const mode = String(record.sourceMode || '').trim();
|
|
211
|
+
const targetKind = String(record.sourceTarget?.targetKind || '').trim();
|
|
212
|
+
return mode === 'github-issue-embedded-artifact'
|
|
213
|
+
|| mode === 'github-comment-embedded-artifact'
|
|
214
|
+
|| targetKind === 'github-issue-embedded-artifact'
|
|
215
|
+
|| targetKind === 'github-comment-embedded-artifact';
|
|
216
|
+
}
|
|
217
|
+
function canonicalSourceArtifactPath(record = {}) { return String(record.sourceTarget?.sourceArtifactPath || record.path || '').trim().replace(/\\/g, '/').replace(/^\/+/, '').replace(/\/{2,}/g, '/'); }
|
|
218
|
+
function registryIdentityId(prefix, kind, parts = []) { return `${prefix}:${kind}:${parts.map((value) => encodeURIComponent(String(value || ''))).join(':')}`; }
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { parseArtifactMarkdown } from '@tiinex/core/artifacts/artifact.parse.js';
|
|
3
|
+
|
|
4
|
+
const ROOT_WITHOUT_PARENT = `# Continuity Context
|
|
5
|
+
|
|
6
|
+
- Envelope Schema: [tiinex.root.v1](tiinex.root.v1.schema.md)
|
|
7
|
+
- Current
|
|
8
|
+
- Current Schema: [tiinex.root.v1](tiinex.root.v1.schema.md)
|
|
9
|
+
- Created At: 2026-07-23T00:00:00.000Z
|
|
10
|
+
- Summary: Root artifact without an artifact parent.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Root Artifact
|
|
15
|
+
|
|
16
|
+
## Summary
|
|
17
|
+
|
|
18
|
+
No parent is declared.
|
|
19
|
+
|
|
20
|
+
# Continuity Integrity
|
|
21
|
+
|
|
22
|
+
- Method: pending
|
|
23
|
+
- Value: pending
|
|
24
|
+
`;
|
|
25
|
+
|
|
26
|
+
const CHILD_SCHEMA_WITHOUT_ARTIFACT_PARENT = `# Continuity Context
|
|
27
|
+
|
|
28
|
+
- Envelope Schema: [tiinex.root.v1](tiinex.root.v1.schema.md)
|
|
29
|
+
- Current
|
|
30
|
+
- Current Schema: [tiinex.schema.module.v1](tiinex.schema.module.v1.schema.md)
|
|
31
|
+
- Created At: 2026-07-23T00:01:00.000Z
|
|
32
|
+
- Summary: Child schema artifact that inherits schema meaning but declares no artifact parent.
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
# Schema Module
|
|
37
|
+
|
|
38
|
+
## Summary
|
|
39
|
+
|
|
40
|
+
No artifact Parent block is declared here.
|
|
41
|
+
|
|
42
|
+
# Continuity Integrity
|
|
43
|
+
|
|
44
|
+
- Method: pending
|
|
45
|
+
- Value: pending
|
|
46
|
+
`;
|
|
47
|
+
|
|
48
|
+
const CHILD_WITH_PARENT = `# Continuity Context
|
|
49
|
+
|
|
50
|
+
- Envelope Schema: [tiinex.root.v1](tiinex.root.v1.schema.md)
|
|
51
|
+
- Parent
|
|
52
|
+
- Parent Schema: [tiinex.topic.v1](tiinex.topic.v1.schema.md)
|
|
53
|
+
- Trace: [parent](parent.trace.md)
|
|
54
|
+
- Origin: [browse + git](https://github.com/Tiinex/docs/blob/abc/parent.trace.md)
|
|
55
|
+
- Created At: 2026-07-22T00:00:00.000Z
|
|
56
|
+
- Current
|
|
57
|
+
- Current Schema: [tiinex.topic.v1](tiinex.topic.v1.schema.md)
|
|
58
|
+
- Created At: 2026-07-23T00:02:00.000Z
|
|
59
|
+
- Summary: Child with declared parent.
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
# Child
|
|
64
|
+
|
|
65
|
+
# Continuity Integrity
|
|
66
|
+
|
|
67
|
+
- Method: pending
|
|
68
|
+
- Value: pending
|
|
69
|
+
`;
|
|
70
|
+
|
|
71
|
+
const root = parseArtifactMarkdown(ROOT_WITHOUT_PARENT);
|
|
72
|
+
assert.equal(root.envelope.parent.schema.id, '', 'root without Parent must not inherit Current Schema as Parent Schema');
|
|
73
|
+
assert.equal(root.envelope.parent.createdAt, '', 'Current Created At must not leak into Parent Created At');
|
|
74
|
+
assert.equal(root.envelope.parent.trace, '', 'root without Parent must not infer a Trace');
|
|
75
|
+
assert.equal(root.envelope.parent.origin, '', 'root without Parent must not infer an Origin');
|
|
76
|
+
assert.equal(root.envelope.current.schema.id, 'tiinex.root.v1', 'Current Schema remains readable');
|
|
77
|
+
assert.equal(root.envelope.current.createdAt, '2026-07-23T00:00:00.000Z', 'Current Created At remains readable');
|
|
78
|
+
|
|
79
|
+
const schemaArtifact = parseArtifactMarkdown(CHILD_SCHEMA_WITHOUT_ARTIFACT_PARENT);
|
|
80
|
+
assert.equal(schemaArtifact.envelope.parent.schema.id, '', 'child schema artifact without artifact Parent must not fabricate parent schema');
|
|
81
|
+
assert.equal(schemaArtifact.envelope.parent.trace, '', 'child schema artifact without artifact Parent must not fabricate parent trace');
|
|
82
|
+
assert.equal(schemaArtifact.envelope.current.schema.id, 'tiinex.schema.module.v1', 'child schema Current Schema remains readable');
|
|
83
|
+
|
|
84
|
+
const child = parseArtifactMarkdown(CHILD_WITH_PARENT);
|
|
85
|
+
assert.equal(child.envelope.parent.schema.id, 'tiinex.topic.v1', 'valid Parent Schema parses');
|
|
86
|
+
assert.equal(child.envelope.parent.trace, 'parent.trace.md', 'valid Parent Trace uses markdown link target for resolution');
|
|
87
|
+
assert.equal(child.envelope.parent.traceLabel, 'parent', 'valid Parent Trace preserves markdown link label for presentation');
|
|
88
|
+
assert.equal(child.envelope.parent.origin, 'https://github.com/Tiinex/docs/blob/abc/parent.trace.md', 'valid Parent Origin parses');
|
|
89
|
+
assert.equal(child.envelope.parent.createdAt, '2026-07-22T00:00:00.000Z', 'valid Parent Created At parses');
|
|
90
|
+
assert.equal(child.envelope.current.createdAt, '2026-07-23T00:02:00.000Z', 'valid Current Created At stays separate');
|
|
91
|
+
|
|
92
|
+
const CANONICAL_FOOTER_DIVIDER = `# Continuity Context
|
|
93
|
+
|
|
94
|
+
- Envelope Schema: [tiinex.root.v1](tiinex.root.v1.schema.md)
|
|
95
|
+
- Current
|
|
96
|
+
- Current Schema: [tiinex.topic.v1](tiinex.topic.v1.schema.md)
|
|
97
|
+
- Created At: 2026-07-23T00:02:30.000Z
|
|
98
|
+
- Summary: Canonical footer divider
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
# Canonical Divider
|
|
103
|
+
|
|
104
|
+
## Current Read
|
|
105
|
+
|
|
106
|
+
body sentinel
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
# Continuity Integrity
|
|
111
|
+
|
|
112
|
+
- sha256-base64url-c14n-v2
|
|
113
|
+
- Towards: self
|
|
114
|
+
- Value: pending
|
|
115
|
+
`;
|
|
116
|
+
const canonicalDivider = parseArtifactMarkdown(CANONICAL_FOOTER_DIVIDER);
|
|
117
|
+
assert.equal(canonicalDivider.body.text.includes('---'), false, 'canonical footer divider is representation boundary, not body content');
|
|
118
|
+
assert.equal(canonicalDivider.body.text.endsWith('body sentinel'), true, 'body ends before canonical footer divider');
|
|
119
|
+
assert.equal(canonicalDivider.integrity.entries.length, 1, 'integrity remains readable after canonical footer divider');
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
const CHILD_WITH_RELATIVE_PARENT_LINK = `# Continuity Context
|
|
123
|
+
|
|
124
|
+
- Envelope Schema: [tiinex.root.v1](tiinex.root.v1.schema.md)
|
|
125
|
+
- Parent
|
|
126
|
+
- Parent Schema: [tiinex.topic.v1](tiinex.topic.v1.schema.md)
|
|
127
|
+
- Trace: [001.trace.md](../001.trace.md)
|
|
128
|
+
- Current
|
|
129
|
+
- Current Schema: [tiinex.topic.v1](tiinex.topic.v1.schema.md)
|
|
130
|
+
- Created At: 2026-07-23T00:03:00.000Z
|
|
131
|
+
- Summary: Child with relative parent href.
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
# Child With Relative Parent
|
|
136
|
+
`;
|
|
137
|
+
|
|
138
|
+
const relativeChild = parseArtifactMarkdown(CHILD_WITH_RELATIVE_PARENT_LINK);
|
|
139
|
+
assert.equal(relativeChild.envelope.parent.trace, '../001.trace.md', 'Parent Trace link href is the resolution target');
|
|
140
|
+
assert.equal(relativeChild.envelope.parent.traceLabel, '001.trace.md', 'Parent Trace label remains available for display');
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
const CHILD_WITH_LABELLED_PARENT_ORIGIN = `# Continuity Context
|
|
144
|
+
|
|
145
|
+
- Envelope Schema: [tiinex.root.v1](tiinex.root.v1.schema.md)
|
|
146
|
+
- Parent
|
|
147
|
+
- Parent Schema: [tiinex.topic.v1](tiinex.topic.v1.schema.md)
|
|
148
|
+
- Trace: [001.trace.md](001.trace.md)
|
|
149
|
+
- Origin:
|
|
150
|
+
- relative: 001.trace.md
|
|
151
|
+
- [github git file](https://github.com/Tiinex/docs/blob/main/.topics/area/001.trace.md)
|
|
152
|
+
- Current
|
|
153
|
+
- Current Schema: [tiinex.topic.v1](tiinex.topic.v1.schema.md)
|
|
154
|
+
- Created At: 2026-07-25T00:00:00.000Z
|
|
155
|
+
- Summary: Child with labelled nested origin.
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
# Child With Labelled Origin
|
|
160
|
+
`;
|
|
161
|
+
const labelledOriginChild = parseArtifactMarkdown(CHILD_WITH_LABELLED_PARENT_ORIGIN);
|
|
162
|
+
assert.equal(labelledOriginChild.envelope.parent.origin, '001.trace.md', 'labelled nested Parent Origin should expose the value, not the label prefix');
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
const INTEGRITY_WITH_TOWARDS = `# Continuity Context
|
|
166
|
+
|
|
167
|
+
- Envelope Schema: [tiinex.root.v1](tiinex.root.v1.schema.md)
|
|
168
|
+
- Parent
|
|
169
|
+
- Parent Schema: [tiinex.topic.v1](tiinex.topic.v1.schema.md)
|
|
170
|
+
- Trace: [001.trace.md](001.trace.md)
|
|
171
|
+
- Current
|
|
172
|
+
- Current Schema: [tiinex.topic.v1](tiinex.topic.v1.schema.md)
|
|
173
|
+
- Summary: Integrity entries
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
# Integrity Entries
|
|
178
|
+
|
|
179
|
+
# Continuity Integrity
|
|
180
|
+
|
|
181
|
+
- [sha256-base64url-c14n-v2](validator.md)
|
|
182
|
+
- Towards: [001.trace.md](001.trace.md)
|
|
183
|
+
- Value: parent-hash
|
|
184
|
+
|
|
185
|
+
- [sha256-base64url-c14n-v2](validator.md)
|
|
186
|
+
- Towards: self
|
|
187
|
+
- Value: self-hash
|
|
188
|
+
`;
|
|
189
|
+
const integrityEntries = parseArtifactMarkdown(INTEGRITY_WITH_TOWARDS).integrity.entries;
|
|
190
|
+
assert.equal(integrityEntries.length, 2, 'integrity parser should expose structured entries');
|
|
191
|
+
assert.equal(integrityEntries[0].towards, '001.trace.md', 'integrity Towards should prefer link target');
|
|
192
|
+
assert.equal(integrityEntries[0].value, 'parent-hash', 'integrity parent Value should parse');
|
|
193
|
+
assert.equal(integrityEntries[1].towards, 'self', 'integrity self Towards should parse');
|
|
194
|
+
assert.equal(integrityEntries[1].value, 'self-hash', 'integrity self Value should parse');
|
|
195
|
+
|
|
196
|
+
console.log('✓ artifact parser Parent-block regression guards passed');
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { parseArtifactMarkdown } from '@tiinex/core/artifacts/artifact.parse.js';
|
|
2
|
+
import {
|
|
3
|
+
collectLoadedArtifactAggregates,
|
|
4
|
+
readArtifactRepresentationQualification,
|
|
5
|
+
readArtifactSchemaQualification,
|
|
6
|
+
artifactSourceBoundaryIdentity,
|
|
7
|
+
artifactRegistryIdentityForRecord
|
|
8
|
+
} from './artifact.identityAggregation.js';
|
|
9
|
+
|
|
10
|
+
export const ARTIFACT_PARTICIPANT_INDEX_SCHEMA_ID = 'tiinex.site.artifact-participant-index.v1';
|
|
11
|
+
export const ARTIFACT_PARTICIPANT_SCHEMA_ID = 'tiinex.site.artifact-participant.v1';
|
|
12
|
+
const PARTICIPANT_IDENTITY_PREFIX = 'tiinex.artifact.participant';
|
|
13
|
+
|
|
14
|
+
export function buildLoadedArtifactParticipantIndex(input = {}) {
|
|
15
|
+
const aggregates = collectLoadedArtifactAggregates(
|
|
16
|
+
input,
|
|
17
|
+
declaredRecordSchemaId,
|
|
18
|
+
metadataRecordSchemaId,
|
|
19
|
+
'',
|
|
20
|
+
PARTICIPANT_IDENTITY_PREFIX
|
|
21
|
+
);
|
|
22
|
+
const participants = aggregates
|
|
23
|
+
.filter(hasAnyDeclaredArtifactSchema)
|
|
24
|
+
.map(buildArtifactParticipantReadModel)
|
|
25
|
+
.sort(compareParticipants);
|
|
26
|
+
return Object.freeze({
|
|
27
|
+
schema: ARTIFACT_PARTICIPANT_INDEX_SCHEMA_ID,
|
|
28
|
+
count: participants.length,
|
|
29
|
+
cleanCandidateCount: participants.filter((participant) => participant.cleanCandidate).length,
|
|
30
|
+
participants: Object.freeze(participants),
|
|
31
|
+
boundary: Object.freeze({
|
|
32
|
+
readOnly: true,
|
|
33
|
+
networkFetch: false,
|
|
34
|
+
mutation: false,
|
|
35
|
+
completenessRequired: false
|
|
36
|
+
})
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function buildArtifactParticipantReadModel(record = {}) {
|
|
41
|
+
const representationQualification = readArtifactRepresentationQualification(record);
|
|
42
|
+
const schemaQualification = readArtifactSchemaQualification(record);
|
|
43
|
+
const declaredSchemaIds = [...schemaQualification.declaredSchemaIds];
|
|
44
|
+
const aggregateIdentity = record.registryIdentity || {};
|
|
45
|
+
const identity = participantIdentityProjection(aggregateIdentity);
|
|
46
|
+
const cleanCandidate = Boolean(identity.id)
|
|
47
|
+
&& representationQualification.state === 'equivalent'
|
|
48
|
+
&& schemaQualification.state === 'equivalent'
|
|
49
|
+
&& declaredSchemaIds.length === 1;
|
|
50
|
+
return Object.freeze({
|
|
51
|
+
schema: ARTIFACT_PARTICIPANT_SCHEMA_ID,
|
|
52
|
+
identity: Object.freeze({
|
|
53
|
+
id: identity.id,
|
|
54
|
+
key: identity.key,
|
|
55
|
+
kind: identity.kind,
|
|
56
|
+
global: identity.global
|
|
57
|
+
}),
|
|
58
|
+
artifact: Object.freeze({
|
|
59
|
+
id: String(record.id || ''),
|
|
60
|
+
loadedRecordIds: Object.freeze([...(record.loadedRecordIds || [record.id]).map(normalizeToken).filter(Boolean)].sort()),
|
|
61
|
+
workspaceIds: Object.freeze([...(record.workspaceIds || []).map(normalizeToken).filter(Boolean)].sort()),
|
|
62
|
+
path: String(record.path || ''),
|
|
63
|
+
title: String(record.title || ''),
|
|
64
|
+
declaredSchemaId: cleanCandidate ? declaredSchemaIds[0] : '',
|
|
65
|
+
declaredSchemaIds: Object.freeze(declaredSchemaIds),
|
|
66
|
+
metadataSchemaId: metadataRecordSchemaId(record),
|
|
67
|
+
currentCreatedAt: String(record.currentCreatedAt || record.createdAt || '')
|
|
68
|
+
}),
|
|
69
|
+
source: sourceProjection(record),
|
|
70
|
+
representationQualification,
|
|
71
|
+
schemaQualification,
|
|
72
|
+
indexedReadable: declaredSchemaIds.length > 0,
|
|
73
|
+
cleanCandidate,
|
|
74
|
+
candidateSchemaId: cleanCandidate ? declaredSchemaIds[0] : '',
|
|
75
|
+
completeness: 'not-evaluated'
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export function participantMatchesSchema(participant = {}, schemaConstraint = '') {
|
|
80
|
+
if (!participant?.cleanCandidate) return false;
|
|
81
|
+
const constraint = normalizeSchemaConstraint(schemaConstraint);
|
|
82
|
+
return !constraint || participant.candidateSchemaId === constraint;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export function resolveCurrentArtifactParticipant(currentArtifact, participantIndex = {}) {
|
|
86
|
+
if (!currentArtifact) return null;
|
|
87
|
+
if (currentArtifact.schema === ARTIFACT_PARTICIPANT_SCHEMA_ID) return currentArtifact;
|
|
88
|
+
const participants = Array.isArray(participantIndex.participants) ? participantIndex.participants : [];
|
|
89
|
+
|
|
90
|
+
const suppliedIdentityKey = normalizeToken(currentArtifact.identity?.key || currentArtifact.participantIdentity?.key || currentArtifact.registryIdentity?.key);
|
|
91
|
+
if (suppliedIdentityKey) {
|
|
92
|
+
const matches = participants.filter((participant) => participant.identity.key === suppliedIdentityKey);
|
|
93
|
+
if (matches.length === 1) return matches[0];
|
|
94
|
+
if (matches.length > 1) return null;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const suppliedIdentityId = normalizeToken(currentArtifact.identity?.id || currentArtifact.participantIdentity?.id);
|
|
98
|
+
if (suppliedIdentityId) {
|
|
99
|
+
const matches = participants.filter((participant) => participant.identity.id === suppliedIdentityId);
|
|
100
|
+
if (matches.length === 1) return matches[0];
|
|
101
|
+
if (matches.length > 1) return null;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const aggregateIdentity = artifactRegistryIdentityForRecord(
|
|
105
|
+
currentArtifact,
|
|
106
|
+
currentArtifactWorkspaceIds(currentArtifact),
|
|
107
|
+
declaredRecordSchemaId,
|
|
108
|
+
metadataRecordSchemaId,
|
|
109
|
+
PARTICIPANT_IDENTITY_PREFIX
|
|
110
|
+
);
|
|
111
|
+
if (aggregateIdentity?.key) {
|
|
112
|
+
const matches = participants.filter((participant) => participant.identity.key === aggregateIdentity.key);
|
|
113
|
+
if (matches.length === 1) return matches[0];
|
|
114
|
+
if (matches.length > 1) return null;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const recordId = normalizeToken(currentArtifact.id);
|
|
118
|
+
if (!recordId) return null;
|
|
119
|
+
const recordIdMatches = participants.filter((participant) => participant.artifact.loadedRecordIds.includes(recordId));
|
|
120
|
+
return recordIdMatches.length === 1 ? recordIdMatches[0] : null;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
function participantIdentityProjection(identity = {}) {
|
|
125
|
+
const key = normalizeToken(identity.key);
|
|
126
|
+
const kind = normalizeToken(identity.kind);
|
|
127
|
+
const global = identity.global === true;
|
|
128
|
+
const id = global
|
|
129
|
+
? normalizeToken(identity.id) || participantIdentityId(kind || 'global', key)
|
|
130
|
+
: participantIdentityId(kind || 'workspace-record', key);
|
|
131
|
+
return Object.freeze({ id, key, kind, global });
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
function participantIdentityId(kind = '', key = '') {
|
|
135
|
+
return `${PARTICIPANT_IDENTITY_PREFIX}:${encodeURIComponent(normalizeToken(kind))}:${encodeURIComponent(normalizeToken(key))}`;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
function currentArtifactWorkspaceIds(record = {}) {
|
|
139
|
+
const memberships = new Set();
|
|
140
|
+
const add = (value) => {
|
|
141
|
+
const id = normalizeToken(value);
|
|
142
|
+
if (id) memberships.add(id);
|
|
143
|
+
};
|
|
144
|
+
add(record.workspaceId);
|
|
145
|
+
for (const value of Array.isArray(record.workspaceIds) ? record.workspaceIds : []) add(value);
|
|
146
|
+
return [...memberships].sort();
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function hasAnyDeclaredArtifactSchema(record = {}) {
|
|
150
|
+
return readArtifactSchemaQualification(record).declaredSchemaIds.length > 0;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function sourceProjection(record = {}) {
|
|
154
|
+
const identity = record.registryIdentity || {};
|
|
155
|
+
const boundary = identity.sourceBoundary || artifactSourceBoundaryIdentity(record) || {};
|
|
156
|
+
return Object.freeze({
|
|
157
|
+
sourceIds: Object.freeze([...(record.loadedSourceIds || [record.source?.id]).map(normalizeToken).filter(Boolean)].sort()),
|
|
158
|
+
adapterId: String(record.source?.adapterId || ''),
|
|
159
|
+
sourceMode: String(record.sourceMode || ''),
|
|
160
|
+
repository: String(boundary.repository || record.source?.repository || record.source?.repo || ''),
|
|
161
|
+
ref: String(boundary.ref || record.source?.ref || ''),
|
|
162
|
+
rootPath: String(boundary.rootPath || record.source?.rootPath || ''),
|
|
163
|
+
boundaryKey: String(boundary.key || identity.boundaryKey || ''),
|
|
164
|
+
boundarySignature: String(boundary.signature || identity.boundarySignature || ''),
|
|
165
|
+
sourceArtifactPath: String(identity.sourceArtifactPath || record.sourceTarget?.sourceArtifactPath || record.path || ''),
|
|
166
|
+
inputTarget: String(identity.inputTarget || record.sourceTarget?.inputTarget || '')
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
function declaredRecordSchemaId(record = {}) {
|
|
171
|
+
const markdown = String(record.markdown || '');
|
|
172
|
+
if (!markdown.trim()) return '';
|
|
173
|
+
try { return normalizeToken(parseArtifactMarkdown(markdown).envelope?.current?.schema?.id); }
|
|
174
|
+
catch { return ''; }
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function metadataRecordSchemaId(record = {}) {
|
|
178
|
+
return normalizeToken(record.schemaId || record.currentSchemaId || '');
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
function normalizeSchemaConstraint(value = '') {
|
|
182
|
+
return normalizeToken(value).replace(/^\[([^\]]+)\]\([^)]+\)$/, '$1');
|
|
183
|
+
}
|
|
184
|
+
function normalizeToken(value = '') { return String(value || '').trim(); }
|
|
185
|
+
function compareParticipants(left, right) {
|
|
186
|
+
return String(left.identity.id).localeCompare(String(right.identity.id))
|
|
187
|
+
|| String(left.artifact.path).localeCompare(String(right.artifact.path))
|
|
188
|
+
|| String(left.artifact.id).localeCompare(String(right.artifact.id));
|
|
189
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Continuity Context
|
|
2
|
+
|
|
3
|
+
- Envelope Schema: [tiinex.root.v1](../../.topics/.schemas/tiinex.root.v1.schema.md)
|
|
4
|
+
- Parent
|
|
5
|
+
- Parent Schema: [tiinex.preservation.v1](../../.topics/.schemas/core/preservation/tiinex.preservation.v1.schema.md)
|
|
6
|
+
- Created At: 2026-07-19 00:00:00
|
|
7
|
+
- Trace: [demo-preservation.trace.md](demo-preservation.trace.md)
|
|
8
|
+
- Current
|
|
9
|
+
- Current Schema: [tiinex.evidence.v1](../../.topics/.schemas/core/evidence/tiinex.evidence.v1.schema.md)
|
|
10
|
+
- Created At: 2026-07-19 00:00:00
|
|
11
|
+
- Summary: Demo evidence artifact for parser/root fallback validation.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Local Startup Evidence
|
|
16
|
+
|
|
17
|
+
## Supported Claim Or Question
|
|
18
|
+
|
|
19
|
+
- Supported Claim Or Question: whether the fresh shell can start through local index.html
|
|
20
|
+
- Evidence Role: supports that the file-local startup path is visible
|
|
21
|
+
|
|
22
|
+
## Provenance
|
|
23
|
+
|
|
24
|
+
- Known Source: Q manual screenshot feedback
|
|
25
|
+
- Preservation Basis: summarized observation in this demo artifact
|
|
26
|
+
- Provenance Limits: exact browser console details are outside this sample
|
|
27
|
+
|
|
28
|
+
## Evidence Material
|
|
29
|
+
|
|
30
|
+
- Material Kind: screenshot observation
|
|
31
|
+
- Material: v82 shell rendered locally without loading app.js
|
|
32
|
+
|
|
33
|
+
## Preservation And Fidelity
|
|
34
|
+
|
|
35
|
+
- Preservation State: readable summary preserved in markdown
|
|
36
|
+
- Fidelity Notes: summarized by reviewer from screenshot
|
|
37
|
+
- Known Losses: exact pixel state and full devtools console not embedded
|
|
38
|
+
|
|
39
|
+
## Interpretation Limits
|
|
40
|
+
|
|
41
|
+
- Does Not Prove: full UX correctness or schema validation completeness
|
|
42
|
+
- Must Not Be Treated As: deployment proof, source authority, or user acceptance
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
# Continuity Integrity
|
|
47
|
+
|
|
48
|
+
- sha256-base64url-c14n-v2
|
|
49
|
+
- Towards: self
|
|
50
|
+
- Value: demo-evidence-v84-not-authoritative
|