@mostajs/collecte
v0.2.0
Published
Enregistrer tout ce qu'une veille récolte — collecte, requête, observation, document, versions, analyse, piste — avec les dates de recherche, de publication, de modification et de mise à jour, sans rien écraser, cloisonné par propriétaire.
Maintainers
Readme
@mostajs/collecte
Auteur : Dr Hamid MADANI [email protected] · AGPL-3.0-or-later · stack mosta-search-stack · N1
Enregistrer tout ce qu'une veille récolte, avec ses dates de recherche, de publication, de modification et de mise à jour — sans rien écraser, cloisonné par propriétaire.
Installation
npm i @mostajs/collecte @mostajs/orm better-sqlite3Le module n'ouvre aucune base : l'application l'ouvre (par exemple par getConfigFromEnv() de
@mostajs/orm, cascade MOSTA_ENV du .env) et lui passe les dépôts.
Mise en route
import { createConnection, BaseRepository, getConfigFromEnv } from '@mostajs/orm'
import { createCollecte, repositoriesFromOrm, SCHEMAS } from '@mostajs/collecte'
import { createWebSearch } from '@mostajs/web-search'
const dialect = await createConnection(getConfigFromEnv(), Object.values(SCHEMAS))
const collecte = createCollecte({ repositories: await repositoriesFromOrm({ BaseRepository, dialect }), ownerId: 'compte-42' })
const c = await collecte.ouvrir({ ruleSet: 'DEVSAASSEARCH', ruleSetVersion: 'f7ec47c', providers: ['serper'] })
const { results, trace } = await createWebSearch({ env: process.env }).search('relance factures', { provider: 'serper' })
await collecte.enregistrer(c.id, trace, results) // requête + observations + documents/versions
await collecte.fermer(c.id) // compteurs calculés ; « partial » si une requête a échouéÉcart, historique, reprise du Radar (0.2.0)
const { nouveaux, modifies, disparus } = await c.ecart(collecteDeLundi, collecteDeMardi)
const { document, observations, versions, dates } = await c.historique(documentId)
const { dejaImporte, collecte, bilan } = await c.importerPassageRadar('data/radar/results-radar-saas-20261003-230929')L'import reprend un dossier du Radar sans perte ni doublon : le réimporter n'écrit rien ; les
documents et versions qu'un passage recopie du précédent ne sont pas doublés ; la collecte garde ses
dates, son statut et ses compteurs d'origine. Les signaux et les idées ne sont pas importés (ils se
déduisent des analyses, ou relèvent de @mostajs/opportunite) : ils sont comptés dans
collecte.importe.horsPerimetre.
Les sept entités
| entité | rôle | règle |
|---|---|---|
| Collecte | une exécution | appartient à un propriétaire |
| Requete | la trace d'une requête de web-search | tout est gardé, les échecs aussi |
| Observation | un résultat tel que rendu | ajout seul |
| Document | une source (URL canonique), par propriétaire | première et dernière vue, nombre de vues, version, dates et leur origine, conditions |
| VersionDocument | un changement de titre ou d'extrait (avant → après) | ajout seul |
| Analyse | une lecture par l'IA, réponse brute comprise | ajout seul |
| Piste | une douleur, une demande, une idée saisie | retirée, jamais effacée |
Les dates
Document.publishedAt et son origine : provider (date absolue du fournisseur), provider-approx
(date relative, « 1 month ago », convertie depuis l'instant de la recherche), ai (lue par l'IA dans
l'extrait et vérifiée), unknown. Une date plus sûre remplace une moins sûre, jamais l'inverse.
La valeur brute reste sur l'observation.
Les conditions
Chaque observation garde les conditions de l'outil qui l'a rendue ; le document porte la plus restrictive de toutes : un rapport vendu ne montre que ce que toutes ses sources permettent.
