@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,327 @@
1
+ import React, { useRef, useState } from 'react';
2
+ import { Button } from '../../ui/primitives/Button.jsx';
3
+ import { TextField } from '../../ui/primitives/Field.jsx';
4
+ import { Icon } from '../../ui/primitives/Icon.jsx';
5
+ import { Modal } from '../../ui/primitives/Modal.jsx';
6
+ import { TiinexAdapterRegistry } from '../../adapters/registry.js';
7
+ import { collectLocalFilesFromDataTransfer } from '../../adapters/local/local.adapter.js';
8
+ import { importConflictSummary } from '../../workspaces/workspace.importConflicts.js';
9
+
10
+ export function AddToWorkspaceDialog({ workspace, sourceContinuation = null, onDismiss, onAddFiles, onAddPastedTrace, onAddGitHubSource, onAddUrls, githubBusy = false }) {
11
+ const githubContinuation = isGitHubSourceContinuation(sourceContinuation) ? sourceContinuation : null;
12
+ const [mode, setMode] = useState(githubContinuation ? 'git' : '');
13
+ const [stagedFiles, setStagedFiles] = useState([]);
14
+ const title = `Add to ${workspace.title || workspace.name || 'workspace'}`;
15
+ const modalClass = mode ? 'tx-add-flow-modal tx-add-mode-modal' : 'tx-add-flow-modal';
16
+
17
+ return (
18
+ <Modal title={modeTitle(mode, title)} onDismiss={onDismiss} className={modalClass}>
19
+ {!mode ? (
20
+ <AddChoiceGrid onMode={setMode} onAddFiles={onAddFiles} title={title} />
21
+ ) : null}
22
+ {mode === 'git' ? (
23
+ <GitHubSourceForm sourceContinuation={githubContinuation} onBack={() => githubContinuation ? onDismiss?.() : setMode('')} onSubmit={onAddGitHubSource} busy={githubBusy} />
24
+ ) : null}
25
+ {mode === 'urls' ? (
26
+ <ExplicitUrlsForm onBack={() => setMode('')} onSubmit={onAddUrls} />
27
+ ) : null}
28
+ {mode === 'drop' ? (
29
+ <DropMode stagedFiles={stagedFiles} setStagedFiles={setStagedFiles} onBack={() => setMode('')} onSubmit={() => onAddFiles(stagedFiles, { sourceMode: 'drop' })} />
30
+ ) : null}
31
+ {mode === 'paste-trace' ? (
32
+ <PasteTraceForm onBack={() => setMode('')} onSubmit={onAddPastedTrace} />
33
+ ) : null}
34
+ </Modal>
35
+ );
36
+ }
37
+
38
+
39
+ function isGitHubSourceContinuation(source = null) {
40
+ if (!source || source.id === 'local' || source.recoveryOnly === true || source.originReferenceSource === true) return false;
41
+ const kind = String(source.adapterId || source.sourceKind || source.kind || '').toLowerCase();
42
+ return kind.includes('github') && source.loadable !== false;
43
+ }
44
+
45
+ function AddChoiceGrid({ onMode, onAddFiles, title }) {
46
+ const hasGithub = Boolean(TiinexAdapterRegistry.forSourceKind('github.repo'));
47
+ const hasLocal = Boolean(TiinexAdapterRegistry.forSourceKind('local.files'));
48
+ return (
49
+ <div className="tx-add-flow" data-flow="old-like-add-menu">
50
+ <div className="tx-add-choice-grid">
51
+ {hasLocal ? <label className="tx-add-choice-card tx-add-choice-file">
52
+ <span className="tx-add-choice-icon"><Icon name="manualFiles" /></span>
53
+ <span className="tx-add-choice-copy"><strong>Manual files</strong><small>Markdown / zip</small></span>
54
+ <Icon name="upload" />
55
+ <input className="tx-visually-hidden-file" type="file" multiple accept=".md,.markdown,.trace.md,.schema.md,.validator.md,.workspace.md,.zip" onChange={(event) => onAddFiles(event.target.files, { sourceMode: 'manual-files' })} />
56
+ </label> : null}
57
+ <label className="tx-add-choice-card tx-add-choice-folder">
58
+ <span className="tx-add-choice-icon"><Icon name="folderOpen" /></span>
59
+ <span className="tx-add-choice-copy"><strong>Manual folder</strong><small>Folder / zip paths</small></span>
60
+ <Icon name="folderPlus" />
61
+ <input className="tx-visually-hidden-file" type="file" multiple webkitdirectory="" directory="" onChange={(event) => onAddFiles(event.target.files, { sourceMode: 'manual-folder' })} />
62
+ </label>
63
+ {hasGithub ? <button type="button" className="tx-add-choice-card" onClick={() => onMode('git')}>
64
+ <span className="tx-add-choice-icon"><Icon name="github" /></span>
65
+ <span className="tx-add-choice-copy"><strong>GitHub source</strong><small>Repo boundary</small></span>
66
+ <Icon name="source" />
67
+ </button> : null}
68
+ <button type="button" className="tx-add-choice-card" onClick={() => onMode('urls')}>
69
+ <span className="tx-add-choice-icon"><Icon name="source" /></span>
70
+ <span className="tx-add-choice-copy"><strong>Explicit URLs</strong><small>Raw / blob URLs</small></span>
71
+ <Icon name="source" />
72
+ </button>
73
+ <button type="button" className="tx-add-choice-card tx-desktop-only-choice" onClick={() => onMode('drop')}>
74
+ <span className="tx-add-choice-icon"><Icon name="handPointer" /></span>
75
+ <span className="tx-add-choice-copy"><strong>Drag and drop</strong><small>Files, folders, zip</small></span>
76
+ <Icon name="drop" />
77
+ </button>
78
+ </div>
79
+ <details className="tx-add-advanced-imports">
80
+ <summary>Advanced imports</summary>
81
+ <div className="tx-add-choice-grid tx-add-choice-grid-secondary">
82
+ <button type="button" className="tx-add-choice-card" onClick={() => onMode('paste-trace')}>
83
+ <span className="tx-add-choice-icon"><Icon name="markdown" /></span>
84
+ <span className="tx-add-choice-copy"><strong>Paste trace</strong><small>Paste existing trace Markdown</small></span>
85
+ <Icon name="continue" />
86
+ </button>
87
+ </div>
88
+ </details>
89
+ </div>
90
+ );
91
+ }
92
+
93
+ function GitHubSourceForm({ sourceContinuation = null, onBack, onSubmit, busy = false }) {
94
+ const continuation = sourceContinuation || null;
95
+ const [repository, setRepository] = useState(continuation?.repo || continuation?.config?.repo || '');
96
+ const [ref, setRef] = useState(continuation?.ref || continuation?.config?.ref || '');
97
+ const [rootPath, setRootPath] = useState(continuation?.rootPath || continuation?.config?.rootPath || '.topics');
98
+ const repoRequested = Boolean(continuation?.repoDiscovery);
99
+ const issueRequested = Boolean(continuation?.issueDiscovery);
100
+ // Broad discovery is a user-owned source setting. Requested/loaded issue surfaces may also come from explicit targets and must not re-enable it.
101
+ const [repoDiscovery, setRepoDiscovery] = useState(continuation ? repoRequested : true);
102
+ const [issueDiscovery, setIssueDiscovery] = useState(continuation ? issueRequested : false);
103
+ const [issueUrls, setIssueUrls] = useState(continuation?.issueUrls || continuation?.config?.issueUrls || '');
104
+ const [fileRefs, setFileRefs] = useState(() => (Array.isArray(continuation?.explicitFileRefs || continuation?.config?.explicitFileRefs) ? Array.from(continuation?.explicitFileRefs || continuation?.config?.explicitFileRefs).join('\n') : String(continuation?.explicitFileRefs || continuation?.config?.explicitFileRefs || '')));
105
+ const [error, setError] = useState('');
106
+
107
+ function send(intent = 'load') {
108
+ if (busy) return;
109
+ setError('');
110
+ const cleanRepo = String(repository || '').trim();
111
+ const explicitRefs = String(fileRefs || '').trim();
112
+ const explicitIssues = String(issueUrls || '').trim();
113
+ if (!cleanRepo) {
114
+ setError('Repo URL or owner/name is required.');
115
+ return;
116
+ }
117
+ const registerOnly = intent === 'register';
118
+ const shouldLoadIssues = !registerOnly && (issueDiscovery || Boolean(explicitIssues));
119
+ const wantsLoad = !registerOnly && (repoDiscovery || Boolean(explicitRefs) || shouldLoadIssues);
120
+ if (!registerOnly && !wantsLoad) {
121
+ setError('Choose at least one discovery surface, add explicit paths, or use Save source.');
122
+ return;
123
+ }
124
+ onSubmit({
125
+ repository,
126
+ ref,
127
+ rootPath,
128
+ operation: registerOnly ? 'register' : 'materialize',
129
+ repoDiscovery: Boolean(repoDiscovery),
130
+ issueDiscovery: Boolean(issueDiscovery),
131
+ issueUrls,
132
+ label: repository,
133
+ explicitFileRefs: fileRefs,
134
+ fileRefs: wantsLoad ? fileRefs : '',
135
+ sourceId: continuation?.id || ''
136
+ });
137
+ }
138
+
139
+ function submit(event) {
140
+ event.preventDefault();
141
+ send('load');
142
+ }
143
+
144
+ const explicitRefs = String(fileRefs || '').trim();
145
+ const explicitIssues = String(issueUrls || '').trim();
146
+ const activeSurfaces = [
147
+ repoDiscovery ? 'repo files' : '',
148
+ explicitRefs ? 'explicit paths' : '',
149
+ issueDiscovery ? 'public issues' : '',
150
+ explicitIssues ? 'specific issue targets' : ''
151
+ ].filter(Boolean);
152
+ const primaryLabel = activeSurfaces.length === 0
153
+ ? 'Choose material to load'
154
+ : activeSurfaces.length === 1 && activeSurfaces[0] === 'repo files'
155
+ ? (continuation ? 'Reload repo Markdown' : 'Discover repo Markdown')
156
+ : `${continuation ? 'Reload' : 'Load'} material`;
157
+ const sourceLabel = continuation?.label || repository || 'GitHub source';
158
+ const backLabel = continuation ? 'Cancel' : 'Back';
159
+ const saveLabel = 'Save source';
160
+
161
+ return (
162
+ <form className="tx-add-source-form tx-github-source-form tx-github-source-plan-form" onSubmit={submit} data-operation={continuation ? "source-edit" : "source-plan"}>
163
+ {continuation ? (
164
+ <div className="tx-source-continuation-banner" role="status">
165
+ <Icon name="source" />
166
+ <span><strong>Continue {sourceLabel}</strong><small>{continuation.count || 0} loaded · {sourceContinuationSummary(continuation)}</small></span>
167
+ </div>
168
+ ) : null}
169
+ <p className="tx-github-source-intro">Read-only GitHub source. Saving the source and loading material are separate.</p>
170
+ <div className="tx-github-source-field-grid">
171
+ <TextField id="source-repo" label="Repository" value={repository} onChange={setRepository} placeholder="Tiinex/docs" />
172
+ <TextField id="source-ref" label="Ref" value={ref} onChange={setRef} placeholder="default branch" />
173
+ </div>
174
+ <label className="tx-textarea-field">
175
+ <span>Root paths</span>
176
+ <textarea value={rootPath} onChange={(event) => setRootPath(event.target.value)} placeholder=".topics&#10;.github/agents/.topics" />
177
+ </label>
178
+ <fieldset className="tx-github-discovery-surfaces" aria-label="Discover broadly">
179
+ <legend>Discover broadly</legend>
180
+ <label className={`tx-github-discovery-card ${repoDiscovery ? 'is-active' : ''}`}>
181
+ <input type="checkbox" checked={repoDiscovery} onChange={(event) => setRepoDiscovery(event.target.checked)} />
182
+ <span><strong>Repo Markdown under root paths</strong><small>Discover bounded Markdown material under the configured roots.</small></span>
183
+ </label>
184
+ <label className={`tx-github-discovery-card ${issueDiscovery ? 'is-active' : ''}`}>
185
+ <input type="checkbox" checked={issueDiscovery} onChange={(event) => setIssueDiscovery(event.target.checked)} />
186
+ <span><strong>Public issues</strong><small>Discover a bounded set of public issues. Specific targets below are independent and always included.</small></span>
187
+ </label>
188
+ </fieldset>
189
+ <label className="tx-textarea-field">
190
+ <span>Include specific targets · Markdown paths / URLs <small>optional; always included</small></span>
191
+ <textarea value={fileRefs} onChange={(event) => setFileRefs(event.target.value)} placeholder="One path or URL per line, e.g. .topics/foo.md or https://raw.githubusercontent.com/owner/repo/main/.topics/foo.md" />
192
+ </label>
193
+ <label className="tx-textarea-field">
194
+ <span>Issue / Discussion URLs <small>optional; exact targets are included independently of broad discovery</small></span>
195
+ <textarea value={issueUrls} onChange={(event) => setIssueUrls(event.target.value)} placeholder="https://github.com/Tiinex/docs/issues/123&#10;https://github.com/Tiinex/docs/discussions/123" />
196
+ </label>
197
+ <details className="tx-github-technical-details">
198
+ <summary>Technical details</summary>
199
+ <p>Transport tries available cache, mirror, proxy, then direct tiers. Operation results are shown after loading.</p>
200
+ </details>
201
+ {error ? <p className="tx-form-error" role="alert">{error}</p> : null}
202
+ <div className="tx-dialog-actions tx-github-dialog-actions">
203
+ <Button type="button" variant="ghost" icon="previous" onClick={onBack}>{backLabel}</Button>
204
+ <Button type="button" variant={continuation ? 'primary' : 'ghost'} icon="source" disabled={busy} onClick={() => send('register')}>{saveLabel}</Button>
205
+ <Button type="submit" variant={continuation ? 'ghost' : 'primary'} icon="github" disabled={busy || activeSurfaces.length === 0}>{busy ? 'GitHub operation running…' : primaryLabel}</Button>
206
+ </div>
207
+ </form>
208
+ );
209
+ }
210
+
211
+
212
+
213
+ function sourceContinuationSummary(source = {}) {
214
+ const surfaces = source.surfaces || source.requestedSurfaces || {};
215
+ const repo = surfaces.repoFiles || {};
216
+ const issues = surfaces.issueSnapshots || {};
217
+ const parts = [];
218
+ if (repo.requested) parts.push(Number(repo.loaded || 0) ? 'repo files loaded' : 'repo files requested');
219
+ if (issues.requested) parts.push(Number(issues.loaded || 0) ? 'issues loaded' : issues.deferred || issues.unavailable ? 'issue snapshots deferred' : 'issue snapshots requested');
220
+ if (!parts.length) parts.push(source.discoveryState || 'deferred');
221
+ return `${parts.join(' · ')} · continue the existing source plan.`;
222
+ }
223
+
224
+ function ExplicitUrlsForm({ onBack, onSubmit }) {
225
+ const [urls, setUrls] = useState('');
226
+ function submit(event) {
227
+ event.preventDefault();
228
+ onSubmit(urls);
229
+ }
230
+ return (
231
+ <form className="tx-add-source-form" onSubmit={submit}>
232
+ <label className="tx-textarea-field">
233
+ <span>URLs</span>
234
+ <textarea value={urls} onChange={(event) => setUrls(event.target.value)} placeholder="https://github.com/Tiinex/docs/blob/master/.topics/.../001.trace.md&#10;https://raw.githubusercontent.com/Tiinex/docs/master/.topics/.../001.trace.md" />
235
+ </label>
236
+ <div className="tx-dialog-actions">
237
+ <Button type="button" variant="ghost" icon="previous" onClick={onBack}>Back</Button>
238
+ <Button type="submit" variant="primary" icon="source">Add URLs</Button>
239
+ </div>
240
+ </form>
241
+ );
242
+ }
243
+
244
+ function DropMode({ stagedFiles, setStagedFiles, onBack, onSubmit }) {
245
+ const inputRef = useRef(null);
246
+ const count = stagedFiles.length;
247
+ const handleFiles = (files) => setStagedFiles(Array.from(files || []));
248
+ async function handleDataTransfer(dataTransfer) {
249
+ const files = await collectLocalFilesFromDataTransfer(dataTransfer);
250
+ setStagedFiles(files);
251
+ }
252
+ return (
253
+ <div className="tx-add-source-form">
254
+ <div
255
+ className="tx-source-dropzone tx-add-full-dropzone"
256
+ tabIndex="0"
257
+ role="button"
258
+ aria-label="Drop Markdown, folders, or zip archives here"
259
+ onDragOver={(event) => event.preventDefault()}
260
+ onDrop={(event) => {
261
+ event.preventDefault();
262
+ handleDataTransfer(event.dataTransfer);
263
+ }}
264
+ onClick={() => inputRef.current?.click()}
265
+ >
266
+ <div className="tx-source-drop-icon"><Icon name="drop" /></div>
267
+ <div>
268
+ <strong>Drop folder, trace files, or markdown</strong>
269
+ <small>{count ? `${count} file${count === 1 ? '' : 's'} staged` : 'No files staged yet.'}</small>
270
+ </div>
271
+ </div>
272
+ <input ref={inputRef} className="tx-visually-hidden-file" type="file" multiple webkitdirectory="" directory="" accept=".md,.markdown,.trace.md,.schema.md,.validator.md,.workspace.md,.zip" onChange={(event) => handleFiles(event.target.files)} />
273
+ <div className="tx-dialog-actions">
274
+ <Button type="button" variant="ghost" icon="previous" onClick={onBack}>Back</Button>
275
+ <Button type="button" variant="ghost" icon="manualFiles" onClick={() => inputRef.current?.click()}>Choose files</Button>
276
+ <Button type="button" variant="primary" icon="fileUpload" onClick={onSubmit} disabled={!count}>Add staged material</Button>
277
+ </div>
278
+ </div>
279
+ );
280
+ }
281
+
282
+ function modeTitle(mode, title) {
283
+ if (mode === 'git') return 'GitHub source';
284
+ if (mode === 'urls') return 'Explicit URLs';
285
+ if (mode === 'drop') return 'Drag and drop';
286
+ return title;
287
+ }
288
+
289
+
290
+
291
+ export function ImportConflictDialog({ conflicts = [], onResolve, onDismiss }) {
292
+ const examples = conflicts.slice(0, 5);
293
+ return (
294
+ <Modal title="Incoming material overlaps this workspace" onDismiss={onDismiss} className="tx-import-conflict-modal">
295
+ <div className="tx-import-conflict-copy">
296
+ <p>{importConflictSummary(conflicts)}</p>
297
+ <p><strong>.trace.md conflicts use lineage slot numbers.</strong> Different slugs in the same numbered slot still conflict.</p>
298
+ {examples.length ? <ul>{examples.map((item, index) => <li key={`${item.type}:${item.incoming}:${index}`}><strong>{item.type === 'trace-slot' ? 'Same lineage slot' : 'Same file path'}</strong><br /><span>{item.incoming} → {item.existing}</span></li>)}</ul> : null}
299
+ </div>
300
+ <div className="tx-dialog-actions">
301
+ <Button variant="primary" onClick={() => onResolve?.('sibling')}>Import as sibling</Button>
302
+ <Button onClick={() => onResolve?.('replace')}>Replace existing</Button>
303
+ <Button variant="subtle" onClick={onDismiss}>Cancel import</Button>
304
+ </div>
305
+ </Modal>
306
+ );
307
+ }
308
+
309
+ function PasteTraceForm({ onBack, onSubmit }) {
310
+ const [text, setText] = useState('');
311
+ const [error, setError] = useState('');
312
+ function submit(event) {
313
+ event.preventDefault();
314
+ if (!String(text || '').trim()) { setError('Paste trace Markdown first.'); return; }
315
+ const ok = onSubmit?.(text);
316
+ if (ok === false) setError('Clipboard text does not look like Tiinex trace Markdown.');
317
+ }
318
+ return (
319
+ <form className="tx-add-source-form tx-paste-trace-form" onSubmit={submit}>
320
+ <p className="tx-boundary-note">Paste an existing Tiinex trace. It stays local/session material until explicitly published.</p>
321
+ <label><span>Trace Markdown</span><textarea rows="14" value={text} onChange={(event) => setText(event.target.value)} placeholder="# Continuity Context
322
+ ..." /></label>
323
+ {error ? <p role="alert" className="tx-field-error">{error}</p> : null}
324
+ <div className="tx-dialog-actions"><Button onClick={onBack}>Back</Button><Button variant="primary" type="submit">Add trace</Button></div>
325
+ </form>
326
+ );
327
+ }
@@ -0,0 +1,160 @@
1
+ import React from 'react';
2
+ import { Badge } from '../../ui/primitives/Badge.jsx';
3
+ import { Icon } from '../../ui/primitives/Icon.jsx';
4
+ import { buildWorkspaceAuditView } from '../../workspaces/workspace.auditView.js';
5
+ import { buildWorkspaceRecoverabilityView } from '../../workspaces/workspace.recoverabilityView.js';
6
+ import { compactPath, validationStateLabel } from './workspace.viewFormatting.js';
7
+
8
+ export function WorkspaceAuditState({ workspace, query = '', records = [], assets = [], onOpenRecord }) {
9
+ const audit = buildWorkspaceAuditView(workspace, { records, query });
10
+ const recovery = buildWorkspaceRecoverabilityView(workspace, { records, assets });
11
+ const counts = audit.visibleCounts || audit.counts || {};
12
+ return (
13
+ <section className="tx-workspace-audit-state" aria-label="Loaded audit">
14
+ <header className="tx-audit-header">
15
+ <div>
16
+ <strong><Icon name="audit" /> {audit.title}</strong>
17
+ <small>{audit.boundary}</small>
18
+ </div>
19
+ <div className="tx-audit-stats" aria-label="Audit stats">
20
+ <span><strong>{counts.records || 0}</strong><small>records</small></span>
21
+ <span><strong>{counts.invalid || 0}</strong><small>invalid</small></span>
22
+ <span><strong>{counts.degraded || 0}</strong><small>degraded</small></span>
23
+ {counts.supporting ? <span><strong>{counts.supporting}</strong><small>supporting</small></span> : null}
24
+ {counts.validationPartial ? <span><strong>{counts.validationPartial}</strong><small>partial validation</small></span> : null}
25
+ <span><strong>{counts.missingLineage || 0}</strong><small>missing lineage</small></span>
26
+ </div>
27
+ </header>
28
+ <div className="tx-audit-finding-summary" aria-label="Audit finding summary">
29
+ <span><Icon name={counts.errors ? 'warning' : 'check'} /> {counts.errors || 0} errors</span>
30
+ <span><Icon name={counts.warnings ? 'warning' : 'check'} /> {counts.warnings || 0} warnings</span>
31
+ <span><Icon name="audit" /> {counts.rootFallback || counts.fallbackUsed || 0} root fallback</span>
32
+ <span><Icon name="open" /> {counts.rootReadable || 0} root-readable</span>
33
+ {counts.unavailableBody ? <span><Icon name="warning" /> {counts.unavailableBody} body unavailable</span> : null}
34
+ {counts.childValidatorUnavailable ? <span><Icon name="warning" /> {counts.childValidatorUnavailable} validator unavailable</span> : null}
35
+ {counts.integrityV2 ? <span><Icon name="check" /> {counts.integrityV2} v2 integrity methods</span> : null}
36
+ <span><Icon name="lineage" /> {counts.lineageFindings || 0} lineage findings</span>
37
+ </div>
38
+ {audit.lineage.findings.length ? (
39
+ <div className="tx-audit-lineage-findings" aria-label="Loaded lineage audit findings">
40
+ {audit.lineage.findings.slice(0, 6).map((finding, index) => (
41
+ <span key={`${finding.code}-${finding.nodeId}-${index}`} className={`tx-lineage-finding tx-${finding.severity || 'info'}`} title={finding.message}>
42
+ <Icon name={(finding.severity === 'warning' || finding.severity === 'error') ? 'warning' : 'check'} /> {finding.code}
43
+ </span>
44
+ ))}
45
+ </div>
46
+ ) : null}
47
+ <AuditRecoverabilitySummary recovery={recovery} />
48
+ <div className="tx-audit-record-list" role="list" aria-label="Loaded audit records">
49
+ {audit.items.map((item) => <AuditRecordRow key={item.id} item={item} onOpenRecord={onOpenRecord} />)}
50
+ </div>
51
+ {audit.empty ? <p className="tx-tree-empty">No loaded records match this audit view.</p> : null}
52
+ </section>
53
+ );
54
+ }
55
+
56
+ function AuditRecoverabilitySummary({ recovery }) {
57
+ if (!recovery) return null;
58
+ const counts = recovery.counts || {};
59
+ const latest = recovery.latestImport;
60
+ return (
61
+ <section className={`tx-audit-recovery-summary tx-recovery-${recovery.status || 'recoverable'}`} aria-label="Recoverability summary">
62
+ <header>
63
+ <strong><Icon name={recovery.status === 'needs-attention' ? 'warning' : 'check'} /> {recovery.status || 'recoverable'}</strong>
64
+ <small>{recovery.boundary}</small>
65
+ </header>
66
+ <div className="tx-audit-recovery-grid">
67
+ <span><strong>{counts.localRecords || 0}</strong><small>local records</small></span>
68
+ <span><strong>{counts.sourceBackedRecords || 0}</strong><small>source-backed</small></span>
69
+ <span><strong>{counts.assets || 0}</strong><small>assets</small></span>
70
+ <span><strong>{counts.workspaceArtifacts || 0}</strong><small>workspaces</small></span>
71
+ <span><strong>{counts.previewOmitted || 0}</strong><small>preview omitted</small></span>
72
+ </div>
73
+ {latest ? <p className="tx-audit-recovery-latest"><Icon name={latest.ok ? 'check' : 'warning'} /> {latest.message}</p> : null}
74
+ {recovery.publicationPreflight ? <AuditPublicationPreflight preflight={recovery.publicationPreflight} /> : null}
75
+ {recovery.reingestPlan ? <AuditReingestPlan plan={recovery.reingestPlan} /> : null}
76
+ {recovery.exportPackagePreflight ? <AuditExportPackagePreflight preflight={recovery.exportPackagePreflight} /> : null}
77
+ {recovery.exportPackageManifest ? <AuditExportPackageManifest manifest={recovery.exportPackageManifest} receipt={recovery.exportPackageReceipt} /> : null}
78
+ <ul className="tx-audit-recovery-guarantees">
79
+ {(recovery.guarantees || []).slice(0, 4).map((item) => <li key={item}>{item}</li>)}
80
+ </ul>
81
+ {(recovery.errors?.length || recovery.warnings?.length) ? (
82
+ <div className="tx-audit-recovery-issues">
83
+ {[...(recovery.errors || []), ...(recovery.warnings || [])].slice(0, 6).map((issue, index) => (
84
+ <span key={`${issue.code}-${issue.path}-${index}`} title={issue.message || issue.code}><Icon name="warning" /> {issue.code}{issue.path ? ` · ${compactPath(issue.path)}` : ''}</span>
85
+ ))}
86
+ </div>
87
+ ) : null}
88
+ </section>
89
+ );
90
+ }
91
+
92
+ function AuditPublicationPreflight({ preflight }) {
93
+ const counts = preflight.counts || {};
94
+ return (
95
+ <div className={`tx-audit-publication-preflight tx-preflight-${preflight.status || 'unknown'}`} aria-label="Publication preflight">
96
+ <span><Icon name={preflight.status === 'blocked' ? 'warning' : 'check'} /> publication preflight: <strong>{preflight.status || 'unknown'}</strong></span>
97
+ <span>{counts.publishableLocalDrafts || 0} publishable local draft{(counts.publishableLocalDrafts || 0) === 1 ? '' : 's'}</span>
98
+ <span>{counts.sourceReferences || 0} source reference{(counts.sourceReferences || 0) === 1 ? '' : 's'}</span>
99
+ {(counts.errors || counts.warnings) ? <span>{counts.errors || 0} errors · {counts.warnings || 0} warnings</span> : null}
100
+ </div>
101
+ );
102
+ }
103
+
104
+ function AuditExportPackagePreflight({ preflight }) {
105
+ const counts = preflight.counts || {};
106
+ return (
107
+ <div className={`tx-audit-publication-preflight tx-export-package-${preflight.status || 'unknown'}`} aria-label="Export package preflight">
108
+ <span><Icon name={preflight.status === 'blocked' ? 'warning' : 'check'} /> export package: <strong>{preflight.status || 'unknown'}</strong></span>
109
+ <span>{counts.packageEntries || 0} package entr{(counts.packageEntries || 0) === 1 ? 'y' : 'ies'}</span>
110
+ <span>{counts.localDraftEntries || 0} local draft{(counts.localDraftEntries || 0) === 1 ? '' : 's'} · {counts.sourceReferenceEntries || 0} source ref{(counts.sourceReferenceEntries || 0) === 1 ? '' : 's'}</span>
111
+ {(counts.errors || counts.warnings) ? <span>{counts.errors || 0} errors · {counts.warnings || 0} warnings</span> : null}
112
+ </div>
113
+ );
114
+ }
115
+
116
+ function AuditExportPackageManifest({ manifest, receipt }) {
117
+ const counts = manifest.counts || {};
118
+ return (
119
+ <div className={`tx-audit-publication-preflight tx-export-manifest-${manifest.status || 'unknown'}`} aria-label="Export package manifest">
120
+ <span><Icon name={manifest.status === 'blocked' ? 'warning' : 'check'} /> package manifest: <strong>{manifest.status || 'unknown'}</strong></span>
121
+ <span>{counts.entries || 0} planned entr{(counts.entries || 0) === 1 ? 'y' : 'ies'} · {counts.blocked || 0} blocked</span>
122
+ <span>{manifest.integrity?.fingerprint || 'no fingerprint'}</span>
123
+ {receipt ? <span>receipt: {receipt.state || 'unknown'}</span> : null}
124
+ </div>
125
+ );
126
+ }
127
+
128
+ function AuditReingestPlan({ plan }) {
129
+ const counts = plan.counts || {};
130
+ return (
131
+ <div className={`tx-audit-publication-preflight tx-reingest-${plan.status || 'unknown'}`} aria-label="Re-ingest plan">
132
+ <span><Icon name={plan.status === 'blocked' ? 'warning' : 'check'} /> re-ingest plan: <strong>{plan.status || 'unknown'}</strong></span>
133
+ <span>{counts.pinnedSourceTargets || 0}/{counts.sourceTargets || 0} pinned source target{(counts.sourceTargets || 0) === 1 ? '' : 's'}</span>
134
+ <span>{counts.localDraftTargets || 0} local draft target{(counts.localDraftTargets || 0) === 1 ? '' : 's'}</span>
135
+ {(counts.errors || counts.warnings) ? <span>{counts.errors || 0} errors · {counts.warnings || 0} warnings</span> : null}
136
+ </div>
137
+ );
138
+ }
139
+
140
+ function AuditRecordRow({ item, onOpenRecord }) {
141
+ const findings = item.findings || [];
142
+ return (
143
+ <button type="button" className={`tx-audit-record-row tx-audit-status-${item.status || 'unknown'}`} role="listitem" onClick={() => onOpenRecord?.(item.id)} title={item.path || ''}>
144
+ <span className="tx-audit-record-main">
145
+ <Icon name={item.status === 'readable' ? 'check' : 'warning'} />
146
+ <strong>{item.title}</strong>
147
+ </span>
148
+ <span className="tx-audit-record-meta">
149
+ <Badge>{item.status}</Badge>
150
+ <Badge>{item.readState || 'read-state unknown'}</Badge>
151
+ <Badge>{validationStateLabel(item.validationState)}</Badge>
152
+ <Badge>{item.schemaId || 'markdown'}</Badge>
153
+ <Badge>{item.sourceBacked ? 'source-backed' : 'local/session'}</Badge>
154
+ {item.fallbackUsed ? <Badge>root fallback</Badge> : null}
155
+ {item.path ? <small>{compactPath(item.path)}</small> : null}
156
+ </span>
157
+ {findings.length ? <small className="tx-audit-record-findings">{findings.slice(0, 3).map((finding) => finding.code).join(' · ')}</small> : null}
158
+ </button>
159
+ );
160
+ }
@@ -0,0 +1,98 @@
1
+ import React, { useState } from 'react';
2
+ import { Badge } from '../../ui/primitives/Badge.jsx';
3
+ import { Modal } from '../../ui/primitives/Modal.jsx';
4
+ import { resolveFindingMessage } from '../../validation/i18n.js';
5
+ import { readStateLabel, schemaCoverageLabel, validationStateLabel, validatorLabel } from './workspace.viewFormatting.js';
6
+
7
+ export function auditBadgeForRecord(record = {}, auditItem = null) {
8
+ const item = auditItem || null;
9
+ const status = String(item?.status || '').toLowerCase();
10
+ const readState = String(item?.readState || '').toLowerCase();
11
+ const bodyAvailability = String(item?.bodyAvailability || '').toLowerCase();
12
+ if (status === 'readable') {
13
+ if (readState === 'root-readable') return { label: 'root ok', tone: 'ok', title: 'Root envelope is readable through the Root companion.' };
14
+ if (item?.fallbackUsed || readState === 'root-fallback') return { label: 'fallback', tone: 'fallback', title: 'Readable through Root fallback; exact child schema companion did not validate this card.' };
15
+ return { label: 'schema ok', tone: 'ok', title: 'Loaded leaf passed schema/audit checks; byte-level integrity is not claimed.' };
16
+ }
17
+ if (status === 'supporting-material') return { label: 'doc', tone: 'open', title: 'Plain Markdown supporting material; not an invalid Tiinex leaf.' };
18
+ if (status === 'pending-unavailable' || readState === 'unavailable-body' || bodyAvailability === 'unavailable-body') return { label: 'body missing', tone: 'pending', title: 'The route/session preserved metadata, but the Markdown body is not loaded.' };
19
+ if (status === 'degraded') return { label: (item?.fallbackUsed || readState === 'root-fallback') ? 'fallback' : 'open', tone: (item?.fallbackUsed || readState === 'root-fallback') ? 'fallback' : 'pending', title: (item?.fallbackUsed || readState === 'root-fallback') ? 'Readable through Root fallback with warnings; child-specific companion is not available.' : 'Readable with warnings; review lineage/source confidence.' };
20
+ if (status) return { label: 'mismatch', tone: 'mismatch', title: 'Audit found errors or incomplete Tiinex leaf structure.' };
21
+ if (record?.hasIntegrity || record?.hasContinuityContext || record?.schemaId) return { label: 'open', tone: 'pending', title: 'Lineage/audit status is not fully resolved yet.' };
22
+ return { label: 'doc', tone: 'open', title: 'Supporting material.' };
23
+ }
24
+
25
+ export function AuditStatusBadge({ record, item }) {
26
+ const [open, setOpen] = useState(false);
27
+ const badge = auditBadgeForRecord(record, item);
28
+ const title = record?.title || item?.title || 'Artifact';
29
+ return (
30
+ <>
31
+ <button type="button" className={`tx-badge tx-audit-badge tx-audit-badge-${badge.tone} tx-audit-badge-button`} title={`${badge.title} Open compact status explainer.`} aria-label={`Explain ${badge.label} status for ${title}`} onClick={(event) => { event.preventDefault(); event.stopPropagation(); setOpen(true); }}>{badge.label}</button>
32
+ {open ? <AuditBadgeDialog record={record} item={item} badge={badge} onDismiss={() => setOpen(false)} /> : null}
33
+ </>
34
+ );
35
+ }
36
+
37
+ export function AuditBadgeDialog({ record = {}, item = null, badge = {}, onDismiss }) {
38
+ const status = String(item?.status || 'not audited');
39
+ const readState = String(item?.readState || (record?.markdown ? 'not indexed' : 'unknown'));
40
+ const coverage = String(item?.schemaCoverage || 'unknown');
41
+ const body = String(item?.bodyAvailability || (record?.markdown ? 'available' : 'unknown'));
42
+ const validationState = String(item?.validationState || item?.validation?.state || 'validation unknown');
43
+ const validationCoverage = String(item?.validationCoverage || item?.validation?.coverage || 'unknown');
44
+ const childValidator = String(item?.childValidator || item?.validation?.childValidator || 'unknown');
45
+ const integrityVersions = Array.isArray(item?.integrityMethodVersions) ? item.integrityMethodVersions : (Array.isArray(item?.validation?.integrityMethodVersions) ? item.validation.integrityMethodVersions : []);
46
+ const findings = Array.isArray(item?.findings) ? item.findings : [];
47
+ const summary = item?.summary || {};
48
+ const hasFindings = findings.length > 0;
49
+ return (
50
+ <Modal title={`${badge.label || 'Status'} · ${record.title || item?.title || 'Artifact'}`} onDismiss={onDismiss} className="tx-audit-badge-dialog">
51
+ <div className="tx-badge-diagnostic-summary">
52
+ <Badge className={`tx-audit-badge tx-audit-badge-${badge.tone || 'open'}`}>{badge.label || 'status'}</Badge>
53
+ <span>{badge.title || 'Compact status explanation.'}</span>
54
+ </div>
55
+ <div className="tx-badge-diagnostic-grid" aria-label="Badge diagnostic facts">
56
+ <span><strong>Audit</strong><small>{status}</small></span>
57
+ <span><strong>Read state</strong><small>{readStateLabel(readState)}</small></span>
58
+ <span><strong>Schema coverage</strong><small>{schemaCoverageLabel(coverage)}</small></span>
59
+ <span><strong>Body</strong><small>{body === 'unavailable-body' ? 'body unavailable' : body}</small></span>
60
+ <span><strong>Validation</strong><small>{validationStateLabel(validationState)}</small></span>
61
+ <span><strong>Validator</strong><small>{validatorLabel(childValidator, validationCoverage)}</small></span>
62
+ {integrityVersions.length ? <span><strong>Integrity method</strong><small>{integrityVersions.join(', ')}</small></span> : null}
63
+ {record?.schemaId || item?.schemaId ? <span><strong>Schema</strong><small>{record.schemaId || item?.schemaId}</small></span> : null}
64
+ {record?.source?.label || item?.sourceLabel ? <span><strong>Source</strong><small>{record.source?.label || item?.sourceLabel}</small></span> : null}
65
+ </div>
66
+ <div className="tx-badge-diagnostic-panels">
67
+ <section>
68
+ <strong>What this means</strong>
69
+ <ul>
70
+ {badge.tone === 'ok' ? <li>The loaded material passed this card's current validation/read check.</li> : null}
71
+ {badge.tone === 'fallback' ? <li>The artifact is readable through Root fallback, but no exact child companion owns the read view yet.</li> : null}
72
+ {childValidator === 'unavailable' ? <li>Root v1 validation ran, but the child schema-specific validator did not run because no exact validator is registered.</li> : null}
73
+ {validationState === 'exact-schema-validated' ? <li>The exact schema companion validator ran for this loaded material.</li> : null}
74
+ {body === 'unavailable-body' ? <li>The source boundary or route shell is known, but the Markdown body is not loaded in this session.</li> : null}
75
+ {badge.tone === 'mismatch' ? <li>Audit found errors or incomplete Tiinex leaf structure.</li> : null}
76
+ {badge.tone === 'pending' || badge.tone === 'open' ? <li>The card remains inspectable, but one or more checks are incomplete, degraded, or awaiting material.</li> : null}
77
+ </ul>
78
+ </section>
79
+ <section>
80
+ <strong>What this does not verify</strong>
81
+ <ul>
82
+ <li>It does not prove authorship, consent, or semantic correctness.</li>
83
+ <li>It does not fetch missing remote material or repair stale lineage.</li>
84
+ <li>It does not turn Root fallback into a schema-owned companion.</li>
85
+ <li>It does not claim child-schema validation when the validator is unavailable.</li>
86
+ </ul>
87
+ </section>
88
+ </div>
89
+ <details className="tx-badge-diagnostic-findings">
90
+ <summary>Findings · {findings.length}</summary>
91
+ {hasFindings ? findings.slice(0, 8).map((finding, index) => (
92
+ <p key={`${finding.code || 'finding'}-${index}`}><strong>{finding.code || finding.severity || 'finding'}</strong><span>{resolveFindingMessage(finding, { locale: 'en', schemaId: record.schemaId || item?.schemaId })}</span></p>
93
+ )) : <p>No findings attached to this card status.</p>}
94
+ <p className="tx-muted">Summary: {Number(summary.error || 0)} errors · {Number(summary.warning || 0)} warnings · {Number(summary.info || 0)} info</p>
95
+ </details>
96
+ </Modal>
97
+ );
98
+ }