@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.
Files changed (580) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +31 -0
  3. package/README.md +26 -0
  4. package/docs/CONSUMER-CONTRACT.md +65 -0
  5. package/package.json +94 -0
  6. package/src/acceptance/knownScenarios.case.mjs +48 -0
  7. package/src/acceptance/knownScenarios.js +89 -0
  8. package/src/acceptance/postV423CanonicalTransitionProductVerticalSlice.case.mjs +774 -0
  9. package/src/acceptance/postV437M0ETimePortalProductParityClosure.case.mjs +51 -0
  10. package/src/acceptance/postV447M0FGithubSocialPublicationProductIntegration.case.mjs +33 -0
  11. package/src/acceptance/postV450M0ProductAcceptanceHardening.case.mjs +82 -0
  12. package/src/acceptance/postV470SchemaReadingContractMaterializationIdentitySourceCoalescingAuthorityCorrection.case.mjs +236 -0
  13. package/src/acceptance/recoveryAcceptance.case.mjs +196 -0
  14. package/src/adapters/adapter.definition.schema.json +33 -0
  15. package/src/adapters/archive/archive.adapter.case.mjs +212 -0
  16. package/src/adapters/export/export.adapter.js +79 -0
  17. package/src/adapters/git-native/git-native.adapter.js +43 -0
  18. package/src/adapters/github/github.adapter.case.mjs +843 -0
  19. package/src/adapters/github/github.adapter.js +395 -0
  20. package/src/adapters/github/github.issueEmbedded.js +262 -0
  21. package/src/adapters/github/github.issueMirror.js +309 -0
  22. package/src/adapters/github/github.issueSnapshot.js +475 -0
  23. package/src/adapters/github/github.issueSurface.js +188 -0
  24. package/src/adapters/github/github.issueTransport.js +237 -0
  25. package/src/adapters/github/github.publicationRead.js +24 -0
  26. package/src/adapters/github/github.readTransport.js +18 -0
  27. package/src/adapters/github/github.repoDiscovery.js +222 -0
  28. package/src/adapters/github/github.repoMirror.js +255 -0
  29. package/src/adapters/github/github.repoProxy.js +276 -0
  30. package/src/adapters/github/github.repoSurface.js +60 -0
  31. package/src/adapters/github/github.transportDiagnostics.js +68 -0
  32. package/src/adapters/local/local.adapter.case.mjs +72 -0
  33. package/src/adapters/local/local.adapter.js +188 -0
  34. package/src/adapters/registry.js +35 -0
  35. package/src/adapters/static/static.adapter.js +84 -0
  36. package/src/app/App.js +1 -0
  37. package/src/app/TiinexApp.jsx +822 -0
  38. package/src/app/appShell.views.jsx +58 -0
  39. package/src/app/artifactAuthoringCapability.js +49 -0
  40. package/src/app/boot/bootApp.js +19 -0
  41. package/src/app/boot/environment.js +1 -0
  42. package/src/app/canonicalAuthoringValues.js +4 -0
  43. package/src/app/canonicalCreationProductController.js +57 -0
  44. package/src/app/canonicalCreationProductSettlement.case.mjs +10 -0
  45. package/src/app/canonicalCreationProductSettlement.js +11 -0
  46. package/src/app/canonicalReferenceLocalCreateCommand.js +210 -0
  47. package/src/app/canonicalReferenceTargets.js +73 -0
  48. package/src/app/canonicalTransitionLocalCreateCommand.js +217 -0
  49. package/src/app/defaultWorkspaceStart.case.mjs +39 -0
  50. package/src/app/defaultWorkspaceStart.js +65 -0
  51. package/src/app/defaultWorkspaceStartCommand.js +55 -0
  52. package/src/app/durableLocalMutationPolicy.js +21 -0
  53. package/src/app/githubMaterializationSummary.js +69 -0
  54. package/src/app/githubProgress.js +25 -0
  55. package/src/app/githubSourceInput.js +47 -0
  56. package/src/app/githubSourceMaterializationCommand.js +97 -0
  57. package/src/app/githubSourceOperation.js +226 -0
  58. package/src/app/governanceDialogData.js +27 -0
  59. package/src/app/handoffPackageImportCommand.js +182 -0
  60. package/src/app/historyAuthority.js +53 -0
  61. package/src/app/initialWorkspaceBootstrapOperation.js +105 -0
  62. package/src/app/lineageCommand.js +118 -0
  63. package/src/app/lineageSourceRecovery.js +339 -0
  64. package/src/app/localDraftMutationCommand.js +174 -0
  65. package/src/app/localMaterialCommand.js +124 -0
  66. package/src/app/nodeGraphVerse.case.mjs +111 -0
  67. package/src/app/persistenceOwnership.js +92 -0
  68. package/src/app/productStateBoundary.js +7 -0
  69. package/src/app/providers/AppProviders.js +1 -0
  70. package/src/app/providers/LocaleProvider.js +1 -0
  71. package/src/app/providers/SchemaRegistryProvider.js +1 -0
  72. package/src/app/providers/WorkspaceProvider.js +1 -0
  73. package/src/app/publicTarget.js +251 -0
  74. package/src/app/publicTargetRestoreCommand.js +149 -0
  75. package/src/app/recordUi.cache.js +35 -0
  76. package/src/app/recordUi.js +11 -0
  77. package/src/app/routes/RouteSurface.js +1 -0
  78. package/src/app/routes/routes.js +1 -0
  79. package/src/app/runtimeState.js +54 -0
  80. package/src/app/schemaCurrentDeclaration.js +69 -0
  81. package/src/app/schemaFactoryLocalCreateCommand.js +101 -0
  82. package/src/app/schemaFactoryViewerProof.case.mjs +134 -0
  83. package/src/app/schemaFactoryViewerProof.js +20 -0
  84. package/src/app/schemaNavigationCommand.js +285 -0
  85. package/src/app/schemaNavigationMaterialization.js +171 -0
  86. package/src/app/schemaNavigationRuntimeCatalog.js +25 -0
  87. package/src/app/schemaNavigationState.js +66 -0
  88. package/src/app/schemaReadingContractQualification.js +91 -0
  89. package/src/app/schemaSourceRecovery.js +373 -0
  90. package/src/app/scrollPersistence.js +30 -0
  91. package/src/app/semanticOperationHistory.js +18 -0
  92. package/src/app/shareActionCommand.js +55 -0
  93. package/src/app/shareProjection.js +190 -0
  94. package/src/app/shell/AppShell.js +1 -0
  95. package/src/app/shell/Header.js +1 -0
  96. package/src/app/shell/Navigation.js +1 -0
  97. package/src/app/shell/SurfaceSwitcher.js +1 -0
  98. package/src/app/sourceTransportRefresh.js +176 -0
  99. package/src/app/startupOwnership.js +40 -0
  100. package/src/app/startupPresentation.case.mjs +34 -0
  101. package/src/app/startupPresentation.js +33 -0
  102. package/src/app/startupPresentation.views.jsx +21 -0
  103. package/src/app/startupRenderPhase.js +9 -0
  104. package/src/app/startupWorkspaceCommand.js +62 -0
  105. package/src/app/startupWorkspaceConfigApplication.js +49 -0
  106. package/src/app/statePersistenceScheduler.js +106 -0
  107. package/src/app/tiinexAppConfigPlan.js +108 -0
  108. package/src/app/tiinexAppConfigSource.js +349 -0
  109. package/src/app/tiinexAppStartupSource.js +79 -0
  110. package/src/app/tiinexHostedWorkspaceConventions.js +572 -0
  111. package/src/app/timePortalHistoricalRead.js +114 -0
  112. package/src/app/timePortalSnapshotResolution.js +53 -0
  113. package/src/app/urlMaterialCommand.js +24 -0
  114. package/src/app/useCanonicalPlacementSelectionOptions.js +9 -0
  115. package/src/app/useCanonicalReferenceSelectionOptions.js +8 -0
  116. package/src/app/useLocalMaterialIntake.js +68 -0
  117. package/src/app/useTimePortalProductController.jsx +111 -0
  118. package/src/app/useWorkspaceEntrypointIntake.js +77 -0
  119. package/src/app/useWorkspaceSelectionProductController.jsx +21 -0
  120. package/src/app/viewState.js +35 -0
  121. package/src/app/viewport.js +21 -0
  122. package/src/app/visualDormancy.js +286 -0
  123. package/src/app/workspaceContinuityNotices.js +32 -0
  124. package/src/app/workspaceDisplayCounts.js +9 -0
  125. package/src/app/workspaceEntrypointIntakeCommand.js +87 -0
  126. package/src/app/workspaceEntrypointProductRouting.case.mjs +20 -0
  127. package/src/app/workspaceExportCommand.js +21 -0
  128. package/src/app/workspaceExportDownload.js +23 -0
  129. package/src/app/workspaceExportExecutionCommand.js +10 -0
  130. package/src/app/workspaceGithubPublication.js +237 -0
  131. package/src/app/workspaceHandoffExport.js +56 -0
  132. package/src/app/workspaceHomeTarget.js +9 -0
  133. package/src/app/workspaceMulticolumn.js +113 -0
  134. package/src/app/workspaceNavigationParity.case.mjs +110 -0
  135. package/src/app/workspaceOpenProgress.js +26 -0
  136. package/src/app/workspacePlacementOptions.js +46 -0
  137. package/src/app/workspaceRecordActions.js +158 -0
  138. package/src/app/workspaceScopedInteraction.js +68 -0
  139. package/src/app/workspaceSelectionOriginContext.js +29 -0
  140. package/src/app/workspaceSelectionSession.js +54 -0
  141. package/src/app/workspaceSourceCloseCommand.js +25 -0
  142. package/src/app/workspaceSpineProductRouting.case.mjs +22 -0
  143. package/src/app/workspaceStartupTransition.js +32 -0
  144. package/src/app/workspaceWindow.js +85 -0
  145. package/src/artifacts/artifact.fixture.js +1 -0
  146. package/src/artifacts/artifact.identity.js +6 -0
  147. package/src/artifacts/artifact.identityAggregation.js +218 -0
  148. package/src/artifacts/artifact.model.js +2 -0
  149. package/src/artifacts/artifact.parse.case.mjs +196 -0
  150. package/src/artifacts/artifact.participantIndex.js +189 -0
  151. package/src/artifacts/fixtures/evidence.trace.md +50 -0
  152. package/src/artifacts/fixtures/topic.trace.md +33 -0
  153. package/src/artifacts/fixtures/unknown-schema.trace.md +25 -0
  154. package/src/audit/audit.findings.js +1 -0
  155. package/src/audit/audit.model.js +2 -0
  156. package/src/audit/audit.plan.js +13 -0
  157. package/src/audit/audit.report.js +12 -0
  158. package/src/audit/audit.severity.js +1 -0
  159. package/src/audit/audit.traverse.js +119 -0
  160. package/src/audit/integrity/auditIntegrity.checks.js +1 -0
  161. package/src/audit/integrity/auditIntegrity.compare.js +1 -0
  162. package/src/audit/lineage/auditLineage.load.js +1 -0
  163. package/src/audit/lineage/auditLineage.plan.js +1 -0
  164. package/src/audit/lineage/auditLineage.resolve.js +12 -0
  165. package/src/audit/sources/auditSources.boundaries.js +1 -0
  166. package/src/audit/sources/auditSources.checks.js +1 -0
  167. package/src/audit/validation/auditValidation.recheck.js +1 -0
  168. package/src/audit/validation/auditValidation.run.js +1 -0
  169. package/src/build.identity.js +15 -0
  170. package/src/commands/command.vocabulary.js +14 -0
  171. package/src/conformance/conformance.fixtures.js +151 -0
  172. package/src/conformance/conformance.run.js +238 -0
  173. package/src/data/applicationDataStore.js +23 -0
  174. package/src/data/companionAccess.js +35 -0
  175. package/src/diagnostics/events.js +1 -0
  176. package/src/diagnostics/invariant.js +1 -0
  177. package/src/diagnostics/schemaBindingChecks.js +1 -0
  178. package/src/diagnostics/schemaModuleChecks.js +1 -0
  179. package/src/diagnostics/sourceBoundaryChecks.js +5 -0
  180. package/src/diagnostics/sourceTransport.report.js +190 -0
  181. package/src/discovery/discovery.controls.js +7 -0
  182. package/src/export/export.plan.js +182 -0
  183. package/src/export/handoff.plan.js +50 -0
  184. package/src/export/package.builder.case.mjs +97 -0
  185. package/src/export/package.controlTopology.case.mjs +130 -0
  186. package/src/export/package.zip.case.mjs +33 -0
  187. package/src/graph/artifactGraph.model.js +344 -0
  188. package/src/graph/artifactGraph.project.js +139 -0
  189. package/src/graph/artifactGraph.worker.js +10 -0
  190. package/src/i18n/i18n.keys.js +1 -0
  191. package/src/i18n/i18n.provider.js +1 -0
  192. package/src/i18n/i18n.resolve.js +5 -0
  193. package/src/i18n/locales/en/common.json +4 -0
  194. package/src/i18n/locales/en/schemas/evidence.json +3 -0
  195. package/src/i18n/locales/en/schemas/presentation-surface.json +3 -0
  196. package/src/i18n/locales/en/schemas/preservation.json +3 -0
  197. package/src/i18n/locales/en/schemas/root.json +3 -0
  198. package/src/i18n/locales/en/schemas/schema-module.json +3 -0
  199. package/src/i18n/locales/en/schemas/topic.json +3 -0
  200. package/src/i18n/locales/en/surfaces/audit.json +3 -0
  201. package/src/i18n/locales/en/surfaces/create.json +3 -0
  202. package/src/i18n/locales/en/surfaces/detail.json +3 -0
  203. package/src/i18n/locales/en/surfaces/display-options.json +3 -0
  204. package/src/i18n/locales/en/surfaces/edit.json +3 -0
  205. package/src/i18n/locales/en/surfaces/feed.json +3 -0
  206. package/src/i18n/locales/en/surfaces/lineage.json +3 -0
  207. package/src/i18n/locales/en/surfaces/preview.json +3 -0
  208. package/src/i18n/locales/en/surfaces/share.json +3 -0
  209. package/src/i18n/locales/en/surfaces/source-settings.json +3 -0
  210. package/src/i18n/locales/en/surfaces/tree.json +3 -0
  211. package/src/i18n/locales/sv/common.json +4 -0
  212. package/src/i18n/locales/sv/schemas/evidence.json +3 -0
  213. package/src/i18n/locales/sv/schemas/presentation-surface.json +3 -0
  214. package/src/i18n/locales/sv/schemas/preservation.json +3 -0
  215. package/src/i18n/locales/sv/schemas/root.json +3 -0
  216. package/src/i18n/locales/sv/schemas/schema-module.json +3 -0
  217. package/src/i18n/locales/sv/schemas/topic.json +3 -0
  218. package/src/i18n/locales/sv/surfaces/audit.json +3 -0
  219. package/src/i18n/locales/sv/surfaces/create.json +3 -0
  220. package/src/i18n/locales/sv/surfaces/detail.json +3 -0
  221. package/src/i18n/locales/sv/surfaces/display-options.json +3 -0
  222. package/src/i18n/locales/sv/surfaces/edit.json +3 -0
  223. package/src/i18n/locales/sv/surfaces/feed.json +3 -0
  224. package/src/i18n/locales/sv/surfaces/lineage.json +3 -0
  225. package/src/i18n/locales/sv/surfaces/preview.json +3 -0
  226. package/src/i18n/locales/sv/surfaces/share.json +3 -0
  227. package/src/i18n/locales/sv/surfaces/source-settings.json +3 -0
  228. package/src/i18n/locales/sv/surfaces/tree.json +3 -0
  229. package/src/index.js +10 -0
  230. package/src/integrity/integrity.testFixture.js +9 -0
  231. package/src/interaction/interaction.spine.js +12 -0
  232. package/src/lineage/lineage.audit.js +1 -0
  233. package/src/lineage/lineage.edges.js +1 -0
  234. package/src/main.js +319 -0
  235. package/src/main.jsx +34 -0
  236. package/src/multiverse/multiverse.model.js +10 -0
  237. package/src/parity/poc.m1ParityScenarios.js +42 -0
  238. package/src/parity/poc.parityLedger.js +261 -0
  239. package/src/publication/publication.githubSocialContract.case.mjs +247 -0
  240. package/src/publication/publication.preflight.case.mjs +64 -0
  241. package/src/react/TiinexApplication.jsx +39 -0
  242. package/src/react/VerseHost.jsx +29 -0
  243. package/src/react/applicationDataContext.jsx +30 -0
  244. package/src/react.js +2 -0
  245. package/src/readers/modes/audit.reader.js +1 -0
  246. package/src/readers/modes/detail.reader.js +1 -0
  247. package/src/readers/modes/handover.reader.js +1 -0
  248. package/src/readers/modes/mobile.reader.js +1 -0
  249. package/src/readers/modes/print.reader.js +1 -0
  250. package/src/readers/modes/scan.reader.js +1 -0
  251. package/src/readers/reader.model.js +1 -0
  252. package/src/readers/reader.resolve.js +2 -0
  253. package/src/reingest/reingest.plan.case.mjs +65 -0
  254. package/src/runtime.js +54 -0
  255. package/src/schemas/README.md +99 -0
  256. package/src/schemas/coordination/handoff/tiinex.handoff.v1.schema.md +614 -0
  257. package/src/schemas/coordination/project/tiinex.project.v1.schema.md +311 -0
  258. package/src/schemas/core/decision/tiinex.decision.v1.schema.md +227 -0
  259. package/src/schemas/core/evidence/tiinex.evidence.v1.schema.md +318 -0
  260. package/src/schemas/core/feedback/tiinex.feedback.v1.schema.md +243 -0
  261. package/src/schemas/core/interpretation/.transitions/evidence-to-interpretation-transition-definition.trace.md +102 -0
  262. package/src/schemas/core/interpretation/tiinex.interpretation.v1.schema.md +308 -0
  263. package/src/schemas/core/preservation/tiinex.preservation.v1.schema.md +312 -0
  264. package/src/schemas/core/relation/.generation/reference-relation-generation-authority.trace.md +185 -0
  265. package/src/schemas/core/relation/.transitions/topic-references-task-transition-definition.trace.md +119 -0
  266. package/src/schemas/core/relation/tiinex.relation.v1.schema.md +240 -0
  267. package/src/schemas/core/relation/workspace/representation/tiinex.workspace.representation.v1.schema.md +550 -0
  268. package/src/schemas/core/signal/tiinex.signal.v1.schema.md +239 -0
  269. package/src/schemas/core/task/.transitions/create-task-transition-definition.trace.md +93 -0
  270. package/src/schemas/core/task/.transitions/topic-to-task-transition-definition.trace.md +102 -0
  271. package/src/schemas/core/task/task-semantic-package.trace.md +53 -0
  272. package/src/schemas/core/task/tiinex.task.v1-transitions.trace.md +33 -0
  273. package/src/schemas/core/task/tiinex.task.v1.authoring.js +65 -0
  274. package/src/schemas/core/task/tiinex.task.v1.schema.md +229 -0
  275. package/src/schemas/core/topic/.transitions/create-topic-transition-definition.trace.md +93 -0
  276. package/src/schemas/core/topic/tiinex.topic.v1-transitions.trace.md +33 -0
  277. package/src/schemas/core/topic/tiinex.topic.v1.schema.md +197 -0
  278. package/src/schemas/core/topic/topic-semantic-package.trace.md +53 -0
  279. package/src/schemas/discovery/finding/tiinex.discovery.finding.v1.schema.md +240 -0
  280. package/src/schemas/discovery/tiinex.discovery.v1.schema.md +294 -0
  281. package/src/schemas/manifest.json +367 -0
  282. package/src/schemas/origins.js +46 -0
  283. package/src/schemas/party/organization/tiinex.party.organization.v1.schema.md +290 -0
  284. package/src/schemas/party/role/tiinex.party.role.v1.schema.md +298 -0
  285. package/src/schemas/party/tiinex.party.v1.schema.js +14 -0
  286. package/src/schemas/party/tiinex.party.v1.schema.json +23 -0
  287. package/src/schemas/party/tiinex.party.v1.schema.md +311 -0
  288. package/src/schemas/party/tiinex.party.v1.schema.runtime.json +2033 -0
  289. package/src/schemas/party/tiinex.party.v1.schema.source.js +9 -0
  290. package/src/schemas/presentation/surface/tiinex.presentation.surface.v1.schema.md +476 -0
  291. package/src/schemas/reduction/tiinex.reduction.v1.schema.md +248 -0
  292. package/src/schemas/schema/module/tiinex.schema.module.v1.schema.md +465 -0
  293. package/src/schemas/schema.companionContract.case.mjs +259 -0
  294. package/src/schemas/schema.factory.case.mjs +256 -0
  295. package/src/schemas/schema.factory.viewerProjection.js +183 -0
  296. package/src/schemas/schemaMarkdownCatalog.js +19 -0
  297. package/src/schemas/tiinex.root.v1.schema.md +865 -0
  298. package/src/schemas/validation/finding/tiinex.validation.finding.v1.schema.md +309 -0
  299. package/src/schemas/validation/method/tiinex.validation.method.v1.schema.md +280 -0
  300. package/src/schemas/validation/report/tiinex.validation.report.v1.schema.md +300 -0
  301. package/src/schemas/workspace/tiinex.workspace.v1.schema.md +486 -0
  302. package/src/schemas/workspace/workspace.add.views.jsx +327 -0
  303. package/src/schemas/workspace/workspace.audit.views.jsx +160 -0
  304. package/src/schemas/workspace/workspace.auditBadge.views.jsx +98 -0
  305. package/src/schemas/workspace/workspace.canonicalReferenceDialog.views.jsx +63 -0
  306. package/src/schemas/workspace/workspace.canonicalTaskDialog.views.jsx +169 -0
  307. package/src/schemas/workspace/workspace.cardActions.js +9 -0
  308. package/src/schemas/workspace/workspace.cards.views.jsx +146 -0
  309. package/src/schemas/workspace/workspace.chrome.views.jsx +299 -0
  310. package/src/schemas/workspace/workspace.continuationDialog.views.jsx +80 -0
  311. package/src/schemas/workspace/workspace.discovery.views.jsx +63 -0
  312. package/src/schemas/workspace/workspace.discoveryRenderWindow.js +56 -0
  313. package/src/schemas/workspace/workspace.displayOptions.views.jsx +114 -0
  314. package/src/schemas/workspace/workspace.entrypointChoice.views.jsx +30 -0
  315. package/src/schemas/workspace/workspace.exportDialog.controller.jsx +40 -0
  316. package/src/schemas/workspace/workspace.exportDialog.views.jsx +142 -0
  317. package/src/schemas/workspace/workspace.governance.views.jsx +45 -0
  318. package/src/schemas/workspace/workspace.graph.views.jsx +134 -0
  319. package/src/schemas/workspace/workspace.lineage.views.jsx +307 -0
  320. package/src/schemas/workspace/workspace.read.views.jsx +105 -0
  321. package/src/schemas/workspace/workspace.recordActionButton.views.jsx +35 -0
  322. package/src/schemas/workspace/workspace.recordDialogs.views.jsx +257 -0
  323. package/src/schemas/workspace/workspace.selection.views.jsx +14 -0
  324. package/src/schemas/workspace/workspace.sourceReceipt.views.jsx +40 -0
  325. package/src/schemas/workspace/workspace.timePortal.views.jsx +56 -0
  326. package/src/schemas/workspace/workspace.tree.views.jsx +107 -0
  327. package/src/schemas/workspace/workspace.viewFormatting.js +172 -0
  328. package/src/schemas/workspace/workspace.views.jsx +210 -0
  329. package/src/source-settings/sourceSettings.model.js +7 -0
  330. package/src/sources/draft/draft.source.js +1 -0
  331. package/src/sources/github/github.loader.js +204 -0
  332. package/src/sources/github/github.permalink.js +1 -0
  333. package/src/sources/github/github.source.js +1 -0
  334. package/src/sources/github/github.transport.case.mjs +237 -0
  335. package/src/sources/github/github.transport.js +472 -0
  336. package/src/sources/local/local.source.js +1 -0
  337. package/src/sources/source.assetReferences.js +109 -0
  338. package/src/sources/source.boundaries.js +24 -0
  339. package/src/sources/source.identity.js +56 -0
  340. package/src/sources/source.model.case.mjs +26 -0
  341. package/src/sources/source.model.js +56 -0
  342. package/src/sources/source.presenter.js +66 -0
  343. package/src/sources/source.resolve.js +11 -0
  344. package/src/sources/static/static.source.js +1 -0
  345. package/src/sources/transport.policy.case.mjs +39 -0
  346. package/src/sources/transport.policy.js +81 -0
  347. package/src/storage/storage.policy.js +79 -0
  348. package/src/styles/app.css +8699 -0
  349. package/src/styles/responsive.css +10 -0
  350. package/src/styles/theme.css +4 -0
  351. package/src/styles/tokens.css +30 -0
  352. package/src/surfaces/audit/AuditSurface.js +1 -0
  353. package/src/surfaces/audit/audit.model.js +1 -0
  354. package/src/surfaces/audit/audit.render.js +1 -0
  355. package/src/surfaces/contracts.js +45 -0
  356. package/src/surfaces/create/CreateSurface.js +1 -0
  357. package/src/surfaces/create/create.model.js +1 -0
  358. package/src/surfaces/create/create.render.js +1 -0
  359. package/src/surfaces/detail/DetailSurface.js +1 -0
  360. package/src/surfaces/detail/detail.model.js +1 -0
  361. package/src/surfaces/detail/detail.render.js +1 -0
  362. package/src/surfaces/display-options/DisplayOptionsSurface.js +1 -0
  363. package/src/surfaces/display-options/displayOptions.model.js +1 -0
  364. package/src/surfaces/display-options/displayOptions.render.js +1 -0
  365. package/src/surfaces/edit/EditSurface.js +1 -0
  366. package/src/surfaces/edit/edit.model.js +1 -0
  367. package/src/surfaces/edit/edit.render.js +1 -0
  368. package/src/surfaces/feed/FeedSurface.js +1 -0
  369. package/src/surfaces/feed/feed.model.js +1 -0
  370. package/src/surfaces/feed/feed.render.js +1 -0
  371. package/src/surfaces/lineage/LineageSurface.js +1 -0
  372. package/src/surfaces/lineage/lineage.model.js +1 -0
  373. package/src/surfaces/lineage/lineage.render.js +1 -0
  374. package/src/surfaces/preview/PreviewSurface.js +1 -0
  375. package/src/surfaces/preview/preview.model.js +1 -0
  376. package/src/surfaces/preview/preview.render.js +1 -0
  377. package/src/surfaces/registry.js +58 -0
  378. package/src/surfaces/share/ShareSurface.js +1 -0
  379. package/src/surfaces/share/share.model.js +1 -0
  380. package/src/surfaces/share/share.render.js +1 -0
  381. package/src/surfaces/source-settings/SourceSettingsSurface.js +1 -0
  382. package/src/surfaces/source-settings/sourceSettings.model.js +1 -0
  383. package/src/surfaces/source-settings/sourceSettings.render.js +1 -0
  384. package/src/surfaces/surfaceContext.js +1 -0
  385. package/src/surfaces/tree/TreeSurface.js +1 -0
  386. package/src/surfaces/tree/tree.model.js +1 -0
  387. package/src/surfaces/tree/tree.render.js +1 -0
  388. package/src/tooling/portable/adapters/cli/cli.common-output.case.mjs +153 -0
  389. package/src/tooling/portable/adapters/cli/cli.handoff-sibling-allocation.case.mjs +52 -0
  390. package/src/tooling/portable/adapters/cli/cli.run.case.mjs +372 -0
  391. package/src/tooling/portable/adapters/cli/cli.summaryProjection.case.mjs +46 -0
  392. package/src/tooling/portable/audit/audit.capability.case.mjs +45 -0
  393. package/src/tooling/portable/fixtures/legacy-artifacts/collaboration/dogfood/001-tiinex-development-dogfood-collaboration-model.trace.fixture.txt +37 -0
  394. package/src/tooling/portable/fixtures/legacy-artifacts/handoff/tooling/001-v480-tooling-workflow-schema-enablement-handoff.trace.fixture.txt +108 -0
  395. 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
  396. package/src/tooling/portable/fixtures/legacy-artifacts/loom/role/001-loom-role.trace.fixture.txt +61 -0
  397. package/src/tooling/portable/fixtures/legacy-artifacts/sigma/role/001-1-sigma-role.trace.fixture.txt +61 -0
  398. 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
  399. 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
  400. 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
  401. 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
  402. 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
  403. 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
  404. package/src/tooling/portable/fixtures/legacy-artifacts/tooling/dogfood/001-1-site-tooling-v471-portable-lineage-authoring-closure-result.trace.fixture.txt +48 -0
  405. package/src/tooling/portable/fixtures/legacy-artifacts/tooling/dogfood/001-site-tooling-v471-portable-lineage-authoring-closure.trace.fixture.txt +39 -0
  406. package/src/tooling/portable/fixtures/legacy-artifacts/tooling/dogfood/002-1-v475-canonical-artifact-envelope-reference-integrity-validation.trace.fixture.txt +43 -0
  407. package/src/tooling/portable/fixtures/legacy-artifacts/tooling/dogfood/003-1-v476-canonical-authority-binding-integrity-method-lineage-alloca.trace.fixture.txt +42 -0
  408. package/src/tooling/portable/fixtures/legacy-artifacts/tooling/dogfood/027-handoff-package-workspace-archive-and-control-plane-minimality-audit.trace.fixture.txt +56 -0
  409. package/src/tooling/portable/fixtures/legacyArtifactFixtures.mjs +34 -0
  410. package/src/tooling/portable/grounding/grounding.capsule.case.mjs +65 -0
  411. package/src/tooling/portable/grounding/grounding.readiness.case.mjs +543 -0
  412. package/src/tooling/portable/grounding/grounding.semanticIntegration.case.mjs +131 -0
  413. package/src/tooling/portable/handoff/boundedWorkspaceRepresentation.case.mjs +103 -0
  414. package/src/tooling/portable/handoff/carrierLineage.fixedWidth.case.mjs +97 -0
  415. package/src/tooling/portable/handoff/coldStartQualification.case.mjs +293 -0
  416. package/src/tooling/portable/handoff/fixtures/027-invalid-audit-result.fixture.txt +192 -0
  417. package/src/tooling/portable/handoff/fixtures/027-invalid-return-handoff.fixture.txt +92 -0
  418. package/src/tooling/portable/handoff/fixtures/cold-start-qualification.v1.examples.json +60 -0
  419. package/src/tooling/portable/handoff/handoff.manufacture.case.mjs +293 -0
  420. package/src/tooling/portable/handoff/materialClosure.case.mjs +727 -0
  421. package/src/tooling/portable/handoff/multiRootManufacture.case.mjs +615 -0
  422. package/src/tooling/portable/handoff/operatorBridgeCore.case.mjs +205 -0
  423. package/src/tooling/portable/handoff/workspaceLandingPlan.case.mjs +143 -0
  424. package/src/tooling/portable/input/node.input.case.mjs +293 -0
  425. package/src/tooling/portable/lifecycle/lifecycle.readiness.case.mjs +179 -0
  426. package/src/tooling/portable/lineage/fixtures/lineage.integrity.repair-projection.v1.examples.json +605 -0
  427. package/src/tooling/portable/lineage/lineage.integrity.shared-capability.case.mjs +37 -0
  428. package/src/tooling/portable/lineage/publicationProviderReceipt.fixture.mjs +50 -0
  429. package/src/tooling/portable/package/fixtures/reference-relation-generation-authority.trace.md +84 -0
  430. package/src/tooling/portable/package/fixtures/tiinex.root.v1.package-authority.contract-fixture.md +64 -0
  431. package/src/tooling/portable/package/fixtures/tiinex.schema.generation.v1.generation-binding.contract-fixture.md +140 -0
  432. package/src/tooling/portable/package/fixtures/tiinex.schema.transition.companion.v1.contract-fixture.md +73 -0
  433. package/src/tooling/portable/package/fixtures/tiinex.semantic.package.v1.contract-fixture.md +147 -0
  434. package/src/tooling/portable/package/fixtures/tiinex.transition.definition.v1.package-contract-fixture.md +77 -0
  435. package/src/tooling/portable/providers/schema.providers.genericity.case.mjs +31 -0
  436. package/src/tooling/portable/reduction/reduction.preflight.case.mjs +298 -0
  437. package/src/tooling/portable/schema/fixtures/evidence-preservation-body.inheritance-record-fixture.md +65 -0
  438. package/src/tooling/portable/schema/fixtures/tiinex.portal.time.v1.contract-fixture.md +294 -0
  439. package/src/tooling/portable/schema/fixtures/tiinex.root.v1.contract-fixture.md +584 -0
  440. package/src/tooling/portable/schema/fixtures/tiinex.root.v1.machine-shape.contract-fixture.md +44 -0
  441. package/src/tooling/portable/schema/fixtures/tiinex.root.v1.ordinary-target.contract-fixture.md +630 -0
  442. package/src/tooling/portable/schema/fixtures/tiinex.schema.contract.v1.repeated-record.contract-fixture.md +69 -0
  443. package/src/tooling/portable/schema/fixtures/tiinex.schema.generation.v1.repeated-record.contract-fixture.md +98 -0
  444. package/src/tooling/portable/schema/fixtures/tiinex.schema.inheritance.v1.repeated-record.contract-fixture.md +58 -0
  445. package/src/tooling/portable/schema/fixtures/tiinex.task.v1.contract-fixture.md +165 -0
  446. package/src/tooling/portable/schema/fixtures/tiinex.transition.definition.v1.contract-fixture.md +744 -0
  447. package/src/tooling/portable/schema/fixtures/tiinex.transition.definition.v1.field-domain.contract-fixture.md +319 -0
  448. package/src/transitions/canonical-schema-cache/053d46ce082d4ec261b82abc44ecca403d61e240/tiinex.relation.v1.schema.md +240 -0
  449. package/src/transitions/canonical-schema-cache/053d46ce082d4ec261b82abc44ecca403d61e240/tiinex.schema.contract.v1.schema.md +391 -0
  450. package/src/transitions/canonical-schema-cache/053d46ce082d4ec261b82abc44ecca403d61e240/tiinex.schema.generation.v1.schema.md +379 -0
  451. package/src/transitions/canonical-schema-cache/053d46ce082d4ec261b82abc44ecca403d61e240/tiinex.schema.transition.companion.v1.schema.md +265 -0
  452. package/src/transitions/canonical-schema-cache/053d46ce082d4ec261b82abc44ecca403d61e240/tiinex.semantic.package.v1.schema.md +402 -0
  453. package/src/transitions/canonical-schema-cache/52ecdea0a75893882ce282214d155f70e1309c2a/tiinex.topic.v1.schema.md +197 -0
  454. package/src/transitions/canonical-schema-cache/d69b8ff55a56b8cb9282b8684db6a938a4435b94/tiinex.root.v1.schema.md +797 -0
  455. package/src/transitions/canonical-schema-cache/d69b8ff55a56b8cb9282b8684db6a938a4435b94/tiinex.transition.definition.v1.schema.md +1062 -0
  456. package/src/transitions/canonicalTransition.packageContracts.js +22 -0
  457. package/src/transitions/canonicalTransition.productDefaults.js +105 -0
  458. package/src/transitions/canonicalTransition.schemaCache.case.mjs +45 -0
  459. package/src/transitions/canonicalTransition.schemaCache.js +81 -0
  460. package/src/transitions/canonicalTransition.semanticPackage.js +146 -0
  461. package/src/transitions/record.transitions.case.mjs +88 -0
  462. package/src/transitions/transition.authorityRepresentation.js +55 -0
  463. package/src/transitions/transition.availabilityPlanner.js +376 -0
  464. package/src/transitions/transition.availabilitySemantics.js +150 -0
  465. package/src/transitions/transition.definitionReadProjection.js +107 -0
  466. package/src/transitions/transition.definitionRegistry.js +355 -0
  467. package/src/transitions/transition.definitionRegistryAggregation.js +21 -0
  468. package/src/transitions/transition.definitions.js +46 -0
  469. package/src/transitions/transition.explicitGenerationPlanner.js +58 -0
  470. package/src/transitions/transition.generationInputPlanner.js +19 -0
  471. package/src/transitions/transition.interpretationMaterializer.js +2 -0
  472. package/src/transitions/transition.invocationBindingPacket.js +52 -0
  473. package/src/transitions/transition.invocationBindingPlanner.js +467 -0
  474. package/src/transitions/transition.legacyShorthand.js +133 -0
  475. package/src/transitions/transition.localArtifactMaterializers.js +16 -0
  476. package/src/transitions/transition.localCreateCapability.js +111 -0
  477. package/src/transitions/transition.outputMaterializationPlanner.js +336 -0
  478. package/src/transitions/transition.parentReference.js +90 -0
  479. package/src/transitions/transition.presentation.js +43 -0
  480. package/src/transitions/transition.productPreparation.js +377 -0
  481. package/src/transitions/transition.productPresentation.browser.js +28 -0
  482. package/src/transitions/transition.productPresentation.js +55 -0
  483. package/src/transitions/transition.referenceCreateCapability.js +119 -0
  484. package/src/transitions/transition.referenceTarget.js +50 -0
  485. package/src/transitions/transition.relationMaterializer.js +2 -0
  486. package/src/transitions/transition.resultSemantics.js +453 -0
  487. package/src/transitions/transition.taskMaterializer.js +2 -0
  488. package/src/transitions/transition.topicMaterializer.js +2 -0
  489. package/src/transitions/transition.validate.case.mjs +58 -0
  490. package/src/ui/cards/ArtifactCard.js +1 -0
  491. package/src/ui/cards/SchemaCard.js +1 -0
  492. package/src/ui/cards/SourceCard.js +1 -0
  493. package/src/ui/dialog.presenter.js +24 -0
  494. package/src/ui/feedback/DegradedNotice.js +1 -0
  495. package/src/ui/feedback/EmptyState.js +1 -0
  496. package/src/ui/feedback/ValidationNotice.js +1 -0
  497. package/src/ui/forms/FormRenderer.js +1 -0
  498. package/src/ui/forms/fields/MarkdownField.js +1 -0
  499. package/src/ui/forms/fields/SelectField.js +1 -0
  500. package/src/ui/forms/fields/SourcePickerField.js +1 -0
  501. package/src/ui/forms/fields/TextField.js +1 -0
  502. package/src/ui/icon.paths.js +37 -0
  503. package/src/ui/layout/Panel.js +1 -0
  504. package/src/ui/layout/ResponsiveFrame.js +1 -0
  505. package/src/ui/layout/SplitView.js +1 -0
  506. package/src/ui/layout/Stack.js +1 -0
  507. package/src/ui/panels/DetailPanel.js +1 -0
  508. package/src/ui/panels/LineagePanel.js +1 -0
  509. package/src/ui/panels/SourcePanel.js +1 -0
  510. package/src/ui/primitives/Badge.js +1 -0
  511. package/src/ui/primitives/Badge.jsx +5 -0
  512. package/src/ui/primitives/Button.js +1 -0
  513. package/src/ui/primitives/Button.jsx +12 -0
  514. package/src/ui/primitives/Card.js +1 -0
  515. package/src/ui/primitives/Field.js +1 -0
  516. package/src/ui/primitives/Field.jsx +21 -0
  517. package/src/ui/primitives/Icon.jsx +90 -0
  518. package/src/ui/primitives/Modal.jsx +27 -0
  519. package/src/validation/i18n.js +37 -0
  520. package/src/validation/validateArtifact.case.mjs +41 -0
  521. package/src/verses/column/ColumnVerse.js +1 -0
  522. package/src/verses/column/column.model.js +6 -0
  523. package/src/verses/column/column.project.js +7 -0
  524. package/src/verses/context.js +26 -0
  525. package/src/verses/contracts.js +1 -0
  526. package/src/verses/hostRegistry.js +47 -0
  527. package/src/verses/registry.js +22 -0
  528. package/src/verses/universe.model.js +8 -0
  529. package/src/verses/universe.presenter.js +8 -0
  530. package/src/verses/universe.project.js +12 -0
  531. package/src/viewer.js +34 -0
  532. package/src/workspace.model.js +5 -0
  533. package/src/workspaces/workspace.actions.js +1 -0
  534. package/src/workspaces/workspace.artifactActions.js +56 -0
  535. package/src/workspaces/workspace.auditView.js +153 -0
  536. package/src/workspaces/workspace.candidates.js +149 -0
  537. package/src/workspaces/workspace.config.js +153 -0
  538. package/src/workspaces/workspace.configuredSource.js +68 -0
  539. package/src/workspaces/workspace.discoveryProgress.js +34 -0
  540. package/src/workspaces/workspace.discoveryView.js +386 -0
  541. package/src/workspaces/workspace.displayFilters.js +63 -0
  542. package/src/workspaces/workspace.displayOptions.js +58 -0
  543. package/src/workspaces/workspace.emptyStateCopy.js +24 -0
  544. package/src/workspaces/workspace.entrypointLifecycle.js +131 -0
  545. package/src/workspaces/workspace.entrypointViewIntent.js +83 -0
  546. package/src/workspaces/workspace.entrypoints.js +157 -0
  547. package/src/workspaces/workspace.feedSort.js +152 -0
  548. package/src/workspaces/workspace.import.js +212 -0
  549. package/src/workspaces/workspace.importConflicts.js +200 -0
  550. package/src/workspaces/workspace.importLifecycle.case.mjs +103 -0
  551. package/src/workspaces/workspace.lifecycle.case.mjs +353 -0
  552. package/src/workspaces/workspace.lifecycle.js +357 -0
  553. package/src/workspaces/workspace.lineageView.js +244 -0
  554. package/src/workspaces/workspace.localSourceLifecycle.js +91 -0
  555. package/src/workspaces/workspace.materialLedger.js +110 -0
  556. package/src/workspaces/workspace.materialReconciliation.case.mjs +164 -0
  557. package/src/workspaces/workspace.materialReconciliation.js +390 -0
  558. package/src/workspaces/workspace.memberIdentity.js +140 -0
  559. package/src/workspaces/workspace.model.js +2 -0
  560. package/src/workspaces/workspace.navigation.js +20 -0
  561. package/src/workspaces/workspace.openSemantics.js +33 -0
  562. package/src/workspaces/workspace.pathTree.js +132 -0
  563. package/src/workspaces/workspace.persistence.case.mjs +271 -0
  564. package/src/workspaces/workspace.persistence.js +469 -0
  565. package/src/workspaces/workspace.persistenceCache.js +41 -0
  566. package/src/workspaces/workspace.persistenceClear.js +45 -0
  567. package/src/workspaces/workspace.persistencePresentation.js +93 -0
  568. package/src/workspaces/workspace.persistenceRecovery.js +147 -0
  569. package/src/workspaces/workspace.persistenceRouteCache.js +82 -0
  570. package/src/workspaces/workspace.publicationReceipts.case.mjs +36 -0
  571. package/src/workspaces/workspace.publicationReceipts.js +56 -0
  572. package/src/workspaces/workspace.recoverabilityView.js +264 -0
  573. package/src/workspaces/workspace.route.js +432 -0
  574. package/src/workspaces/workspace.runtimeCanonical.js +18 -0
  575. package/src/workspaces/workspace.sourceMaterial.js +71 -0
  576. package/src/workspaces/workspace.sourceRecordPath.js +5 -0
  577. package/src/workspaces/workspace.sourceRecords.js +75 -0
  578. package/src/workspaces/workspace.store.js +3 -0
  579. package/src/workspaces/workspace.summary.js +116 -0
  580. package/src/workspaces/workspace.timePortal.js +137 -0
@@ -0,0 +1,58 @@
1
+ import React from 'react';
2
+ import { Button } from '../ui/primitives/Button.jsx';
3
+ import { Modal } from '../ui/primitives/Modal.jsx';
4
+ import { runtime } from './runtimeState.js';
5
+
6
+ const LOGO_SRC = `${import.meta.env.BASE_URL}assets/tiinex-logo-white-transparent.png`;
7
+ let emptyStageVisitCursor = 0;
8
+
9
+ export function GlobalDock({ hasWorkspace, workspaceCount, pagerVisible, previousWorkspaceEnabled = true, nextWorkspaceEnabled = true, onPreviousWorkspace, onNextWorkspace, onCreate, homeHref, onShare, onHelp }) {
10
+ const showPager = Boolean(hasWorkspace && pagerVisible);
11
+ return (
12
+ <nav
13
+ className={`tx-top-dock tx-dock-shell-row ${showPager ? 'tx-top-dock-paged' : 'tx-top-dock-fit'}`}
14
+ aria-label="Global actions"
15
+ data-workspace-count={workspaceCount}
16
+ data-overflow-pager={showPager ? 'visible' : 'hidden'}
17
+ >
18
+ {showPager ? <Button shape="round" icon="previous" className="tx-dock-pager-button" aria-label="Previous workspace" disabled={!previousWorkspaceEnabled} onClick={onPreviousWorkspace} /> : null}
19
+ <span className="tx-dock-core tx-centered-dock-core tx-content-fit-dock tx-poc-brand-first-dock">
20
+ <a className="tx-logo-command tx-logo-home tx-dock-logo-large" data-home href={homeHref || '/'} aria-label="Tiinex home">
21
+ <img src={LOGO_SRC} alt="" />
22
+ </a>
23
+ <span className="tx-dock-side tx-dock-actions tx-dock-right">
24
+ <Button icon="create" variant={hasWorkspace ? 'primary' : 'nav'} className="tx-dock-action-button tx-dock-create-button" onClick={onCreate}>Create</Button>
25
+ <Button icon="shareNodes" variant="nav" className="tx-dock-action-button tx-dock-share-button" onClick={onShare}>Share</Button>
26
+ <Button icon="help" variant="nav" className="tx-dock-icon-button" aria-label="Help" onClick={onHelp} />
27
+ </span>
28
+ </span>
29
+ {showPager ? <Button shape="round" icon="next" className="tx-dock-pager-button" aria-label="Next workspace" disabled={!nextWorkspaceEnabled} onClick={onNextWorkspace} /> : null}
30
+ </nav>
31
+ );
32
+ }
33
+
34
+ export function EmptyStage({ workspaceConfig }) {
35
+ const [subtitleCursor] = React.useState(() => emptyStageVisitCursor++);
36
+ const subtitle = runtime().config?.emptyStageSubtitle?.(workspaceConfig, subtitleCursor) || 'Every handoff starts somewhere';
37
+ return (
38
+ <section className="tx-empty-stage tx-old-empty-stage tx-uc001-empty-start tx-m1-product-empty-stage" aria-label="No workspace loaded">
39
+ <p>{subtitle}</p>
40
+ </section>
41
+ );
42
+ }
43
+
44
+ export function HelpDialog({ workspaceConfig, onDismiss }) {
45
+ const help = workspaceConfig?.help || [];
46
+ return (
47
+ <Modal title="Help" onDismiss={onDismiss}>
48
+ <div className="tx-help-stack">
49
+ {help.length ? help.map((item) => (
50
+ <details key={item.question} open={item.question === 'What is this view?'}>
51
+ <summary>{item.question}</summary>
52
+ <p>{item.body}</p>
53
+ </details>
54
+ )) : <p className="tx-muted">No workspace help is configured.</p>}
55
+ </div>
56
+ </Modal>
57
+ );
58
+ }
@@ -0,0 +1,49 @@
1
+ import { transitionDefinitionsForRecord } from '../transitions/transition.definitions.js';
2
+ import { canDiscardLocalDraft, canEditLocalDraft } from '@tiinex/core/artifacts/artifact.localDraft.js';
3
+ import { durableLocalMutationDecision, DurableLocalMutationOperation } from './durableLocalMutationPolicy.js';
4
+
5
+ export const ARTIFACT_AUTHORING_CAPABILITY_SCHEMA_ID = 'tiinex.artifact.authoring-capability.v1';
6
+ export const ArtifactAuthoringOperation = Object.freeze({
7
+ createFromTransition: 'createFromTransition',
8
+ createRoot: 'createRoot',
9
+ editLocalDraft: 'editLocalDraft',
10
+ discardLocalDraft: 'discardLocalDraft'
11
+ });
12
+
13
+ export function projectArtifactAuthoringCapability(record = {}, options = {}) {
14
+ const transitions = transitionDefinitionsForRecord(record, options.transitionOptions || {});
15
+ const createAuthority = durableLocalMutationDecision(options.persistenceOwnership, DurableLocalMutationOperation.localDraftCreate);
16
+ const discardAuthority = durableLocalMutationDecision(options.persistenceOwnership, DurableLocalMutationOperation.localDraftDelete);
17
+ const editEligible = canEditLocalDraft(record);
18
+ const discardEligible = canDiscardLocalDraft(record);
19
+ return Object.freeze({
20
+ schema: ARTIFACT_AUTHORING_CAPABILITY_SCHEMA_ID,
21
+ recordId: String(record?.id || ''),
22
+ operations: Object.freeze({
23
+ createFromTransition: operation({
24
+ available: Boolean(transitions.length && createAuthority.ok),
25
+ known: Boolean(transitions.length),
26
+ owner: 'schema-transition/createContinuationDraft',
27
+ reason: transitions.length ? (createAuthority.ok ? 'Schema-owned transition creation is available.' : createAuthority.notice) : 'No schema-owned authoring transition is available for this artifact.'
28
+ }),
29
+ createRoot: operation({ available: false, known: true, owner: 'not-yet-owned', reason: 'Standalone/root artifact creation is not implemented in M4-A.' }),
30
+ editLocalDraft: operation({
31
+ available: Boolean(editEligible && createAuthority.ok),
32
+ known: editEligible,
33
+ owner: 'local-draft-update-command',
34
+ reason: !editEligible ? 'Only supported browser-local draft schemas can be edited.' : (createAuthority.ok ? 'This browser-local draft can be edited.' : createAuthority.notice)
35
+ }),
36
+ discardLocalDraft: operation({
37
+ available: Boolean(discardEligible && discardAuthority.ok),
38
+ known: discardEligible,
39
+ owner: 'local-draft-discard-command',
40
+ reason: !discardEligible ? 'Only browser-local drafts can be discarded.' : (discardAuthority.ok ? 'This browser-local draft can be discarded.' : discardAuthority.notice)
41
+ })
42
+ }),
43
+ transitions: Object.freeze(transitions.slice())
44
+ });
45
+ }
46
+
47
+ function operation({ available = false, known = false, owner = '', reason = '' } = {}) {
48
+ return Object.freeze({ available: Boolean(available), known: Boolean(known), owner: String(owner || ''), reason: String(reason || '') });
49
+ }
@@ -0,0 +1,19 @@
1
+ import { environment } from './environment.js';
2
+ import { schemaRegistry } from '@tiinex/core/schemas/registry.js';
3
+ import { defaultReaderModes } from '../../readers/reader.resolve.js';
4
+ import { surfaceRegistry } from '../../surfaces/registry.js';
5
+ import { auditSeedSummary } from '@tiinex/core/audit/audit.summary.js';
6
+ import { t, defaultLocale } from '../../i18n/i18n.resolve.js';
7
+
8
+ export function createAppModel() {
9
+ return {
10
+ environment,
11
+ locale: defaultLocale,
12
+ title: t('app.title'),
13
+ summary: t('app.summary'),
14
+ schemas: schemaRegistry,
15
+ surfaces: surfaceRegistry,
16
+ readers: defaultReaderModes,
17
+ audit: auditSeedSummary()
18
+ };
19
+ }
@@ -0,0 +1 @@
1
+ export const environment = Object.freeze({ runtime: 'v82-schema-binding-shell', legacyRuntimeLoaded: false });
@@ -0,0 +1,4 @@
1
+ export function canonicalAuthoringSubmissionValues(action = {}, inputValues = {}) {
2
+ const fixedInputs = action?.authoring?.fixedInputs || {};
3
+ return Object.freeze({ ...(inputValues || {}), ...fixedInputs });
4
+ }
@@ -0,0 +1,57 @@
1
+ import { executeCanonicalTransitionLocalCreate } from './canonicalTransitionLocalCreateCommand.js';
2
+ import { executeCanonicalReferenceLocalCreate } from './canonicalReferenceLocalCreateCommand.js';
3
+ import { executeSchemaFactoryLocalCreate } from './schemaFactoryLocalCreateCommand.js';
4
+ import { BUNDLED_CANONICAL_TRANSITION_DEFINITIONS, BUNDLED_CANONICAL_TRANSITION_SCHEMA_CACHE } from '../transitions/canonicalTransition.productDefaults.js';
5
+ import { canonicalCreationProductSettlementState } from './canonicalCreationProductSettlement.js';
6
+ import { isSchemaFactoryViewerCreateAction } from '../schemas/schema.factory.viewerProjection.js';
7
+
8
+ export function createCanonicalCreationProductController(input = {}) {
9
+ const executeTransition = input.executeTransitionCommand || executeCanonicalTransitionLocalCreate;
10
+ const executeReference = input.executeReferenceCommand || executeCanonicalReferenceLocalCreate;
11
+ const executeFactory = input.executeFactoryCommand || executeSchemaFactoryLocalCreate;
12
+ const currentState = () => input.getState?.() || {};
13
+ const lifecycle = () => input.getLifecycle?.() || null;
14
+ const persistenceOwnership = () => input.getPersistenceOwnership?.() || null;
15
+ const recordAction = () => input.getRecordAction?.() || null;
16
+ const dialogWorkspaceId = () => String(input.getDialogWorkspaceId?.() || '');
17
+
18
+ function settle(result, workspaceId, action = {}) {
19
+ input.resetSelection?.();
20
+ if (action?.productScope === 'workspace') { input.setDialog?.(null); input.setDialogWorkspaceId?.(''); }
21
+ input.setRecordAction?.(null); input.setActiveRecordId?.(''); input.setActiveAssetId?.(''); input.setNotice?.(result.notice);
22
+ input.commitSemanticNavigation?.(canonicalCreationProductSettlementState(result, workspaceId, Number(input.viewportWidth || 0)), 'push');
23
+ return result;
24
+ }
25
+
26
+ function createTransitionRecord(parentRecord, action, values, options = {}) {
27
+ const sourceState = currentState();
28
+ const workspaceId = String(options.workspaceId || recordAction()?.workspaceId || dialogWorkspaceId() || sourceState.activeWorkspaceId || '').trim();
29
+ const result = executeTransition({ lifecycle: lifecycle(), state: sourceState, workspaceId, currentRecordId: parentRecord?.id || '', definitionKey: action?.definitionKey || '', values, placementFolder: options.placementFolder || '', schemaCache: BUNDLED_CANONICAL_TRANSITION_SCHEMA_CACHE, bundledDefinitions: BUNDLED_CANONICAL_TRANSITION_DEFINITIONS, persistenceOwnership: persistenceOwnership() });
30
+ if (!result?.ok) { input.setNotice?.(result?.notice || 'Could not create canonical local artifact.'); return result; }
31
+ return settle(result, workspaceId, action);
32
+ }
33
+
34
+ function createFactoryRecord(parentRecord, action, values, options = {}) {
35
+ const sourceState = currentState();
36
+ const workspaceId = String(options.workspaceId || dialogWorkspaceId() || sourceState.activeWorkspaceId || '').trim();
37
+ const result = executeFactory({ lifecycle: lifecycle(), state: sourceState, workspaceId, currentRecordId: parentRecord?.id || '', action, values, placementFolder: options.placementFolder || '', persistenceOwnership: persistenceOwnership() });
38
+ if (!result?.ok) { input.setNotice?.(result?.notice || 'Could not create schema-factory local artifact.'); return result; }
39
+ return settle(result, workspaceId, action);
40
+ }
41
+
42
+ function createWorkspaceArtifactRecord(parentRecord, action, values, options = {}) {
43
+ return isSchemaFactoryViewerCreateAction(action)
44
+ ? createFactoryRecord(parentRecord, action, values, options)
45
+ : createTransitionRecord(parentRecord, action, values, options);
46
+ }
47
+
48
+ function createReferenceRecord(subjectRecord, action, targetOption) {
49
+ const sourceState = currentState();
50
+ const workspaceId = recordAction()?.workspaceId || sourceState.activeWorkspaceId || '';
51
+ const result = executeReference({ lifecycle: lifecycle(), state: sourceState, workspaceId, currentRecordId: subjectRecord?.id || '', targetWorkspaceId: targetOption?.workspaceId || '', targetRecordId: targetOption?.id || '', definitionKey: action?.definitionKey || '', schemaCache: BUNDLED_CANONICAL_TRANSITION_SCHEMA_CACHE, bundledDefinitions: BUNDLED_CANONICAL_TRANSITION_DEFINITIONS, persistenceOwnership: persistenceOwnership() });
52
+ if (!result?.ok) { input.setNotice?.(result?.notice || 'Could not create canonical Reference Relation.'); return result; }
53
+ return settle(result, workspaceId, action);
54
+ }
55
+
56
+ return Object.freeze({ createTransitionRecord, createFactoryRecord, createWorkspaceArtifactRecord, createReferenceRecord });
57
+ }
@@ -0,0 +1,10 @@
1
+ import assert from 'node:assert/strict';
2
+ import { canonicalCreationProductSettlementState } from './canonicalCreationProductSettlement.js';
3
+ const A={id:'A',records:[{id:'subject'},{id:'relation-1'}]}; const B={id:'B',records:[{id:'target'}]};
4
+ const current={activeWorkspaceId:'B',workspaces:[A,B],view:{workspaceVerse:'feed',query:'target'},workspaceViews:{A:{workspaceVerse:'tree',query:'origin',selectedRecordId:'subject'},B:{workspaceVerse:'feed',query:'target',selectedRecordId:'target'}},workspaceWindow:{schema:'tiinex.workspace.window.v1',offset:1}};
5
+ const settled=canonicalCreationProductSettlementState({state:current,workspace:A,record:{id:'relation-1'}},'A',1400);
6
+ assert.equal(settled.activeWorkspaceId,'A','Reference/creation settlement focuses subject/result workspace rather than incidental target workspace');
7
+ assert.equal(settled.view.workspaceVerse,'lineage');
8
+ assert.equal(settled.view.selectedRecordId,'relation-1');
9
+ assert.equal(settled.workspaceViews.B.query,'target','target workspace presentation remains intact');
10
+ console.log('canonicalCreationProductSettlement tests passed');
@@ -0,0 +1,11 @@
1
+ import { stateWithWorkspaceViewPatchAndFocus } from './workspaceScopedInteraction.js';
2
+
3
+ export function canonicalCreationProductSettlementState(result = {}, workspaceId = '', viewportWidth = 0) {
4
+ return stateWithWorkspaceViewPatchAndFocus(result.state || {}, result.workspace?.id || workspaceId, {
5
+ workspaceVerse: 'lineage',
6
+ selectedRecordId: result.record?.id || '',
7
+ lineageQuery: '',
8
+ lineageLoadReport: null,
9
+ lineageAuditReport: null
10
+ }, viewportWidth);
11
+ }
@@ -0,0 +1,210 @@
1
+ import { buildCanonicalTransitionInvocationBindingPlan } from '../transitions/transition.invocationBindingPlanner.js';
2
+ import { buildCanonicalTransitionOutputMaterializationPlan } from '../transitions/transition.outputMaterializationPlanner.js';
3
+ import { prepareCanonicalTransitionProductActions } from '../transitions/transition.productPreparation.js';
4
+ import { allocateRootArtifactPath } from '@tiinex/core/transitions/record.transitions.js';
5
+ import { localArtifactMaterializerForSchema } from '../transitions/transition.localArtifactMaterializers.js';
6
+ import { qualifyDurableReferenceParticipant } from '../transitions/transition.referenceTarget.js';
7
+ import { canonicalReferenceTargetOptions, annotatedLoadedRecords } from './canonicalReferenceTargets.js';
8
+ import { durableLocalMutationDecision, DurableLocalMutationOperation } from './durableLocalMutationPolicy.js';
9
+
10
+ export const CANONICAL_REFERENCE_LOCAL_CREATE_COMMAND_SCHEMA_ID = 'tiinex.site.canonical-reference-local-create-command.v1';
11
+
12
+ export function executeCanonicalReferenceLocalCreate(input = {}) {
13
+ const state = input.state || {};
14
+ const subjectWorkspace = findWorkspace(state, input.workspaceId);
15
+ if (!subjectWorkspace) return refusal('workspace-not-found', state, 'Reference cannot be created because the subject workspace is unavailable.');
16
+ const subjectRecord = findRecord(subjectWorkspace, input.currentRecordId);
17
+ if (!subjectRecord) return refusal('reference-subject-not-found', state, 'Reference cannot be created because the selected subject artifact is unavailable.');
18
+ const targetWorkspace = findWorkspace(state, input.targetWorkspaceId);
19
+ const targetRecord = findRecord(targetWorkspace, input.targetRecordId);
20
+ if (!targetWorkspace || !targetRecord) return refusal('reference-target-not-found', state, 'Reference cannot be created because the selected target artifact is unavailable.');
21
+ if (subjectWorkspace.id === targetWorkspace.id && subjectRecord.id === targetRecord.id) return refusal('reference-target-not-distinct', state, 'Reference requires a distinct target artifact.');
22
+
23
+ const loaded = annotatedLoadedRecords(state);
24
+ const referenceRecords = loaded.map((item) => item.record);
25
+ const preparation = prepareCanonicalTransitionProductActions({
26
+ currentRecord: subjectRecord,
27
+ workspaceRecords: subjectWorkspace.records || [],
28
+ referenceRecords,
29
+ workspaceId: subjectWorkspace.id,
30
+ schemaCache: input.schemaCache,
31
+ bundledDefinitions: input.bundledDefinitions
32
+ });
33
+ const matches = (preparation.actions || []).filter((candidate) => candidate.definitionKey === input.definitionKey);
34
+ if (matches.length !== 1) return refusal('canonical-reference-definition-key-not-unique', state, 'Reference cannot be created because the canonical Transition key does not identify exactly one definition.');
35
+ const action = matches[0];
36
+ if (!action?.productCapable || action.referenceCapability?.state !== 'qualified') return refusal('canonical-reference-capability-unavailable', state, 'Reference is not qualified for the selected subject artifact.');
37
+
38
+ const targets = canonicalReferenceTargetOptions({ state, subjectWorkspaceId: subjectWorkspace.id, subjectRecord, targetSchemaId: action.referenceCapability.targetSchemaId });
39
+ const targetOption = targets.options.find((option) => option.workspaceId === targetWorkspace.id && option.id === targetRecord.id) || null;
40
+ if (!targetOption?.enabled) return refusal(targetOption?.qualification?.reason || 'reference-target-identity-unqualified', state, 'Reference target does not have durable enough identity for this bounded product capability.', { targetQualification: targetOption?.qualification || null });
41
+ if (!(action.referenceCapability.targetCandidateParticipantIds || []).includes(targetOption.participantId)) return refusal('reference-target-not-applicable', state, 'Reference target does not satisfy the exact Transition target role.');
42
+
43
+ const subjectParticipant = targets.subjectParticipant;
44
+ const subjectQualification = qualifyDurableReferenceParticipant(subjectRecord, subjectParticipant, {
45
+ subjectWorkspaceId: subjectWorkspace.id,
46
+ participantWorkspaceId: subjectWorkspace.id,
47
+ workspaceRecords: subjectWorkspace.records || []
48
+ });
49
+ if (subjectQualification.state !== 'qualified') return refusal(subjectQualification.reason || 'reference-subject-identity-unqualified', state, 'Reference subject does not have durable enough identity for this bounded product capability.', { subjectQualification });
50
+
51
+ const result = action.resultSemantics || {};
52
+ const output = result.outputRoles?.[0];
53
+ const outputSchemaId = token(output?.schemaConstraint);
54
+ const materializer = localArtifactMaterializerForSchema(outputSchemaId);
55
+ if (!materializer || outputSchemaId !== 'tiinex.relation.v1') return refusal('canonical-reference-materializer-unavailable', state, 'Reference Relation materializer is unavailable for the exact qualified output schema.');
56
+ const relation = action.referenceCapability.relationEffect || {};
57
+ const placement = result.outputPlacements?.[0] || {};
58
+ const destination = result.destinationBindings?.[0] || {};
59
+ const explicit = action.explicitGenerationQualification || null;
60
+ const outputRole = token(action.referenceCapability.outputRole || output?.name);
61
+ if (token(explicit?.qualification) !== 'qualified') return refusal('explicit-generation-authority-unqualified', state, 'Reference Relation generation authority is not exactly qualified.');
62
+
63
+ const relationTitle = `Reference ${subjectRecord.title || 'Topic'} to ${targetRecord.title || 'Task'}`;
64
+ const packet = {
65
+ inputRoles: [
66
+ { role: action.referenceCapability.subjectRole, members: [{ bindingId: 'reference-subject-1', participantId: subjectParticipant.identity.id }] },
67
+ { role: action.referenceCapability.targetRole, members: [{ bindingId: 'reference-target-1', participantId: targetOption.participantId }] }
68
+ ],
69
+ destinations: [{ name: destination.name || '', value: subjectWorkspace.id }],
70
+ naming: [{ placement: placement.name || '', value: relationTitle }],
71
+ memberAssociations: []
72
+ };
73
+ const bindingPlan = buildCanonicalTransitionInvocationBindingPlan({
74
+ definition: action.definition,
75
+ participantIndex: targets.participantIndex,
76
+ currentArtifact: subjectParticipant,
77
+ bindingPacket: packet
78
+ });
79
+
80
+ const values = referenceGenerationValues({ action, subjectQualification, targetQualification: targetOption.qualification });
81
+ const requiredInputNames = (explicit.authority?.requiredInputs || []).map((item) => token(item?.name)).filter(Boolean);
82
+ if (!requiredInputNames.length || requiredInputNames.some((name) => !token(values[name]))) return refusal('reference-generation-values-incomplete', state, 'Reference Relation generation values are incomplete for the exact generation authority.', { values });
83
+ const generationInputs = requiredInputNames.map((name) => ({ outputRole, name, value: values[name] }));
84
+ const v423 = buildCanonicalTransitionOutputMaterializationPlan({
85
+ definition: action.definition,
86
+ participantIndex: targets.participantIndex,
87
+ currentArtifact: subjectParticipant,
88
+ bindingPacket: packet,
89
+ generationInputs,
90
+ explicitGenerationAuthorities: [{ outputRole, qualification: explicit }]
91
+ });
92
+ if (bindingPlan.qualification !== 'qualified' || v423.qualification !== 'qualified') return refusal('canonical-reference-plan-not-qualified', state, 'Reference cannot be created because canonical binding/materialization planning did not qualify.', { bindingPlan, v423 });
93
+
94
+ const capability = referenceExecutionCapability({ action, v423, subjectWorkspace, targetOption, materializer });
95
+ if (!capability.ok) return refusal(capability.error, state, capability.notice, { bindingPlan, v423, capability });
96
+
97
+ const allocation = allocateRootArtifactPath({ targetId: outputSchemaId, targetLabel: materializer.label, title: relationTitle }, { workspaceRecords: subjectWorkspace.records || [] });
98
+ const concretePath = token(allocation.path);
99
+ if (!concretePath) return refusal('reference-local-path-allocation-unavailable', state, 'Reference Relation cannot be created because a browser-local path could not be allocated.', { bindingPlan, v423 });
100
+ const cacheById = Object.fromEntries((preparation.cacheQualification?.entries || []).map((item) => [item.schemaId, item]));
101
+ const relationSchemaMaterials = [cacheById['tiinex.root.v1']?.markdown || '', cacheById[outputSchemaId]?.markdown || ''];
102
+ const rendered = materializer.render({ values, parent: null, continuityMode: 'root', now: input.now });
103
+ if (rendered.state !== 'rendered') return refusal(rendered.reason, state, 'Reference Relation could not be rendered from its qualified generation values.', { bindingPlan, v423 });
104
+ const artifactQualification = materializer.qualify({ markdown: rendered.markdown, schemaMaterials: relationSchemaMaterials, values, parent: null, continuityMode: 'root', path: concretePath });
105
+ if (artifactQualification.state !== 'qualified') return refusal(artifactQualification.reason, state, 'Reference Relation did not satisfy the exact Relation contract.', { bindingPlan, v423, artifactQualification });
106
+
107
+ const authority = durableLocalMutationDecision(input.persistenceOwnership, DurableLocalMutationOperation.localDraftCreate);
108
+ if (!authority.ok) return refusal(authority.error || 'local-mutation-not-authorized', state, authority.notice || 'Local Reference creation is not available in this session.', { bindingPlan, v423, artifactQualification });
109
+ if (!input.lifecycle?.addWorkspaceRecord) return refusal('workspace-lifecycle-unavailable', state, 'Reference Relation cannot be created because the local workspace lifecycle is unavailable.');
110
+ const beforeSubject = stableJson(subjectRecord), beforeTarget = stableJson(targetRecord);
111
+ const candidate = Object.assign({}, artifactQualification.record, {
112
+ sourceMode: 'local-transition-canonical',
113
+ path: concretePath,
114
+ transitionMaterialization: {
115
+ schema: CANONICAL_REFERENCE_LOCAL_CREATE_COMMAND_SCHEMA_ID,
116
+ canonicalIdentifier: action.canonicalIdentifier,
117
+ remoteWrite: false,
118
+ sourceMutation: false,
119
+ targetMutation: false,
120
+ concretePath,
121
+ continuityMode: 'root',
122
+ relationMaterialization: true
123
+ }
124
+ });
125
+ delete candidate.source;
126
+ delete candidate.sourceTarget;
127
+ const committed = input.lifecycle.addWorkspaceRecord(state, subjectWorkspace.id, candidate, { clock: input.clock });
128
+ if (!committed?.ok) return refusal(committed?.error || 'workspace-mutation-failed', state, 'Reference Relation could not be added to the browser-local workspace.', { bindingPlan, v423, artifactQualification });
129
+
130
+ const afterSubject = findRecord(findWorkspace(committed.state, subjectWorkspace.id), subjectRecord.id);
131
+ const afterTarget = findRecord(findWorkspace(committed.state, targetWorkspace.id), targetRecord.id);
132
+ if (stableJson(afterSubject) !== beforeSubject || stableJson(afterTarget) !== beforeTarget) return refusal('post-mutation-participant-boundary-violation', state, 'Reference creation was refused because a participant artifact changed.', { bindingPlan, v423, artifactQualification });
133
+ const createdSource = committed.record?.source || {};
134
+ if (createdSource.adapterId === 'github' || createdSource.repository || createdSource.repo || createdSource.ref || committed.record?.sourceTarget) return refusal('post-mutation-source-boundary-violation', state, 'Reference Relation inherited source provenance and was refused.', { bindingPlan, v423, artifactQualification });
135
+
136
+ return Object.freeze({
137
+ ok: true,
138
+ schema: CANONICAL_REFERENCE_LOCAL_CREATE_COMMAND_SCHEMA_ID,
139
+ state: committed.state,
140
+ workspace: committed.workspace,
141
+ record: committed.record,
142
+ subjectRecord,
143
+ targetRecord,
144
+ subjectQualification,
145
+ targetQualification: targetOption.qualification,
146
+ bindingPlan,
147
+ v423,
148
+ artifactQualification,
149
+ concretePath,
150
+ relationMaterialization: true,
151
+ remoteWrite: false,
152
+ sourceMutation: false,
153
+ targetMutation: false,
154
+ notice: `Created local Reference Relation from ${subjectRecord.title || 'subject'} to ${targetRecord.title || 'target'}.`
155
+ });
156
+ }
157
+
158
+ function referenceGenerationValues({ action = {}, subjectQualification = {}, targetQualification = {} } = {}) {
159
+ const effect = action.referenceCapability?.relationEffect || {};
160
+ const transitionPath = token(action.definition?.artifact?.path || action.definition?.artifact?.source?.sourceArtifactPath);
161
+ const generationTarget = token(action.explicitGenerationQualification?.resolution?.target);
162
+ const exact = action.explicitGenerationQualification?.exactAuthorityRepresentations || {};
163
+ return Object.freeze({
164
+ 'Relation Type': 'topic reference to task',
165
+ 'Relation Direction': 'Topic subject -> referenced Task',
166
+ 'Relation Scope': 'artifact-level',
167
+ 'Relation Target': token(targetQualification.durableTarget),
168
+ 'Predicate Identifier': token(effect.predicateIdentifier),
169
+ 'Predicate Meaning': token(effect.predicateMeaning),
170
+ 'Subject Binding': token(subjectQualification.durableTarget),
171
+ 'Object Binding': token(targetQualification.durableTarget),
172
+ Directionality: token(effect.directionality),
173
+ 'Transition Authority': transitionPath ? `site-local:${transitionPath}` : '',
174
+ 'Transition Authority Representation Method': token(exact.transition?.method),
175
+ 'Transition Authority Representation Value': token(exact.transition?.value),
176
+ 'Generation Authority': generationTarget,
177
+ 'Generation Authority Representation Method': token(exact.generation?.method),
178
+ 'Generation Authority Representation Value': token(exact.generation?.value)
179
+ });
180
+ }
181
+ function referenceExecutionCapability({ action = {}, v423 = {}, subjectWorkspace = {}, targetOption = {}, materializer = null } = {}) {
182
+ const output = v423.outputRolePlans?.[0] || {};
183
+ const placement = output.placements?.[0] || {};
184
+ const effect = action.referenceCapability?.relationEffect || {};
185
+ const supported = v423.outputRolePlans?.length === 1
186
+ && output.outputCount?.exactCount === 1
187
+ && output.effectiveParticipantKind === 'artifact'
188
+ && output.schemaConstraint === 'tiinex.relation.v1'
189
+ && output.generation?.authority === 'explicit-reference'
190
+ && output.generation?.state === 'resolved'
191
+ && output.lifecycle?.requestedOperation === 'create'
192
+ && placement.placementIntent === 'new-materialization'
193
+ && placement.destinationValue === subjectWorkspace.id
194
+ && placement.naming?.authority === 'explicit-binding'
195
+ && placement.naming?.state === 'resolved'
196
+ && placement.concretePath === null
197
+ && action.resultSemantics?.parentEffects?.length === 0
198
+ && action.resultSemantics?.relationEffects?.length === 1
199
+ && effect.semanticQualification?.state === 'qualified'
200
+ && effect.predicateScope === 'local-transition-definition'
201
+ && effect.portablePredicateIdentityClaimed === false
202
+ && targetOption.enabled === true
203
+ && materializer?.schemaId === 'tiinex.relation.v1';
204
+ return Object.freeze({ ok: Boolean(supported), error: supported ? '' : 'canonical-reference-pattern-unsupported', notice: supported ? '' : 'Reference is outside the bounded durable browser-local capability.' });
205
+ }
206
+ function findWorkspace(state = {}, id = '') { const key = token(id); return (state.workspaces || []).find((item) => token(item?.id) === key) || null; }
207
+ function findRecord(workspace = null, id = '') { const key = token(id); return (workspace?.records || []).find((item) => token(item?.id) === key) || null; }
208
+ function refusal(error, state, notice, extra = {}) { return Object.freeze({ ok: false, schema: CANONICAL_REFERENCE_LOCAL_CREATE_COMMAND_SCHEMA_ID, error, state, notice, ...extra, remoteWrite: false, sourceMutation: false, targetMutation: false, relationMaterialization: false, concretePath: null }); }
209
+ function stableJson(value) { return JSON.stringify(value ?? null); }
210
+ function token(value = '') { return String(value || '').trim(); }
@@ -0,0 +1,73 @@
1
+ import { buildLoadedArtifactParticipantIndex, participantMatchesSchema, resolveCurrentArtifactParticipant } from '../artifacts/artifact.participantIndex.js';
2
+ import { referenceTargetOption } from '../transitions/transition.referenceTarget.js';
3
+
4
+ export const CANONICAL_REFERENCE_TARGET_OPTIONS_SCHEMA_ID = 'tiinex.site.canonical-reference-target-options.v1';
5
+
6
+ export function canonicalReferenceTargetOptions(input = {}) {
7
+ const state = input.state || {};
8
+ const subjectWorkspaceId = token(input.subjectWorkspaceId);
9
+ const subjectRecord = input.subjectRecord || null;
10
+ const targetSchemaId = token(input.targetSchemaId);
11
+ const loaded = annotatedLoadedRecords(state);
12
+ const participantIndex = buildLoadedArtifactParticipantIndex({ records: loaded.map((item) => item.record) });
13
+ const subjectAnnotated = loaded.find((item) => item.workspaceId === subjectWorkspaceId && String(item.record?.id || '') === String(subjectRecord?.id || ''))?.record || subjectRecord;
14
+ const subjectParticipant = resolveCurrentArtifactParticipant(subjectAnnotated, participantIndex);
15
+ if (!subjectParticipant?.cleanCandidate || !targetSchemaId) return result([], participantIndex, subjectParticipant, 'subject-or-target-schema-unqualified');
16
+
17
+ const byParticipant = new Map();
18
+ for (const item of loaded) {
19
+ const participant = resolveCurrentArtifactParticipant(item.record, participantIndex);
20
+ if (!participantMatchesSchema(participant, targetSchemaId)) continue;
21
+ if (participant.identity?.id === subjectParticipant.identity?.id) continue;
22
+ const option = referenceTargetOption(item.original, participant, {
23
+ subjectWorkspaceId,
24
+ participantWorkspaceId: item.workspaceId,
25
+ workspaceRecords: item.workspaceRecords
26
+ });
27
+ const key = token(participant.identity?.id);
28
+ if (!key) continue;
29
+ const previous = byParticipant.get(key);
30
+ if (!previous || preferOption(option, previous, subjectWorkspaceId)) byParticipant.set(key, Object.freeze({ ...option, key: `participant:${key}`, participantId: key }));
31
+ }
32
+ const options = [...byParticipant.values()].sort(compareOptions);
33
+ return result(options, participantIndex, subjectParticipant, 'qualified');
34
+ }
35
+
36
+ export function annotatedLoadedRecords(state = {}) {
37
+ const out = [];
38
+ for (const workspace of Array.isArray(state.workspaces) ? state.workspaces : []) {
39
+ const workspaceId = token(workspace?.id);
40
+ const records = Array.isArray(workspace?.records) ? workspace.records : [];
41
+ for (const original of records) {
42
+ const workspaceIds = [...new Set([...(Array.isArray(original?.workspaceIds) ? original.workspaceIds : []), workspaceId].map(token).filter(Boolean))].sort();
43
+ out.push(Object.freeze({ workspaceId, workspaceRecords: records, original, record: Object.freeze({ ...original, workspaceIds }) }));
44
+ }
45
+ }
46
+ return Object.freeze(out);
47
+ }
48
+
49
+ function result(options, participantIndex, subjectParticipant, state) {
50
+ return Object.freeze({
51
+ schema: CANONICAL_REFERENCE_TARGET_OPTIONS_SCHEMA_ID,
52
+ state,
53
+ options: Object.freeze(options),
54
+ qualifiedOptions: Object.freeze(options.filter((item) => item.enabled)),
55
+ unavailableOptions: Object.freeze(options.filter((item) => !item.enabled)),
56
+ participantIndex,
57
+ subjectParticipant: subjectParticipant || null,
58
+ readOnly: true,
59
+ mutation: false,
60
+ networkFetch: false
61
+ });
62
+ }
63
+ function preferOption(next, previous, subjectWorkspaceId) {
64
+ if (next.enabled !== previous.enabled) return next.enabled;
65
+ const nextSame = next.workspaceId === subjectWorkspaceId, previousSame = previous.workspaceId === subjectWorkspaceId;
66
+ if (nextSame !== previousSame) return nextSame;
67
+ return `${next.workspaceId}\0${next.id}`.localeCompare(`${previous.workspaceId}\0${previous.id}`) < 0;
68
+ }
69
+ function compareOptions(a, b) {
70
+ if (a.enabled !== b.enabled) return a.enabled ? -1 : 1;
71
+ return String(a.title || '').localeCompare(String(b.title || '')) || String(a.workspaceId || '').localeCompare(String(b.workspaceId || '')) || String(a.id || '').localeCompare(String(b.id || ''));
72
+ }
73
+ function token(value = '') { return String(value || '').trim(); }