Skip to content

Commit 88bd942

Browse files
Merge pull request #228 from SenteraLLC/feature/lineage-tracking
Feature/lineage tracking
2 parents d9a9a7d + e4f6350 commit 88bd942

22 files changed

Lines changed: 1679 additions & 1275 deletions

.github/copilot-instructions.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
## General Instructions
2+
- Keep it simple.
3+
- Work in small, incremental changes.
4+
- Whenever you run a command in the terminal, pipe the output to a file, output.txt, that you can read from. Make sure to overwrite each time so that it doesn't grow too big. There is a bug in the current version of Copilot that causes it to not read the output of commands correctly. This workaround allows you to read the output from the temporary file instead.
5+
- Ensure changes pass linting checks by running `npm run lint` and waiting for it to complete. Read the linting errors and resolve them manually.
6+
- Ensure changes build successfully by running `npm run build`.
7+
- Do not add new dependencies unless given explicit permission.
8+
- Do not modify the `package.json` or `package-lock.json` files unless instructed.
9+
10+
11+
## Task Tracking
12+
- Always start each step by referencing and updating your tasks in `.github/tasks.md`.
13+
- Use checkboxes to track progress.
14+
- Work on one task at a time.
15+
- Do not mark tasks as complete until they are fully done. Ask for confirmation if unsure.

.github/tasks.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
## Tasks
2+
- [x] Read the discussion in [#209](https://github.com/SenteraLLC/ulabel/issues/209) and understand the requirements.
3+
- [x] Implement the fix requested in [#209](https://github.com/SenteraLLC/ulabel/issues/209).
4+
- [x] Build the fix and ensure the build succeeds by running `npm run build`.
5+
- [x] Receive confirmation that the fix works as expected.

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
node_modules
22
ulabel_local/py-dbapi/dbapi/__pycache__
33
build
4-
build/*
4+
build/*
5+
output.txt

CHANGELOG.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,19 @@ All notable changes to this project will be documented here.
66

77
Nothing yet.
88

9+
## [0.19.0] - Aug 19th, 2025
10+
11+
- Add minimal lineage tracking via `last_edited_by` and `last_edited_at` annotation fields
12+
- Prevent creation of zero-length polylines
13+
- Fixed `process_resume_from` not actually populating missing annotation fields on load
14+
- Misc bug/QOL fixes
15+
- Simplified/fixed non-spatial annotation creation/deletion
16+
- Replaced `alert`, `throw`, and `console` calls with `log_message()`
17+
- Cleanup of `suggest_edits()` and other functions related to toggling dialogs
18+
- Refactor action stream management and undo/redo flow into `actions.ts`
19+
- Move a lot of repeated rendering/cleanup steps after actions into general action listeners that trigger on similar actions
20+
- Move `annotation_id` out of undo/redo payloads and into the action itself
21+
922
## [0.18.2] - July 28th, 2025
1023

1124
- Fix special characters in submit buttons breaking tool

api_spec.md

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -159,15 +159,24 @@ As you can see, each subtask will have a corresponding list of annotation object
159159

160160
// timestamp when annotation was created
161161
"created_at": "<ISO datetime string>",
162+
163+
// the username associated with the most recent modification to the annotation
164+
"last_edited_by": "<string>",
165+
166+
// timestamp of the most recent modification to the annotation
167+
"last_edited_at": "<ISO datetime string>",
162168

163169
// true if annotation was deleted
164-
"deprecated": <bool>,
170+
"deprecated": "<bool>",
171+
172+
// indicates what/who deprecated the annotation, eg { human: false }
173+
"deprecated_by": "<object>",
165174

166175
// which type of annotation
167176
"spatial_type": "<string>",
168177

169178
// (nullable) e.g. [[x1, y1], [x2, y2], ...]
170-
"spatial_payload": <array>,
179+
"spatial_payload": "<array>",
171180

172181
// The class associated with the annotation
173182
"classification_payloads": [
@@ -186,16 +195,16 @@ As you can see, each subtask will have a corresponding list of annotation object
186195
],
187196

188197
// size in underlying image pixels
189-
"line_size": <number>,
198+
"line_size": "<number>",
190199

191200
// (nullable) frame ann was created for
192-
"frame": <int>,
201+
"frame": "<int>",
193202

194203
// certain spatial types allow text
195204
"text_payload": "<string>",
196205

197206
// as provided to constructor
198-
"annotation_meta": <object>
207+
"annotation_meta": "<object>"
199208
}
200209
```
201210

demo/multi-class.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@
131131
"toggle_brush_mode_keybind": "f",
132132
"create_bbox_on_initial_crop": "|",
133133
"click_and_drag_poly_annotations": false,
134-
"anno_scaling_mode": "match-zoom",
134+
"anno_scaling_mode": "fixed",
135135
"allow_annotations_outside_image": false,
136136
});
137137
// Wait for ULabel instance to finish initialization

demo/resume-from.html

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,29 +35,29 @@
3535
"spatial_type": "point",
3636
"spatial_payload": [[300, 300]],
3737
"classification_payloads": [
38-
{"id": "c72ea9a1-79f9-444c-a01a-7983f0697b4a", "class_id": 12, "confidence": 0.0},
39-
{"id": "c72ea9a1-79f9-444c-a01a-7983f0697b4a", "class_id": 11, "confidence": 1.0},
40-
{"id": "c72ea9a1-79f9-444c-a01a-7983f0697b4a", "class_id": 10, "confidence": 0.0},
38+
{"class_id": 12, "confidence": 0.0},
39+
{"class_id": 11, "confidence": 1.0},
40+
{"class_id": 10, "confidence": 0.0},
4141
],
42-
"line_width": 4
42+
"line_size": 4
4343
},
4444
{
4545
"id": "4a586dc4-0efa-4563-a42b-8eea3dd5b04b",
4646
"spatial_type": "point",
4747
"spatial_payload": [[400, 300]],
4848
"classification_payloads": [
49-
{"id": "c72ea9a1-79f9-444c-a01a-7983f0697b4a", "class_id": 10}
49+
{"class_id": 10, "confidence": 1.0},
5050
],
51-
"line_width": 4
51+
"line_size": 4
5252
},
5353
{
5454
"id": "4a686dc4-0efa-4563-a42b-8eea3dd5b04b",
5555
"spatial_type": "point",
5656
"spatial_payload": [[300, 400]],
5757
"classification_payloads": [
58-
{"id": "c72ea9a1-79f9-444c-a01a-7983f0697b4a", "class_id": 12}
58+
{"class_id": 12, "confidence": 1.0},
5959
],
60-
"line_width": 4
60+
"line_size": 4
6161
},
6262
{
6363
"id": "4a186dc4-0efa-4563-a42b-8eea3dd5b04b",
@@ -105,7 +105,7 @@
105105
]
106106
],
107107
"classification_payloads": [
108-
{"id": "c72ea9a1-79f9-444c-a01a-7983f0697b4a", "class_id": 11},
108+
{"class_id": 11, "confidence": 1.0},
109109
{"class_id": -1, "confidence": 0.0}
110110
],
111111
},

dist/ulabel.js

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

dist/ulabel.js.LICENSE.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ object-assign
6868
and limitations under the License.
6969
***************************************************************************** */
7070

71+
/*! For license information please see ulabel.js.LICENSE.txt */
72+
7173
/**
7274
* splaytree v3.1.2
7375
* Fast Splay tree for Node and browser

dist/ulabel.min.js

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)