@voxendar/shared 0.2.0 → 0.4.0
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.
- package/dist/capture/audio.d.ts +16 -0
- package/dist/capture/audio.d.ts.map +1 -0
- package/dist/capture/audio.js +22 -0
- package/dist/capture/audio.js.map +1 -0
- package/dist/capture/fields.d.ts +87 -0
- package/dist/capture/fields.d.ts.map +1 -0
- package/dist/capture/fields.js +171 -0
- package/dist/capture/fields.js.map +1 -0
- package/dist/constants.d.ts +1 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +1 -0
- package/dist/constants.js.map +1 -1
- package/dist/i18n/copy/ar-SA.d.ts +176 -0
- package/dist/i18n/copy/ar-SA.d.ts.map +1 -0
- package/dist/i18n/copy/ar-SA.js +194 -0
- package/dist/i18n/copy/ar-SA.js.map +1 -0
- package/dist/i18n/copy/de-DE.d.ts +176 -0
- package/dist/i18n/copy/de-DE.d.ts.map +1 -0
- package/dist/i18n/copy/de-DE.js +196 -0
- package/dist/i18n/copy/de-DE.js.map +1 -0
- package/dist/i18n/copy/en-US.d.ts +190 -0
- package/dist/i18n/copy/en-US.d.ts.map +1 -0
- package/dist/i18n/copy/en-US.js +223 -0
- package/dist/i18n/copy/en-US.js.map +1 -0
- package/dist/i18n/copy/es-MX.d.ts +176 -0
- package/dist/i18n/copy/es-MX.d.ts.map +1 -0
- package/dist/i18n/copy/es-MX.js +189 -0
- package/dist/i18n/copy/es-MX.js.map +1 -0
- package/dist/i18n/copy/fr-FR.d.ts +176 -0
- package/dist/i18n/copy/fr-FR.d.ts.map +1 -0
- package/dist/i18n/copy/fr-FR.js +190 -0
- package/dist/i18n/copy/fr-FR.js.map +1 -0
- package/dist/i18n/copy/he-IL.d.ts +176 -0
- package/dist/i18n/copy/he-IL.d.ts.map +1 -0
- package/dist/i18n/copy/he-IL.js +190 -0
- package/dist/i18n/copy/he-IL.js.map +1 -0
- package/dist/i18n/copy/hi-IN.d.ts +176 -0
- package/dist/i18n/copy/hi-IN.d.ts.map +1 -0
- package/dist/i18n/copy/hi-IN.js +191 -0
- package/dist/i18n/copy/hi-IN.js.map +1 -0
- package/dist/i18n/copy/ja-JP.d.ts +176 -0
- package/dist/i18n/copy/ja-JP.d.ts.map +1 -0
- package/dist/i18n/copy/ja-JP.js +192 -0
- package/dist/i18n/copy/ja-JP.js.map +1 -0
- package/dist/i18n/copy/ko-KR.d.ts +176 -0
- package/dist/i18n/copy/ko-KR.d.ts.map +1 -0
- package/dist/i18n/copy/ko-KR.js +192 -0
- package/dist/i18n/copy/ko-KR.js.map +1 -0
- package/dist/i18n/copy/pt-BR.d.ts +176 -0
- package/dist/i18n/copy/pt-BR.d.ts.map +1 -0
- package/dist/i18n/copy/pt-BR.js +187 -0
- package/dist/i18n/copy/pt-BR.js.map +1 -0
- package/dist/i18n/copy/ru-RU.d.ts +176 -0
- package/dist/i18n/copy/ru-RU.d.ts.map +1 -0
- package/dist/i18n/copy/ru-RU.js +191 -0
- package/dist/i18n/copy/ru-RU.js.map +1 -0
- package/dist/i18n/copy/zh-CN.d.ts +176 -0
- package/dist/i18n/copy/zh-CN.d.ts.map +1 -0
- package/dist/i18n/copy/zh-CN.js +189 -0
- package/dist/i18n/copy/zh-CN.js.map +1 -0
- package/dist/i18n/copy/zh-TW.d.ts +176 -0
- package/dist/i18n/copy/zh-TW.d.ts.map +1 -0
- package/dist/i18n/copy/zh-TW.js +196 -0
- package/dist/i18n/copy/zh-TW.js.map +1 -0
- package/dist/i18n/rtl.d.ts +27 -0
- package/dist/i18n/rtl.d.ts.map +1 -0
- package/dist/i18n/rtl.js +47 -0
- package/dist/i18n/rtl.js.map +1 -0
- package/dist/i18n/server-messages.d.ts +56 -0
- package/dist/i18n/server-messages.d.ts.map +1 -0
- package/dist/i18n/server-messages.js +163 -0
- package/dist/i18n/server-messages.js.map +1 -0
- package/dist/i18n/templates.d.ts +5 -0
- package/dist/i18n/templates.d.ts.map +1 -1
- package/dist/i18n/templates.js +5 -0
- package/dist/i18n/templates.js.map +1 -1
- package/dist/i18n/ui.d.ts +85 -0
- package/dist/i18n/ui.d.ts.map +1 -0
- package/dist/i18n/ui.js +151 -0
- package/dist/i18n/ui.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/schemas/capture.d.ts +8 -0
- package/dist/schemas/capture.d.ts.map +1 -1
- package/dist/schemas/capture.js +6 -0
- package/dist/schemas/capture.js.map +1 -1
- package/dist/schemas/enums.d.ts +2 -0
- package/dist/schemas/enums.d.ts.map +1 -1
- package/package.json +8 -3
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where a member's raw recording lives (Milestone 1.5).
|
|
3
|
+
*
|
|
4
|
+
* Shared because three places have to agree on the shape and only one of them can be
|
|
5
|
+
* checked at compile time: the app builds the path, `transcribeAndExtract` validates
|
|
6
|
+
* it (`^audio/[^/]+/.+$` and its own `audio/{uid}/` ownership prefix), and
|
|
7
|
+
* `storage.rules` grants clients write access to `audio/{uid}/**` and nothing else. A
|
|
8
|
+
* path that disagrees is a capture that fails after the audio has already been
|
|
9
|
+
* uploaded — the worst moment to find out. `tests/functions/update-capture.test.js`
|
|
10
|
+
* feeds this function's output through the callable's schema so the two cannot drift.
|
|
11
|
+
*
|
|
12
|
+
* The recording is deleted by the backend the moment it has been transcribed, so this
|
|
13
|
+
* is a short-lived object, not storage the member can browse.
|
|
14
|
+
*/
|
|
15
|
+
export declare function rawAudioStoragePath(uid: string, fileName: string): string;
|
|
16
|
+
//# sourceMappingURL=audio.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audio.d.ts","sourceRoot":"","sources":["../../src/capture/audio.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEzE"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.rawAudioStoragePath = rawAudioStoragePath;
|
|
4
|
+
const constants_1 = require("../constants");
|
|
5
|
+
/**
|
|
6
|
+
* Where a member's raw recording lives (Milestone 1.5).
|
|
7
|
+
*
|
|
8
|
+
* Shared because three places have to agree on the shape and only one of them can be
|
|
9
|
+
* checked at compile time: the app builds the path, `transcribeAndExtract` validates
|
|
10
|
+
* it (`^audio/[^/]+/.+$` and its own `audio/{uid}/` ownership prefix), and
|
|
11
|
+
* `storage.rules` grants clients write access to `audio/{uid}/**` and nothing else. A
|
|
12
|
+
* path that disagrees is a capture that fails after the audio has already been
|
|
13
|
+
* uploaded — the worst moment to find out. `tests/functions/update-capture.test.js`
|
|
14
|
+
* feeds this function's output through the callable's schema so the two cannot drift.
|
|
15
|
+
*
|
|
16
|
+
* The recording is deleted by the backend the moment it has been transcribed, so this
|
|
17
|
+
* is a short-lived object, not storage the member can browse.
|
|
18
|
+
*/
|
|
19
|
+
function rawAudioStoragePath(uid, fileName) {
|
|
20
|
+
return `${constants_1.STORAGE_PATHS.rawAudio}/${uid}/${fileName}`;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=audio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audio.js","sourceRoot":"","sources":["../../src/capture/audio.ts"],"names":[],"mappings":";;AAgBA,kDAEC;AAlBD,4CAA6C;AAE7C;;;;;;;;;;;;;GAaG;AACH,SAAgB,mBAAmB,CAAC,GAAW,EAAE,QAAgB;IAC/D,OAAO,GAAG,yBAAa,CAAC,QAAQ,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;AACxD,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { EventDraft } from "../schemas/event";
|
|
3
|
+
/**
|
|
4
|
+
* The confirmation card's fields (Milestone 1.5), shared by the app and the backend.
|
|
5
|
+
*
|
|
6
|
+
* Why this lives in `shared` rather than in the app: the card edits a draft that the
|
|
7
|
+
* backend must store, and both sides have to agree on exactly two things — what may
|
|
8
|
+
* be edited, and what "edited" means. The `editedFields` list is the accuracy
|
|
9
|
+
* telemetry behind the confirmation-fatigue risk (README §8), so a field name that
|
|
10
|
+
* one side spells differently from the other silently produces a wrong metric, which
|
|
11
|
+
* is the kind of bug nobody notices until the numbers are used to make a decision.
|
|
12
|
+
*
|
|
13
|
+
* The conversion direction matters too. The draft stores absolute instants
|
|
14
|
+
* (`2026-09-27T15:00:00+08:00`), because that is what Google Calendar needs. A person
|
|
15
|
+
* editing a card thinks in wall clock ("3pm"). `fieldsFromEventDraft` converts one
|
|
16
|
+
* way — and deliberately does **no** timezone arithmetic: it reads the offset that is
|
|
17
|
+
* already in the string, since that offset is the one the backend resolved for that
|
|
18
|
+
* very instant. Rebuilding the instant from edited fields is the backend's job
|
|
19
|
+
* (`functions/src/capture/updateCapture.ts`), where the real IANA database lives.
|
|
20
|
+
*/
|
|
21
|
+
/** Field names the confirmation card may change. Stable strings — they are logged. */
|
|
22
|
+
export declare const CAPTURE_EDITABLE_FIELDS: readonly ["title", "date", "startTime", "endTime", "allDay", "location", "notes"];
|
|
23
|
+
export type CaptureEditableField = (typeof CAPTURE_EDITABLE_FIELDS)[number];
|
|
24
|
+
export declare const EditableCaptureFieldsSchema: z.ZodObject<{
|
|
25
|
+
title: z.ZodString;
|
|
26
|
+
date: z.ZodString;
|
|
27
|
+
startTime: z.ZodNullable<z.ZodString>;
|
|
28
|
+
endTime: z.ZodNullable<z.ZodString>;
|
|
29
|
+
allDay: z.ZodBoolean;
|
|
30
|
+
location: z.ZodNullable<z.ZodString>;
|
|
31
|
+
notes: z.ZodNullable<z.ZodString>;
|
|
32
|
+
}, "strip", z.ZodTypeAny, {
|
|
33
|
+
title: string;
|
|
34
|
+
allDay: boolean;
|
|
35
|
+
location: string | null;
|
|
36
|
+
notes: string | null;
|
|
37
|
+
date: string;
|
|
38
|
+
startTime: string | null;
|
|
39
|
+
endTime: string | null;
|
|
40
|
+
}, {
|
|
41
|
+
title: string;
|
|
42
|
+
allDay: boolean;
|
|
43
|
+
location: string | null;
|
|
44
|
+
notes: string | null;
|
|
45
|
+
date: string;
|
|
46
|
+
startTime: string | null;
|
|
47
|
+
endTime: string | null;
|
|
48
|
+
}>;
|
|
49
|
+
export type EditableCaptureFields = z.infer<typeof EditableCaptureFieldsSchema>;
|
|
50
|
+
/**
|
|
51
|
+
* A draft as the card shows it. `endTime` is null for all-day events — the card has
|
|
52
|
+
* no use for the exclusive next-midnight end, and a person never typed it.
|
|
53
|
+
*/
|
|
54
|
+
export declare function fieldsFromEventDraft(draft: EventDraft): EditableCaptureFields;
|
|
55
|
+
/**
|
|
56
|
+
* Which fields the member actually changed — the telemetry the whole card exists to
|
|
57
|
+
* produce (context.md §9's success signal). Only names from
|
|
58
|
+
* `CAPTURE_EDITABLE_FIELDS` can be returned, and only real differences: a card that
|
|
59
|
+
* was opened and confirmed untouched yields `[]`.
|
|
60
|
+
*
|
|
61
|
+
* The all-day toggle is reported as **one** edit: flipping it clears the start and
|
|
62
|
+
* end times as a consequence, and counting those clearings separately would turn a
|
|
63
|
+
* single tap into three "corrections" in the accuracy metric — the metric exists to
|
|
64
|
+
* measure how often the extractor is wrong, not how many fields a control happens to
|
|
65
|
+
* touch.
|
|
66
|
+
*/
|
|
67
|
+
export declare function editedFieldsBetween(original: EditableCaptureFields, edited: EditableCaptureFields): CaptureEditableField[];
|
|
68
|
+
/** True when the draft carries anything the card should flag in amber. */
|
|
69
|
+
export declare function needsAttention(draft: Pick<EventDraft, "confidence" | "ambiguities">): boolean;
|
|
70
|
+
/**
|
|
71
|
+
* The card's time fields into `HH:MM`, or null when it is not a time at all.
|
|
72
|
+
*
|
|
73
|
+
* People type times the way they say them — "3", "3pm", "3:30 pm", "15.00" — and a
|
|
74
|
+
* card that answers "that is not a time" to "3pm" is a card that makes a member feel
|
|
75
|
+
* stupid for writing what they meant. The LLM's own output is always `HH:MM`; this is
|
|
76
|
+
* for the human editing afterwards.
|
|
77
|
+
*
|
|
78
|
+
* Deliberately narrow about what it will *infer*: a **bare** hour 1–11 becomes PM only
|
|
79
|
+
* when the hour has passed (a person editing a card at 16:00 who types "3" means
|
|
80
|
+
* 15:00, not 03:00), a clock reading ("9:05") is taken exactly as written, and
|
|
81
|
+
* anything else returns null so the card can say so instead of guessing.
|
|
82
|
+
*
|
|
83
|
+
* @param value the raw text from the field
|
|
84
|
+
* @param now used only to choose AM/PM for a bare hour; injectable for tests
|
|
85
|
+
*/
|
|
86
|
+
export declare function normaliseTimeInput(value: string, now?: Date): string | null;
|
|
87
|
+
//# sourceMappingURL=fields.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fields.d.ts","sourceRoot":"","sources":["../../src/capture/fields.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD;;;;;;;;;;;;;;;;;GAiBG;AAEH,sFAAsF;AACtF,eAAO,MAAM,uBAAuB,mFAQ1B,CAAC;AAEX,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,uBAAuB,CAAC,CAAC,MAAM,CAAC,CAAC;AAO5E,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;EAQtC,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAWhF;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,UAAU,GAAG,qBAAqB,CAY7E;AAOD;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,qBAAqB,EAC/B,MAAM,EAAE,qBAAqB,GAC5B,oBAAoB,EAAE,CAYxB;AAED,0EAA0E;AAC1E,wBAAgB,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,YAAY,GAAG,aAAa,CAAC,GAAG,OAAO,CAE7F;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,GAAE,IAAiB,GAAG,MAAM,GAAG,IAAI,CA+BvF"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EditableCaptureFieldsSchema = exports.CAPTURE_EDITABLE_FIELDS = void 0;
|
|
4
|
+
exports.fieldsFromEventDraft = fieldsFromEventDraft;
|
|
5
|
+
exports.editedFieldsBetween = editedFieldsBetween;
|
|
6
|
+
exports.needsAttention = needsAttention;
|
|
7
|
+
exports.normaliseTimeInput = normaliseTimeInput;
|
|
8
|
+
const zod_1 = require("zod");
|
|
9
|
+
/**
|
|
10
|
+
* The confirmation card's fields (Milestone 1.5), shared by the app and the backend.
|
|
11
|
+
*
|
|
12
|
+
* Why this lives in `shared` rather than in the app: the card edits a draft that the
|
|
13
|
+
* backend must store, and both sides have to agree on exactly two things — what may
|
|
14
|
+
* be edited, and what "edited" means. The `editedFields` list is the accuracy
|
|
15
|
+
* telemetry behind the confirmation-fatigue risk (README §8), so a field name that
|
|
16
|
+
* one side spells differently from the other silently produces a wrong metric, which
|
|
17
|
+
* is the kind of bug nobody notices until the numbers are used to make a decision.
|
|
18
|
+
*
|
|
19
|
+
* The conversion direction matters too. The draft stores absolute instants
|
|
20
|
+
* (`2026-09-27T15:00:00+08:00`), because that is what Google Calendar needs. A person
|
|
21
|
+
* editing a card thinks in wall clock ("3pm"). `fieldsFromEventDraft` converts one
|
|
22
|
+
* way — and deliberately does **no** timezone arithmetic: it reads the offset that is
|
|
23
|
+
* already in the string, since that offset is the one the backend resolved for that
|
|
24
|
+
* very instant. Rebuilding the instant from edited fields is the backend's job
|
|
25
|
+
* (`functions/src/capture/updateCapture.ts`), where the real IANA database lives.
|
|
26
|
+
*/
|
|
27
|
+
/** Field names the confirmation card may change. Stable strings — they are logged. */
|
|
28
|
+
exports.CAPTURE_EDITABLE_FIELDS = [
|
|
29
|
+
"title",
|
|
30
|
+
"date",
|
|
31
|
+
"startTime",
|
|
32
|
+
"endTime",
|
|
33
|
+
"allDay",
|
|
34
|
+
"location",
|
|
35
|
+
"notes",
|
|
36
|
+
];
|
|
37
|
+
/** `YYYY-MM-DD`, the shape the card and the extractor both use. */
|
|
38
|
+
const localDate = zod_1.z.string().regex(/^\d{4}-\d{2}-\d{2}$/);
|
|
39
|
+
/** `HH:MM`, 24-hour, the shape the card and the extractor both use. */
|
|
40
|
+
const localTime = zod_1.z.string().regex(/^\d{1,2}:\d{2}$/);
|
|
41
|
+
exports.EditableCaptureFieldsSchema = zod_1.z.object({
|
|
42
|
+
title: zod_1.z.string().min(1).max(200),
|
|
43
|
+
date: localDate,
|
|
44
|
+
startTime: localTime.nullable(),
|
|
45
|
+
endTime: localTime.nullable(),
|
|
46
|
+
allDay: zod_1.z.boolean(),
|
|
47
|
+
location: zod_1.z.string().max(500).nullable(),
|
|
48
|
+
notes: zod_1.z.string().max(2000).nullable(),
|
|
49
|
+
});
|
|
50
|
+
/** One RFC3339 timestamp split into the offset it carries and the wall clock it reads. */
|
|
51
|
+
function wallClockFromRfc3339(value) {
|
|
52
|
+
const match = /^(\d{4}-\d{2}-\d{2})T(\d{2}):(\d{2})/.exec(value);
|
|
53
|
+
if (!match)
|
|
54
|
+
return null;
|
|
55
|
+
// The string is already expressed in the member's zone with the right offset (the
|
|
56
|
+
// backend produced it that way), so the wall clock is simply its local part.
|
|
57
|
+
return { date: match[1] ?? "", time: `${match[2]}:${match[3]}` };
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* A draft as the card shows it. `endTime` is null for all-day events — the card has
|
|
61
|
+
* no use for the exclusive next-midnight end, and a person never typed it.
|
|
62
|
+
*/
|
|
63
|
+
function fieldsFromEventDraft(draft) {
|
|
64
|
+
const start = wallClockFromRfc3339(draft.start);
|
|
65
|
+
const end = draft.end ? wallClockFromRfc3339(draft.end) : null;
|
|
66
|
+
return {
|
|
67
|
+
title: draft.title,
|
|
68
|
+
date: start?.date ?? "",
|
|
69
|
+
startTime: draft.allDay ? null : (start?.time ?? null),
|
|
70
|
+
endTime: draft.allDay ? null : (end?.time ?? null),
|
|
71
|
+
allDay: draft.allDay,
|
|
72
|
+
location: draft.location ?? null,
|
|
73
|
+
notes: draft.notes ?? null,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/** Trimmed comparison, so whitespace is not reported as an edit the member made. */
|
|
77
|
+
function normalise(value) {
|
|
78
|
+
return (value ?? "").trim();
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Which fields the member actually changed — the telemetry the whole card exists to
|
|
82
|
+
* produce (context.md §9's success signal). Only names from
|
|
83
|
+
* `CAPTURE_EDITABLE_FIELDS` can be returned, and only real differences: a card that
|
|
84
|
+
* was opened and confirmed untouched yields `[]`.
|
|
85
|
+
*
|
|
86
|
+
* The all-day toggle is reported as **one** edit: flipping it clears the start and
|
|
87
|
+
* end times as a consequence, and counting those clearings separately would turn a
|
|
88
|
+
* single tap into three "corrections" in the accuracy metric — the metric exists to
|
|
89
|
+
* measure how often the extractor is wrong, not how many fields a control happens to
|
|
90
|
+
* touch.
|
|
91
|
+
*/
|
|
92
|
+
function editedFieldsBetween(original, edited) {
|
|
93
|
+
const changed = [];
|
|
94
|
+
const allDayToggled = original.allDay !== edited.allDay;
|
|
95
|
+
for (const field of exports.CAPTURE_EDITABLE_FIELDS) {
|
|
96
|
+
if (field === "allDay") {
|
|
97
|
+
if (allDayToggled)
|
|
98
|
+
changed.push(field);
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
if ((field === "startTime" || field === "endTime") && allDayToggled)
|
|
102
|
+
continue;
|
|
103
|
+
if (normalise(original[field]) !== normalise(edited[field]))
|
|
104
|
+
changed.push(field);
|
|
105
|
+
}
|
|
106
|
+
return changed;
|
|
107
|
+
}
|
|
108
|
+
/** True when the draft carries anything the card should flag in amber. */
|
|
109
|
+
function needsAttention(draft) {
|
|
110
|
+
return draft.confidence !== "high" || draft.ambiguities.length > 0;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* The card's time fields into `HH:MM`, or null when it is not a time at all.
|
|
114
|
+
*
|
|
115
|
+
* People type times the way they say them — "3", "3pm", "3:30 pm", "15.00" — and a
|
|
116
|
+
* card that answers "that is not a time" to "3pm" is a card that makes a member feel
|
|
117
|
+
* stupid for writing what they meant. The LLM's own output is always `HH:MM`; this is
|
|
118
|
+
* for the human editing afterwards.
|
|
119
|
+
*
|
|
120
|
+
* Deliberately narrow about what it will *infer*: a **bare** hour 1–11 becomes PM only
|
|
121
|
+
* when the hour has passed (a person editing a card at 16:00 who types "3" means
|
|
122
|
+
* 15:00, not 03:00), a clock reading ("9:05") is taken exactly as written, and
|
|
123
|
+
* anything else returns null so the card can say so instead of guessing.
|
|
124
|
+
*
|
|
125
|
+
* @param value the raw text from the field
|
|
126
|
+
* @param now used only to choose AM/PM for a bare hour; injectable for tests
|
|
127
|
+
*/
|
|
128
|
+
function normaliseTimeInput(value, now = new Date()) {
|
|
129
|
+
const text = value.trim().toLowerCase().replace(/\s+/g, "");
|
|
130
|
+
if (text.length === 0)
|
|
131
|
+
return null;
|
|
132
|
+
const match = /^(\d{1,2})(?:[:.](\d{2}))?(am|pm|a\.m\.|p\.m\.)?$/.exec(text);
|
|
133
|
+
if (!match)
|
|
134
|
+
return null;
|
|
135
|
+
const hour = Number(match[1]);
|
|
136
|
+
const minute = match[2] ? Number(match[2]) : 0;
|
|
137
|
+
if (!Number.isFinite(hour) || minute > 59)
|
|
138
|
+
return null;
|
|
139
|
+
const meridiem = match[3]?.[0];
|
|
140
|
+
if (meridiem === "a") {
|
|
141
|
+
// 12am is midnight, and the only 12 that does not keep its number.
|
|
142
|
+
if (hour < 1 || hour > 12)
|
|
143
|
+
return null;
|
|
144
|
+
return format(checked(hour === 12 ? 0 : hour), minute);
|
|
145
|
+
}
|
|
146
|
+
if (meridiem === "p") {
|
|
147
|
+
if (hour < 1 || hour > 12)
|
|
148
|
+
return null;
|
|
149
|
+
return format(checked(hour === 12 ? 12 : hour + 12), minute);
|
|
150
|
+
}
|
|
151
|
+
if (hour > 23)
|
|
152
|
+
return null;
|
|
153
|
+
// A *bare* hour (no minutes) of 1–11 with no meridiem is read as the next time that
|
|
154
|
+
// hour comes round — at 16:00, "3" means 15:00, because someone re-timing a dentist
|
|
155
|
+
// appointment does not mean 03:00. A clock reading ("9:05", "15:00") is read exactly
|
|
156
|
+
// as written, in the morning or not.
|
|
157
|
+
const bareHour = match[2] === undefined;
|
|
158
|
+
if (bareHour && hour >= 1 && hour <= 11 && now.getHours() >= 12) {
|
|
159
|
+
return format(checked(hour + 12), minute);
|
|
160
|
+
}
|
|
161
|
+
return format(checked(hour), minute);
|
|
162
|
+
}
|
|
163
|
+
function checked(hour) {
|
|
164
|
+
return hour >= 0 && hour <= 23 ? hour : null;
|
|
165
|
+
}
|
|
166
|
+
function format(hour, minute) {
|
|
167
|
+
if (hour === null)
|
|
168
|
+
return null;
|
|
169
|
+
return `${String(hour).padStart(2, "0")}:${String(minute).padStart(2, "0")}`;
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=fields.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fields.js","sourceRoot":"","sources":["../../src/capture/fields.ts"],"names":[],"mappings":"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"}
|
package/dist/constants.d.ts
CHANGED
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
* native-name label in the app, and a republish of this package + a functions
|
|
25
25
|
* redeploy, since the backend resolves it from the registry.
|
|
26
26
|
*/
|
|
27
|
-
export declare const SUPPORTED_LANGUAGES: readonly ["en-US", "zh-CN", "es-MX", "fr-FR", "de-DE", "pt-BR", "ru-RU", "ar-SA", "hi-IN", "he-IL", "ja-JP", "ko-KR"];
|
|
27
|
+
export declare const SUPPORTED_LANGUAGES: readonly ["en-US", "zh-CN", "zh-TW", "es-MX", "fr-FR", "de-DE", "pt-BR", "ru-RU", "ar-SA", "hi-IN", "he-IL", "ja-JP", "ko-KR"];
|
|
28
28
|
/** Google Calendar color ids "1"–"11" (color-to-member assignment decided in Phase 0). */
|
|
29
29
|
export declare const GOOGLE_CALENDAR_COLOR_IDS: readonly ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"];
|
|
30
30
|
/** Default per-event reminder offsets in minutes (1 day, 2 hours). */
|
package/dist/constants.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,mBAAmB,
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,mBAAmB,gIActB,CAAC;AAEX,0FAA0F;AAC1F,eAAO,MAAM,yBAAyB,oEAY5B,CAAC;AAEX,sEAAsE;AACtE,eAAO,MAAM,gCAAgC,sBAAuB,CAAC;AAErE,qEAAqE;AACrE,eAAO,MAAM,kCAAkC,KAAK,CAAC;AAErD,mEAAmE;AACnE,eAAO,MAAM,wCAAwC,MAAM,CAAC;AAE5D,iCAAiC;AACjC,eAAO,MAAM,qBAAqB;;;;;;;CAOxB,CAAC;AAEX,sCAAsC;AACtC,eAAO,MAAM,aAAa;;;CAGhB,CAAC"}
|
package/dist/constants.js
CHANGED
package/dist/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH;;;;;;;;;;;;;;;;;;;GAmBG;AACU,QAAA,mBAAmB,GAAG;IACjC,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;CACC,CAAC;AAEX,0FAA0F;AAC7E,QAAA,yBAAyB,GAAG;IACvC,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,IAAI;IACJ,IAAI;CACI,CAAC;AAEX,sEAAsE;AACzD,QAAA,gCAAgC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAU,CAAC;AAErE,qEAAqE;AACxD,QAAA,kCAAkC,GAAG,EAAE,CAAC;AAErD,mEAAmE;AACtD,QAAA,wCAAwC,GAAG,GAAG,CAAC;AAE5D,iCAAiC;AACpB,QAAA,qBAAqB,GAAG;IACnC,YAAY,EAAE,cAAc;IAC5B,gBAAgB,EAAE,kBAAkB;IACpC,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,SAAS;IAClB,QAAQ,EAAE,UAAU;IACpB,aAAa,EAAE,eAAe;CACtB,CAAC;AAEX,sCAAsC;AACzB,QAAA,aAAa,GAAG;IAC3B,QAAQ,EAAE,OAAO,EAAE,gDAAgD;IACnE,QAAQ,EAAE,KAAK,EAAE,6CAA6C;CACtD,CAAC"}
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH;;;;;;;;;;;;;;;;;;;GAmBG;AACU,QAAA,mBAAmB,GAAG;IACjC,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;CACC,CAAC;AAEX,0FAA0F;AAC7E,QAAA,yBAAyB,GAAG;IACvC,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,IAAI;IACJ,IAAI;CACI,CAAC;AAEX,sEAAsE;AACzD,QAAA,gCAAgC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAU,CAAC;AAErE,qEAAqE;AACxD,QAAA,kCAAkC,GAAG,EAAE,CAAC;AAErD,mEAAmE;AACtD,QAAA,wCAAwC,GAAG,GAAG,CAAC;AAE5D,iCAAiC;AACpB,QAAA,qBAAqB,GAAG;IACnC,YAAY,EAAE,cAAc;IAC5B,gBAAgB,EAAE,kBAAkB;IACpC,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,SAAS;IAClB,QAAQ,EAAE,UAAU;IACpB,aAAa,EAAE,eAAe;CACtB,CAAC;AAEX,sCAAsC;AACzB,QAAA,aAAa,GAAG;IAC3B,QAAQ,EAAE,OAAO,EAAE,gDAAgD;IACnE,QAAQ,EAAE,KAAK,EAAE,6CAA6C;CACtD,CAAC"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
export declare const AR: {
|
|
2
|
+
"common.next": string;
|
|
3
|
+
"common.back": string;
|
|
4
|
+
"common.tryAgain": string;
|
|
5
|
+
"common.dismiss": string;
|
|
6
|
+
"common.none": string;
|
|
7
|
+
"login.subtitle": string;
|
|
8
|
+
"login.continueWithGoogle": string;
|
|
9
|
+
"login.signingIn": string;
|
|
10
|
+
"login.failed": string;
|
|
11
|
+
"login.configWarning": "EXPO_PUBLIC_GOOGLE_OAUTH_CLIENT_ID is not set in app/.env — copy GOOGLE_OAUTH_CLIENT_ID from the root .env (same Web OAuth client the backend exchanges with).";
|
|
12
|
+
"setup.titleGroup": string;
|
|
13
|
+
"setup.titleSolo": string;
|
|
14
|
+
"setup.justForMe": string;
|
|
15
|
+
"setup.createOrJoin": string;
|
|
16
|
+
"setup.yourName": string;
|
|
17
|
+
"setup.namePlaceholder": string;
|
|
18
|
+
"setup.groupName": string;
|
|
19
|
+
"setup.calendarName": string;
|
|
20
|
+
"setup.soloNamePlaceholder": string;
|
|
21
|
+
"setup.groupNamePlaceholder": string;
|
|
22
|
+
"setup.soloHint": string;
|
|
23
|
+
"setup.inviteQuestion": string;
|
|
24
|
+
"setup.invitePlaceholder": "ABC23456";
|
|
25
|
+
"setup.joinWithCode": string;
|
|
26
|
+
"setup.languageQuestion": string;
|
|
27
|
+
"setup.languageFootnote": string;
|
|
28
|
+
"setup.voiceQuestion": string;
|
|
29
|
+
"setup.voiceFootnote": string;
|
|
30
|
+
"setup.styleQuestion": string;
|
|
31
|
+
"setup.styleFootnote": string;
|
|
32
|
+
"setup.avatarQuestion": string;
|
|
33
|
+
"setup.avatarFootnote": string;
|
|
34
|
+
"setup.createGroup": string;
|
|
35
|
+
"setup.createCalendar": string;
|
|
36
|
+
"setup.startOver": string;
|
|
37
|
+
"setup.settingUpGroup": string;
|
|
38
|
+
"setup.settingUpCalendar": string;
|
|
39
|
+
"setup.errorCreateGroup": string;
|
|
40
|
+
"setup.errorCreateCalendar": string;
|
|
41
|
+
"setup.errorJoin": string;
|
|
42
|
+
"today.title": string;
|
|
43
|
+
"today.welcome": string;
|
|
44
|
+
"today.group": string;
|
|
45
|
+
"today.placeholder": string;
|
|
46
|
+
"capture.title": string;
|
|
47
|
+
"capture.holdToTalk": string;
|
|
48
|
+
"capture.listening": string;
|
|
49
|
+
"capture.sending": string;
|
|
50
|
+
"capture.working": string;
|
|
51
|
+
"capture.orType": string;
|
|
52
|
+
"capture.placeholder": string;
|
|
53
|
+
"capture.send": string;
|
|
54
|
+
"capture.emailHint": string;
|
|
55
|
+
"capture.micPermission": string;
|
|
56
|
+
"capture.recordFailed": string;
|
|
57
|
+
"capture.holdLonger": string;
|
|
58
|
+
"capture.doneConfirmed": string;
|
|
59
|
+
"capture.doneDiscarded": string;
|
|
60
|
+
"card.playAgain": string;
|
|
61
|
+
"card.title": string;
|
|
62
|
+
"card.date": string;
|
|
63
|
+
"card.start": string;
|
|
64
|
+
"card.end": string;
|
|
65
|
+
"card.location": string;
|
|
66
|
+
"card.notes": string;
|
|
67
|
+
"card.allDay": string;
|
|
68
|
+
"card.today": string;
|
|
69
|
+
"card.tomorrow": string;
|
|
70
|
+
"card.discard": string;
|
|
71
|
+
"card.confirm": string;
|
|
72
|
+
"card.badTime": string;
|
|
73
|
+
"card.badDate": string;
|
|
74
|
+
"card.badTitle": string;
|
|
75
|
+
"card.badTooLong": string;
|
|
76
|
+
"card.badField": string;
|
|
77
|
+
"card.checkFields": string;
|
|
78
|
+
"card.voiceFallback": string;
|
|
79
|
+
"settings.title": string;
|
|
80
|
+
"settings.yourName": string;
|
|
81
|
+
"settings.saveName": string;
|
|
82
|
+
"settings.nameFootnote": string;
|
|
83
|
+
"settings.language": string;
|
|
84
|
+
"settings.languageFootnote": string;
|
|
85
|
+
"settings.voice": string;
|
|
86
|
+
"settings.voiceFootnote": string;
|
|
87
|
+
"settings.style": string;
|
|
88
|
+
"settings.styleFootnote": string;
|
|
89
|
+
"settings.primaryChannel": string;
|
|
90
|
+
"settings.primaryChannelFootnote": string;
|
|
91
|
+
"settings.fallbackChannel": string;
|
|
92
|
+
"settings.fallbackChannelFootnote": string;
|
|
93
|
+
"settings.fallbackAlreadyPrimary": string;
|
|
94
|
+
"settings.yourColor": string;
|
|
95
|
+
"settings.currentColor": string;
|
|
96
|
+
"settings.colorNotAssigned": string;
|
|
97
|
+
"settings.colorFootnoteGroup": string;
|
|
98
|
+
"settings.colorFootnoteSolo": string;
|
|
99
|
+
"settings.yourAvatar": string;
|
|
100
|
+
"settings.avatarFootnote": string;
|
|
101
|
+
"settings.saveLabelName": string;
|
|
102
|
+
"settings.saveLabelLanguage": string;
|
|
103
|
+
"settings.saveLabelVoice": string;
|
|
104
|
+
"settings.saveLabelStyle": string;
|
|
105
|
+
"settings.saveLabelChannels": string;
|
|
106
|
+
"settings.saveLabelColor": string;
|
|
107
|
+
"settings.saveLabelAvatar": string;
|
|
108
|
+
"settings.saving": string;
|
|
109
|
+
"settings.signedInAs": string;
|
|
110
|
+
"settings.signOut": string;
|
|
111
|
+
"settings.privacyPolicy": string;
|
|
112
|
+
"settings.privacyPolicyHint": string;
|
|
113
|
+
"settings.privacyPolicyError": string;
|
|
114
|
+
"settings.errorLoad": string;
|
|
115
|
+
"settings.errorSave": string;
|
|
116
|
+
"settings.profileIncomplete": string;
|
|
117
|
+
"voices.loading": string;
|
|
118
|
+
"voices.loadError": string;
|
|
119
|
+
"voices.playError": string;
|
|
120
|
+
"voices.preparing": string;
|
|
121
|
+
"voices.hearSample": string;
|
|
122
|
+
"voices.previewHint": string;
|
|
123
|
+
"style.professional": string;
|
|
124
|
+
"style.warm_casual": string;
|
|
125
|
+
"style.friendly_brief": string;
|
|
126
|
+
"channel.sms": "SMS";
|
|
127
|
+
"channel.whatsapp": "WhatsApp";
|
|
128
|
+
"channel.telegram": "Telegram";
|
|
129
|
+
"color.1": string;
|
|
130
|
+
"color.2": string;
|
|
131
|
+
"color.3": string;
|
|
132
|
+
"color.4": string;
|
|
133
|
+
"color.5": string;
|
|
134
|
+
"color.6": string;
|
|
135
|
+
"color.7": string;
|
|
136
|
+
"color.8": string;
|
|
137
|
+
"color.9": string;
|
|
138
|
+
"color.10": string;
|
|
139
|
+
"color.11": string;
|
|
140
|
+
"avatar.mom_01": string;
|
|
141
|
+
"avatar.mom_02": string;
|
|
142
|
+
"avatar.dad_01": string;
|
|
143
|
+
"avatar.dad_02": string;
|
|
144
|
+
"avatar.kid_01": string;
|
|
145
|
+
"avatar.kid_02": string;
|
|
146
|
+
"avatar.kid_03": string;
|
|
147
|
+
"avatar.professional_f_01": string;
|
|
148
|
+
"avatar.professional_m_01": string;
|
|
149
|
+
"avatar.professional_x_01": string;
|
|
150
|
+
"avatar.grandparent_f_01": string;
|
|
151
|
+
"avatar.grandparent_m_01": string;
|
|
152
|
+
"avatar.generic_01": string;
|
|
153
|
+
"avatar.generic_02": string;
|
|
154
|
+
"avatar.generic_03": string;
|
|
155
|
+
"error.connection": string;
|
|
156
|
+
"error.notAnEvent": string;
|
|
157
|
+
"error.tooLong": string;
|
|
158
|
+
"error.recordingGone": string;
|
|
159
|
+
"error.noAudio": string;
|
|
160
|
+
"error.badDateTime": string;
|
|
161
|
+
"error.colorTaken": string;
|
|
162
|
+
"error.groupNotJoinable": string;
|
|
163
|
+
"error.noGoogleEmail": string;
|
|
164
|
+
"error.noEvent": string;
|
|
165
|
+
"error.noteGone": string;
|
|
166
|
+
"error.notYours": string;
|
|
167
|
+
"error.badDecision": string;
|
|
168
|
+
"error.calendarSave": string;
|
|
169
|
+
"error.signIn": string;
|
|
170
|
+
"error.profileMissing": string;
|
|
171
|
+
"error.invalidInvite": string;
|
|
172
|
+
"error.alreadySetUp": string;
|
|
173
|
+
"error.generic": string;
|
|
174
|
+
"card.checkVolume": string;
|
|
175
|
+
};
|
|
176
|
+
//# sourceMappingURL=ar-SA.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ar-SA.d.ts","sourceRoot":"","sources":["../../../src/i18n/copy/ar-SA.ts"],"names":[],"mappings":"AAgBA,eAAO,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2LM,CAAC"}
|