halkyon/pubspec.yaml

149 lines
6.7 KiB
YAML
Raw Normal View History

# The Halkyon project: every app and the packages they share, one pub workspace.
#
# `_` is the conventional name of a pub workspace's root, which is never published or
# imported, so the naming lint doesn't apply to it.
name: _ # ignore: package_names
publish_to: none
environment:
sdk: '^3.13.0'
# Every package of every Halkyon app and the packages they share (ADR 0015): one
# resolution, one lockfile, one version of each dependency across the apps.
workspace:
feat(learn): Learn's agent, an MCP server suggesting in shared studysets Halkyon's ADR 0044, step 6c (D7, D49 to D52). apps/learn/halkyon_learn_agent is one executable, `halkyon-agent --instance URL sign-in | sync | mcp`: - sign-in keeps the token read from stdin, signs in with it, makes the agent's key pair on its first sign-in, keeps it before setting the public halves on the register (agents.setKeys), and syncs; - it opens its data as the app's _openPersonData does, on halkyon_learn_core and halkyon_content: its own SQLite database, the sync's space router, its keys and those of the spaces shared with it, and the repositories of studysets, cards, notes, paths, files and feedback; - mcp serves ten tools over stdio (dart_mcp): list, read and search the studysets shared with it, suggest a change or a new card or note, report, list a studyset's suggestions and reply. Each syncs first and a suggestion again at once; a refusal is the tool's error; - its files live in $XDG_CONFIG_HOME/halkyon-agent/<host>, 0700 and 0600, refused when others may read them (D50); - tool/install.sh builds it with `dart build cli` (libsodium and SQLite bundled) and copies it to its user on the host, the build before kept (D52). The synced gateways of learning paths and files, and the fakes of the core's gateways, move into halkyon_learn_core (its testing.dart), which the app's tests and the agent's share. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-11-11 22:06:29 +01:00
- apps/learn/halkyon_learn_agent
- apps/learn/halkyon_learn_client
- apps/learn/halkyon_learn_core
- apps/learn/halkyon_learn_server
- apps/learn/halkyon_learn_flutter
- apps/learn/halkyon_learn_curator
feat(meditate): the app: Today, Explore, Profile, the sitting and its bells halkyon_meditate_flutter on halkyon_app and halkyon_ui (ADR 0038): the first start, sign-in and account as every Halkyon app's, a bar below medium windows and a rail with the icon from medium on, fern washes, Settings in cards (Sync, the operator's, Sitting, Practice, the account, What's new, About, the version), English and German. - Today: a greeting by the hour, Sit now at 5, 10, 20 minutes and the timer's own length, the practice of the day, the week with the days in a row, favourites, recently sat (D9). - Explore: six practices of Halkyon's own, written for the app, found by a search without case or accents, by goal and by kind; each page with how it goes, its lengths, its heart and Start (D4, D10). - The sitting, over the tabs: its time from the clock, a ring counting down, the cue of the moment, Pause and End, the bells at the start, between and at the end, the screen kept on; ended early, kept from a minute on where the person says so (D5, D6). - Profile: every Halkyon app's, then the person's practice: minutes, sittings, days, the week and every sitting kept, to delete (D8). - Settings and sittings sealed with the person's key and synced (D7). The bells are synthesised by apps/meditate/tool/bells.py, the icon is Lucide's sprout from cobalt through pacific into fern (tool/app_icons.py). Releases and the deploy are a later step. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-11-03 09:25:30 +01:00
- apps/meditate/halkyon_meditate_client
- apps/meditate/halkyon_meditate_server
- apps/meditate/halkyon_meditate_flutter
- apps/todo/halkyon_todo_client
- apps/todo/halkyon_todo_server
- apps/todo/halkyon_todo_flutter
- apps/train/halkyon_train_client
- apps/train/halkyon_train_server
- apps/train/halkyon_train_flutter
- packages/halkyon_app
- packages/halkyon_base_client
- packages/halkyon_base_server
- packages/halkyon_content
- packages/halkyon_core
- packages/halkyon_editor
- packages/halkyon_interop
- packages/halkyon_keys
- packages/halkyon_llm
feat(oidc): a Serverpod module for signing in with OpenID Connect, SimpleLogin a preset (ADR 0023) halkyon_oidc_server and its generated client halkyon_oidc_client: any provider following OpenID Connect's code flow, beside Serverpod's own providers, with a preset for SimpleLogin (no PKCE, no `typ`). Nothing of Halkyon's is in it; BSD-3-Clause, `publish_to: none` for now. - Attempts in `halkyon_oidc_attempt` (ADR 0020's D13): the ID PostgreSQL's gen_random_uuid(), a state and a nonce of 32 random bytes, PKCE's verifier where used, the caller if signed in; ten minutes, taken once. A host may begin the state with a marker. - The code exchanged by the module itself, so a provider out of reach (a timeout, a 5xx) is told apart from a refused code; the ID token checked with dart_jsonwebtoken's algorithms (ADR 0020's D12): the provider's algorithms alone, the key its `kid` names, of the right type; issuer, audience and `azp`, expiry, time issued, `nbf`, a minute's leeway; the attempt's nonce; a `sub`. - Keys kept an hour, fetched again for an unknown `kid` at most once a minute; discovery checked against the issuer; every request with a timeout. - Identities in `halkyon_oidc_identity`: the provider's key and the `sub`, one per person and provider, deleted with the person. - The stock endpoint (`OidcIdpBaseEndpoint`), and the parts for a host with rules of its own: begin, verify, keep and takeKept, link, accountOf, unlink; merging people; a limit per network. - The forwarding page, moved here from halkyon_base in the next commit. The package's main library is the code generator's, as halkyon_base's; a host imports `package:halkyon_oidc_server/oidc.dart`. ADR 0023's point 5 no longer names OAuth2PkceUtil, which the module doesn't use. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-23 20:28:37 +02:00
- packages/halkyon_oidc_client
- packages/halkyon_oidc_flutter
feat(oidc): a Serverpod module for signing in with OpenID Connect, SimpleLogin a preset (ADR 0023) halkyon_oidc_server and its generated client halkyon_oidc_client: any provider following OpenID Connect's code flow, beside Serverpod's own providers, with a preset for SimpleLogin (no PKCE, no `typ`). Nothing of Halkyon's is in it; BSD-3-Clause, `publish_to: none` for now. - Attempts in `halkyon_oidc_attempt` (ADR 0020's D13): the ID PostgreSQL's gen_random_uuid(), a state and a nonce of 32 random bytes, PKCE's verifier where used, the caller if signed in; ten minutes, taken once. A host may begin the state with a marker. - The code exchanged by the module itself, so a provider out of reach (a timeout, a 5xx) is told apart from a refused code; the ID token checked with dart_jsonwebtoken's algorithms (ADR 0020's D12): the provider's algorithms alone, the key its `kid` names, of the right type; issuer, audience and `azp`, expiry, time issued, `nbf`, a minute's leeway; the attempt's nonce; a `sub`. - Keys kept an hour, fetched again for an unknown `kid` at most once a minute; discovery checked against the issuer; every request with a timeout. - Identities in `halkyon_oidc_identity`: the provider's key and the `sub`, one per person and provider, deleted with the person. - The stock endpoint (`OidcIdpBaseEndpoint`), and the parts for a host with rules of its own: begin, verify, keep and takeKept, link, accountOf, unlink; merging people; a limit per network. - The forwarding page, moved here from halkyon_base in the next commit. The package's main library is the code generator's, as halkyon_base's; a host imports `package:halkyon_oidc_server/oidc.dart`. ADR 0023's point 5 no longer names OAuth2PkceUtil, which the module doesn't use. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-23 20:28:37 +02:00
- packages/halkyon_oidc_server
- packages/halkyon_ui
- packages/halkyon_ui/example
dev_dependencies:
# The checks' own Dart SDK for the images (tool/check.dart), unzipped.
archive: ^4.3.0
# The tools' (tool/check.dart, tool/release.dart) options, and their tests (test/).
args: ^2.7.0
# The release tool's checksums, its calls to Forgejo's API, and the pubspecs it reads.
crypto: ^3.0.7
http: ^1.6.0
# Referenced by analysis_options.yaml in this directory.
leancode_lint: ^27.0.0
# Runs scripts across the workspace's packages (`melos:` below): `dart run melos …`.
melos: ^8.9.0
path: ^1.9.1
test: ^1.31.1
yaml: ^3.1.4
dependency_overrides:
# Learn's flutter_launcher_icons (0.14.4, its latest, from June 2025) asks for
# cli_util ^0.4.1, Melos for 0.5 or later. Of cli_util it uses only the logger
# (`Logger.standard`, `Logger.verbose`, `Ansi`, `Progress`), the same in 0.5.2.
# Drop this once flutter_launcher_icons allows 0.5.
cli_util: ^0.5.2
# Two Android plugins patched for Kotlin built into the Android Gradle
# plugin (android.builtInKotlin=true, which every app sets since 4 Nov
# 2026): their latest releases still apply the Kotlin Gradle plugin
# themselves, which Flutter warns will fail builds. Only android/build.gradle
# differs from the release (third_party/README.md); drop each override once
# its plugin's own release has migrated. flutter_web_auth_2 is
# halkyon_oidc_flutter's, keyboard_height_plugin appflowy_editor's (Learn's
# notes).
flutter_web_auth_2:
path: third_party/flutter_web_auth_2
keyboard_height_plugin:
path: third_party/keyboard_height_plugin
# The offline sync package's shared part from our fork: v0.0.10 with eight
# changes. Byte payloads compared as bytes: v0.0.10 compares them byte by byte
# through a UUID parse that throws for each byte, so a sync touching a few thousand
# cards kept the server busy for minutes, answering nobody, while its client timed
# out and sent everything again (2026-10-12). onInboundMerge, called only when
# changes from the remote peer were merged: onMergeSuccess fires for a space this
# device only pushed to, so every repository read everything again after each
# save's sync (2026-10-17). A local delete, and a merge only inserting new rows
# or only deleting rows, skip the foreign key projection pass when they can't
# change it: the pass loaded nearly every synced row, 8 s for one delete and 9.5 s
# for each rating another device made, in a library of 8,000 cards (2026-10-17).
# Such a merge writes its new rows up to 1,000 to a statement: a first push of
# that library took the server 35 s, now 5 (2026-10-17). And projections are
# rebuilt once after the synced tables changed, not on every session and merge
# (upstream #150). The changes a device lacks are collected with their rows read
# 500 to a statement per table, not one statement each: a new device's first sync
# of a library of 56,000 rows kept halkyon.li's server busy some 100 s, sending
# nothing, so the client closed the stream after 40 s and started over
# (2026-11-09). The server hands each change out as it is read, so a device hears
# from it before the whole collection is read (2026-11-11). A write without a
# transaction acts in the space it touches, and a host names where a new row goes
# (`newRowSpace`), for spaces people share (ADR 0044, D24; 2026-11-11). Pinned to a
# signed commit of the fork's branch halkyon/space-writes (on
# halkyon/streamed-collection, on halkyon/batched-row-reads, on
# halkyon/batch-inserts, on halkyon/fast-merge-deletes, on halkyon/fast-merges, on
# halkyon/fast-deletes, on halkyon/inbound-merges, on halkyon/byte-payloads); drop
# each change once a release of the package has it.
serverpod_offline_sync:
git:
url: https://code.halkyon.app/project-halkyon/serverpod-offline-sync.git
path: packages/serverpod_offline_sync
ref: 845fb557db3e21cf78b152f9e39ba6a26947bab9
# Melos (https://melos.invertase.dev): its scripts run across the workspace's packages,
# `dart run melos run <name>`, and take Melos' filters, such as
# `--diff=origin/main --include-dependents` for only what changed since main and what
# depends on it. tool/check.dart runs the tests through them.
melos:
scripts:
analyze:
description: Analyses the whole workspace, infos fatal too, as CI does.
run: dart analyze --fatal-infos
test:dart:
description: The tests of the packages without Flutter (servers, curator, the
shared Dart packages). Each server's start a PostgreSQL of their own on one
port, so one package at a time.
exec:
command: dart test
concurrency: 1
packageFilters:
flutter: false
dirExists: test
test:flutter:
description: The tests of the Flutter packages, those needing a running server
left out (`flutter test -t requires-server` runs them by hand).
exec:
command: flutter test -x requires-server
concurrency: 1
packageFilters:
flutter: true
dirExists: test
generate:
description: Serverpod's code generation in every server package (the CLI on
the PATH, at the version CI pins).
exec:
command: serverpod --no-analytics generate
concurrency: 1
packageFilters:
fileExists: config/generator.yaml
check:
description: Every check a push has to pass (tool/check.dart).
run: dart run tool/check.dart