@naisys/erp 3.0.0-beta.9 → 3.0.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.
Files changed (83) hide show
  1. package/.env.example +5 -0
  2. package/client-dist/assets/index-CSiMTJfw.css +14 -0
  3. package/client-dist/assets/index-D6lSIioV.js +11167 -0
  4. package/client-dist/assets/rolldown-runtime-CvHMtSRF.js +33 -0
  5. package/client-dist/assets/vendor-CJ0ET9hP.js +75181 -0
  6. package/client-dist/assets/vendor-CLUPjUnv.css +8747 -0
  7. package/client-dist/favicon-16x16.png +0 -0
  8. package/client-dist/favicon-32x32.png +0 -0
  9. package/client-dist/favicon.ico +0 -0
  10. package/client-dist/index.html +17 -2
  11. package/dist/{dbConfig.js → database/dbConfig.js} +1 -1
  12. package/dist/{erpDb.js → database/erpDb.js} +1 -1
  13. package/dist/erpRoutes.js +115 -0
  14. package/dist/erpServer.js +85 -161
  15. package/dist/error-handler.js +3 -0
  16. package/dist/generated/prisma/internal/class.js +4 -4
  17. package/dist/generated/prisma/internal/prismaNamespace.js +3 -1
  18. package/dist/middleware/auth-middleware.js +146 -0
  19. package/dist/route-helpers.js +2 -2
  20. package/dist/routes/admin.js +15 -7
  21. package/dist/routes/audit.js +1 -1
  22. package/dist/routes/{item-fields.js → items/item-fields.js} +24 -22
  23. package/dist/routes/{item-instances.js → items/item-instances.js} +42 -24
  24. package/dist/routes/{items.js → items/items.js} +35 -33
  25. package/dist/routes/{operation-dependencies.js → operations/operation-dependencies.js} +6 -6
  26. package/dist/routes/{operation-field-refs.js → operations/operation-field-refs.js} +6 -6
  27. package/dist/routes/{operation-run-comments.js → operations/operation-run-comments.js} +5 -5
  28. package/dist/routes/{operation-run-transitions.js → operations/operation-run-transitions.js} +29 -13
  29. package/dist/routes/{operation-runs.js → operations/operation-runs.js} +48 -10
  30. package/dist/routes/{operations.js → operations/operations.js} +6 -6
  31. package/dist/routes/{order-revision-transitions.js → orders/order-revision-transitions.js} +4 -4
  32. package/dist/routes/{order-revisions.js → orders/order-revisions.js} +6 -6
  33. package/dist/routes/{order-run-transitions.js → orders/order-run-transitions.js} +11 -5
  34. package/dist/routes/{order-runs.js → orders/order-runs.js} +7 -5
  35. package/dist/routes/{orders.js → orders/orders.js} +15 -11
  36. package/dist/routes/{dispatch.js → production/dispatch.js} +88 -7
  37. package/dist/routes/{inventory.js → production/inventory.js} +33 -10
  38. package/dist/routes/{labor-tickets.js → production/labor-tickets.js} +7 -7
  39. package/dist/routes/{work-centers.js → production/work-centers.js} +29 -29
  40. package/dist/routes/root.js +1 -1
  41. package/dist/routes/{step-field-attachments.js → steps/step-field-attachments.js} +8 -8
  42. package/dist/routes/{step-fields.js → steps/step-fields.js} +6 -6
  43. package/dist/routes/{step-run-fields.js → steps/step-run-fields.js} +9 -9
  44. package/dist/routes/{step-run-transitions.js → steps/step-run-transitions.js} +6 -6
  45. package/dist/routes/{step-runs.js → steps/step-runs.js} +7 -7
  46. package/dist/routes/{steps.js → steps/steps.js} +5 -5
  47. package/dist/routes/{auth.js → users/auth.js} +11 -23
  48. package/dist/routes/{user-permissions.js → users/user-permissions.js} +21 -7
  49. package/dist/routes/{users.js → users/users.js} +42 -20
  50. package/dist/services/attachment-service.js +2 -2
  51. package/dist/services/{item-instance-service.js → inventory/item-instance-service.js} +2 -2
  52. package/dist/services/{item-service.js → inventory/item-service.js} +2 -2
  53. package/dist/services/{operation-dependency-service.js → operations/operation-dependency-service.js} +1 -1
  54. package/dist/services/{operation-run-comment-service.js → operations/operation-run-comment-service.js} +1 -1
  55. package/dist/services/{operation-run-service.js → operations/operation-run-service.js} +15 -4
  56. package/dist/services/{operation-service.js → operations/operation-service.js} +2 -2
  57. package/dist/services/{step-run-service.js → operations/step-run-service.js} +1 -1
  58. package/dist/services/{step-service.js → operations/step-service.js} +2 -2
  59. package/dist/services/{order-revision-service.js → orders/order-revision-service.js} +4 -5
  60. package/dist/services/{order-run-service.js → orders/order-run-service.js} +68 -22
  61. package/dist/services/{order-service.js → orders/order-service.js} +11 -2
  62. package/dist/services/{revision-diff-service.js → orders/revision-diff-service.js} +11 -10
  63. package/dist/services/{field-ref-service.js → production/field-ref-service.js} +1 -1
  64. package/dist/services/{field-service.js → production/field-service.js} +2 -2
  65. package/dist/services/{field-value-service.js → production/field-value-service.js} +27 -3
  66. package/dist/services/production/labor-ticket-backfill.js +67 -0
  67. package/dist/services/{labor-ticket-service.js → production/labor-ticket-service.js} +21 -15
  68. package/dist/services/{work-center-service.js → production/work-center-service.js} +2 -2
  69. package/dist/services/user-service.js +94 -28
  70. package/dist/version.js +12 -0
  71. package/npm-shrinkwrap.json +3000 -0
  72. package/package.json +11 -9
  73. package/prisma/migrations/20260427010000_hash_user_api_keys/migration.sql +10 -0
  74. package/prisma/migrations/20260427020000_nullable_user_password_hash/migration.sql +39 -0
  75. package/prisma/migrations/20260517000000_add_op_run_tokens/migration.sql +2 -0
  76. package/prisma/schema.prisma +4 -2
  77. package/client-dist/assets/index-45dVo30p.css +0 -1
  78. package/client-dist/assets/index-C9uuPHLH.js +0 -168
  79. package/dist/auth-middleware.js +0 -203
  80. package/dist/userService.js +0 -118
  81. /package/bin/{naisys-erp → naisys-erp.js} +0 -0
  82. /package/dist/{supervisorAuth.js → middleware/supervisorAuth.js} +0 -0
  83. /package/dist/{audit.js → services/audit.js} +0 -0
package/package.json CHANGED
@@ -1,22 +1,21 @@
1
1
  {
2
2
  "name": "@naisys/erp",
3
- "version": "3.0.0-beta.9",
3
+ "version": "3.0.0",
4
4
  "description": "NAISYS ERP - Web UI for AI-driven order and work management",
5
5
  "type": "module",
6
6
  "main": "dist/erpServer.js",
7
7
  "bin": {
8
- "naisys-erp": "bin/naisys-erp"
8
+ "naisys-erp": "bin/naisys-erp.js"
9
9
  },
10
10
  "exports": {
11
11
  ".": "./dist/erpServer.js"
12
12
  },
13
13
  "scripts": {
14
- "clean": "rimraf dist client-dist .test-naisys",
14
+ "clean": "npx rimraf dist client-dist .test-naisys",
15
15
  "dev": "tsx watch src/erpServer.ts",
16
16
  "build": "prisma generate && tsc",
17
17
  "bundle": "npx shx rm -rf client-dist && npx shx cp -r ../client/dist client-dist",
18
18
  "start": "node dist/erpServer.js",
19
- "start:reset-password": "node dist/erpServer.js --reset-password",
20
19
  "type-check": "tsc --noEmit",
21
20
  "npm:publish:dryrun": "npm publish --dry-run",
22
21
  "npm:publish": "npm publish --access public",
@@ -26,9 +25,11 @@
26
25
  "test": "vitest run && npx playwright test"
27
26
  },
28
27
  "files": [
28
+ "npm-shrinkwrap.json",
29
29
  "dist",
30
30
  "client-dist",
31
31
  "bin",
32
+ ".env.example",
32
33
  "prisma.config.ts",
33
34
  "prisma/schema.prisma",
34
35
  "prisma/migrations",
@@ -45,11 +46,11 @@
45
46
  "@fastify/rate-limit": "^10.3.0",
46
47
  "@fastify/static": "^9.0.0",
47
48
  "@fastify/swagger": "^9.7.0",
48
- "@naisys/erp-shared": "3.0.0-beta.9",
49
- "@naisys/common": "3.0.0-beta.9",
50
- "@naisys/common-node": "3.0.0-beta.9",
51
- "@naisys/hub-database": "3.0.0-beta.9",
52
- "@naisys/supervisor-database": "3.0.0-beta.9",
49
+ "@naisys/common": "3.0.0",
50
+ "@naisys/common-node": "3.0.0",
51
+ "@naisys/erp-shared": "3.0.0",
52
+ "@naisys/hub-database": "3.0.0",
53
+ "@naisys/supervisor-database": "3.0.0",
53
54
  "@prisma/adapter-better-sqlite3": "^7.5.0",
54
55
  "@prisma/client": "^7.5.0",
55
56
  "@scalar/fastify-api-reference": "^1.48.7",
@@ -64,6 +65,7 @@
64
65
  "@playwright/test": "^1.58.2",
65
66
  "@types/better-sqlite3": "^7.6.13",
66
67
  "@types/node": "^25.5.0",
68
+ "@vitest/coverage-v8": "^4.1.5",
67
69
  "prisma": "^7.5.0",
68
70
  "tsx": "^4.21.0",
69
71
  "typescript": "^5.9.3",
@@ -0,0 +1,10 @@
1
+ -- Replace persisted plaintext user API keys with nullable hashes.
2
+ -- Existing plaintext keys are intentionally discarded.
3
+
4
+ DROP INDEX IF EXISTS "users_api_key_key";
5
+
6
+ ALTER TABLE "users" RENAME COLUMN "api_key" TO "api_key_hash";
7
+
8
+ UPDATE "users" SET "api_key_hash" = NULL;
9
+
10
+ CREATE UNIQUE INDEX "users_api_key_hash_key" ON "users"("api_key_hash");
@@ -0,0 +1,39 @@
1
+ -- Make users.password_hash nullable. NULL means the user is not
2
+ -- password-authable (passkey-only, API-key-only, or agent).
3
+ -- Existing sentinel values are converted to NULL.
4
+
5
+ PRAGMA foreign_keys=OFF;
6
+
7
+ CREATE TABLE "users_new" (
8
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
9
+ "uuid" TEXT NOT NULL,
10
+ "username" TEXT NOT NULL,
11
+ "password_hash" TEXT,
12
+ "is_agent" INTEGER NOT NULL DEFAULT 0,
13
+ "created_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
14
+ "updated_at" DATETIME NOT NULL,
15
+ "deleted_at" DATETIME,
16
+ "api_key_hash" TEXT
17
+ );
18
+
19
+ INSERT INTO "users_new" ("id", "uuid", "username", "password_hash", "is_agent", "created_at", "updated_at", "deleted_at", "api_key_hash")
20
+ SELECT
21
+ "id",
22
+ "uuid",
23
+ "username",
24
+ CASE WHEN "password_hash" IN ('!sso-passkey-only', '!api-key-only', '') THEN NULL ELSE "password_hash" END,
25
+ "is_agent",
26
+ "created_at",
27
+ "updated_at",
28
+ "deleted_at",
29
+ "api_key_hash"
30
+ FROM "users";
31
+
32
+ DROP TABLE "users";
33
+ ALTER TABLE "users_new" RENAME TO "users";
34
+
35
+ CREATE UNIQUE INDEX "users_uuid_key" ON "users"("uuid");
36
+ CREATE UNIQUE INDEX "users_username_key" ON "users"("username");
37
+ CREATE UNIQUE INDEX "users_api_key_hash_key" ON "users"("api_key_hash");
38
+
39
+ PRAGMA foreign_keys=ON;
@@ -0,0 +1,2 @@
1
+ ALTER TABLE "operation_runs" ADD COLUMN "tokens" INTEGER;
2
+ ALTER TABLE "labor_tickets" ADD COLUMN "tokens" INTEGER;
@@ -307,6 +307,7 @@ model OperationRun {
307
307
  status OperationRunStatus @default(pending)
308
308
  assignedToId Int? @map("assigned_to_id")
309
309
  cost Float?
310
+ tokens Int?
310
311
  statusNote String? @map("status_note")
311
312
  completedAt DateTime? @map("completed_at")
312
313
  createdAt DateTime @default(now()) @map("created_at")
@@ -418,8 +419,8 @@ model User {
418
419
  id Int @id @default(autoincrement())
419
420
  uuid String @unique
420
421
  username String @unique
421
- passwordHash String @map("password_hash")
422
- apiKey String? @unique @map("api_key")
422
+ passwordHash String? @map("password_hash")
423
+ apiKeyHash String? @unique @map("api_key_hash")
423
424
  isAgent Boolean @default(false) @map("is_agent")
424
425
  createdAt DateTime @default(now()) @map("created_at")
425
426
  updatedAt DateTime @updatedAt @map("updated_at")
@@ -518,6 +519,7 @@ model LaborTicket {
518
519
  clockIn DateTime @map("clock_in")
519
520
  clockOut DateTime? @map("clock_out")
520
521
  cost Float?
522
+ tokens Int?
521
523
  createdAt DateTime @default(now()) @map("created_at")
522
524
  createdById Int @map("created_by")
523
525
  updatedAt DateTime @updatedAt @map("updated_at")