@jsm-mit/sultana-agent-tools-package 0.12.0 → 0.14.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/README.md +2 -2
- package/dist/create-salon-tools.d.ts +1 -0
- package/dist/create-salon-tools.d.ts.map +1 -1
- package/dist/customer/customer-core-port.d.ts +3 -3
- package/dist/customer/customer-core-port.d.ts.map +1 -1
- package/dist/customer/ic-customer-core-port.d.ts +2 -1
- package/dist/customer/ic-customer-core-port.d.ts.map +1 -1
- package/dist/customer/ic-customer-core-port.js +3 -3
- package/dist/customer/persona.d.ts.map +1 -1
- package/dist/customer/persona.js +3 -1
- package/dist/customer/texts.d.ts +2 -1
- package/dist/customer/texts.d.ts.map +1 -1
- package/dist/customer/texts.js +4 -2
- package/dist/customer/tools.d.ts.map +1 -1
- package/dist/customer/tools.js +28 -6
- package/dist/ic-salon-core-port.d.ts +1 -0
- package/dist/ic-salon-core-port.d.ts.map +1 -1
- package/dist/ic-salon-core-port.js +3 -3
- package/dist/tools/promos.js +1 -1
- package/dist/tools/schedule.js +1 -1
- package/package.json +7 -7
package/README.md
CHANGED
|
@@ -15,7 +15,7 @@ canister wrapper and nothing else — no model provider, no agent framework.
|
|
|
15
15
|
import { createSalonTools, SALON_AGENT_PERSONA_PL } from "@jsm-mit/sultana-agent-tools-package";
|
|
16
16
|
|
|
17
17
|
const tools = createSalonTools({
|
|
18
|
-
canisterId: process.env.
|
|
18
|
+
canisterId: process.env.SULTANA_COORDINATOR_ID!,
|
|
19
19
|
identity, // the salon owner's identity (or, later, a granted agent principal)
|
|
20
20
|
salonId,
|
|
21
21
|
});
|
|
@@ -81,7 +81,7 @@ An assistant that runs without the owner's identity takes the read-only set and
|
|
|
81
81
|
import { createSalonReadTools, SALON_READ_PERSONA_PL } from "@jsm-mit/sultana-agent-tools-package";
|
|
82
82
|
|
|
83
83
|
const tools = createSalonReadTools({
|
|
84
|
-
canisterId: process.env.
|
|
84
|
+
canisterId: process.env.SULTANA_COORDINATOR_ID!,
|
|
85
85
|
salonId, // no identity: every call is a public query, made anonymously
|
|
86
86
|
});
|
|
87
87
|
```
|
|
@@ -25,6 +25,7 @@ export declare function createSalonTools(options: CreateSalonToolsOptions): Agen
|
|
|
25
25
|
/** The same tool set over any port — the seam tests and the sandbox use. */
|
|
26
26
|
export declare function createSalonToolsFromPort(port: SalonCorePort, options?: CreateSalonToolsFromPortOptions): AgentTool[];
|
|
27
27
|
export interface CreateSalonReadToolsOptions {
|
|
28
|
+
/** The Sultana group's COORDINATOR (sultana-sharded) — the package finds the core and the salon's worker. */
|
|
28
29
|
canisterId: string;
|
|
29
30
|
salonId: string;
|
|
30
31
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-salon-tools.d.ts","sourceRoot":"","sources":["../src/create-salon-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAmB,KAAK,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACvF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAI1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,WAAW,+BAA+B;IAC5C;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,iBAAiB,CAAC;CACrC;AAED,MAAM,WAAW,uBACb,SAAQ,IAAI,CAAC,sBAAsB,EAAE,UAAU,GAAG,QAAQ,CAAC,EACvD,+BAA+B;IACnC,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,SAAS,EAAE,CAK9E;AAED,4EAA4E;AAC5E,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,GAAE,+BAAoC,GAAG,SAAS,EAAE,CAQxH;AAED,MAAM,WAAW,2BAA2B;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,2BAA2B,GAAG,SAAS,EAAE,CAGtF;AAED;mEACmE;AACnE,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,aAAa,GAAG,SAAS,EAAE,CAE7E"}
|
|
1
|
+
{"version":3,"file":"create-salon-tools.d.ts","sourceRoot":"","sources":["../src/create-salon-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAmB,KAAK,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACvF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAI1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,WAAW,+BAA+B;IAC5C;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,iBAAiB,CAAC;CACrC;AAED,MAAM,WAAW,uBACb,SAAQ,IAAI,CAAC,sBAAsB,EAAE,UAAU,GAAG,QAAQ,CAAC,EACvD,+BAA+B;IACnC,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,SAAS,EAAE,CAK9E;AAED,4EAA4E;AAC5E,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,GAAE,+BAAoC,GAAG,SAAS,EAAE,CAQxH;AAED,MAAM,WAAW,2BAA2B;IACxC,6GAA6G;IAC7G,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,2BAA2B,GAAG,SAAS,EAAE,CAGtF;AAED;mEACmE;AACnE,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,aAAa,GAAG,SAAS,EAAE,CAE7E"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { ServiceTypeView, TimeRange } from "../salon-core-port.js";
|
|
2
2
|
/**
|
|
3
|
-
* Everything the customer tools may do
|
|
3
|
+
* Everything the customer tools may do in the Sultana group, in plain JSON. Unlike
|
|
4
4
|
* `SalonCorePort` it is bound to no salon — a customer looks across all of them — but to ONE
|
|
5
5
|
* customer: the identity behind the port (the customer's lent delegation) and the place the
|
|
6
6
|
* customer searches around. Neither ever appears as a tool argument.
|
|
@@ -88,7 +88,7 @@ export interface CustomerCorePort {
|
|
|
88
88
|
book(input: BookingInput): Promise<string>;
|
|
89
89
|
/** Needs the customer's identity. Every appointment of the customer, past and cancelled too. */
|
|
90
90
|
listMyAppointments(): Promise<AppointmentView[]>;
|
|
91
|
-
/** Needs the customer's identity. */
|
|
92
|
-
cancel(appointmentId: string): Promise<void>;
|
|
91
|
+
/** Needs the customer's identity. The salon is where the group finds the appointment. */
|
|
92
|
+
cancel(salonId: string, appointmentId: string): Promise<void>;
|
|
93
93
|
}
|
|
94
94
|
//# sourceMappingURL=customer-core-port.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"customer-core-port.d.ts","sourceRoot":"","sources":["../../src/customer/customer-core-port.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"customer-core-port.d.ts","sourceRoot":"","sources":["../../src/customer/customer-core-port.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import type { Identity } from "@icp-sdk/core/agent";
|
|
|
2
2
|
import type { ServiceTypeView, TimeRange } from "../salon-core-port.js";
|
|
3
3
|
import type { AppointmentView, BookingInput, Coordinates, CustomerCorePort, CustomerPromoView, CustomerServiceView, SalonView, SlotSearchView } from "./customer-core-port.js";
|
|
4
4
|
export interface IcCustomerCorePortOptions {
|
|
5
|
+
/** The Sultana group's COORDINATOR (sultana-sharded) — the package finds the core and the salon's worker. */
|
|
5
6
|
canisterId: string;
|
|
6
7
|
/** The customer's lent delegation. Omit it and every read still works (they are public
|
|
7
8
|
* queries), while booking, the customer's appointments and cancelling are refused. */
|
|
@@ -39,6 +40,6 @@ export declare class IcCustomerCorePort implements CustomerCorePort {
|
|
|
39
40
|
freeWindows(salonId: string, workerId: string, day: string): Promise<TimeRange[]>;
|
|
40
41
|
book(input: BookingInput): Promise<string>;
|
|
41
42
|
listMyAppointments(): Promise<AppointmentView[]>;
|
|
42
|
-
cancel(appointmentId: string): Promise<void>;
|
|
43
|
+
cancel(salonId: string, appointmentId: string): Promise<void>;
|
|
43
44
|
}
|
|
44
45
|
//# sourceMappingURL=ic-customer-core-port.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ic-customer-core-port.d.ts","sourceRoot":"","sources":["../../src/customer/ic-customer-core-port.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAepD,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACxE,OAAO,KAAK,EAER,eAAe,EACf,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EAEnB,SAAS,EACT,cAAc,EACjB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,yBAAyB;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB;0FACsF;IACtF,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,uFAAuF;IACvF,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAC;CACpB;AAaD;;;;;;;GAOG;AACH,qBAAa,kBAAmB,YAAW,gBAAgB;IACvD,SAAgB,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAC;IAE7C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoB;IACjD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoB;IACjD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoB;gBAErC,OAAO,EAAE,yBAAyB;IAajC,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAU3D,UAAU,CAAC,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,GAAG,OAAO,CAAC,cAAc,CAAC;IAW1H,eAAe,CAAC,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC;IAWvI,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAQnD,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAKlE,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAa9D,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAUjF,IAAI,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAW1C,kBAAkB,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAehD,MAAM,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"ic-customer-core-port.d.ts","sourceRoot":"","sources":["../../src/customer/ic-customer-core-port.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAepD,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACxE,OAAO,KAAK,EAER,eAAe,EACf,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EAEnB,SAAS,EACT,cAAc,EACjB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,yBAAyB;IACtC,6GAA6G;IAC7G,UAAU,EAAE,MAAM,CAAC;IACnB;0FACsF;IACtF,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,uFAAuF;IACvF,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAC;CACpB;AAaD;;;;;;;GAOG;AACH,qBAAa,kBAAmB,YAAW,gBAAgB;IACvD,SAAgB,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAC;IAE7C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoB;IACjD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoB;IACjD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoB;gBAErC,OAAO,EAAE,yBAAyB;IAajC,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAU3D,UAAU,CAAC,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,GAAG,OAAO,CAAC,cAAc,CAAC;IAW1H,eAAe,CAAC,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC;IAWvI,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAQnD,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAKlE,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAa9D,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAUjF,IAAI,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAW1C,kBAAkB,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAehD,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAI7E"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Principal } from "@icp-sdk/core/principal";
|
|
2
|
-
import { AppointmentsActor, AvailabilityActor, filterServiceTypes, PromoActor, SalonServicesActor, SalonsActor, searchAsapAsyncUnsafe, searchAtMomentsAsyncUnsafe, SearchActor, ServiceTypesActor, } from "@jsm-mit/sultana-
|
|
2
|
+
import { AppointmentsActor, AvailabilityActor, filterServiceTypes, PromoActor, SalonServicesActor, SalonsActor, searchAsapAsyncUnsafe, searchAtMomentsAsyncUnsafe, SearchActor, ServiceTypesActor, } from "@jsm-mit/sultana-sharded-package";
|
|
3
3
|
/**
|
|
4
4
|
* The customer port over the published canister wrapper. Conversions live here and nowhere
|
|
5
5
|
* else: the canister speaks `bigint`, `Principal` and nanoseconds, the tools speak numbers,
|
|
@@ -101,8 +101,8 @@ export class IcCustomerCorePort {
|
|
|
101
101
|
discountCode: appointment.discountCode[0],
|
|
102
102
|
}));
|
|
103
103
|
}
|
|
104
|
-
async cancel(appointmentId) {
|
|
105
|
-
await this.appointments.cancelAppointmentAsyncUnsafe(appointmentId);
|
|
104
|
+
async cancel(salonId, appointmentId) {
|
|
105
|
+
await this.appointments.cancelAppointmentAsyncUnsafe(salonId, appointmentId);
|
|
106
106
|
}
|
|
107
107
|
}
|
|
108
108
|
function toService(service) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persona.d.ts","sourceRoot":"","sources":["../../src/customer/persona.ts"],"names":[],"mappings":"AAiBA;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAE5D;
|
|
1
|
+
{"version":3,"file":"persona.d.ts","sourceRoot":"","sources":["../../src/customer/persona.ts"],"names":[],"mappings":"AAiBA;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAE5D;AAoCD,yEAAyE;AACzE,eAAO,MAAM,yBAAyB,QAAgC,CAAC"}
|
package/dist/customer/persona.js
CHANGED
|
@@ -31,7 +31,9 @@ Zasady pracy:
|
|
|
31
31
|
- Typ usługi ustal przez find_service_type (np. „strzyżenie męskie”). Nigdy nie wymyślaj id.
|
|
32
32
|
Gdy klient pyta ogólnie („paznokcie”) i pasuje kilka typów, szukaj po wszystkich naraz
|
|
33
33
|
(serviceTypeIds w search_slots). Dopytaj tylko wtedy, gdy typy znaczą wyraźnie różne rzeczy.
|
|
34
|
-
- Terminy znajdź przez search_slots: bez daty = jak najszybciej,
|
|
34
|
+
- Terminy znajdź przez search_slots: bez daty = jak najszybciej, sama date = najwcześniejsze terminy
|
|
35
|
+
tego dnia („w poniedziałek”), date i time = okolice tej godziny. Nie dopytuj o godzinę, gdy klient
|
|
36
|
+
jej nie podał.
|
|
35
37
|
Dzisiejszą datę weź z get_current_date — „jutro o 10” przelicz na RRRR-MM-DD i GG:MM.
|
|
36
38
|
- Salony z wyniku search_slots aplikacja pokazuje pod Twoją odpowiedzią jako karty z godzinami
|
|
37
39
|
do kliknięcia. Nie wypisuj ich listy: w jednym–dwóch zdaniach powiedz, ile salonów znalazłeś
|
package/dist/customer/texts.d.ts
CHANGED
|
@@ -25,12 +25,13 @@ export interface CustomerTexts {
|
|
|
25
25
|
bookingOff(problem: string): string;
|
|
26
26
|
badDay(field: string): string;
|
|
27
27
|
badTime(field: string): string;
|
|
28
|
-
|
|
28
|
+
timeNeedsDate: string;
|
|
29
29
|
serviceTypeRequired: string;
|
|
30
30
|
tooManyServiceTypes: (max: number) => string;
|
|
31
31
|
leadSoon: string;
|
|
32
32
|
leadExtended: string;
|
|
33
33
|
leadAround(day: string, time: string): string;
|
|
34
|
+
leadDay(day: string): string;
|
|
34
35
|
/** `asked` and `now` as "RRRR-MM-DD GG:MM" — the model sees which date it got wrong. */
|
|
35
36
|
momentPassed(asked: string, now: string): string;
|
|
36
37
|
probesFailed: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"texts.d.ts","sourceRoot":"","sources":["../../src/customer/texts.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,WAAW,aAAa;IAC1B,QAAQ,EAAE;QACN,eAAe,EAAE,MAAM,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,IAAI,EAAE,MAAM,CAAC;QACb,gBAAgB,EAAE,MAAM,CAAC;QACzB,MAAM,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAE1B,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACpC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IAE/B,
|
|
1
|
+
{"version":3,"file":"texts.d.ts","sourceRoot":"","sources":["../../src/customer/texts.ts"],"names":[],"mappings":"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"}
|
package/dist/customer/texts.js
CHANGED
|
@@ -16,12 +16,13 @@ const PL = {
|
|
|
16
16
|
bookingOff: (problem) => `Rezerwacje są chwilowo wyłączone: ${problem}.`,
|
|
17
17
|
badDay: (field) => `Pole "${field}" musi być datą w formacie RRRR-MM-DD.`,
|
|
18
18
|
badTime: (field) => `Pole "${field}" musi być godziną w formacie GG:MM.`,
|
|
19
|
-
|
|
19
|
+
timeNeedsDate: "Godzina (time) wymaga dnia (date). Sam dzień bez godziny szuka najwcześniejszych terminów tego dnia.",
|
|
20
20
|
serviceTypeRequired: "Podaj serviceTypeId albo serviceTypeIds (id z find_service_type).",
|
|
21
21
|
tooManyServiceTypes: (max) => `Najwyżej ${max} typów usług w jednym szukaniu.`,
|
|
22
22
|
leadSoon: "Najbliższe wolne terminy:",
|
|
23
23
|
leadExtended: "W najbliższej godzinie nic wolnego, na które klient zdąży. Najbliższe terminy:",
|
|
24
24
|
leadAround: (day, time) => `Wolne terminy w okolicach ${day} ${time}:`,
|
|
25
|
+
leadDay: (day) => `Najwcześniejsze wolne terminy w dniu ${day}:`,
|
|
25
26
|
momentPassed: (asked, now) => `Termin ${asked} już minął — teraz jest ${now}. Sprawdź, czy dobrze przeliczyłeś datę (np. „jutro” = dzień po ${now.slice(0, 10)}), i szukaj jeszcze raz. Klienta pytaj o inny termin tylko wtedy, gdy to on podał godzinę, która minęła.`,
|
|
26
27
|
probesFailed: "Nie udało się sprawdzić terminów — kanister nie odpowiadał. Spróbuj ponownie za chwilę.",
|
|
27
28
|
nothingFree: (radius) => `Nic wolnego w promieniu ${radius}. Zaproponuj inną godzinę, inny dzień albo większy promień.`,
|
|
@@ -73,12 +74,13 @@ const EN = {
|
|
|
73
74
|
bookingOff: (problem) => `Booking is switched off for the moment: ${problem}.`,
|
|
74
75
|
badDay: (field) => `Field "${field}" must be a date in the YYYY-MM-DD format.`,
|
|
75
76
|
badTime: (field) => `Field "${field}" must be a time in the HH:MM format.`,
|
|
76
|
-
|
|
77
|
+
timeNeedsDate: "A time needs a date. A date alone searches for that day's earliest slots.",
|
|
77
78
|
serviceTypeRequired: "Give serviceTypeId or serviceTypeIds (ids from find_service_type).",
|
|
78
79
|
tooManyServiceTypes: (max) => `At most ${max} service types in one search.`,
|
|
79
80
|
leadSoon: "The nearest free slots:",
|
|
80
81
|
leadExtended: "Nothing free within the next hour that the customer can reach in time. The nearest slots:",
|
|
81
82
|
leadAround: (day, time) => `Free slots around ${day} ${time}:`,
|
|
83
|
+
leadDay: (day) => `The earliest free slots on ${day}:`,
|
|
82
84
|
momentPassed: (asked, now) => `${asked} has already passed — it is ${now} now. Check the date you computed ("tomorrow" = the day after ${now.slice(0, 10)}) and search again. Ask the customer for another time only when the time they gave has really passed.`,
|
|
83
85
|
probesFailed: "The slots could not be checked — the canister did not answer. Try again in a moment.",
|
|
84
86
|
nothingFree: (radius) => `Nothing free within ${radius}. Suggest another time, another day or a larger radius.`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/customer/tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAI7D,OAAO,EAAW,KAAK,SAAS,EAAmB,MAAM,aAAa,CAAC;AACvE,OAAO,EAAmB,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAiB,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,KAAK,EAAgC,gBAAgB,EAAkD,MAAM,yBAAyB,CAAC;AAe9I,MAAM,WAAW,oBAAoB;IACjC,IAAI,EAAE,gBAAgB,CAAC;IACvB,kCAAkC;IAClC,GAAG,EAAE,MAAM,IAAI,CAAC;IAChB,uFAAuF;IACvF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2FAA2F;IAC3F,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,qFAAqF;IACrF,KAAK,CAAC,EAAE,aAAa,CAAC;CACzB;
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/customer/tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAI7D,OAAO,EAAW,KAAK,SAAS,EAAmB,MAAM,aAAa,CAAC;AACvE,OAAO,EAAmB,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAiB,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,KAAK,EAAgC,gBAAgB,EAAkD,MAAM,yBAAyB,CAAC;AAe9I,MAAM,WAAW,oBAAoB;IACjC,IAAI,EAAE,gBAAgB,CAAC;IACvB,kCAAkC;IAClC,GAAG,EAAE,MAAM,IAAI,CAAC;IAChB,uFAAuF;IACvF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2FAA2F;IAC3F,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,qFAAqF;IACrF,KAAK,CAAC,EAAE,aAAa,CAAC;CACzB;AAqED,wBAAgB,eAAe,CAAC,OAAO,EAAE,oBAAoB,GAAG,SAAS,CA4GxE;AAUD,wBAAgB,YAAY,CAAC,OAAO,EAAE,oBAAoB,GAAG,SAAS,CAmCrE;AAkCD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,oBAAoB,GAAG,SAAS,CA4CzE;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,iBAAiB,GAAG,SAAS,GAAG,SAAS,CAsF1H;AA+CD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,oBAAoB,GAAG,SAAS,CAqC/E;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,iBAAiB,GAAG,SAAS,GAAG,SAAS,CA6C5H"}
|
package/dist/customer/tools.js
CHANGED
|
@@ -21,6 +21,8 @@ const MAX_RADIUS_KM = 50;
|
|
|
21
21
|
const MAX_SERVICE_TYPE_IDS = 30;
|
|
22
22
|
const MAX_SALONS_SHOWN = 6;
|
|
23
23
|
const MAX_TIMES_SHOWN = 6;
|
|
24
|
+
/** A day asked without an hour is searched from this time of that morning (minutes). */
|
|
25
|
+
const DAY_SEARCH_FROM_MINUTES = 6 * 60;
|
|
24
26
|
/** "Pick a time": the asked moment, a little before it and the hour after it. */
|
|
25
27
|
const AROUND_TIME_MINUTES = [-30, -15, 0, 15, 30, 45, 60];
|
|
26
28
|
const CONFIRMED_FIELD = {
|
|
@@ -70,14 +72,14 @@ export function searchSlotsTool(context) {
|
|
|
70
72
|
return {
|
|
71
73
|
name: "search_slots",
|
|
72
74
|
progress: texts.progress.searchSlots,
|
|
73
|
-
description: "Szuka salonów w okolicy klienta, które mają wolny termin na usługę danego typu. Szuka wokół pozycji z aplikacji; gdy klient wskazuje inne miejsce („koło Kolejowej w Warszawie”), podaj lat i lng tego miejsca — odległości liczą się wtedy od niego. Bez date i time szuka „jak najszybciej” (najbliższa godzina, a gdy nic nie ma — do 24 godzin naprzód). Z date i time sprawdza okolice tej godziny (pół godziny wcześniej do godziny później). Zwraca salony z usługami (serviceId, cena, czas) i wolnymi terminami. Odległość, cenę i czas trwania dostajesz jako gotowy tekst — przepisz go bez zmian. Id typów weź z find_service_type: jeden typ w serviceTypeId albo kilka w serviceTypeIds — kilka typów to jedno szukanie, salon z usługą pasującą do paru typów wraca raz.",
|
|
75
|
+
description: "Szuka salonów w okolicy klienta, które mają wolny termin na usługę danego typu. Szuka wokół pozycji z aplikacji; gdy klient wskazuje inne miejsce („koło Kolejowej w Warszawie”), podaj lat i lng tego miejsca — odległości liczą się wtedy od niego. Bez date i time szuka „jak najszybciej” (najbliższa godzina, a gdy nic nie ma — do 24 godzin naprzód). Z samą date (np. „w poniedziałek”) szuka najwcześniejszych wolnych terminów tego dnia. Z date i time sprawdza okolice tej godziny (pół godziny wcześniej do godziny później). Zwraca salony z usługami (serviceId, cena, czas) i wolnymi terminami. Odległość, cenę i czas trwania dostajesz jako gotowy tekst — przepisz go bez zmian. Id typów weź z find_service_type: jeden typ w serviceTypeId albo kilka w serviceTypeIds — kilka typów to jedno szukanie, salon z usługą pasującą do paru typów wraca raz.",
|
|
74
76
|
parameters: {
|
|
75
77
|
type: "object",
|
|
76
78
|
properties: {
|
|
77
79
|
serviceTypeId: { type: "string", description: "Id typu usługi z find_service_type." },
|
|
78
80
|
serviceTypeIds: { type: "array", items: { type: "string" }, description: `Kilka id typów usług z find_service_type (najwyżej ${MAX_SERVICE_TYPE_IDS}), gdy klient pyta ogólnie i pasuje kilka typów. Zamiast serviceTypeId.` },
|
|
79
|
-
date: { type: "string", description: "Dzień RRRR-MM-DD.
|
|
80
|
-
time: { type: "string", description: "Godzina GG:MM
|
|
81
|
+
date: { type: "string", description: "Dzień RRRR-MM-DD. Bez time: najwcześniejsze wolne terminy tego dnia. Pomiń, żeby szukać jak najszybciej." },
|
|
82
|
+
time: { type: "string", description: "Godzina GG:MM, tylko razem z date: szuka w okolicach tej godziny." },
|
|
81
83
|
radiusKm: { type: "number", description: `Promień szukania w km, domyślnie ${DEFAULT_RADIUS_KM}, najwyżej ${MAX_RADIUS_KM}.` },
|
|
82
84
|
lat: { type: "number", description: "Szerokość geograficzna miejsca wskazanego przez klienta. Tylko razem z lng; pomiń oba, żeby szukać wokół pozycji z aplikacji." },
|
|
83
85
|
lng: { type: "number", description: "Długość geograficzna miejsca wskazanego przez klienta. Tylko razem z lat." },
|
|
@@ -102,8 +104,8 @@ export function searchSlotsTool(context) {
|
|
|
102
104
|
const dayText = readOptionalString(args, "date");
|
|
103
105
|
const timeText = readOptionalString(args, "time");
|
|
104
106
|
const now = context.now();
|
|
105
|
-
if (
|
|
106
|
-
throw new ArgumentError(texts.
|
|
107
|
+
if (dayText === undefined && timeText !== undefined) {
|
|
108
|
+
throw new ArgumentError(texts.timeNeedsDate);
|
|
107
109
|
}
|
|
108
110
|
let found;
|
|
109
111
|
let lead;
|
|
@@ -111,6 +113,26 @@ export function searchSlotsTool(context) {
|
|
|
111
113
|
found = await port.searchAsap(location, serviceTypeIds, radiusKm, now);
|
|
112
114
|
lead = found.phase === "extended" ? texts.leadExtended : texts.leadSoon;
|
|
113
115
|
}
|
|
116
|
+
else if (timeText === undefined) {
|
|
117
|
+
// A day without an hour ("on Monday"): the day's earliest slots — the
|
|
118
|
+
// "as soon as possible" search run from that morning (from now, today),
|
|
119
|
+
// keeping only what falls on that day.
|
|
120
|
+
const day = readDay(texts, args, "date");
|
|
121
|
+
const from = Math.max(momentOf(day, DAY_SEARCH_FROM_MINUTES), now.getTime());
|
|
122
|
+
const dayEnd = momentOf(day, 24 * 60);
|
|
123
|
+
if (from >= dayEnd)
|
|
124
|
+
return err("invalid_arguments", texts.momentPassed(`${day} 23:59`, localStampOf(now)));
|
|
125
|
+
const all = await port.searchAsap(location, serviceTypeIds, radiusKm, new Date(from));
|
|
126
|
+
const salons = all.salons
|
|
127
|
+
.map((salon) => {
|
|
128
|
+
const availableAt = salon.availableAt.filter((at) => at < dayEnd);
|
|
129
|
+
const soonestAt = salon.soonestAt !== null && salon.soonestAt < dayEnd ? salon.soonestAt : (availableAt[0] ?? null);
|
|
130
|
+
return { ...salon, availableAt, soonestAt };
|
|
131
|
+
})
|
|
132
|
+
.filter((salon) => salon.availableAt.length > 0);
|
|
133
|
+
found = { ...all, salons };
|
|
134
|
+
lead = texts.leadDay(day);
|
|
135
|
+
}
|
|
114
136
|
else {
|
|
115
137
|
const day = readDay(texts, args, "date");
|
|
116
138
|
const at = readTimeMinutes(texts, args, "time");
|
|
@@ -455,7 +477,7 @@ export function cancelAppointmentTool(context, confirmations) {
|
|
|
455
477
|
const refused = gate.redeem(args, echo);
|
|
456
478
|
if (refused)
|
|
457
479
|
return refused;
|
|
458
|
-
await port.cancel(appointmentId);
|
|
480
|
+
await port.cancel(appointment.salonId, appointmentId);
|
|
459
481
|
return ok(texts.cancelled(describeAppointment(texts, appointment)), { appointmentId });
|
|
460
482
|
}
|
|
461
483
|
catch (error) {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Identity } from "@icp-sdk/core/agent";
|
|
2
2
|
import type { DiscountCodeInput, DiscountCodeView, MediaView, PromoView, PromoWriteInput, SalonAccess, SalonCorePort, SalonPhotoPort, TimeRange, ServiceTypeView, ServiceView, ServiceWriteInput, WorkerView } from "./salon-core-port.js";
|
|
3
3
|
export interface IcSalonCorePortOptions {
|
|
4
|
+
/** The Sultana group's COORDINATOR (sultana-sharded) — the package finds the core and the salon's worker. */
|
|
4
5
|
canisterId: string;
|
|
5
6
|
/** Omit for an anonymous identity — every write will then be refused, which is only useful in
|
|
6
7
|
* a read-only demo. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ic-salon-core-port.d.ts","sourceRoot":"","sources":["../src/ic-salon-core-port.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAgBpD,OAAO,KAAK,EACR,iBAAiB,EACjB,gBAAgB,EAEhB,SAAS,EACT,SAAS,EACT,eAAe,EACf,WAAW,EACX,aAAa,EACb,cAAc,EAEd,SAAS,EACT,eAAe,EACf,WAAW,EACX,iBAAiB,EACjB,UAAU,EACb,MAAM,sBAAsB,CAAC;AAS9B,MAAM,WAAW,sBAAsB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB;2BACuB;IACvB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mFAAmF;IACnF,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;CACxB;AAED;;;GAGG;AACH,qBAAa,eAAgB,YAAW,aAAa;IACjD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAU;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoB;IACjD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoB;IACjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,OAAO,CAA8G;IAC7H,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IACnD,SAAgB,MAAM,CAAC,EAAE,cAAc,CAAC;gBAE5B,OAAO,EAAE,sBAAsB;IAsB9B,YAAY,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAkBtC,UAAU,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;IAYrD,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"ic-salon-core-port.d.ts","sourceRoot":"","sources":["../src/ic-salon-core-port.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Principal } from "@icp-sdk/core/principal";
|
|
2
|
-
import { AssetsActor, AvailabilityActor, DiscountCodesActor, filterServiceTypes, HrActor, PromoActor, promoMusicOf, SalonsActor, SalonServicesActor, ServiceTypesActor, } from "@jsm-mit/sultana-
|
|
2
|
+
import { AssetsActor, AvailabilityActor, DiscountCodesActor, filterServiceTypes, HrActor, PromoActor, promoMusicOf, SalonsActor, SalonServicesActor, ServiceTypesActor, } from "@jsm-mit/sultana-sharded-package";
|
|
3
3
|
import { AssetsRustSalonActor } from "@jsm-mit/sultana-assets-rust-package";
|
|
4
4
|
const SERVICE_TYPES_CATALOG_TTL_MS = 60_000;
|
|
5
5
|
/** The assets canister registers a stored image in core with a call of its own; the library lists
|
|
@@ -57,10 +57,10 @@ export class IcSalonCorePort {
|
|
|
57
57
|
return this.services.addSalonServiceAsyncUnsafe(input.active, BigInt(input.durationMinutes), input.name, BigInt(input.pricePln), this.salonId, input.serviceTypeIds, input.workerIds);
|
|
58
58
|
}
|
|
59
59
|
async updateService(serviceId, input) {
|
|
60
|
-
await this.services.updateSalonServiceAsyncUnsafe(input.active, BigInt(input.durationMinutes), input.name, BigInt(input.pricePln), serviceId, input.serviceTypeIds, input.workerIds);
|
|
60
|
+
await this.services.updateSalonServiceAsyncUnsafe(this.salonId, input.active, BigInt(input.durationMinutes), input.name, BigInt(input.pricePln), serviceId, input.serviceTypeIds, input.workerIds);
|
|
61
61
|
}
|
|
62
62
|
async removeService(serviceId) {
|
|
63
|
-
await this.services.removeSalonServiceAsyncUnsafe(serviceId);
|
|
63
|
+
await this.services.removeSalonServiceAsyncUnsafe(this.salonId, serviceId);
|
|
64
64
|
}
|
|
65
65
|
async listWorkers() {
|
|
66
66
|
const workers = await this.hr.getWorkersBySalonIdAsyncUnsafe(this.salonId);
|
package/dist/tools/promos.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { MAX_ACTIVE_PROMOS_PER_SALON, MAX_PROMOS_PER_SALON } from "@jsm-mit/sultana-
|
|
1
|
+
import { MAX_ACTIVE_PROMOS_PER_SALON, MAX_PROMOS_PER_SALON } from "@jsm-mit/sultana-sharded-package";
|
|
2
2
|
import { toToolError } from "../errors.js";
|
|
3
3
|
import { err, ok } from "../types.js";
|
|
4
4
|
import { ArgumentError, phrasesMatch, readBoolean, readOptionalNumber, readOptionalString, readOptionalStringArray, readString, } from "./args.js";
|
package/dist/tools/schedule.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { formatMinutesToTime, parseTimeRangesToSlots, parseTimeToMinutes } from "@jsm-mit/sultana-
|
|
1
|
+
import { formatMinutesToTime, parseTimeRangesToSlots, parseTimeToMinutes } from "@jsm-mit/sultana-sharded-package";
|
|
2
2
|
import { toToolError } from "../errors.js";
|
|
3
3
|
import { err, ok } from "../types.js";
|
|
4
4
|
import { ArgumentError, readBoolean, readOptionalString, readString } from "./args.js";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jsm-mit/sultana-agent-tools-package",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.0",
|
|
4
4
|
"description": "Agent tool layer for Sultana: framework-agnostic tools over the Sultana core canister wrapper — a salon owner's set (services, promos, schedule) and a customer's set (search, free times, booking), each with a read-only set that needs no identity.",
|
|
5
5
|
"homepage": "https://github.com/JSM-Sultana/sultana-agent-tools-package#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -28,18 +28,18 @@
|
|
|
28
28
|
"build": "tsc && tsc -p tsconfig.tests.json",
|
|
29
29
|
"clean": "rm -rf dist",
|
|
30
30
|
"test": "node --import tsx --test \"tests/**/*.test.ts\"",
|
|
31
|
-
"sandbox": "npx tsx --env-file-if-exists=.env sandbox/main.ts",
|
|
31
|
+
"sandbox": "npx tsx --env-file-if-exists=.env.sandbox sandbox/main.ts",
|
|
32
32
|
"prepare": "npm run build",
|
|
33
|
-
"test-tools": "npx tsx --env-file-if-exists=.env --test tests/integration/test-salon-tools.ts",
|
|
34
|
-
"test-customer-tools": "npx tsx --env-file-if-exists=.env --test tests/integration/test-customer-tools.ts",
|
|
33
|
+
"test-tools": "npx tsx --env-file-if-exists=.env.tests --test tests/integration/test-salon-tools.ts",
|
|
34
|
+
"test-customer-tools": "npx tsx --env-file-if-exists=.env.tests --test tests/integration/test-customer-tools.ts",
|
|
35
35
|
"booksy": "npx tsx sandbox/booksy.ts",
|
|
36
|
-
"whoami": "npx tsx --env-file-if-exists=.env sandbox/whoami.ts",
|
|
36
|
+
"whoami": "npx tsx --env-file-if-exists=.env.sandbox sandbox/whoami.ts",
|
|
37
37
|
"publish-public": "bash scripts/publish-public.sh"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
40
|
"@icp-sdk/core": "^6.1.0",
|
|
41
|
-
"@jsm-mit/sultana-assets-rust-package": "^0.
|
|
42
|
-
"@jsm-mit/sultana-
|
|
41
|
+
"@jsm-mit/sultana-assets-rust-package": "^0.2.0",
|
|
42
|
+
"@jsm-mit/sultana-sharded-package": "^0.1.0"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
45
|
"@jsm-mit/utils-package": "^0.5.0",
|