@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,3 @@
1
+ {
2
+ "label": "edit"
3
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "label": "feed"
3
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "label": "lineage"
3
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "label": "preview"
3
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "label": "share"
3
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "label": "source-settings"
3
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "label": "tree"
3
+ }
package/src/index.js ADDED
@@ -0,0 +1,10 @@
1
+ export { createApplicationDataStore } from './data/applicationDataStore.js';
2
+ export { defineVerse, createVerseRegistry, loadVerse } from './verses/hostRegistry.js';
3
+ export { createTiinexApplicationRuntime } from './runtime.js';
4
+ export {
5
+ defineCompanionProvider,
6
+ resolveCompanionResources,
7
+ companionProviderFromWorkspace,
8
+ projectApplicationData,
9
+ toPlaythingsStoryRecords
10
+ } from '@tiinex/core';
@@ -0,0 +1,9 @@
1
+ import { sealC14nV2Self } from '@tiinex/core/integrity/integrity.c14nV2.js';
2
+ import { C14N_V2_VALIDATOR_TARGET } from '@tiinex/core/integrity/integrity.methodReference.js';
3
+
4
+ export function sealedC14nV2FixtureMarkdown(label = 'Fixture Parent') {
5
+ const unsigned = `# ${String(label || 'Fixture Parent')}\n\nFixture bytes used only as a validated c14n-v2 Parent integrity target in tests.\n\n# Continuity Integrity\n\n- [sha256-base64url-c14n-v2](${C14N_V2_VALIDATOR_TARGET})\n - Towards: self\n - Value: pending`;
6
+ const sealed = sealC14nV2Self(unsigned);
7
+ if (sealed.state !== 'sealed') throw new Error(`fixture-self-seal-${sealed.reason || sealed.state}`);
8
+ return sealed.markdown;
9
+ }
@@ -0,0 +1,12 @@
1
+ export const interactionSpineContract = {
2
+ id: 'tiinex.interaction.spine.v1',
3
+ status: 'scaffold',
4
+ purpose: 'Give the workspace a compact action rhythm without replacing source truth or validator results.',
5
+ steps: ['load', 'read', 'trace', 'audit', 'act'],
6
+ rules: [
7
+ 'The spine shows the next useful interaction without making hidden state changes.',
8
+ 'Scaffolded actions must look scaffolded or disabled.',
9
+ 'Audit remains explicit and user-invoked.',
10
+ 'Read, trace, and audit may change arrangement or disclosure but not source truth.'
11
+ ]
12
+ };
@@ -0,0 +1 @@
1
+ export { runAudit } from '@tiinex/core/audit/audit.run.js';
@@ -0,0 +1 @@
1
+ export function createLineageEdge(from, to, kind = 'parent') { return { from, to, kind }; }
package/src/main.js ADDED
@@ -0,0 +1,319 @@
1
+ (() => {
2
+ 'use strict';
3
+
4
+ const lifecycle = window.TiinexWorkspaceLifecycle;
5
+ const route = window.TiinexWorkspaceRoute;
6
+ const persistence = window.TiinexWorkspacePersistence;
7
+ const root = document.getElementById('root');
8
+ const VERSION_LABEL = 'v115 source progress parity';
9
+ const workspaceConfig = window.TiinexWorkspaceConfig?.createDefaultWorkspaceConfig?.() || { emptyStage: { subtitles: ['Everything starts from somewhere.'] }, viewerIdentity: { browserTitle: 'Tiinex' }, help: [] };
10
+ const iconPaths = window.TiinexIconPaths || {};
11
+ if (workspaceConfig.viewerIdentity?.browserTitle && document?.title !== undefined) document.title = workspaceConfig.viewerIdentity.browserTitle;
12
+ if (!root || !lifecycle || !persistence || !route) return;
13
+
14
+ let state = hydrateState();
15
+ let dialog = null;
16
+ let notice = '';
17
+
18
+ render();
19
+ bindRouteEvents();
20
+
21
+ function hydrateState() {
22
+ const restored = persistence.readInitialState();
23
+ return route.normalizeRouteState(restored, lifecycle);
24
+ }
25
+
26
+ function commit(next, mode = 'replace') {
27
+ state = route.normalizeRouteState(next, lifecycle);
28
+ if (state.workspaces?.length) persistence.writeState(state, { mode });
29
+ else persistence.clearState?.({ mode });
30
+ render();
31
+ }
32
+
33
+ function restoreFromLocation() {
34
+ state = hydrateState();
35
+ dialog = null;
36
+ notice = '';
37
+ render();
38
+ }
39
+
40
+ function bindRouteEvents() {
41
+ window.addEventListener?.('popstate', restoreFromLocation);
42
+ window.addEventListener?.('hashchange', restoreFromLocation);
43
+ }
44
+
45
+ function render() {
46
+ const active = lifecycle.activeWorkspace(state);
47
+ root.innerHTML = renderApp(active);
48
+ bindEvents();
49
+ }
50
+
51
+ function bindEvents() {
52
+ root.querySelectorAll('[data-home]').forEach((button) => button.addEventListener('click', goHome));
53
+ root.querySelectorAll('[data-create-workspace]').forEach((button) => button.addEventListener('click', () => openDialog('create-workspace')));
54
+ root.querySelectorAll('[data-close-workspace]').forEach((button) => button.addEventListener('click', () => openCloseDialog(button.getAttribute('data-close-workspace'))));
55
+ root.querySelectorAll('[data-multiverse]').forEach((button) => button.addEventListener('click', () => openDialog('multiverse')));
56
+ root.querySelectorAll('[data-help]').forEach((button) => button.addEventListener('click', () => openDialog('help')));
57
+ root.querySelectorAll('[data-share]').forEach((button) => button.addEventListener('click', () => openDialog('share')));
58
+ root.querySelectorAll('[data-copy-share]').forEach((button) => button.addEventListener('click', () => copyShareUrl(button.getAttribute('data-copy-share'))));
59
+ root.querySelectorAll('[data-verse]').forEach((button) => button.addEventListener('click', () => commit(lifecycle.setWorkspaceVerse(state, button.getAttribute('data-verse')), 'push')));
60
+ root.querySelectorAll('[data-workspace-action]').forEach((button) => button.addEventListener('click', () => openWorkspaceAction(button.getAttribute('data-workspace-action'), button.getAttribute('data-workspace-id'))));
61
+ root.querySelectorAll('[data-close-source]').forEach((button) => button.addEventListener('click', () => closeWorkspaceSource(button.getAttribute('data-workspace-id'), button.getAttribute('data-close-source'))));
62
+ const search = root.querySelector('#workspace-search');
63
+ if (search) search.addEventListener('input', () => {
64
+ const next = lifecycle.cloneState(state);
65
+ next.view.query = search.value;
66
+ commit(next, 'replace');
67
+ });
68
+ const createForm = root.querySelector('#create-workspace-form');
69
+ if (createForm) createForm.addEventListener('submit', (event) => submitCreateWorkspace(event, createForm));
70
+ const addMaterialForm = root.querySelector('#add-material-form');
71
+ if (addMaterialForm) addMaterialForm.addEventListener('submit', (event) => submitAddRecord(event, addMaterialForm, 'local.material'));
72
+ const continueForm = root.querySelector('#continue-form');
73
+ if (continueForm) continueForm.addEventListener('submit', (event) => submitAddRecord(event, continueForm, 'continuation'));
74
+ const sourceForm = root.querySelector('#add-source-form');
75
+ if (sourceForm) sourceForm.addEventListener('submit', (event) => submitAddConfiguredSource(event, sourceForm));
76
+ root.querySelectorAll('[data-dialog-close]').forEach((button) => button.addEventListener('click', () => { dialog = null; notice = ''; render(); }));
77
+ root.querySelectorAll('[data-confirm-close]').forEach((button) => button.addEventListener('click', () => {
78
+ const result = lifecycle.closeWorkspace(state, button.getAttribute('data-confirm-close'));
79
+ dialog = null;
80
+ commit(result.state, 'push');
81
+ }));
82
+ }
83
+
84
+ function goHome() {
85
+ dialog = null;
86
+ notice = '';
87
+ commit(lifecycle.makeEmptyAppState(), 'push');
88
+ }
89
+
90
+ function submitCreateWorkspace(event, createForm) {
91
+ event.preventDefault();
92
+ const input = createForm.querySelector('[name="workspaceName"]');
93
+ const result = lifecycle.createWorkspace(state, { name: input?.value || '' });
94
+ if (!result.ok && result.error === 'workspace.name.required') {
95
+ createForm.querySelector('[data-form-error]').textContent = 'Workspace name is required.';
96
+ input?.focus();
97
+ return;
98
+ }
99
+ dialog = null;
100
+ commit(result.state, 'push');
101
+ }
102
+
103
+ function openDialog(type) {
104
+ dialog = { type };
105
+ render();
106
+ if (type === 'create-workspace') root.querySelector('[name="workspaceName"]')?.focus();
107
+ }
108
+
109
+ function openCloseDialog(workspaceId) {
110
+ const workspace = state.workspaces.find((item) => item.id === workspaceId);
111
+ dialog = { type: 'close-workspace', workspace };
112
+ render();
113
+ }
114
+
115
+ function openWorkspaceAction(action, workspaceId) {
116
+ const workspace = state.workspaces.find((item) => item.id === workspaceId) || lifecycle.activeWorkspace(state);
117
+ if (!workspace) return;
118
+ if (action === 'add-material') dialog = { type: 'add-material', workspace };
119
+ else if (action === 'add-source') dialog = { type: 'add-source', workspace };
120
+ else if (action === 'continue') dialog = { type: 'continue', workspace };
121
+ else if (action === 'open') dialog = { type: 'open-workspace', workspace };
122
+ else dialog = { type: 'command-info', workspace, action };
123
+ render();
124
+ root.querySelector('[name="recordTitle"]')?.focus();
125
+ }
126
+
127
+ function submitAddRecord(event, form, kind) {
128
+ event.preventDefault();
129
+ const workspaceId = form.getAttribute('data-workspace-id') || state.activeWorkspaceId;
130
+ const titleInput = form.querySelector('[name="recordTitle"]');
131
+ const summaryInput = form.querySelector('[name="recordSummary"]');
132
+ const fallbackTitle = kind === 'continuation' ? 'Continuation leaf' : 'Local material';
133
+ const result = lifecycle.addWorkspaceRecord(state, workspaceId, {
134
+ title: titleInput?.value || fallbackTitle,
135
+ summary: summaryInput?.value || '',
136
+ kind,
137
+ status: kind === 'continuation' ? 'draft' : 'local'
138
+ });
139
+ if (!result.ok && result.error === 'record.title.required') {
140
+ form.querySelector('[data-form-error]').textContent = 'Title is required.';
141
+ titleInput?.focus();
142
+ return;
143
+ }
144
+ dialog = null;
145
+ notice = '';
146
+ commit(result.state, 'push');
147
+ }
148
+
149
+
150
+ function submitAddConfiguredSource(event, form) {
151
+ event.preventDefault();
152
+ const workspaceId = form.getAttribute('data-workspace-id') || state.activeWorkspaceId;
153
+ const entry = sourcePresenter().configuredEntrypoint(workspaceConfig);
154
+ const result = lifecycle.addWorkspaceSource(state, workspaceId, {
155
+ label: entry.label || entry.repository || 'Tiinex/docs',
156
+ repository: entry.repository || 'Tiinex/docs',
157
+ ref: entry.ref || 'master',
158
+ rootPath: entry.rootPath || '.topics',
159
+ transportLabel: sourcePresenter().configuredMirrorLabel(workspaceConfig, entry.repository || 'Tiinex/docs')
160
+ });
161
+ if (!result.ok) return;
162
+ dialog = null;
163
+ notice = '';
164
+ commit(result.state, 'push');
165
+ }
166
+
167
+ function closeWorkspaceSource(workspaceId, sourceId) {
168
+ const result = lifecycle.closeWorkspaceSource?.(state, workspaceId, sourceId);
169
+ if (!result?.ok) return;
170
+ commit(result.state, 'push');
171
+ }
172
+
173
+ function copyShareUrl(url) {
174
+ const value = url || cleanShareUrl();
175
+ notice = 'Copy this URL from the field if clipboard access is blocked.';
176
+ try {
177
+ const copy = navigator?.clipboard?.writeText?.(value);
178
+ if (copy?.then) copy.then(() => { notice = 'Clean link copied.'; render(); }).catch(() => render());
179
+ else render();
180
+ } catch (_) { render(); }
181
+ }
182
+
183
+ function renderApp(active) {
184
+ const mode = 'DISCOVERY MODE';
185
+ const emptyClass = active ? '' : ' tx-empty-stage-mode';
186
+ return `
187
+ <main class="tx-app tx-shell-visual-continuity tx-shell-pattern-parity tx-shell-legibility-corrected tx-shell-height-continuity tx-shell-scroll-owned tx-shell-column-fit tx-shell-icon-polish tx-shell-command-portable tx-shell-config-grounded tx-shell-route-grounded tx-shell-v111-workspace-fit tx-shell-v112-live-workspace tx-shell-v113-action-clarity tx-shell-v114-old-empty-workspace tx-shell-v115-source-progress tx-uc001-shell tx-uc001-empty-stage-parity${emptyClass}" data-uc="UC-001-empty-create-restore-close">
188
+ ${renderGlobalDock(Boolean(active))}
189
+ ${active ? `
190
+ <section class="tx-workspace-window tx-focused-main-window tx-uc001-window" aria-label="Tiinex workspace window">
191
+ ${sourcePresenter().renderWindowHeader(active, sourceContext())}
192
+ ${sourcePresenter().renderSourceStrip(active, sourceContext())}
193
+ ${active.discoveryProgress ? '' : renderWorkspaceDropHint(active)}
194
+ ${renderModeStrip(mode)}
195
+ ${sourcePresenter().renderProgress(active, sourceContext())}
196
+ <div class="tx-primary-stage tx-column-primary-stage">${renderWorkspace(active)}</div>
197
+ </section>
198
+ <footer class="tx-footer">Powered by <strong>Tiinex</strong></footer>` : `${renderEmptyStage()}<footer class="tx-footer tx-empty-footer">Powered by <strong>Tiinex</strong></footer>`}
199
+ ${dialog ? renderDialog() : ''}
200
+ </main>`;
201
+ }
202
+
203
+ function renderGlobalDock(hasWorkspace) {
204
+ const showPager = hasWorkspace && state.workspaces.length > 1;
205
+ return `
206
+ <nav class="tx-legacy-global-dock ${hasWorkspace ? 'tx-active-global-dock' : 'tx-empty-global-dock'} ${showPager ? 'tx-global-dock-paged' : 'tx-global-dock-fit'}" aria-label="Global actions">
207
+ ${showPager ? `<button class="tx-nav-button tx-round-nav" type="button" title="Previous workspace">${icon('previous')}</button>` : ''}
208
+ <span class="tx-dock-core tx-centered-dock-core">
209
+ <span class="tx-dock-left"><button class="tx-nav-button tx-multiverse-switch" type="button" data-multiverse title="Change multiverse" aria-label="Change multiverse">${icon('multiverse')}</button><button class="tx-nav-button tx-primary-orb" type="button" data-create-workspace title="Create workspace">${icon('create')}<strong>Create</strong></button></span>
210
+ <button class="tx-logo-orb tx-logo-home" type="button" data-home title="Tiinex home" aria-label="Tiinex home"><img src="./public/assets/tiinex-logo-white-transparent.png" alt=""></button>
211
+ <span class="tx-dock-right"><button class="tx-nav-button tx-share-action" type="button" data-share title="Share">${icon('share')}<strong>Share</strong></button><button class="tx-nav-button" type="button" data-help title="Help" aria-label="Help">${icon('help')}</button></span>
212
+ </span>
213
+ ${showPager ? `<button class="tx-nav-button tx-round-nav" type="button" title="Next workspace">${icon('next')}</button>` : ''}
214
+ </nav>`;
215
+ }
216
+
217
+ function renderWorkspaceDropHint(workspace) {
218
+ if (!workspace || (workspace.records || []).length) return '';
219
+ return `<div class="tx-workspace-drop-hint">Drop lineage files, configs, folders, or zips into this workspace · or use the source button above.</div>`;
220
+ }
221
+
222
+ function renderModeStrip(mode) {
223
+ return `<div class="tx-mode-strip tx-legacy-main-mode" aria-label="Mode controls"><div id="main-mode-name" class="tx-mode-name">${mode}</div><div class="tx-segment" aria-label="Workspace verse"><button class="tx-button ${state.view.workspaceVerse === 'feed' ? 'tx-active' : ''}" data-verse="feed" type="button">Feed</button><button class="tx-button ${state.view.workspaceVerse === 'tree' ? 'tx-active' : ''}" data-verse="tree" type="button">Tree</button></div><input id="workspace-search" class="tx-search-input" type="search" value="${escapeHtml(state.view.query || '')}" placeholder="Search title/schema/source…" aria-label="Search loaded artifacts"></div>`;
224
+ }
225
+
226
+ function renderEmptyStage() {
227
+ const subtitle = window.TiinexWorkspaceConfig?.emptyStageSubtitle?.(workspaceConfig) || 'Everything starts from somewhere.';
228
+ return `<section class="tx-empty-stage tx-old-empty-stage tx-uc001-empty-start" aria-label="No workspace loaded" title="Use Create to start a local workspace"><p>${escapeHtml(subtitle)}</p></section>`;
229
+ }
230
+
231
+ function renderWorkspace(workspace) {
232
+ const records = (workspace.records || []).filter(recordMatchesQuery);
233
+ return `<section class="tx-column-feed tx-uc001-created-workspace" data-workspace-id="${escapeHtml(workspace.id)}"><div class="tx-reader-state">${badge(state.view.workspaceVerse)}${badge(`${records.length} shown`)}</div>${records.length ? records.map(renderRecordCard).join('') : renderWorkspaceEmptyState(workspace)}</section>`;
234
+ }
235
+
236
+ function renderWorkspaceEmptyState(workspace) {
237
+ return `<div class="tx-empty-node-state" role="status" aria-live="polite">No nodes match this view.</div>`;
238
+ }
239
+
240
+ function renderRecordCard(record) {
241
+ return `<article class="tx-artifact-card tx-legacy-artifact-card tx-record-card"><div class="tx-legacy-card-badges">${badge(record.status || 'open')}${badge(record.kind || 'artifact')}${badge(record.createdAt || 'local')}</div><header class="tx-legacy-card-body"><h3>${escapeHtml(record.title || 'Untitled')}</h3><p>${escapeHtml(record.summary || '')}</p></header><footer class="tx-artifact-actions tx-legacy-action-row">${actionButton('open', 'Open record', true, 'open', state.activeWorkspaceId)}</footer></article>`;
242
+ }
243
+
244
+ function renderLineageRootTrailingCard() { return `<article class="tx-lineage-terminal tx-lineage-root-card"><span>${icon('audit')}</span><p>Lineage root reached.</p></article>`; }
245
+
246
+ function dialogPresenter() {
247
+ return window.TiinexDialogPresenter || {};
248
+ }
249
+
250
+ function presenterContext() {
251
+ return { icon, badge, escapeHtml };
252
+ }
253
+
254
+ function sourcePresenter() {
255
+ return window.TiinexSourcePresenter || {};
256
+ }
257
+
258
+ function sourceContext() {
259
+ return { icon, badge, statPill, escapeHtml, workspaceConfig };
260
+ }
261
+
262
+ function renderDialog() {
263
+ if (dialog.type === 'close-workspace') return renderCloseDialog(dialog.workspace);
264
+ if (dialog.type === 'multiverse') return renderMultiverseDialog();
265
+ if (dialog.type === 'help') return renderHelpDialog();
266
+ if (dialog.type === 'share') return renderShareDialog();
267
+ if (dialog.type === 'add-material') return dialogPresenter().renderAddMaterialDialog(dialog.workspace, presenterContext());
268
+ if (dialog.type === 'add-source') return sourcePresenter().renderAddSourceDialog(dialog.workspace, sourceContext());
269
+ if (dialog.type === 'continue') return dialogPresenter().renderContinueDialog(dialog.workspace, presenterContext());
270
+ if (dialog.type === 'open-workspace') return dialogPresenter().renderOpenWorkspaceDialog(dialog.workspace, presenterContext());
271
+ if (dialog.type === 'command-info') return dialogPresenter().renderCommandInfoDialog(dialog, presenterContext());
272
+ return renderCreateDialog();
273
+ }
274
+
275
+ function renderCreateDialog() {
276
+ return `<div class="tx-dialog-backdrop" role="presentation"><section class="tx-dialog tx-workspace-create-dialog" role="dialog" aria-modal="true" aria-labelledby="create-workspace-title"><button class="tx-dialog-close" type="button" data-dialog-close aria-label="Close">${icon('close')}</button><div class="tx-mini-label">Workspace</div><h2 id="create-workspace-title">Create workspace</h2><p class="tx-muted">Name a local workspace. Add sources and files after it opens.</p><form id="create-workspace-form"><label class="tx-field"><span>Workspace name</span><input name="workspaceName" autocomplete="off" maxlength="72" required placeholder="Example: Documentation"></label><div class="tx-badges">${badge('local/session')}${badge('no GitHub guess')}${badge('hash + storage restore')}</div><p class="tx-form-error" data-form-error aria-live="polite"></p><button class="tx-button tx-primary tx-dialog-primary" type="submit">${icon('create')} Create workspace</button></form></section></div>`;
277
+ }
278
+
279
+
280
+ function renderCloseDialog(workspace) {
281
+ return `<div class="tx-dialog-backdrop" role="presentation"><section class="tx-dialog tx-workspace-close-dialog" role="dialog" aria-modal="true" aria-labelledby="close-workspace-title"><button class="tx-dialog-close" type="button" data-dialog-close aria-label="Close">${icon('close')}</button><div class="tx-mini-label">Close</div><h2 id="close-workspace-title">Close workspace?</h2><p>This closes <strong>${escapeHtml(workspace?.name || 'this workspace')}</strong> from the current browser session. It does not delete source files, GitHub material, or local downloads.</p><div class="tx-dialog-actions"><button class="tx-button" type="button" data-dialog-close>Cancel</button><button class="tx-button tx-danger" type="button" data-confirm-close="${escapeHtml(workspace?.id || '')}">Close workspace</button></div></section></div>`;
282
+ }
283
+
284
+ function renderMultiverseDialog() {
285
+ return `<div class="tx-dialog-backdrop" role="presentation"><section class="tx-dialog" role="dialog" aria-modal="true" aria-labelledby="multiverse-title"><button class="tx-dialog-close" type="button" data-dialog-close aria-label="Close">${icon('close')}</button><div class="tx-mini-label">Multiverse</div><h2 id="multiverse-title">Column multiverse</h2><p>Column is the only active universe while UC-001 is being proven. Additional verses stay unavailable until this happy path is stable.</p><div class="tx-badges">${badge('Column active')}${badge(`${state.workspaces.length} workspace${state.workspaces.length === 1 ? '' : 's'}`)}${badge('Map/Atlas frozen')}</div></section></div>`;
286
+ }
287
+
288
+ function renderHelpDialog() {
289
+ const help = workspaceConfig.help || [];
290
+ const items = help.slice(0, 4).map((item) => `<details class="tx-help-item"><summary>${escapeHtml(item.question)}</summary><p>${escapeHtml(item.body)}</p></details>`).join('');
291
+ return `<div class="tx-dialog-backdrop" role="presentation"><section class="tx-dialog" role="dialog" aria-modal="true" aria-labelledby="help-title"><button class="tx-dialog-close" type="button" data-dialog-close aria-label="Close">${icon('close')}</button><div class="tx-mini-label">Help</div><h2 id="help-title">Workspace help</h2>${items || '<p>No help entries configured.</p>'}</section></div>`;
292
+ }
293
+
294
+ function renderShareDialog() {
295
+ const url = cleanShareUrl();
296
+ return `<div class="tx-dialog-backdrop" role="presentation"><section class="tx-dialog" role="dialog" aria-modal="true" aria-labelledby="share-title"><button class="tx-dialog-close" type="button" data-dialog-close aria-label="Close">${icon('close')}</button><div class="tx-mini-label">Share</div><h2 id="share-title">Share current view</h2><p>Hash state carries the current local view. Empty start keeps a clean URL.</p><label class="tx-field"><span>URL</span><input readonly value="${escapeHtml(url)}"></label>${notice ? `<p class="tx-form-note">${escapeHtml(notice)}</p>` : ''}<button class="tx-button tx-primary tx-dialog-primary" type="button" data-copy-share="${escapeHtml(url)}">${icon('share')} Copy clean link</button></section></div>`;
297
+ }
298
+
299
+ function cleanShareUrl() {
300
+ if (!state.workspaces?.length) return `${location.origin || ''}${location.pathname || ''}${location.search || ''}`;
301
+ return location.href || '';
302
+ }
303
+
304
+ function recordMatchesQuery(record) {
305
+ const query = String(state.view.query || '').toLowerCase().trim();
306
+ if (!query) return true;
307
+ return `${record.title || ''} ${record.summary || ''} ${record.kind || ''}`.toLowerCase().includes(query);
308
+ }
309
+
310
+ function actionButton(iconName, label, labeled = false, action = '', workspaceId = '') { return `<button class="tx-action-button tx-legacy-action ${labeled ? 'tx-labeled-action' : ''}" type="button" title="${escapeHtml(label)}" ${action ? `data-workspace-action="${escapeHtml(action)}" data-workspace-id="${escapeHtml(workspaceId)}"` : ''}>${icon(iconName)}${labeled ? `<strong>${escapeHtml(label)}</strong>` : ''}</button>`; }
311
+ function icon(name) { return `<svg class="tx-svg-icon" viewBox="0 0 24 24" aria-hidden="true" focusable="false">${iconPaths[name] || iconPaths.preview}</svg>`; }
312
+
313
+ function statPill(iconName, count, title) {
314
+ return `<span class="stat-pill tx-counter-pill" title="${escapeHtml(title || '')}">${icon(iconName)}<strong>${Number(count || 0)}</strong></span>`;
315
+ }
316
+
317
+ function badge(text) { return `<span class="tx-badge">${escapeHtml(text)}</span>`; }
318
+ function escapeHtml(value) { return String(value).replaceAll('&', '&amp;').replaceAll('<', '&lt;').replaceAll('>', '&gt;').replaceAll('"', '&quot;').replaceAll("'", '&#39;'); }
319
+ })();
package/src/main.jsx ADDED
@@ -0,0 +1,34 @@
1
+ import React from 'react';
2
+ import { createRoot } from 'react-dom/client';
3
+
4
+ import './ui/icon.paths.js';
5
+ import './workspaces/workspace.config.js';
6
+ import { tiinexBuildIdentity, TIINEX_RUNTIME_ID } from './build.identity.js';
7
+ import './sources/source.identity.js';
8
+ import './workspaces/workspace.lifecycle.js';
9
+ import './workspaces/workspace.route.js';
10
+ import './workspaces/workspace.persistenceRecovery.js';
11
+ import './workspaces/workspace.persistenceRouteCache.js';
12
+ import './workspaces/workspace.persistencePresentation.js';
13
+ import './workspaces/workspace.persistenceCache.js';
14
+ import './workspaces/workspace.persistenceClear.js';
15
+ import './workspaces/workspace.persistence.js';
16
+
17
+ import './styles/tokens.css';
18
+ import './styles/theme.css';
19
+ import './styles/responsive.css';
20
+ import './styles/app.css';
21
+
22
+ import { TiinexApp } from './app/TiinexApp.jsx';
23
+
24
+ const root = document.getElementById('root');
25
+ if (!root) throw new Error('Missing #root mount point');
26
+
27
+ window.TiinexRuntimeIdentity = tiinexBuildIdentity();
28
+ document.documentElement.dataset.tiinexRuntime = TIINEX_RUNTIME_ID;
29
+
30
+ createRoot(root).render(
31
+ <React.StrictMode>
32
+ <TiinexApp />
33
+ </React.StrictMode>
34
+ );
@@ -0,0 +1,10 @@
1
+ export const multiverseModel = {
2
+ type: 'tiinex.web.multiverse.model.v1',
3
+ status: 'runtime-projection-supported',
4
+ definition: 'A Multiverse is a layout containing multiple active Verse panes over one or more workspace/material contexts.',
5
+ firstRuntimeTarget: 'column-verse + node-graph Multi-Verse projection',
6
+ nestingPolicy: 'recursive multiverses are allowed when expanding into a new context; roundtrip cycles in the active expansion path are blocked',
7
+ noMaxDepth: true,
8
+ cycleGuardKey: ['workspaceId', 'verseId', 'materialScopeId', 'sourceBoundaryId'],
9
+ graphBoundary: 'Multi-Verse may colocate several workspace graph projections while retaining workspace/source boundaries and exact declared cross-workspace relations; layout never implies authority.'
10
+ };
@@ -0,0 +1,42 @@
1
+ export const m1PoCParityScenarioDefinitions = Object.freeze([
2
+ {
3
+ id: 'local-archive-intake',
4
+ status: 'partial',
5
+ legacyBehavior: 'Drop/select local files, folders, zip/source-zip material, password-protected stored ZipCrypto archives, and pasted trace Markdown; classify workspace artifacts/leaves/assets and resolve path or trace-slot conflicts explicitly.',
6
+ semanticOwner: 'adapter result + workspace import/conflict contract',
7
+ runtimeOwner: 'src/adapters/archive, src/adapters/local, src/workspaces/workspace.import, src/workspaces/workspace.importConflicts, src/app/localMaterialCommand',
8
+ automatedChecks: ['src/parity/poc.localArchiveParity.test.mjs', 'src/adapters/archive/archive.adapter.test.mjs', 'src/adapters/local/local.adapter.test.mjs', 'src/workspaces/workspace.importConflicts.test.mjs', 'src/app/localMaterialCommand.test.mjs', 'src/schemas/workspace/workspace.addParity.test.mjs'],
9
+ manualChecks: ['drop PoC-compatible source zip', 'password-protected zip intake', 'repeat import conflict choice', 'paste trace Markdown', 'refresh recovery'],
10
+ failureResult: 'partial/degraded adapter result or explicit conflict/password request; no silent overwrite and no fake GitHub provenance'
11
+ },
12
+ {
13
+ id: 'bootstrap-config-ownership',
14
+ status: 'partial',
15
+ legacyBehavior: 'Local PoC startup automatically applies explicit runtime/query workspace config when supplied and otherwise falls back to the embedded/default workspace. All Workspace Entrypoints with Open On Apply become the initial workspace set in declared order; bootstrap ownership sits beneath the UI instead of reducing startup to one selected source or requiring a technical start button.',
16
+ semanticOwner: 'workspace config/bootstrap transition',
17
+ runtimeOwner: 'src/app/initialWorkspaceBootstrapOperation + src/app/tiinexAppStartupSource + src/app/startupWorkspaceCommand + src/app/defaultWorkspaceStartCommand + src/workspaces/workspace.persistenceRecovery',
18
+ automatedChecks: ['src/app/defaultWorkspaceStart.test.mjs', 'src/app/startupWorkspaceCommand.test.mjs', 'src/app/initialWorkspaceBootstrapOperation.test.mjs', 'src/app/emptyStageProductHierarchy.test.mjs', 'src/app/tiinexAppConfigSource.test.mjs', 'src/workspaces/workspace.entrypointLifecycle.test.mjs', 'src/workspaces/workspace.persistence.test.mjs'],
19
+ manualChecks: ['open clean local client and compare first useful workspace state with .old', 'verify explicit runtime config overrides embedded default'],
20
+ failureResult: 'clean UI remains calm; bootstrap errors are explicit and local deltas are not lost or converted into source authority'
21
+ },
22
+ {
23
+ id: 'workspace-artifact-canonical-spine',
24
+ status: 'partial',
25
+ legacyBehavior: 'Workspace Markdown travels through the normal artifact/file spine. Workspace-ness adds one Open/Merge capability model to the artifact rather than creating a second primary workspace-candidate object. Open replaces prior non-draft/source-only workspaces while preserving durable unpublished local work; Merge intentionally retains the current workspace context.',
26
+ semanticOwner: 'canonical artifact identity + workspace role/capability projection',
27
+ runtimeOwner: 'src/workspaces/workspace.import + src/workspaces/workspace.sourceRecords + src/export/tree.bundle + src/actions/record.actions + workspace views',
28
+ automatedChecks: ['src/workspaces/workspace.import.test.mjs', 'src/workspaces/workspace.openSemantics.test.mjs', 'src/workspaces/workspace.entrypointCapability.test.mjs', 'src/workspaces/workspace.entrypointLifecycle.test.mjs', 'src/app/githubSourceMaterializationCommand.test.mjs', 'src/app/workspaceRecordActions.test.mjs', 'src/app/localMaterialCommand.test.mjs', 'src/app/workspaceEntrypointIntakeCommand.test.mjs', 'src/app/workspaceEntrypointProductRouting.test.mjs', 'src/acceptance/recoveryAcceptance.test.mjs'],
29
+ manualChecks: ['compare Documentation/Start workspace artifacts against .old: one artifact class, one Open/Merge model'],
30
+ failureResult: 'legacy candidate-bearing inputs may remain compatibility-readable only at I/O boundaries; persisted candidates normalize once to canonical workspace records/roles and runtime must not recreate a second primary candidate model'
31
+ },
32
+ {
33
+ id: 'source-over-import-canonical-takeover',
34
+ status: 'partial',
35
+ legacyBehavior: 'When verified source material is equivalent to a local import, source becomes canonical and the redundant local payload is pruned. Divergent/newer local work remains explicit; closing source never resurrects a previously deduplicated copy.',
36
+ semanticOwner: 'artifact identity + material reconciliation/source boundary',
37
+ runtimeOwner: 'src/workspaces/workspace.materialReconciliation + src/workspaces/workspace.sourceRecords + src/workspaces/workspace.lifecycle + src/workspaces/workspace.sourceMaterial',
38
+ automatedChecks: ['src/workspaces/workspace.materialReconciliation.test.mjs', 'src/workspaces/workspace.sourceOverImport.test.mjs', 'src/workspaces/workspace.importLifecycle.test.mjs', 'src/acceptance/recoveryAcceptance.test.mjs'],
39
+ manualChecks: ['import local material then load verified source and compare visible artifacts with .old', 'close source after exact dedupe', 'repeat with divergent local edit'],
40
+ failureResult: 'unverified/divergent material remains explicit; exact verified duplicates do not create hidden resurrection snapshots'
41
+ }
42
+ ]);