@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,190 @@
1
+ import {
2
+ artifactPublicTargetFromRecord,
3
+ buildPublicViewerTargetUrl,
4
+ publicTargetFromRecord,
5
+ publicTargetFromWorkspace,
6
+ publicTargetRestoreCapability,
7
+ PublicTargetRestoreCapability
8
+ } from './publicTarget.js';
9
+ import { workspaceHasDurableLocalMaterial } from '../workspaces/workspace.openSemantics.js';
10
+
11
+ export const SHARE_PROJECTION_SCHEMA = 'tiinex.shareProjection.v1';
12
+
13
+ export const ShareScope = Object.freeze({
14
+ artifact: 'artifact',
15
+ workspace: 'workspace',
16
+ workspaceSet: 'workspace-set',
17
+ current: 'current'
18
+ });
19
+
20
+ export const ShareTargetStatus = Object.freeze({
21
+ available: 'available',
22
+ exactViewOnly: 'exact-view-only',
23
+ localOnly: 'local-only',
24
+ unavailable: 'unavailable'
25
+ });
26
+
27
+ export const ShareAccessStatus = Object.freeze({
28
+ unknown: 'unknown',
29
+ accessBound: 'access-bound',
30
+ notApplicable: 'not-applicable'
31
+ });
32
+
33
+ export function projectShareTruth({
34
+ scope = ShareScope.current,
35
+ state = {},
36
+ workspace = null,
37
+ record = null,
38
+ publicViewerUrl = '',
39
+ exactStateBaseUrl = '',
40
+ routeCodec = globalThis.TiinexWorkspaceRoute,
41
+ persistenceCodec = globalThis.TiinexWorkspacePersistence
42
+ } = {}) {
43
+ const normalizedScope = normalizeScope(scope);
44
+ const exactStateUrl = normalizedScope === ShareScope.current
45
+ ? buildExactStateUrl(state, { baseUrl: exactStateBaseUrl, routeCodec, persistenceCodec })
46
+ : '';
47
+ const publicTarget = publicTargetForScope(normalizedScope, workspace, record);
48
+ const restoreCapability = publicTarget ? publicTargetRestoreCapability(publicTarget) : PublicTargetRestoreCapability.invalid;
49
+ const publicUrl = restoreCapability === PublicTargetRestoreCapability.restorable
50
+ ? buildPublicViewerTargetUrl(publicTarget, publicViewerUrl)
51
+ : '';
52
+ const localMaterial = localMaterialForScope(normalizedScope, workspace, record);
53
+ const sourceBacked = sourceBackedForScope(normalizedScope, workspace, record);
54
+ const targetStatus = shareTargetStatus({ publicTarget, publicUrl, exactStateUrl, localMaterial, sourceBacked, restoreCapability });
55
+ const accessStatus = shareAccessStatus({ scope: normalizedScope, publicTarget, workspace, record, restoreCapability });
56
+ const warnings = shareWarnings({ targetStatus, publicTarget, publicUrl, exactStateUrl, localMaterial, restoreCapability });
57
+ const allowedActions = [];
58
+ if (publicUrl) allowedActions.push('copy-public-url');
59
+ if (exactStateUrl) allowedActions.push('copy-exact-state-url');
60
+ return deepFreeze({
61
+ schema: SHARE_PROJECTION_SCHEMA,
62
+ scope: normalizedScope,
63
+ publicTarget,
64
+ publicUrl,
65
+ exactStateUrl,
66
+ restoreCapability,
67
+ targetStatus,
68
+ accessStatus,
69
+ localMaterialWarning: warnings.find((warning) => warning.code === 'share.local-material-not-carried') || null,
70
+ warnings,
71
+ allowedActions
72
+ });
73
+ }
74
+
75
+ export function buildExactStateUrl(state = {}, { baseUrl = '', routeCodec = globalThis.TiinexWorkspaceRoute, persistenceCodec = globalThis.TiinexWorkspacePersistence } = {}) {
76
+ const base = safeHttpUrl(baseUrl);
77
+ if (!base || typeof routeCodec?.makeRouteState !== 'function' || typeof persistenceCodec?.encodeState !== 'function') return '';
78
+ const routeState = routeCodec.makeRouteState(state || {});
79
+ const encoded = persistenceCodec.encodeState(routeState);
80
+ if (!encoded) return '';
81
+ const url = new URL(base);
82
+ url.hash = `state=${encoded}`;
83
+ return url.href;
84
+ }
85
+
86
+ function publicTargetForScope(scope, workspace, record) {
87
+ if (scope === ShareScope.artifact) return artifactPublicTargetFromRecord(record || {});
88
+ if (scope === ShareScope.workspace) return publicTargetFromWorkspace(workspace || {});
89
+ if (scope === ShareScope.workspaceSet) {
90
+ const target = publicTargetFromRecord(record || {});
91
+ return target?.targetKind === 'workspace' ? target : null;
92
+ }
93
+ return null;
94
+ }
95
+
96
+ function shareTargetStatus({ publicTarget, publicUrl, exactStateUrl, localMaterial, sourceBacked, restoreCapability }) {
97
+ if (restoreCapability === PublicTargetRestoreCapability.restorable && publicTarget && publicUrl) return ShareTargetStatus.available;
98
+ if (localMaterial && !publicTarget && !sourceBacked) return ShareTargetStatus.localOnly;
99
+ if (exactStateUrl && !publicTarget) return ShareTargetStatus.exactViewOnly;
100
+ return ShareTargetStatus.unavailable;
101
+ }
102
+
103
+ function shareAccessStatus({ scope, publicTarget, record, restoreCapability }) {
104
+ if (!publicTarget || restoreCapability !== PublicTargetRestoreCapability.restorable) return ShareAccessStatus.notApplicable;
105
+ if (scope === ShareScope.artifact || scope === ShareScope.workspaceSet) {
106
+ return explicitAuthRequired(record) ? ShareAccessStatus.accessBound : ShareAccessStatus.unknown;
107
+ }
108
+ if (scope === ShareScope.workspace) return ShareAccessStatus.unknown;
109
+ return ShareAccessStatus.notApplicable;
110
+ }
111
+
112
+
113
+ function shareWarnings({ targetStatus, publicTarget, publicUrl, exactStateUrl, localMaterial, restoreCapability }) {
114
+ const warnings = [];
115
+ if (publicTarget && restoreCapability === PublicTargetRestoreCapability.unsupported) warnings.push(warning('share.public-target-unsupported', 'This target can be described, but the current public receiver cannot reconstruct it.'));
116
+ if (publicTarget && restoreCapability === PublicTargetRestoreCapability.restorable && !publicUrl) warnings.push(warning('share.public-viewer-unavailable', 'A reconstructive target exists, but no configured public viewer URL can encode it.'));
117
+ if (localMaterial && publicTarget) warnings.push(warning('share.local-material-not-carried', 'Browser-local material is not carried by this public target.'));
118
+ if (targetStatus === ShareTargetStatus.exactViewOnly && exactStateUrl) warnings.push(warning('share.exact-state-not-public-material', 'The exact state URL describes semantic browser state; it does not guarantee recipient material availability.'));
119
+ if (targetStatus === ShareTargetStatus.localOnly) warnings.push(warning('share.local-only', 'This scope contains browser-local material without a truthful reconstructive public target.'));
120
+ return warnings;
121
+ }
122
+
123
+ function localMaterialForScope(scope, workspace, record) {
124
+ if (scope === ShareScope.artifact || scope === ShareScope.workspaceSet) return isLocalMaterial(record);
125
+ if (scope === ShareScope.workspace) return workspaceHasDurableLocalMaterial(workspace || {});
126
+ return false;
127
+ }
128
+
129
+ function sourceBackedForScope(scope, workspace, record) {
130
+ if (scope === ShareScope.artifact || scope === ShareScope.workspaceSet) return isSourceBackedMaterial(record);
131
+ if (scope !== ShareScope.workspace) return false;
132
+ if ((Array.isArray(workspace?.sources) ? workspace.sources : []).some(isSourceBackedSource)) return true;
133
+ return [...(Array.isArray(workspace?.records) ? workspace.records : []), ...(Array.isArray(workspace?.assets) ? workspace.assets : [])].some(isSourceBackedMaterial);
134
+ }
135
+
136
+ function explicitAuthRequired(record) {
137
+ return authRequiredIn(record?.source) || authRequiredIn(record?.sourceTarget);
138
+ }
139
+
140
+ function authRequiredIn(value = null) {
141
+ if (!value || typeof value !== 'object') return false;
142
+ return Boolean(
143
+ value.authRequired
144
+ || value.config?.authRequired
145
+ || value.transportPolicy?.authRequired
146
+ || value.diagnostics?.transportPolicy?.authRequired
147
+ );
148
+ }
149
+
150
+ function isLocalMaterial(value = {}) {
151
+ const source = value?.source || {};
152
+ const mode = String(value?.sourceMode || '').toLowerCase();
153
+ return source.id === 'local' || source.adapterId === 'local' || source.kind === 'local' || String(source.sourceKind || '').startsWith('local.') || mode.startsWith('local');
154
+ }
155
+
156
+ function isSourceBackedMaterial(value = {}) {
157
+ if (!value || typeof value !== 'object' || isLocalMaterial(value)) return false;
158
+ return Boolean(value.sourceTarget?.inputTarget || value.sourceTarget?.sourceUrl || value.sourceTarget?.rawUrl || isSourceBackedSource(value.source || {}));
159
+ }
160
+
161
+ function isSourceBackedSource(source = {}) {
162
+ if (!source || typeof source !== 'object') return false;
163
+ if (source.id === 'local' || source.adapterId === 'local' || source.kind === 'local') return false;
164
+ return Boolean(source.adapterId || source.sourceKind || source.repo || source.repository || source.url || source.permalink);
165
+ }
166
+
167
+ function normalizeScope(value = '') {
168
+ const scope = String(value || '').trim();
169
+ return Object.values(ShareScope).includes(scope) ? scope : ShareScope.current;
170
+ }
171
+
172
+ function warning(code, message) {
173
+ return Object.freeze({ code, message });
174
+ }
175
+
176
+ function safeHttpUrl(value = '') {
177
+ try {
178
+ const url = new URL(String(value || '').trim());
179
+ return /^https?:$/.test(url.protocol) ? url.href : '';
180
+ } catch (_) {
181
+ return '';
182
+ }
183
+ }
184
+
185
+ function deepFreeze(value) {
186
+ if (!value || typeof value !== 'object' || Object.isFrozen(value)) return value;
187
+ Object.freeze(value);
188
+ for (const child of Object.values(value)) deepFreeze(child);
189
+ return value;
190
+ }
@@ -0,0 +1 @@
1
+ export function AppShell(model) { return model; }
@@ -0,0 +1 @@
1
+ export function Header(title) { return { title }; }
@@ -0,0 +1 @@
1
+ export function Navigation(items = []) { return items; }
@@ -0,0 +1 @@
1
+ export function SurfaceSwitcher(surfaces = []) { return surfaces; }
@@ -0,0 +1,176 @@
1
+ import { nextGithubTransportTier, normalizeGithubTransportTier } from '../sources/github/github.transport.js';
2
+
3
+ export const GITHUB_SOURCE_TRANSPORT_SURFACES = Object.freeze([
4
+ Object.freeze({ key: 'repoFiles', label: 'repo files', shortLabel: 'files', inputKey: 'repoDiscovery' }),
5
+ Object.freeze({ key: 'explicitFiles', label: 'explicit files', shortLabel: 'explicit', inputKey: 'explicitFiles' }),
6
+ Object.freeze({ key: 'issueSnapshots', label: 'issue snapshots', shortLabel: 'issues', inputKey: 'issueDiscovery' })
7
+ ]);
8
+
9
+ const SURFACE_BY_KEY = Object.freeze(Object.fromEntries(GITHUB_SOURCE_TRANSPORT_SURFACES.map((surface) => [surface.key, surface])));
10
+
11
+ export function sourceTransportSequenceTier(source = {}, fallbackTier = '') {
12
+ const outcome = source.transportOutcome || {};
13
+ return normalizeGithubTransportTier(
14
+ fallbackTier
15
+ || outcome.sequenceTier
16
+ || source.transportRefreshTier
17
+ || outcome.requestedTier
18
+ || outcome.refreshTier
19
+ || ''
20
+ ) || 'cache';
21
+ }
22
+
23
+ export function sourceTransportSurfaceState(source = {}, key = '') {
24
+ const surfaceKey = String(key || '').trim();
25
+ const requested = source.requestedSurfaces?.[surfaceKey] || {};
26
+ const actual = source.surfaces?.[surfaceKey] || {};
27
+ return Object.assign({}, requested, actual);
28
+ }
29
+
30
+ export function sourceTransportSurfaceTier(source = {}, key = '', fallbackTier = '') {
31
+ const surface = sourceTransportSurfaceState(source, key);
32
+ const list = Array.isArray(surface.transportTiers) ? surface.transportTiers.map((tier) => normalizeGithubTransportTier(tier)).filter(Boolean) : [];
33
+ const actualTier = normalizeGithubTransportTier(surface.transportTier || list[list.length - 1] || '');
34
+ return normalizeGithubTransportTier(
35
+ fallbackTier
36
+ || actualTier
37
+ || surface.sequenceTier
38
+ || surface.transportRefreshTier
39
+ || ''
40
+ ) || sourceTransportSequenceTier(source, '');
41
+ }
42
+
43
+ export function sourceTransportConfiguredSurfaces(source = {}) {
44
+ const keys = [];
45
+ const explicitFileRefs = Array.isArray(source.explicitFileRefs || source.config?.explicitFileRefs)
46
+ ? Array.from(source.explicitFileRefs || source.config?.explicitFileRefs).filter(Boolean)
47
+ : [];
48
+ if (source.repoDiscovery === true) keys.push('repoFiles');
49
+ if (explicitFileRefs.length) keys.push('explicitFiles');
50
+ if (source.issueDiscovery === true || Boolean(source.issueUrls || source.config?.issueUrls)) keys.push('issueSnapshots');
51
+ return keys;
52
+ }
53
+
54
+ export function sourceTransportActiveSurfaces(source = {}) {
55
+ return GITHUB_SOURCE_TRANSPORT_SURFACES.filter((surface) => {
56
+ const state = sourceTransportSurfaceState(source, surface.key);
57
+ if (state.requested || state.attempted || state.loaded || state.discovered || state.requestedCount || state.unavailable || state.skipped || state.failed) return true;
58
+ if (surface.key === 'repoFiles' && source.repoDiscovery) return true;
59
+ if (surface.key === 'issueSnapshots' && (source.issueDiscovery || source.issueUrls || source.config?.issueUrls)) return true;
60
+ return false;
61
+ }).map((surface) => surface.key);
62
+ }
63
+
64
+ export function normalizeTransportSurfaceKeys(value, source = {}) {
65
+ const configured = new Set(sourceTransportConfiguredSurfaces(source));
66
+ const requested = Array.isArray(value) ? value : String(value || '').split(',');
67
+ const keys = requested
68
+ .map((item) => String(item || '').trim())
69
+ .filter(Boolean)
70
+ .filter((key) => Boolean(SURFACE_BY_KEY[key]) && configured.has(key));
71
+ if (keys.length) return Array.from(new Set(keys));
72
+ return Array.from(configured);
73
+ }
74
+
75
+ export function sourceTransportBadgesForSource(source = {}) {
76
+ const activeKeys = sourceTransportActiveSurfaces(source).filter((key) => key !== 'explicitFiles');
77
+ if (!activeKeys.length) return [];
78
+ const configured = source.transportOutcome?.configured || source.transportPlan?.configured || {};
79
+ const configuredKeys = new Set(sourceTransportConfiguredSurfaces(source));
80
+ const rows = activeKeys.map((key) => {
81
+ const surface = sourceTransportSurfaceState(source, key);
82
+ const pendingTier = normalizeGithubTransportTier(surface.pendingTier || '');
83
+ const tier = pendingTier || sourceTransportSurfaceTier(source, key);
84
+ const status = String(surface.status || surface.activeStatus || (surface.unavailable || surface.skipped ? 'unavailable' : surface.failed ? 'failed' : surface.loaded ? 'ok' : '')).toLowerCase();
85
+ const nextTier = pendingTier ? '' : nextGithubTransportTier(tier || 'cache', configured);
86
+ return {
87
+ key,
88
+ label: SURFACE_BY_KEY[key]?.label || key,
89
+ shortLabel: SURFACE_BY_KEY[key]?.shortLabel || key,
90
+ tier,
91
+ pendingTier,
92
+ status,
93
+ nextTier,
94
+ refreshable: Boolean(nextTier) && configuredKeys.has(key),
95
+ loaded: Number(surface.loaded || 0),
96
+ unavailable: Boolean(surface.unavailable || surface.skipped),
97
+ failed: Number(surface.failed || 0) > 0
98
+ };
99
+ });
100
+ const tierSet = new Set(rows.map((row) => row.tier || 'cache'));
101
+ const pendingSet = new Set(rows.map((row) => row.pendingTier || ''));
102
+ const allSameTier = tierSet.size === 1 && pendingSet.size === 1;
103
+ if (allSameTier) {
104
+ const first = rows[0];
105
+ return [Object.assign({}, first, {
106
+ key: 'all',
107
+ surfaceKeys: rows.map((row) => row.key),
108
+ label: first.tier || 'transport',
109
+ shortLabel: '',
110
+ mixed: false,
111
+ rows,
112
+ refreshable: rows.some((row) => row.refreshable),
113
+ nextTier: first.nextTier || ''
114
+ })];
115
+ }
116
+ return rows.map((row) => Object.assign({}, row, { surfaceKeys: [row.key], mixed: true }));
117
+ }
118
+
119
+ export function sourceTransportRefreshInputForSource(source = {}, currentTier = '', surfaceKeysInput = null) {
120
+ const configured = source.transportPlan?.configured || source.transportOutcome?.configured || {};
121
+ const pendingTier = normalizeGithubTransportTier(source.transportOutcome?.pendingTier || '');
122
+ const pendingSurfaces = Array.isArray(source.transportOutcome?.pendingSurfaces) ? source.transportOutcome.pendingSurfaces : [];
123
+ const selectedSurfaceKeys = normalizeTransportSurfaceKeys(pendingTier ? (pendingSurfaces.length ? pendingSurfaces : surfaceKeysInput) : surfaceKeysInput, source);
124
+ const observedTier = pendingTier || normalizeGithubTransportTier(currentTier) || (selectedSurfaceKeys.length === 1 ? sourceTransportSurfaceTier(source, selectedSurfaceKeys[0]) : sourceTransportSequenceTier(source, currentTier));
125
+ const nextTier = nextGithubTransportTier(observedTier, configured);
126
+ if (!nextTier) return { ok: false, reason: 'last-tier', observedTier, selectedSurfaceKeys, pendingTier, pendingSurfaces };
127
+ const issueSurfaceSelected = selectedSurfaceKeys.includes('issueSnapshots');
128
+ const explicitFileSurfaceSelected = selectedSurfaceKeys.includes('explicitFiles');
129
+ const issueUrls = issueSurfaceSelected ? (source.issueUrls || source.config?.issueUrls || '') : '';
130
+ const explicitFileRefs = explicitFileSurfaceSelected && Array.isArray(source.explicitFileRefs || source.config?.explicitFileRefs)
131
+ ? Array.from(source.explicitFileRefs || source.config?.explicitFileRefs)
132
+ : [];
133
+ const repoDiscovery = selectedSurfaceKeys.includes('repoFiles') && source.repoDiscovery === true;
134
+ const issueDiscovery = issueSurfaceSelected && Boolean(source.issueDiscovery);
135
+ if (!repoDiscovery && !explicitFileRefs.length && !issueDiscovery && !issueUrls) return { ok: false, reason: 'no-surfaces', nextTier, observedTier, selectedSurfaceKeys, pendingTier, pendingSurfaces };
136
+ return {
137
+ ok: true,
138
+ nextTier,
139
+ observedTier,
140
+ selectedSurfaceKeys,
141
+ replacingPending: Boolean(pendingTier),
142
+ pendingTier,
143
+ pendingSurfaces,
144
+ input: {
145
+ sourceId: source.id || '',
146
+ repository: source.repo || source.repository || source.config?.repo || '',
147
+ ref: source.ref || source.config?.ref || '',
148
+ rootPath: source.rootPath || source.config?.rootPath || '.topics',
149
+ label: source.label || source.repo || 'GitHub source',
150
+ repoDiscovery,
151
+ issueDiscovery,
152
+ issueUrls,
153
+ explicitFileRefs,
154
+ transportRefreshTier: nextTier,
155
+ transportRefreshSurfaces: selectedSurfaceKeys
156
+ }
157
+ };
158
+ }
159
+
160
+ export function sourceTransportPendingUpdateInputForSource(source = {}, refresh = {}) {
161
+ const nextTier = normalizeGithubTransportTier(refresh.nextTier || '') || 'direct';
162
+ const selectedSurfaceKeys = normalizeTransportSurfaceKeys(refresh.selectedSurfaceKeys, source);
163
+ const repo = source.repo || source.repository || source.config?.repo || '';
164
+ const surfaces = Object.assign({}, source.surfaces || {});
165
+ for (const key of selectedSurfaceKeys) surfaces[key] = Object.assign({}, surfaces[key] || {}, { pendingTier: nextTier, transportRefreshTier: nextTier });
166
+ return Object.assign({}, source, {
167
+ id: source.id || '', repository: repo, repo,
168
+ ref: source.ref || source.config?.ref || '',
169
+ rootPath: source.rootPath || source.config?.rootPath || '.topics',
170
+ label: source.label || source.repo || 'GitHub source',
171
+ discoveryState: 'loading',
172
+ surfaces,
173
+ transportRefreshTier: nextTier,
174
+ transportOutcome: Object.assign({}, source.transportOutcome || {}, { pendingTier: nextTier, pendingFromTier: refresh.observedTier || source.transportRefreshTier || '', pendingSurfaces: selectedSurfaceKeys })
175
+ });
176
+ }
@@ -0,0 +1,40 @@
1
+ export function createStartupOwnershipGate() {
2
+ let generation = 0;
3
+ return {
4
+ claim() { generation += 1; return generation; },
5
+ invalidate() { generation += 1; return generation; },
6
+ isCurrent(token) { return token === generation; },
7
+ current() { return generation; }
8
+ };
9
+ }
10
+
11
+ export async function runOwnedWorkspaceStartupTransition({
12
+ gate,
13
+ runTransition,
14
+ transitionOptions = {},
15
+ setPhase = null,
16
+ setNotice = null
17
+ } = {}) {
18
+ if (!gate || typeof gate.claim !== 'function' || typeof gate.isCurrent !== 'function') {
19
+ throw new Error('startup.ownership-gate-required');
20
+ }
21
+ if (typeof runTransition !== 'function') throw new Error('startup.transition-runner-required');
22
+ const token = gate.claim();
23
+ const isCurrentOwner = () => gate.isCurrent(token);
24
+ setPhase?.('resolving');
25
+ const sourceCommit = transitionOptions.commit;
26
+ const sourceMaterialize = transitionOptions.materializeSource;
27
+ const sourceDiagnostics = transitionOptions.setDiagnostics;
28
+ const result = await runTransition(Object.assign({}, transitionOptions, {
29
+ commit: (...args) => isCurrentOwner() ? sourceCommit?.(...args) : null,
30
+ setDiagnostics: (...args) => isCurrentOwner() ? sourceDiagnostics?.(...args) : null,
31
+ materializeSource: async (input, options = {}) => {
32
+ if (!isCurrentOwner()) return { ok: false, skipped: 'stale-startup-owner' };
33
+ return sourceMaterialize?.(input, Object.assign({}, options, { isCurrentOwner }));
34
+ }
35
+ }));
36
+ if (!isCurrentOwner()) return Object.assign({}, result, { stale: true, ownershipToken: token });
37
+ setPhase?.(result?.ok ? 'resolved' : 'failed');
38
+ if (!result?.ok && result?.message) setNotice?.(result.message);
39
+ return Object.assign({}, result, { stale: false, ownershipToken: token });
40
+ }
@@ -0,0 +1,34 @@
1
+ import assert from 'node:assert/strict';
2
+ import { startupPresentationFor } from './startupPresentation.js';
3
+
4
+ assert.equal(startupPresentationFor({ startupPhase: 'resolved', state: {} }), null, 'normal product stage owns resolved startup');
5
+ assert.equal(startupPresentationFor({ startupPhase: 'failed', state: {} }), null, 'existing product failure path owns failed startup');
6
+
7
+ const clean = startupPresentationFor({ startupPhase: 'resolving', state: { workspaces: [], activeWorkspaceId: '' } });
8
+ assert.equal(clean?.message, 'Opening workspace', 'first paint must be truthful without guessing default ownership');
9
+ assert.equal(clean?.workspaceCount, 0);
10
+
11
+ const explicit = startupPresentationFor({ startupPhase: 'resolving', state: {
12
+ activeWorkspaceId: 'workspace:explicit',
13
+ workspaces: [{
14
+ id: 'workspace:explicit',
15
+ name: 'Explicit query workspace',
16
+ discoveryProgress: { active: true, label: 'Opening Explicit query workspace workspace' },
17
+ workspaceBootstrap: { schema: 'tiinex.workspace.bootstrap.v1', startState: 'explicit-runtime-config', workspaceSetSize: 1 }
18
+ }]
19
+ } });
20
+ assert.equal(explicit?.message, 'Opening Explicit query workspace workspace', 'owned explicit progress may become visible once startup has actually selected it');
21
+ assert.equal(explicit?.ownedWorkspaceId, 'workspace:explicit');
22
+ assert(!explicit?.message.includes('Tiinex docs'), 'explicit resolving presentation must not visually substitute embedded/default ownership');
23
+
24
+ const multi = startupPresentationFor({ startupPhase: 'resolving', state: {
25
+ activeWorkspaceId: 'workspace:a',
26
+ workspaces: [
27
+ { id: 'workspace:a', discoveryProgress: { active: true, label: 'Opening A workspace' }, workspaceBootstrap: { schema: 'tiinex.workspace.bootstrap.v1', workspaceSetSize: 2, workspaceSetIndex: 0 } },
28
+ { id: 'workspace:b', discoveryProgress: { active: true, label: 'Opening B workspace' }, workspaceBootstrap: { schema: 'tiinex.workspace.bootstrap.v1', workspaceSetSize: 2, workspaceSetIndex: 1 } }
29
+ ]
30
+ } });
31
+ assert.equal(multi?.message, 'Opening 2 configured workspaces', 'multi-entrypoint startup must not collapse presentation to one guessed source');
32
+ assert.equal(multi?.workspaceCount, 2);
33
+
34
+ console.log('✓ startup presentation model tests passed');
@@ -0,0 +1,33 @@
1
+ export const STARTUP_PRESENTATION_KIND = 'startup-resolving';
2
+
3
+ export function startupPresentationFor({ startupPhase = 'resolving', state = {} } = {}) {
4
+ if (startupPhase !== 'resolving') return null;
5
+ const workspaces = Array.isArray(state?.workspaces) ? state.workspaces : [];
6
+ const owned = workspaces.filter((workspace) => hasStartupPresentationAuthority(workspace));
7
+ const activeId = String(state?.activeWorkspaceId || '').trim();
8
+ const active = owned.find((workspace) => String(workspace?.id || '') === activeId) || owned[0] || null;
9
+ const declaredSize = owned.reduce((size, workspace) => Math.max(size, Number(workspace?.workspaceBootstrap?.workspaceSetSize || 0)), 0);
10
+ const workspaceCount = Math.max(declaredSize, owned.length);
11
+ const ownedMessage = cleanMessage(active?.discoveryProgress?.label || active?.workspaceBootstrap?.userFacingMessage || '');
12
+ const message = workspaceCount > 1
13
+ ? `Opening ${workspaceCount} configured workspaces`
14
+ : (ownedMessage || 'Opening workspace');
15
+ return Object.freeze({
16
+ kind: STARTUP_PRESENTATION_KIND,
17
+ message,
18
+ workspaceCount,
19
+ ownedWorkspaceId: String(active?.id || '')
20
+ });
21
+ }
22
+
23
+ function hasStartupPresentationAuthority(workspace = {}) {
24
+ return Boolean(
25
+ workspace?.discoveryProgress?.active
26
+ || workspace?.workspaceBootstrap?.schema === 'tiinex.workspace.bootstrap.v1'
27
+ || workspace?.workspaceBootstrap?.startState
28
+ );
29
+ }
30
+
31
+ function cleanMessage(value = '') {
32
+ return String(value || '').trim().replace(/[.\s]+$/u, '');
33
+ }
@@ -0,0 +1,21 @@
1
+ import React from 'react';
2
+
3
+ const LOGO_SRC = `${import.meta.env.BASE_URL}assets/tiinex-logo-white-transparent.png`;
4
+
5
+ export function StartupStage({ presentation = null, runtimeId = '', sourceBoundary = '' }) {
6
+ if (!presentation) return null;
7
+ return (
8
+ <main
9
+ className="tx-react-runtime tx-uc001-shell tx-startup-resolving-shell"
10
+ data-runtime={runtimeId}
11
+ data-source-boundary={sourceBoundary}
12
+ data-startup-presentation={presentation.kind || 'startup-resolving'}
13
+ >
14
+ <section className="tx-startup-stage" role="status" aria-live="polite" aria-label="Opening Tiinex workspace">
15
+ <img className="tx-startup-logo" src={LOGO_SRC} alt="" />
16
+ <p>{presentation.message || 'Opening workspace'}</p>
17
+ <span className="tx-startup-progress" aria-hidden="true"><i /><i /><i /></span>
18
+ </section>
19
+ </main>
20
+ );
21
+ }
@@ -0,0 +1,9 @@
1
+ export function initialStartupRenderPhase({ locationLike = null, routeResolved = false } = {}) {
2
+ const hash = String(locationLike?.hash || '');
3
+ if (!hash.startsWith('#state=')) return 'resolving';
4
+ return routeResolved ? 'resolved' : 'resolving';
5
+ }
6
+
7
+ export function shouldRenderProductStage(startupPhase = 'resolving') {
8
+ return startupPhase === 'resolved' || startupPhase === 'failed';
9
+ }
@@ -0,0 +1,62 @@
1
+ import { stateWithDefaultWorkspaceStartProgress } from './defaultWorkspaceStart.js';
2
+ import { openWorkspaceEntrypointSet } from '../workspaces/workspace.entrypointLifecycle.js';
3
+
4
+ export function prepareResolvedStartupWorkspaceCommand({ lifecycle, persistence, state = {}, resolved = {}, storage = null } = {}) {
5
+ const resolvedInputs = (Array.isArray(resolved?.inputs) ? resolved.inputs : [resolved?.input]).filter(Boolean);
6
+ if (!resolved?.ok || !resolvedInputs.length) return { ok: false, error: 'startup.config-unavailable', message: resolved?.message || 'Startup workspace config is unavailable.', state, resolved };
7
+ if (!lifecycle?.createWorkspace) return { ok: false, error: 'workspace.lifecycle-unavailable', message: 'Workspace lifecycle is unavailable.', state, resolved };
8
+ const inputs = resolvedInputs.map((sourceInput) => Object.assign({}, sourceInput, {
9
+ bootstrapStartState: resolved.startupClass || 'configured-workspace',
10
+ bootstrapBoundary: 'resolved-startup-config'
11
+ }));
12
+ const opened = openWorkspaceEntrypointSet({
13
+ lifecycle,
14
+ state,
15
+ sourceInputs: inputs,
16
+ entry: { title: resolved.config?.viewerIdentity?.browserTitle || 'Tiinex workspace set', markdown: resolved.markdown || '', path: resolved.configUrl || resolved.targetUrl || '' },
17
+ workspaceInput(sourceInput, index) {
18
+ const name = sourceInput.label || resolved.config?.viewerIdentity?.browserTitle || sourceInput.repository || `Tiinex workspace ${index + 1}`;
19
+ const id = inputs.length === 1
20
+ ? stableStartupWorkspaceId(resolved.configUrl || resolved.targetUrl || name)
21
+ : stableStartupWorkspaceId(`${resolved.configUrl || resolved.targetUrl || 'tiinex-startup'}#${index}:${name}:${sourceInput.repository || ''}`);
22
+ return { id, name, boundary: 'resolved Tiinex startup config; source materialization is explicit' };
23
+ },
24
+ afterCreate({ state: createdState, workspace, sourceInput }) {
25
+ let nextState = persistence?.hydrateWorkspaceWithLocalDeltas?.(createdState, workspace?.id, storage) || createdState;
26
+ let target = (nextState.workspaces || []).find((item) => item.id === workspace?.id) || workspace;
27
+ if (target && resolved.markdown) target.workspaceMarkdown = resolved.markdown;
28
+ nextState = stateWithDefaultWorkspaceStartProgress(nextState, workspace?.id, { input: sourceInput });
29
+ return nextState;
30
+ },
31
+ registerSources: false,
32
+ annotateWorkspace({ state: nextState, workspaceId, index }) {
33
+ const workspace = (nextState.workspaces || []).find((item) => item.id === workspaceId);
34
+ if (!workspace) return;
35
+ workspace.workspaceConfig = resolved.config && typeof resolved.config === 'object' ? JSON.parse(JSON.stringify(resolved.config)) : null;
36
+ workspace.workspaceBootstrap = Object.assign({}, workspace.workspaceBootstrap || {}, {
37
+ schema: 'tiinex.workspace.bootstrap.v1',
38
+ startState: resolved.startupClass || 'configured-workspace',
39
+ boundary: 'resolved-startup-config',
40
+ configUrl: resolved.configUrl || resolved.targetUrl || '',
41
+ selectedConvention: resolved.diagnostics?.selectedConvention || '',
42
+ usefulStartPath: 'resolved-config-workspace-set-materialization-queued',
43
+ workspaceSetSize: inputs.length,
44
+ workspaceSetIndex: index
45
+ });
46
+ }
47
+ });
48
+ if (!opened?.ok) return { ok: false, error: opened?.error || 'startup.workspace-create-failed', message: opened?.message || 'Could not create startup workspace set.', state, resolved };
49
+ return Object.assign({}, opened, {
50
+ resolved,
51
+ sourceInput: opened.sourceInputs?.[0] || null,
52
+ notice: inputs.length > 1 ? `Opening ${inputs.length} configured workspaces.` : `Opening ${opened.workspace?.title || opened.workspace?.name || 'workspace'}.`
53
+ });
54
+ }
55
+
56
+
57
+ export function stableStartupWorkspaceId(value = '') {
58
+ const text = String(value || 'tiinex-startup');
59
+ let hash = 2166136261;
60
+ for (let index = 0; index < text.length; index += 1) { hash ^= text.charCodeAt(index); hash = Math.imul(hash, 16777619); }
61
+ return `workspace:startup:${(hash >>> 0).toString(36)}`;
62
+ }
@@ -0,0 +1,49 @@
1
+ import { isWorkspaceEntrypointArtifact } from '@tiinex/core/workspaces/workspace.entrypointCapability.js';
2
+ import { openWorkspaceRecordAction } from './workspaceRecordActions.js';
3
+
4
+ export function applyMaterializedStartupWorkspaceConfig({ runtimeApi = {}, state = {}, resolved = {}, discoveryWorkspaceId = '' } = {}) {
5
+ if (resolved?.selectedPlan !== 'workspace-discovery') return { ok: true, applied: false, state };
6
+ const workspace = workspaceById(state, discoveryWorkspaceId || state.activeWorkspaceId);
7
+ if (!workspace) return { ok: false, error: 'startup.discovery-workspace-missing', message: 'Startup workspace discovery materialized without a workspace owner.', state };
8
+ const candidates = (Array.isArray(workspace.records) ? workspace.records : []).filter((record) => isWorkspaceEntrypointArtifact(record) && String(record.markdown || '').trim());
9
+ const selected = selectStartupWorkspaceArtifact(candidates, resolved?.input?.workspaceMatch || '');
10
+ if (!selected.ok) return Object.assign({}, selected, { state, workspace });
11
+ const opened = openWorkspaceRecordAction({ lifecycle: runtimeApi.lifecycle, parseWorkspaceConfig: runtimeApi.config?.parseWorkspaceConfig, state, record: selected.record });
12
+ if (!opened?.ok) return { ok: false, error: opened?.error || 'startup.workspace-artifact-open-failed', message: opened?.message || 'Could not apply the discovered startup workspace artifact.', state, workspace, record: selected.record };
13
+ return Object.assign({}, opened, { applied: true, startupRecord: selected.record, discoveryWorkspaceId: workspace.id });
14
+ }
15
+
16
+ export function selectStartupWorkspaceArtifact(records = [], workspaceMatch = '') {
17
+ const list = Array.isArray(records) ? records : [];
18
+ if (!list.length) return { ok: false, error: 'startup.workspace-artifact-missing', message: 'Startup discovery did not materialize an openable workspace artifact.' };
19
+ const pattern = String(workspaceMatch || '').trim();
20
+ if (pattern) {
21
+ const matched = list.filter((record) => workspaceArtifactMatches(record, pattern));
22
+ if (matched.length === 1) return { ok: true, record: matched[0] };
23
+ if (matched.length > 1) return { ok: false, error: 'startup.workspace-artifact-ambiguous', message: 'Startup workspace match resolved to more than one workspace artifact.' };
24
+ return { ok: false, error: 'startup.workspace-artifact-match-missing', message: 'Startup workspace match did not resolve to a materialized workspace artifact.' };
25
+ }
26
+ if (list.length === 1) return { ok: true, record: list[0] };
27
+ return { ok: false, error: 'startup.workspace-artifact-ambiguous', message: 'Startup discovery materialized multiple workspace artifacts without a unique match.' };
28
+ }
29
+
30
+ function workspaceArtifactMatches(record = {}, pattern = '') {
31
+ const values = [record.path, record.sourceTarget?.sourceArtifactPath, record.title, record.name].map((value) => String(value || '').trim()).filter(Boolean);
32
+ const cleanPattern = String(pattern || '').trim().replace(/\\/g, '/');
33
+ const regex = wildcardRegex(cleanPattern);
34
+ return values.some((value) => {
35
+ const cleanValue = String(value || '').replace(/\\/g, '/');
36
+ if (regex.test(cleanValue)) return true;
37
+ if (!cleanPattern.includes('/')) return regex.test(cleanValue.split('/').filter(Boolean).pop() || '');
38
+ return false;
39
+ });
40
+ }
41
+
42
+ function wildcardRegex(pattern = '') {
43
+ const escaped = String(pattern || '').replace(/[.+?^${}()|[\]\\]/g, '\\$&').replace(/\*/g, '.*');
44
+ return new RegExp(`^${escaped}$`, 'i');
45
+ }
46
+
47
+ function workspaceById(state = {}, workspaceId = '') {
48
+ return (Array.isArray(state?.workspaces) ? state.workspaces : []).find((workspace) => String(workspace?.id || '') === String(workspaceId || '')) || null;
49
+ }